From bb6e2230bb8ded3c5546bc4e4c282ee343754475 Mon Sep 17 00:00:00 2001
From: ke_junjie <508432735@qq.com>
Date: 周三, 04 6月 2025 13:36:49 +0800
Subject: [PATCH] 修改

---
 qqjf-Web/src/api/forklift.js                                              |   34 
 qqjf-Web/src/icons/svg/logo.svg                                           |    1 
 qqjf-Web/src/styles/sidebar.scss                                          |   84 
 qqjf-Web/src/views/reportforms/rateequipment/index.vue                    |  135 
 qqjf-Web/src/icons/svg/pdf.svg                                            |    1 
 qqjf-Web/src/icons/svg/search.svg                                         |    1 
 qqjf-Web/src/components/chooseRelevanceFinishedPart/index.vue             |  358 
 qqjf-Web/src/icons/svg/outbound.svg                                       |    1 
 qqjf-Web/src/vendor/Blob.js                                               |  162 
 qqjf-Web/src/views/storage/components/inventoryEdit.vue                   |  166 
 qqjf-Web/src/views/reportforms/turnover/index.vue                         |  144 
 qqjf-Web/src/views/dataview/output.vue                                    |  129 
 qqjf-Web/src/api/outbound.js                                              |   60 
 qqjf-Web/src/icons/svg/record-chart.svg                                   |    1 
 qqjf-Web/src/views/storage/components/viewdatainfo.vue                    |   77 
 qqjf-Web/src/utils/index.js                                               |  357 
 qqjf-Web/src/views/Didproject/index.vue                                   |  263 
 qqjf-Web/src/icons/svg/excel.svg                                          |    1 
 qqjf-Web/src/icons/svg/skill.svg                                          |    1 
 qqjf-Web/src/views/basicInfo/components/stackerEdit.vue                   |  113 
 qqjf-Web/src/views/dataview/rateequipment.vue                             |  141 
 qqjf-Web/src/components/tableContainer/index.vue                          |  654 
 qqjf-Web/src/icons/svg/bug.svg                                            |    1 
 qqjf-Web/src/views/storage/setting/palte/index.vue                        |  196 
 qqjf-Web/src/assets/login/bg.jpg                                          |    0 
 qqjf-Web/src/views/dataview/turnover.vue                                  |  138 
 qqjf-Web/src/api/warning.js                                               |   55 
 qqjf-Web/src/icons/svg/email.svg                                          |    1 
 qqjf-Web/package.json                                                     |   72 
 qqjf-Web/src/router/_import_development.js                                |    3 
 qqjf-Web/src/views/Didproject/components/didnav.vue                       |  111 
 qqjf-Web/src/views/Home/index.vue                                         |  296 
 qqjf-Web/src/store/index.js                                               |   26 
 qqjf-Web/.gitignore                                                       |   23 
 qqjf-Web/src/icons/svg/eye.svg                                            |    1 
 qqjf-Web/src/components/modal/index.vue                                   |  115 
 qqjf-Web/src/router/index.js                                              |  140 
 qqjf-Web/src/views/storage/setting/choose/index.vue                       |  365 
 qqjf-Web/src/views/outbound/regulator/plant/index.vue                     |  321 
 qqjf-Web/src/api/dept.js                                                  |   38 
 qqjf-Web/.prettierrc.js                                                   |    8 
 qqjf-Web/src/utils/request.js                                             |   96 
 qqjf-Web/src/views/task/taskdocuments/index.vue                           |  205 
 qqjf-Web/src/views/storage/base/materials/index.vue                       |  170 
 qqjf-Web/src/icons/svg/align-right.svg                                    |    1 
 qqjf-Web/src/icons/svg/drag.svg                                           |    1 
 qqjf-Web/src/views/storage/components/storage-inquer.vue                  |  424 
 qqjf-Web/babel.config.js                                                  |    5 
 qqjf-Web/src/api/quotation.js                                             |   98 
 qqjf-Web/src/api/ProductionLine.js                                        |   38 
 qqjf-Web/src/views/Home/components/tasktimeecharts.vue                    |  210 
 qqjf-Web/src/views/Didproject/components/didinquer.vue                    |   33 
 qqjf-Web/src/api/equipmenttask.js                                         |   26 
 qqjf-Web/src/views/basicInfo/equipmenttask/avroRecord/index.vue           |  202 
 qqjf-Web/src/views/dataview/tasktime.vue                                  |  104 
 qqjf-Web/src/icons/svg/education.svg                                      |    1 
 qqjf-Web/src/views/reportforms/workpiece/index.vue                        |  130 
 qqjf-Web/src/views/reportforms/statistics/components/eltablecolumn.vue    |   30 
 qqjf-Web/src/api/manage.js                                                |   38 
 qqjf-Web/src/views/dataview/taskbeat.vue                                  |   69 
 qqjf-Web/src/icons/svg/edit.svg                                           |    1 
 qqjf-Web/src/icons/svg/money.svg                                          |    1 
 qqjf-Web/src/store/modules/setting.js                                     |   22 
 qqjf-Web/src/views/storage/components/palteEdit.vue                       |  263 
 qqjf-Web/src/views/basicInfo/components/baseinquer.vue                    |  172 
 qqjf-Web/src/assets/heard/logbg.jpg                                       |    0 
 qqjf-Web/src/utils/excel.js                                               |   16 
 qqjf-Web/src/utils/validate.js                                            |   87 
 qqjf-Web/src/icons/svg/documentation.svg                                  |    1 
 qqjf-Web/src/views/system/user/roleAuth/index.vue                         |  360 
 qqjf-Web/src/icons/svg/dashboard.svg                                      |    1 
 qqjf-Web/vue.config.js                                                    |  160 
 qqjf-Web/src/views/dataview/product.vue                                   |   66 
 qqjf-Web/src/icons/svg/him.svg                                            |    1 
 qqjf-Web/src/views/storage/index.vue                                      |   11 
 qqjf-Web/src/views/Home/components/turnoverEchart.vue                     |  207 
 qqjf-Web/src/icons/svg/password.svg                                       |    1 
 qqjf-Web/.env.production                                                  |   10 
 qqjf-Web/src/api/viewdata.js                                              |   38 
 qqjf-Web/src/api/Didproject.js                                            |   79 
 qqjf-Web/src/api/enterchoose.js                                           |  106 
 qqjf-Web/src/views/task/forklifttasks/index.vue                           |  246 
 qqjf-Web/src/Layout/components/Sidebar/item.vue                           |   42 
 qqjf-Web/src/styles/transition.scss                                       |   31 
 qqjf-Web/src/views/outbound/index.vue                                     |   11 
 qqjf-Web/src/Layout/components/Sidebar/SidebarItem.vue                    |   49 
 qqjf-Web/src/views/inbound/purchase/intype/index.vue                      |  186 
 qqjf-Web/src/views/basicInfo/equipmenttask/rgvtask/index.vue              |  217 
 qqjf-Web/src/settings.js                                                  |   43 
 qqjf-Web/src/api/enter.js                                                 |   80 
 qqjf-Web/src/views/outbound/components/outinquer.vue                      |  111 
 qqjf-Web/src/views/inbound/index.vue                                      |   11 
 qqjf-Web/src/icons/svg/link.svg                                           |    1 
 qqjf-Web/src/components/tableContainer/tableHead.js                       | 2084 ++
 qqjf-Web/src/icons/svg/star.svg                                           |    1 
 qqjf-Web/src/views/Didproject/components/lineEcharts.vue                  |  215 
 qqjf-Web/src/icons/svg/nested.svg                                         |    1 
 qqjf-Web/src/views/Didproject/components/pieEcharts.vue                   |  130 
 qqjf-Web/src/views/inbound/purchase/index.vue                             |    9 
 qqjf-Web/src/api/statistics.js                                            |   14 
 qqjf-Web/src/icons/svg/lock.svg                                           |    1 
 qqjf-Web/src/icons/svg/trade.svg                                          |    1 
 qqjf-Web/src/views/storage/setting/storage-area/index.vue                 |    9 
 qqjf-Web/src/views/reportforms/statistics/components/statisticsinquer.vue |  273 
 qqjf-Web/src/icons/svg/icon.svg                                           |    1 
 qqjf-Web/src/views/dataview/statelibrary.vue                              |  117 
 qqjf-Web/src/icons/svg/in-storage.svg                                     |    1 
 qqjf-Web/src/api/palte.js                                                 |   63 
 qqjf-Web/src/views/Home/components/product.vue                            |  202 
 qqjf-Web/src/icons/svg/wechat.svg                                         |    1 
 qqjf-Web/src/api/role-auth.js                                             |   53 
 qqjf-Web/src/utils/getPageTitle.js                                        |    7 
 qqjf-Web/src/views/system/user/index.vue                                  |    9 
 qqjf-Web/src/icons/svg/language.svg                                       |    1 
 qqjf-Web/src/utils/auth.js                                                |   15 
 qqjf-Web/src/store/modules/tagsView.js                                    |  195 
 qqjf-Web/src/views/reportforms/tasktime/index.vue                         |  111 
 qqjf-Web/src/views/task/index.vue                                         |   11 
 qqjf-Web/src/components/SvgIcon/index.vue                                 |   49 
 qqjf-Web/src/views/inbound/purchase/confirm_welding/index.vue             |  734 
 qqjf-Web/src/store/modules/user.js                                        |   46 
 qqjf-Web/src/styles/innner-circles.scss                                   |   51 
 qqjf-Web/src/views/task/components/maintaskEdit.vue                       |  283 
 qqjf-Web/src/views/inbound/components/partschoose.vue                     |  104 
 qqjf-Web/src/api/output.js                                                |   14 
 qqjf-Web/src/router/modules/base.js                                       |  379 
 qqjf-Web/src/components/index.js                                          |    7 
 qqjf-Web/public/favicon.ico                                               |    0 
 qqjf-Web/src/api/reportforms.js                                           |   91 
 qqjf-Web/src/views/basicInfo/components/warningEdit.vue                   |  144 
 qqjf-Web/src/views/storage/components/forkliftEdit.vue                    |  175 
 qqjf-Web/src/mixins/layout.js                                             |   33 
 qqjf-Web/src/icons/svg/size.svg                                           |    1 
 qqjf-Web/src/icons/svg/message.svg                                        |    1 
 qqjf-Web/src/api/cass-line.js                                             |   36 
 qqjf-Web/src/views/storage/components/storageEdit.vue                     |  173 
 qqjf-Web/src/views/reportforms/product/index.vue                          |   75 
 qqjf-Web/src/api/avroRecord.js                                            |   25 
 qqjf-Web/src/views/system/index.vue                                       |   11 
 qqjf-Web/src/views/storage/setting/cass-line/index.vue                    |  169 
 qqjf-Web/src/views/storage/components/casslineEdit.vue                    |  133 
 qqjf-Web/src/icons/svg/table.svg                                          |    1 
 qqjf-Web/src/views/basicInfo/index.vue                                    |   11 
 qqjf-Web/src/icons/svg/exit-fullscreen.svg                                |    1 
 qqjf-Web/src/icons/svg/zip.svg                                            |    1 
 qqjf-Web/.env.development                                                 |    5 
 qqjf-Web/src/styles/index.scss                                            |  705 
 qqjf-Web/src/Layout/components/Sidebar/index.vue                          |  111 
 qqjf-Web/src/vendor/Export2Excel.js                                       |  139 
 qqjf-Web/src/views/inbound/purchase/enter/index.vue                       |  290 
 qqjf-Web/src/router/_import_production.js                                 |    2 
 qqjf-Web/src/mixins/resize.js                                             |   65 
 qqjf-Web/src/icons/svg/clipboard.svg                                      |    1 
 qqjf-Web/src/api/inventory.js                                             |   57 
 qqjf-Web/src/views/basicInfo/equipmenttask/piler/index.vue                |  236 
 qqjf-Web/src/icons/svg/list.svg                                           |    1 
 qqjf-Web/src/views/Didproject/components/classify.vue                     |  107 
 qqjf-Web/src/views/inbound/components/inboundinuqer.vue                   |  240 
 qqjf-Web/src/icons/svg/tree-table.svg                                     |    1 
 qqjf-Web/src/assets/heard/heard.jpg                                       |    0 
 qqjf-Web/src/views/dataview/components/lineEcharts.vue                    |  179 
 qqjf-Web/src/Layout/components/Appmain.vue                                |   52 
 qqjf-Web/src/views/Home/components/warehouseechart.vue                    |  235 
 qqjf-Web/src/views/system/user/dept/index.vue                             |  165 
 qqjf-Web/src/Layout/index.vue                                             |  104 
 qqjf-Web/src/views/dataview/classified.vue                                |   48 
 qqjf-Web/src/utils/vab.js                                                 |   23 
 qqjf-Web/src/views/reportforms/index.vue                                  |   11 
 qqjf-Web/src/components/autoscroll/index.vue                              |  197 
 qqjf-Web/src/Layout/components/navbar.vue                                 |  135 
 qqjf-Web/src/views/storage/components/positionEdit.vue                    |  178 
 qqjf-Web/src/views/statistics/index.vue                                   |    9 
 qqjf-Web/jsconfig.json                                                    |    9 
 qqjf-Web/src/api/role.js                                                  |   38 
 qqjf-Web/src/icons/svg/theme.svg                                          |    1 
 qqjf-Web/public/index.html                                                |   19 
 qqjf-Web/src/views/basicInfo/base/warning/index.vue                       |  204 
 qqjf-Web/src/views/system/user/role/index.vue                             |  156 
 qqjf-Web/src/assets/heard/heard1.jpg                                      |    0 
 qqjf-Web/src/views/task/components/maintask-inquer.vue                    |  212 
 qqjf-Web/src/icons/svg/component.svg                                      |    1 
 qqjf-Web/src/icons/svg/storage.svg                                        |    1 
 qqjf-Web/src/icons/index.js                                               |    9 
 qqjf-Web/src/icons/svg/example.svg                                        |    1 
 qqjf-Web/src/views/login/index.vue                                        |  360 
 qqjf-Web/.eslintrc.js                                                     |   26 
 qqjf-Web/src/views/storage/components/chooseEdit.vue                      |  262 
 qqjf-Web/src/icons/svg/sys.svg                                            |    1 
 qqjf-Web/src/Layout/components/TagsView/ScrollPane.vue                    |   94 
 qqjf-Web/src/api/intype.js                                                |   14 
 qqjf-Web/src/views/basicInfo/equipmenttask/index.vue                      |    9 
 qqjf-Web/src/views/reportforms/Taskbeat/index.vue                         |   74 
 qqjf-Web/src/views/system/user/components/roleEdIt.vue                    |  139 
 qqjf-Web/src/icons/svg/inbound.svg                                        |    1 
 qqjf-Web/src/views/Home/components/rateequipment.vue                      |  204 
 qqjf-Web/src/views/task/taskrecord/index.vue                              |  345 
 qqjf-Web/src/styles/variables.scss                                        |   35 
 qqjf-Web/src/api/stacker.js                                               |   38 
 qqjf-Web/src/icons/svg/peoples.svg                                        |    1 
 qqjf-Web/src/views/basicInfo/base/index.vue                               |    9 
 qqjf-Web/src/views/reportforms/warehouse/index.vue                        |   72 
 qqjf-Web/src/views/reportforms/movablerate/index.vue                      |  132 
 qqjf-Web/src/api/maintask.js                                              |   77 
 qqjf-Web/src/views/storage/components/viewdataInquer.vue                  |  141 
 qqjf-Web/src/main.js                                                      |   35 
 qqjf-Web/src/views/reportforms/statistics/components/statisticstable.vue  |  121 
 qqjf-Web/src/views/Home/components/lefttop.vue                            |   65 
 qqjf-Web/src/icons/svg/out-storage.svg                                    |    1 
 qqjf-Web/src/icons/svg/tab.svg                                            |    1 
 qqjf-Web/src/icons/svg/user.svg                                           |    1 
 qqjf-Web/src/utils/axios.js                                               |   61 
 qqjf-Web/src/App.vue                                                      |   28 
 qqjf-Web/src/views/inbound/components/quotaionEdit.vue                    |  345 
 qqjf-Web/src/icons/svg/tree.svg                                           |    1 
 qqjf-Web/src/views/inbound/purchase/quotation/index.vue                   |  342 
 qqjf-Web/src/permission.js                                                |  134 
 qqjf-Web/src/utils/sessionStorage.js                                      |   39 
 qqjf-Web/src/utils/date.js                                                |  156 
 qqjf-Web/src/views/storage/setting/choose/components/limitModal.vue       |  139 
 qqjf-Web/src/views/system/user/components/deptEdit.vue                    |  135 
 qqjf-Web/src/views/system/user/manage/index.vue                           |  172 
 qqjf-Web/package-lock.json                                                | 15387 +++++++++++++++++++
 qqjf-Web/src/api/taskrecord.js                                            |   25 
 qqjf-Web/src/plugins/mapServer.js                                         |    5 
 qqjf-Web/src/views/dataview/workpiece.vue                                 |  142 
 qqjf-Web/src/api/position.js                                              |   45 
 qqjf-Web/src/utils/debounce.js                                            |   23 
 qqjf-Web/src/views/reportforms/statistics/index.vue                       |  167 
 qqjf-Web/src/icons/svg/chart.svg                                          |    1 
 qqjf-Web/src/Layout/components/TagsView/index.vue                         |  294 
 qqjf-Web/src/views/storage/base/index.vue                                 |    9 
 qqjf-Web/src/components/choose/addchoose.vue                              |  183 
 qqjf-Web/src/views/basicInfo/base/stacker/index.vue                       |  159 
 qqjf-Web/src/views/outbound/components/plantEdit.vue                      |  435 
 qqjf-Web/src/views/reportforms/classified/index.vue                       |   59 
 qqjf-Web/src/icons/svg/people.svg                                         |    1 
 qqjf-Web/src/views/inbound/purchase/input_finished_product/index.vue      |  736 
 qqjf-Web/src/views/task/maintask/index.vue                                |  430 
 qqjf-Web/src/store/modules/permission.js                                  |   53 
 qqjf-Web/src/views/storage/base/viewdata/index.vue                        |  233 
 qqjf-Web/src/views/test/index.vue                                         |   35 
 qqjf-Web/src/views/Home/components/movablerateechart.vue                  |  206 
 qqjf-Web/src/assets/css/TimesNewRomanPSMT24163565.ttf                     |    0 
 qqjf-Web/src/Layout/components/index.js                                   |    2 
 qqjf-Web/src/icons/svg/fullscreen.svg                                     |    1 
 qqjf-Web/src/views/Home/components/sourceEchart.vue                       |  121 
 qqjf-Web/src/views/inbound/components/quotaion_relevanceEdit.vue          |  381 
 qqjf-Web/src/icons/svg/homePage.svg                                       |    1 
 qqjf-Web/src/utils/throttle.js                                            |   18 
 qqjf-Web/src/views/inbound/components/enterchoose.vue                     |  149 
 qqjf-Web/src/views/storage/base/inventory/index.vue                       |  232 
 qqjf-Web/src/components/autoscroll/eleResize.js                           |  110 
 qqjf-Web/src/api/materials.js                                             |   15 
 qqjf-Web/src/styles/elemen-ui.scss                                        |    4 
 qqjf-Web/src/utils/input.js                                               |   42 
 qqjf-Web/src/views/storage/setting/position/index.vue                     |  170 
 qqjf-Web/src/icons/svg/international.svg                                  |    1 
 qqjf-Web/src/icons/svg/shopping.svg                                       |    1 
 qqjf-Web/src/store/getters.js                                             |    7 
 qqjf-Web/src/views/dataview/warehouse.vue                                 |   70 
 qqjf-Web/src/views/reportforms/output/index.vue                           |  160 
 qqjf-Web/src/icons/svg/form.svg                                           |    1 
 qqjf-Web/src/views/outbound/regulator/index.vue                           |    9 
 qqjf-Web/src/components/TreeTable/index.vue                               |  159 
 qqjf-Web/src/views/storage/setting/storage/index.vue                      |  136 
 qqjf-Web/src/api/register.js                                              |   15 
 qqjf-Web/src/components/choose/choose.vue                                 |  211 
 qqjf-Web/src/api/forklifttasks.js                                         |   55 
 qqjf-Web/src/views/system/user/components/manageEdit.vue                  |  199 
 qqjf-Web/src/views/dataview/movablerate.vue                               |  135 
 qqjf-Web/src/views/task/components/forklifttasksEdit.vue                  |  254 
 qqjf-Web/src/plugins/cdn.js                                               |   11 
 qqjf-Web/src/views/system/user/components/topinquer.vue                   |  120 
 qqjf-Web/src/views/storage/setting/forklift/index.vue                     |  176 
 qqjf-Web/src/components/TreeTable/readme.md                               |   89 
 qqjf-Web/src/views/reportforms/statelibrary/index.vue                     |  106 
 qqjf-Web/src/icons/svg/eye-open.svg                                       |    1 
 qqjf-Web/src/views/storage/setting/index.vue                              |    9 
 qqjf-Web/src/views/inbound/components/enterEdit.vue                       |  544 
 qqjf-Web/src/views/Didproject/components/notice.vue                       |   83 
 qqjf-Web/src/components/TreeTable/eval.js                                 |   30 
 qqjf-Web/src/icons/svg/guide.svg                                          |    1 
 qqjf-Web/src/assets/heard/logo.png                                        |    0 
 qqjf-Web/src/components/chooseUser/index.vue                              |  212 
 qqjf-Web/src/icons/svg/404.svg                                            |    1 
 qqjf-Web/src/views/Home/components/meterEchart.vue                        |  273 
 qqjf-Web/src/icons/svg/qq.svg                                             |    1 
 qqjf-Web/src/components/title/index.vue                                   |   26 
 288 files changed, 46,306 insertions(+), 0 deletions(-)

diff --git a/qqjf-Web/.env.development b/qqjf-Web/.env.development
new file mode 100644
index 0000000..3e70522
--- /dev/null
+++ b/qqjf-Web/.env.development
@@ -0,0 +1,5 @@
+# just a flag
+ENV = 'development'
+
+# base api
+VUE_APP_BASE_API = '/'
\ No newline at end of file
diff --git a/qqjf-Web/.env.production b/qqjf-Web/.env.production
new file mode 100644
index 0000000..0417b86
--- /dev/null
+++ b/qqjf-Web/.env.production
@@ -0,0 +1,10 @@
+# just a flag 
+ENV = 'production'
+
+# base api
+#VUE_APP_BASE_API = 'http://10.103.11.236:8085'  #姝e紡鍙戝竷鐢ㄨ繖涓� 11缃戞
+# VUE_APP_BASE_API = 'http://10.103.9.200:8085'  #姝e紡鍙戝竷鐢ㄨ繖涓� 9缃戞
+#VUE_APP_BASE_API = 'http://192.168.137.200:8085'  #娴嬭瘯鐜鐢ㄨ繖涓�
+
+VUE_APP_BASE_API = 'http://localhost:6099'
+# VUE_APP_BASE_API = '/'
\ No newline at end of file
diff --git a/qqjf-Web/.eslintrc.js b/qqjf-Web/.eslintrc.js
new file mode 100644
index 0000000..3e7b17a
--- /dev/null
+++ b/qqjf-Web/.eslintrc.js
@@ -0,0 +1,26 @@
+module.exports = {
+  root: true,
+  env: {
+    node: true
+  },
+  extends: ['plugin:vue/essential', 'eslint:recommended', '@vue/prettier'],
+  parserOptions: {
+    parser: 'babel-eslint'
+  },
+  rules: {
+    'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
+    semi: 'off',
+    'no-unused-vars': [2, { vars: 'all', args: 'none' }],
+    quotes: 'off',
+    'no-dupe-keys': 'off'
+  },
+  overrides: [
+    {
+      files: ['**/__tests__/*.{j,t}s?(x)', '**/tests/unit/**/*.spec.{j,t}s?(x)'],
+      env: {
+        jest: true
+      }
+    }
+  ]
+};
diff --git a/qqjf-Web/.gitignore b/qqjf-Web/.gitignore
new file mode 100644
index 0000000..f2bacfe
--- /dev/null
+++ b/qqjf-Web/.gitignore
@@ -0,0 +1,23 @@
+.DS_Store
+node_modules
+/dist
+.history
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/qqjf-Web/.prettierrc.js b/qqjf-Web/.prettierrc.js
new file mode 100644
index 0000000..16f5b05
--- /dev/null
+++ b/qqjf-Web/.prettierrc.js
@@ -0,0 +1,8 @@
+module.exports = {
+  trailingComma: 'none',
+  tabWidth: 2,
+  semi: true,
+  singleQuote: true,
+  printWidth: 120,
+  arrowParens: 'avoid'
+};
diff --git a/qqjf-Web/babel.config.js b/qqjf-Web/babel.config.js
new file mode 100644
index 0000000..e955840
--- /dev/null
+++ b/qqjf-Web/babel.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/cli-plugin-babel/preset'
+  ]
+}
diff --git a/qqjf-Web/jsconfig.json b/qqjf-Web/jsconfig.json
new file mode 100644
index 0000000..958df04
--- /dev/null
+++ b/qqjf-Web/jsconfig.json
@@ -0,0 +1,9 @@
+{ 
+  "compilerOptions": {
+    "baseUrl": "./",
+    "paths": {
+        "@/*": ["src/*"]
+    }
+  },
+  "exclude": ["node_modules", "dist"]
+}
\ No newline at end of file
diff --git a/qqjf-Web/package-lock.json b/qqjf-Web/package-lock.json
new file mode 100644
index 0000000..23b5d57
--- /dev/null
+++ b/qqjf-Web/package-lock.json
@@ -0,0 +1,15387 @@
+{
+  "name": "wbtoubiao",
+  "version": "0.1.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@achrinza/node-ipc": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/@achrinza/node-ipc/-/node-ipc-9.2.2.tgz",
+      "integrity": "sha512-b90U39dx0cU6emsOvy5hxU4ApNXnE3+Tuo8XQZfiKTGelDwpMwBVgBP7QX6dGTcJgu/miyJuNJ/2naFBliNWEw==",
+      "dev": true,
+      "requires": {
+        "@node-ipc/js-queue": "2.0.3",
+        "event-pubsub": "4.3.0",
+        "js-message": "1.0.7"
+      }
+    },
+    "@ampproject/remapping": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+      "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/gen-mapping": "^0.1.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      }
+    },
+    "@babel/code-frame": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
+      "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+      "dev": true,
+      "requires": {
+        "@babel/highlight": "^7.18.6"
+      }
+    },
+    "@babel/compat-data": {
+      "version": "7.20.14",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz",
+      "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==",
+      "dev": true
+    },
+    "@babel/core": {
+      "version": "7.20.12",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz",
+      "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==",
+      "dev": true,
+      "requires": {
+        "@ampproject/remapping": "^2.1.0",
+        "@babel/code-frame": "^7.18.6",
+        "@babel/generator": "^7.20.7",
+        "@babel/helper-compilation-targets": "^7.20.7",
+        "@babel/helper-module-transforms": "^7.20.11",
+        "@babel/helpers": "^7.20.7",
+        "@babel/parser": "^7.20.7",
+        "@babel/template": "^7.20.7",
+        "@babel/traverse": "^7.20.12",
+        "@babel/types": "^7.20.7",
+        "convert-source-map": "^1.7.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.2.2",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "@babel/generator": {
+      "version": "7.20.14",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz",
+      "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.20.7",
+        "@jridgewell/gen-mapping": "^0.3.2",
+        "jsesc": "^2.5.1"
+      },
+      "dependencies": {
+        "@jridgewell/gen-mapping": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+          "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+          "dev": true,
+          "requires": {
+            "@jridgewell/set-array": "^1.0.1",
+            "@jridgewell/sourcemap-codec": "^1.4.10",
+            "@jridgewell/trace-mapping": "^0.3.9"
+          }
+        }
+      }
+    },
+    "@babel/helper-annotate-as-pure": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz",
+      "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.18.6"
+      }
+    },
+    "@babel/helper-builder-binary-assignment-operator-visitor": {
+      "version": "7.18.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz",
+      "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-explode-assignable-expression": "^7.18.6",
+        "@babel/types": "^7.18.9"
+      }
+    },
+    "@babel/helper-compilation-targets": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
+      "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.20.5",
+        "@babel/helper-validator-option": "^7.18.6",
+        "browserslist": "^4.21.3",
+        "lru-cache": "^5.1.1",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-create-class-features-plugin": {
+      "version": "7.20.12",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz",
+      "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.18.6",
+        "@babel/helper-environment-visitor": "^7.18.9",
+        "@babel/helper-function-name": "^7.19.0",
+        "@babel/helper-member-expression-to-functions": "^7.20.7",
+        "@babel/helper-optimise-call-expression": "^7.18.6",
+        "@babel/helper-replace-supers": "^7.20.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+        "@babel/helper-split-export-declaration": "^7.18.6"
+      }
+    },
+    "@babel/helper-create-regexp-features-plugin": {
+      "version": "7.20.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz",
+      "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.18.6",
+        "regexpu-core": "^5.2.1"
+      }
+    },
+    "@babel/helper-define-polyfill-provider": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz",
+      "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-compilation-targets": "^7.17.7",
+        "@babel/helper-plugin-utils": "^7.16.7",
+        "debug": "^4.1.1",
+        "lodash.debounce": "^4.0.8",
+        "resolve": "^1.14.2",
+        "semver": "^6.1.2"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-environment-visitor": {
+      "version": "7.18.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
+      "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
+      "dev": true
+    },
+    "@babel/helper-explode-assignable-expression": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz",
+      "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.18.6"
+      }
+    },
+    "@babel/helper-function-name": {
+      "version": "7.19.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
+      "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.18.10",
+        "@babel/types": "^7.19.0"
+      }
+    },
+    "@babel/helper-hoist-variables": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
+      "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.18.6"
+      }
+    },
+    "@babel/helper-member-expression-to-functions": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz",
+      "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.20.7"
+      }
+    },
+    "@babel/helper-module-imports": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
+      "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.18.6"
+      }
+    },
+    "@babel/helper-module-transforms": {
+      "version": "7.20.11",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
+      "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-environment-visitor": "^7.18.9",
+        "@babel/helper-module-imports": "^7.18.6",
+        "@babel/helper-simple-access": "^7.20.2",
+        "@babel/helper-split-export-declaration": "^7.18.6",
+        "@babel/helper-validator-identifier": "^7.19.1",
+        "@babel/template": "^7.20.7",
+        "@babel/traverse": "^7.20.10",
+        "@babel/types": "^7.20.7"
+      }
+    },
+    "@babel/helper-optimise-call-expression": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz",
+      "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.18.6"
+      }
+    },
+    "@babel/helper-plugin-utils": {
+      "version": "7.20.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
+      "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
+      "dev": true
+    },
+    "@babel/helper-remap-async-to-generator": {
+      "version": "7.18.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz",
+      "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.18.6",
+        "@babel/helper-environment-visitor": "^7.18.9",
+        "@babel/helper-wrap-function": "^7.18.9",
+        "@babel/types": "^7.18.9"
+      }
+    },
+    "@babel/helper-replace-supers": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz",
+      "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-environment-visitor": "^7.18.9",
+        "@babel/helper-member-expression-to-functions": "^7.20.7",
+        "@babel/helper-optimise-call-expression": "^7.18.6",
+        "@babel/template": "^7.20.7",
+        "@babel/traverse": "^7.20.7",
+        "@babel/types": "^7.20.7"
+      }
+    },
+    "@babel/helper-simple-access": {
+      "version": "7.20.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+      "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.20.2"
+      }
+    },
+    "@babel/helper-skip-transparent-expression-wrappers": {
+      "version": "7.20.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz",
+      "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.20.0"
+      }
+    },
+    "@babel/helper-split-export-declaration": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
+      "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.18.6"
+      }
+    },
+    "@babel/helper-string-parser": {
+      "version": "7.19.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
+      "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
+      "dev": true
+    },
+    "@babel/helper-validator-identifier": {
+      "version": "7.19.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+      "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+      "dev": true
+    },
+    "@babel/helper-validator-option": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
+      "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
+      "dev": true
+    },
+    "@babel/helper-wrap-function": {
+      "version": "7.20.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz",
+      "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.19.0",
+        "@babel/template": "^7.18.10",
+        "@babel/traverse": "^7.20.5",
+        "@babel/types": "^7.20.5"
+      }
+    },
+    "@babel/helpers": {
+      "version": "7.20.13",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz",
+      "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.20.7",
+        "@babel/traverse": "^7.20.13",
+        "@babel/types": "^7.20.7"
+      }
+    },
+    "@babel/highlight": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+      "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.18.6",
+        "chalk": "^2.0.0",
+        "js-tokens": "^4.0.0"
+      }
+    },
+    "@babel/parser": {
+      "version": "7.20.15",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz",
+      "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg=="
+    },
+    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz",
+      "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz",
+      "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+        "@babel/plugin-proposal-optional-chaining": "^7.20.7"
+      }
+    },
+    "@babel/plugin-proposal-async-generator-functions": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz",
+      "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-environment-visitor": "^7.18.9",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-remap-async-to-generator": "^7.18.9",
+        "@babel/plugin-syntax-async-generators": "^7.8.4"
+      }
+    },
+    "@babel/plugin-proposal-class-properties": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
+      "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-proposal-class-static-block": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz",
+      "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.20.7",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/plugin-syntax-class-static-block": "^7.14.5"
+      }
+    },
+    "@babel/plugin-proposal-decorators": {
+      "version": "7.20.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.13.tgz",
+      "integrity": "sha512-7T6BKHa9Cpd7lCueHBBzP0nkXNina+h5giOZw+a8ZpMfPFY19VjJAjIxyFHuWkhCWgL6QMqRiY/wB1fLXzm6Mw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.20.12",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-replace-supers": "^7.20.7",
+        "@babel/helper-split-export-declaration": "^7.18.6",
+        "@babel/plugin-syntax-decorators": "^7.19.0"
+      }
+    },
+    "@babel/plugin-proposal-dynamic-import": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz",
+      "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-export-namespace-from": {
+      "version": "7.18.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz",
+      "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.9",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-json-strings": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz",
+      "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6",
+        "@babel/plugin-syntax-json-strings": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-logical-assignment-operators": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz",
+      "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-nullish-coalescing-operator": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz",
+      "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-numeric-separator": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz",
+      "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-object-rest-spread": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz",
+      "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.20.5",
+        "@babel/helper-compilation-targets": "^7.20.7",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-transform-parameters": "^7.20.7"
+      }
+    },
+    "@babel/plugin-proposal-optional-catch-binding": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz",
+      "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-optional-chaining": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz",
+      "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-private-methods": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz",
+      "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-proposal-private-property-in-object": {
+      "version": "7.20.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz",
+      "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.18.6",
+        "@babel/helper-create-class-features-plugin": "^7.20.5",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+      }
+    },
+    "@babel/plugin-proposal-unicode-property-regex": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz",
+      "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-syntax-async-generators": {
+      "version": "7.8.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-class-properties": {
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-syntax-class-static-block": {
+      "version": "7.14.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+      "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-syntax-decorators": {
+      "version": "7.19.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz",
+      "integrity": "sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.19.0"
+      }
+    },
+    "@babel/plugin-syntax-dynamic-import": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-export-namespace-from": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.3"
+      }
+    },
+    "@babel/plugin-syntax-import-assertions": {
+      "version": "7.20.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz",
+      "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.19.0"
+      }
+    },
+    "@babel/plugin-syntax-json-strings": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-jsx": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz",
+      "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-syntax-logical-assignment-operators": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-nullish-coalescing-operator": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-numeric-separator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-chaining": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-private-property-in-object": {
+      "version": "7.14.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+      "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-syntax-top-level-await": {
+      "version": "7.14.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+      "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-arrow-functions": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz",
+      "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.20.2"
+      }
+    },
+    "@babel/plugin-transform-async-to-generator": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz",
+      "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-remap-async-to-generator": "^7.18.9"
+      }
+    },
+    "@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz",
+      "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-transform-block-scoping": {
+      "version": "7.20.15",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz",
+      "integrity": "sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.20.2"
+      }
+    },
+    "@babel/plugin-transform-classes": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz",
+      "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.18.6",
+        "@babel/helper-compilation-targets": "^7.20.7",
+        "@babel/helper-environment-visitor": "^7.18.9",
+        "@babel/helper-function-name": "^7.19.0",
+        "@babel/helper-optimise-call-expression": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-replace-supers": "^7.20.7",
+        "@babel/helper-split-export-declaration": "^7.18.6",
+        "globals": "^11.1.0"
+      }
+    },
+    "@babel/plugin-transform-computed-properties": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz",
+      "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/template": "^7.20.7"
+      }
+    },
+    "@babel/plugin-transform-destructuring": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz",
+      "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.20.2"
+      }
+    },
+    "@babel/plugin-transform-dotall-regex": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz",
+      "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-transform-duplicate-keys": {
+      "version": "7.18.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz",
+      "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.9"
+      }
+    },
+    "@babel/plugin-transform-exponentiation-operator": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz",
+      "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-transform-for-of": {
+      "version": "7.18.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz",
+      "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-transform-function-name": {
+      "version": "7.18.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz",
+      "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-compilation-targets": "^7.18.9",
+        "@babel/helper-function-name": "^7.18.9",
+        "@babel/helper-plugin-utils": "^7.18.9"
+      }
+    },
+    "@babel/plugin-transform-literals": {
+      "version": "7.18.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz",
+      "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.9"
+      }
+    },
+    "@babel/plugin-transform-member-expression-literals": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz",
+      "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-transform-modules-amd": {
+      "version": "7.20.11",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz",
+      "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.20.11",
+        "@babel/helper-plugin-utils": "^7.20.2"
+      }
+    },
+    "@babel/plugin-transform-modules-commonjs": {
+      "version": "7.20.11",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz",
+      "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.20.11",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-simple-access": "^7.20.2"
+      }
+    },
+    "@babel/plugin-transform-modules-systemjs": {
+      "version": "7.20.11",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz",
+      "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-hoist-variables": "^7.18.6",
+        "@babel/helper-module-transforms": "^7.20.11",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-validator-identifier": "^7.19.1"
+      }
+    },
+    "@babel/plugin-transform-modules-umd": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz",
+      "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-transform-named-capturing-groups-regex": {
+      "version": "7.20.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz",
+      "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.20.5",
+        "@babel/helper-plugin-utils": "^7.20.2"
+      }
+    },
+    "@babel/plugin-transform-new-target": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz",
+      "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-transform-object-super": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz",
+      "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6",
+        "@babel/helper-replace-supers": "^7.18.6"
+      }
+    },
+    "@babel/plugin-transform-parameters": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz",
+      "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.20.2"
+      }
+    },
+    "@babel/plugin-transform-property-literals": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz",
+      "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-transform-regenerator": {
+      "version": "7.20.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz",
+      "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "regenerator-transform": "^0.15.1"
+      }
+    },
+    "@babel/plugin-transform-reserved-words": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz",
+      "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-transform-runtime": {
+      "version": "7.19.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz",
+      "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.19.0",
+        "babel-plugin-polyfill-corejs2": "^0.3.3",
+        "babel-plugin-polyfill-corejs3": "^0.6.0",
+        "babel-plugin-polyfill-regenerator": "^0.4.1",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "@babel/plugin-transform-shorthand-properties": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz",
+      "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-transform-spread": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz",
+      "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0"
+      }
+    },
+    "@babel/plugin-transform-sticky-regex": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz",
+      "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/plugin-transform-template-literals": {
+      "version": "7.18.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz",
+      "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.9"
+      }
+    },
+    "@babel/plugin-transform-typeof-symbol": {
+      "version": "7.18.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz",
+      "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.9"
+      }
+    },
+    "@babel/plugin-transform-unicode-escapes": {
+      "version": "7.18.10",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz",
+      "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.18.9"
+      }
+    },
+    "@babel/plugin-transform-unicode-regex": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz",
+      "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      }
+    },
+    "@babel/preset-env": {
+      "version": "7.20.2",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz",
+      "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.20.1",
+        "@babel/helper-compilation-targets": "^7.20.0",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-validator-option": "^7.18.6",
+        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9",
+        "@babel/plugin-proposal-async-generator-functions": "^7.20.1",
+        "@babel/plugin-proposal-class-properties": "^7.18.6",
+        "@babel/plugin-proposal-class-static-block": "^7.18.6",
+        "@babel/plugin-proposal-dynamic-import": "^7.18.6",
+        "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
+        "@babel/plugin-proposal-json-strings": "^7.18.6",
+        "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9",
+        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
+        "@babel/plugin-proposal-numeric-separator": "^7.18.6",
+        "@babel/plugin-proposal-object-rest-spread": "^7.20.2",
+        "@babel/plugin-proposal-optional-catch-binding": "^7.18.6",
+        "@babel/plugin-proposal-optional-chaining": "^7.18.9",
+        "@babel/plugin-proposal-private-methods": "^7.18.6",
+        "@babel/plugin-proposal-private-property-in-object": "^7.18.6",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.18.6",
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/plugin-syntax-class-properties": "^7.12.13",
+        "@babel/plugin-syntax-class-static-block": "^7.14.5",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+        "@babel/plugin-syntax-import-assertions": "^7.20.0",
+        "@babel/plugin-syntax-json-strings": "^7.8.3",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+        "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+        "@babel/plugin-syntax-top-level-await": "^7.14.5",
+        "@babel/plugin-transform-arrow-functions": "^7.18.6",
+        "@babel/plugin-transform-async-to-generator": "^7.18.6",
+        "@babel/plugin-transform-block-scoped-functions": "^7.18.6",
+        "@babel/plugin-transform-block-scoping": "^7.20.2",
+        "@babel/plugin-transform-classes": "^7.20.2",
+        "@babel/plugin-transform-computed-properties": "^7.18.9",
+        "@babel/plugin-transform-destructuring": "^7.20.2",
+        "@babel/plugin-transform-dotall-regex": "^7.18.6",
+        "@babel/plugin-transform-duplicate-keys": "^7.18.9",
+        "@babel/plugin-transform-exponentiation-operator": "^7.18.6",
+        "@babel/plugin-transform-for-of": "^7.18.8",
+        "@babel/plugin-transform-function-name": "^7.18.9",
+        "@babel/plugin-transform-literals": "^7.18.9",
+        "@babel/plugin-transform-member-expression-literals": "^7.18.6",
+        "@babel/plugin-transform-modules-amd": "^7.19.6",
+        "@babel/plugin-transform-modules-commonjs": "^7.19.6",
+        "@babel/plugin-transform-modules-systemjs": "^7.19.6",
+        "@babel/plugin-transform-modules-umd": "^7.18.6",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1",
+        "@babel/plugin-transform-new-target": "^7.18.6",
+        "@babel/plugin-transform-object-super": "^7.18.6",
+        "@babel/plugin-transform-parameters": "^7.20.1",
+        "@babel/plugin-transform-property-literals": "^7.18.6",
+        "@babel/plugin-transform-regenerator": "^7.18.6",
+        "@babel/plugin-transform-reserved-words": "^7.18.6",
+        "@babel/plugin-transform-shorthand-properties": "^7.18.6",
+        "@babel/plugin-transform-spread": "^7.19.0",
+        "@babel/plugin-transform-sticky-regex": "^7.18.6",
+        "@babel/plugin-transform-template-literals": "^7.18.9",
+        "@babel/plugin-transform-typeof-symbol": "^7.18.9",
+        "@babel/plugin-transform-unicode-escapes": "^7.18.10",
+        "@babel/plugin-transform-unicode-regex": "^7.18.6",
+        "@babel/preset-modules": "^0.1.5",
+        "@babel/types": "^7.20.2",
+        "babel-plugin-polyfill-corejs2": "^0.3.3",
+        "babel-plugin-polyfill-corejs3": "^0.6.0",
+        "babel-plugin-polyfill-regenerator": "^0.4.1",
+        "core-js-compat": "^3.25.1",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "@babel/preset-modules": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
+      "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
+      "dev": true,
+      "requires": {
+        "@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": {
+      "version": "7.20.13",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz",
+      "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==",
+      "dev": true,
+      "requires": {
+        "regenerator-runtime": "^0.13.11"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.13.11",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+          "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+          "dev": true
+        }
+      }
+    },
+    "@babel/template": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
+      "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.18.6",
+        "@babel/parser": "^7.20.7",
+        "@babel/types": "^7.20.7"
+      }
+    },
+    "@babel/traverse": {
+      "version": "7.20.13",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz",
+      "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.18.6",
+        "@babel/generator": "^7.20.7",
+        "@babel/helper-environment-visitor": "^7.18.9",
+        "@babel/helper-function-name": "^7.19.0",
+        "@babel/helper-hoist-variables": "^7.18.6",
+        "@babel/helper-split-export-declaration": "^7.18.6",
+        "@babel/parser": "^7.20.13",
+        "@babel/types": "^7.20.7",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0"
+      }
+    },
+    "@babel/types": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
+      "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-string-parser": "^7.19.4",
+        "@babel/helper-validator-identifier": "^7.19.1",
+        "to-fast-properties": "^2.0.0"
+      }
+    },
+    "@gar/promisify": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
+      "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw=="
+    },
+    "@hapi/address": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
+      "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==",
+      "dev": true
+    },
+    "@hapi/bourne": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz",
+      "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==",
+      "dev": true
+    },
+    "@hapi/hoek": {
+      "version": "8.5.1",
+      "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz",
+      "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==",
+      "dev": true
+    },
+    "@hapi/joi": {
+      "version": "15.1.1",
+      "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz",
+      "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==",
+      "dev": true,
+      "requires": {
+        "@hapi/address": "2.x.x",
+        "@hapi/bourne": "1.x.x",
+        "@hapi/hoek": "8.x.x",
+        "@hapi/topo": "3.x.x"
+      }
+    },
+    "@hapi/topo": {
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz",
+      "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==",
+      "dev": true,
+      "requires": {
+        "@hapi/hoek": "^8.3.0"
+      }
+    },
+    "@intervolga/optimize-cssnano-plugin": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz",
+      "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==",
+      "dev": true,
+      "requires": {
+        "cssnano": "^4.0.0",
+        "cssnano-preset-default": "^4.0.0",
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "@jridgewell/gen-mapping": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+      "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/set-array": "^1.0.0",
+        "@jridgewell/sourcemap-codec": "^1.4.10"
+      }
+    },
+    "@jridgewell/resolve-uri": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+      "dev": true
+    },
+    "@jridgewell/set-array": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+      "dev": true
+    },
+    "@jridgewell/sourcemap-codec": {
+      "version": "1.4.14",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+      "dev": true
+    },
+    "@jridgewell/trace-mapping": {
+      "version": "0.3.17",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+      "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/resolve-uri": "3.1.0",
+        "@jridgewell/sourcemap-codec": "1.4.14"
+      }
+    },
+    "@microsoft/signalr": {
+      "version": "5.0.17",
+      "resolved": "https://registry.npmjs.org/@microsoft/signalr/-/signalr-5.0.17.tgz",
+      "integrity": "sha512-zTjFxjh67WWCe35ZipsqkktM5mM+MsckyyI2ZvFmYWR7ibpUoAyZI1DFdYfwXfsyBdlykDaW84o9lrB+9tDpaA==",
+      "requires": {
+        "abort-controller": "^3.0.0",
+        "eventsource": "^1.0.7",
+        "fetch-cookie": "^0.7.3",
+        "node-fetch": "^2.6.7",
+        "ws": "^6.0.0"
+      }
+    },
+    "@mrmlnc/readdir-enhanced": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+      "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+      "dev": true,
+      "requires": {
+        "call-me-maybe": "^1.0.1",
+        "glob-to-regexp": "^0.3.0"
+      }
+    },
+    "@node-ipc/js-queue": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@node-ipc/js-queue/-/js-queue-2.0.3.tgz",
+      "integrity": "sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==",
+      "dev": true,
+      "requires": {
+        "easy-stack": "1.0.1"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
+      "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
+      "dev": true
+    },
+    "@npmcli/fs": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz",
+      "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==",
+      "requires": {
+        "@gar/promisify": "^1.0.1",
+        "semver": "^7.3.5"
+      }
+    },
+    "@npmcli/move-file": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
+      "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
+      "requires": {
+        "mkdirp": "^1.0.4",
+        "rimraf": "^3.0.2"
+      }
+    },
+    "@soda/friendly-errors-webpack-plugin": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz",
+      "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==",
+      "dev": true,
+      "requires": {
+        "chalk": "^3.0.0",
+        "error-stack-parser": "^2.0.6",
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@soda/get-current-script": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@soda/get-current-script/-/get-current-script-1.0.2.tgz",
+      "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==",
+      "dev": true
+    },
+    "@types/body-parser": {
+      "version": "1.19.2",
+      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
+      "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
+      "dev": true,
+      "requires": {
+        "@types/connect": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/connect": {
+      "version": "3.4.35",
+      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
+      "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/connect-history-api-fallback": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
+      "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
+      "dev": true,
+      "requires": {
+        "@types/express-serve-static-core": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/express": {
+      "version": "4.17.17",
+      "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
+      "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
+      "dev": true,
+      "requires": {
+        "@types/body-parser": "*",
+        "@types/express-serve-static-core": "^4.17.33",
+        "@types/qs": "*",
+        "@types/serve-static": "*"
+      }
+    },
+    "@types/express-serve-static-core": {
+      "version": "4.17.33",
+      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz",
+      "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "@types/qs": "*",
+        "@types/range-parser": "*"
+      }
+    },
+    "@types/glob": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
+      "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
+      "dev": true,
+      "requires": {
+        "@types/minimatch": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/http-proxy": {
+      "version": "1.17.9",
+      "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz",
+      "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/json-schema": {
+      "version": "7.0.11",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+      "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ=="
+    },
+    "@types/mime": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz",
+      "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==",
+      "dev": true
+    },
+    "@types/minimatch": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
+      "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==",
+      "dev": true
+    },
+    "@types/minimist": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
+      "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
+      "dev": true
+    },
+    "@types/node": {
+      "version": "18.11.18",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
+      "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==",
+      "dev": true
+    },
+    "@types/normalize-package-data": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
+      "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
+      "dev": true
+    },
+    "@types/q": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz",
+      "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==",
+      "dev": true
+    },
+    "@types/qs": {
+      "version": "6.9.7",
+      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
+      "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
+      "dev": true
+    },
+    "@types/range-parser": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
+      "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
+      "dev": true
+    },
+    "@types/serve-static": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz",
+      "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==",
+      "dev": true,
+      "requires": {
+        "@types/mime": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/source-list-map": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz",
+      "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==",
+      "dev": true
+    },
+    "@types/tapable": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz",
+      "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==",
+      "dev": true
+    },
+    "@types/uglify-js": {
+      "version": "3.17.1",
+      "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.1.tgz",
+      "integrity": "sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g==",
+      "dev": true,
+      "requires": {
+        "source-map": "^0.6.1"
+      }
+    },
+    "@types/webpack": {
+      "version": "4.41.33",
+      "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.33.tgz",
+      "integrity": "sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "@types/tapable": "^1",
+        "@types/uglify-js": "*",
+        "@types/webpack-sources": "*",
+        "anymatch": "^3.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "@types/webpack-dev-server": {
+      "version": "3.11.6",
+      "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz",
+      "integrity": "sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ==",
+      "dev": true,
+      "requires": {
+        "@types/connect-history-api-fallback": "*",
+        "@types/express": "*",
+        "@types/serve-static": "*",
+        "@types/webpack": "^4",
+        "http-proxy-middleware": "^1.0.0"
+      }
+    },
+    "@types/webpack-sources": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz",
+      "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "@types/source-list-map": "*",
+        "source-map": "^0.7.3"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.7.4",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+          "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+          "dev": true
+        }
+      }
+    },
+    "@vue/babel-helper-vue-jsx-merge-props": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz",
+      "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==",
+      "dev": true
+    },
+    "@vue/babel-helper-vue-transform-on": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz",
+      "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==",
+      "dev": true
+    },
+    "@vue/babel-plugin-jsx": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz",
+      "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/plugin-syntax-jsx": "^7.0.0",
+        "@babel/template": "^7.0.0",
+        "@babel/traverse": "^7.0.0",
+        "@babel/types": "^7.0.0",
+        "@vue/babel-helper-vue-transform-on": "^1.0.2",
+        "camelcase": "^6.0.0",
+        "html-tags": "^3.1.0",
+        "svg-tags": "^1.0.0"
+      }
+    },
+    "@vue/babel-plugin-transform-vue-jsx": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz",
+      "integrity": "sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/plugin-syntax-jsx": "^7.2.0",
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0",
+        "html-tags": "^2.0.0",
+        "lodash.kebabcase": "^4.1.1",
+        "svg-tags": "^1.0.0"
+      },
+      "dependencies": {
+        "html-tags": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz",
+          "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==",
+          "dev": true
+        }
+      }
+    },
+    "@vue/babel-preset-app": {
+      "version": "4.5.19",
+      "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.19.tgz",
+      "integrity": "sha512-VCNRiAt2P/bLo09rYt3DLe6xXUMlhJwrvU18Ddd/lYJgC7s8+wvhgYs+MTx4OiAXdu58drGwSBO9SPx7C6J82Q==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.11.0",
+        "@babel/helper-compilation-targets": "^7.9.6",
+        "@babel/helper-module-imports": "^7.8.3",
+        "@babel/plugin-proposal-class-properties": "^7.8.3",
+        "@babel/plugin-proposal-decorators": "^7.8.3",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+        "@babel/plugin-syntax-jsx": "^7.8.3",
+        "@babel/plugin-transform-runtime": "^7.11.0",
+        "@babel/preset-env": "^7.11.0",
+        "@babel/runtime": "^7.11.0",
+        "@vue/babel-plugin-jsx": "^1.0.3",
+        "@vue/babel-preset-jsx": "^1.2.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3",
+        "core-js": "^3.6.5",
+        "core-js-compat": "^3.6.5",
+        "semver": "^6.1.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "@vue/babel-preset-jsx": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz",
+      "integrity": "sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==",
+      "dev": true,
+      "requires": {
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0",
+        "@vue/babel-plugin-transform-vue-jsx": "^1.4.0",
+        "@vue/babel-sugar-composition-api-inject-h": "^1.4.0",
+        "@vue/babel-sugar-composition-api-render-instance": "^1.4.0",
+        "@vue/babel-sugar-functional-vue": "^1.4.0",
+        "@vue/babel-sugar-inject-h": "^1.4.0",
+        "@vue/babel-sugar-v-model": "^1.4.0",
+        "@vue/babel-sugar-v-on": "^1.4.0"
+      }
+    },
+    "@vue/babel-sugar-composition-api-inject-h": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz",
+      "integrity": "sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0"
+      }
+    },
+    "@vue/babel-sugar-composition-api-render-instance": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz",
+      "integrity": "sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0"
+      }
+    },
+    "@vue/babel-sugar-functional-vue": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz",
+      "integrity": "sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0"
+      }
+    },
+    "@vue/babel-sugar-inject-h": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz",
+      "integrity": "sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0"
+      }
+    },
+    "@vue/babel-sugar-v-model": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz",
+      "integrity": "sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0",
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0",
+        "@vue/babel-plugin-transform-vue-jsx": "^1.4.0",
+        "camelcase": "^5.0.0",
+        "html-tags": "^2.0.0",
+        "svg-tags": "^1.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+          "dev": true
+        },
+        "html-tags": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz",
+          "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==",
+          "dev": true
+        }
+      }
+    },
+    "@vue/babel-sugar-v-on": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz",
+      "integrity": "sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0",
+        "@vue/babel-plugin-transform-vue-jsx": "^1.4.0",
+        "camelcase": "^5.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+          "dev": true
+        }
+      }
+    },
+    "@vue/cli-overlay": {
+      "version": "4.5.19",
+      "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-4.5.19.tgz",
+      "integrity": "sha512-GdxvNSmOw7NHIazCO8gTK+xZbaOmScTtxj6eHVeMbYpDYVPJ+th3VMLWNpw/b6uOjwzzcyKlA5dRQ1DAb+gF/g==",
+      "dev": true
+    },
+    "@vue/cli-plugin-babel": {
+      "version": "4.5.19",
+      "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.19.tgz",
+      "integrity": "sha512-8ebXzaMW9KNTMAN6+DzkhFsjty1ieqT7hIW5Lbk4v30Qhfjkms7lBWyXPGkoq+wAikXFa1Gnam2xmWOBqDDvWg==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.11.0",
+        "@vue/babel-preset-app": "^4.5.19",
+        "@vue/cli-shared-utils": "^4.5.19",
+        "babel-loader": "^8.1.0",
+        "cache-loader": "^4.1.0",
+        "thread-loader": "^2.1.3",
+        "webpack": "^4.0.0"
+      }
+    },
+    "@vue/cli-plugin-eslint": {
+      "version": "4.5.19",
+      "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.19.tgz",
+      "integrity": "sha512-53sa4Pu9j5KajesFlj494CcO8vVo3e3nnZ1CCKjGGnrF90id1rUeepcFfz5XjwfEtbJZp2x/NoX/EZE6zCzSFQ==",
+      "dev": true,
+      "requires": {
+        "@vue/cli-shared-utils": "^4.5.19",
+        "eslint-loader": "^2.2.1",
+        "globby": "^9.2.0",
+        "inquirer": "^7.1.0",
+        "webpack": "^4.0.0",
+        "yorkie": "^2.0.0"
+      }
+    },
+    "@vue/cli-plugin-router": {
+      "version": "4.5.19",
+      "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.5.19.tgz",
+      "integrity": "sha512-3icGzH1IbVYmMMsOwYa0lal/gtvZLebFXdE5hcQJo2mnTwngXGMTyYAzL56EgHBPjbMmRpyj6Iw9k4aVInVX6A==",
+      "dev": true,
+      "requires": {
+        "@vue/cli-shared-utils": "^4.5.19"
+      }
+    },
+    "@vue/cli-plugin-vuex": {
+      "version": "4.5.19",
+      "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.19.tgz",
+      "integrity": "sha512-DUmfdkG3pCdkP7Iznd87RfE9Qm42mgp2hcrNcYQYSru1W1gX2dG/JcW8bxmeGSa06lsxi9LEIc/QD1yPajSCZw==",
+      "dev": true
+    },
+    "@vue/cli-service": {
+      "version": "4.5.19",
+      "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-4.5.19.tgz",
+      "integrity": "sha512-+Wpvj8fMTCt9ZPOLu5YaLkFCQmB4MrZ26aRmhhKiCQ/4PMoL6mLezfqdt6c+m2htM+1WV5RunRo+0WHl2DfwZA==",
+      "dev": true,
+      "requires": {
+        "@intervolga/optimize-cssnano-plugin": "^1.0.5",
+        "@soda/friendly-errors-webpack-plugin": "^1.7.1",
+        "@soda/get-current-script": "^1.0.0",
+        "@types/minimist": "^1.2.0",
+        "@types/webpack": "^4.0.0",
+        "@types/webpack-dev-server": "^3.11.0",
+        "@vue/cli-overlay": "^4.5.19",
+        "@vue/cli-plugin-router": "^4.5.19",
+        "@vue/cli-plugin-vuex": "^4.5.19",
+        "@vue/cli-shared-utils": "^4.5.19",
+        "@vue/component-compiler-utils": "^3.1.2",
+        "@vue/preload-webpack-plugin": "^1.1.0",
+        "@vue/web-component-wrapper": "^1.2.0",
+        "acorn": "^7.4.0",
+        "acorn-walk": "^7.1.1",
+        "address": "^1.1.2",
+        "autoprefixer": "^9.8.6",
+        "browserslist": "^4.12.0",
+        "cache-loader": "^4.1.0",
+        "case-sensitive-paths-webpack-plugin": "^2.3.0",
+        "cli-highlight": "^2.1.4",
+        "clipboardy": "^2.3.0",
+        "cliui": "^6.0.0",
+        "copy-webpack-plugin": "^5.1.1",
+        "css-loader": "^3.5.3",
+        "cssnano": "^4.1.10",
+        "debug": "^4.1.1",
+        "default-gateway": "^5.0.5",
+        "dotenv": "^8.2.0",
+        "dotenv-expand": "^5.1.0",
+        "file-loader": "^4.2.0",
+        "fs-extra": "^7.0.1",
+        "globby": "^9.2.0",
+        "hash-sum": "^2.0.0",
+        "html-webpack-plugin": "^3.2.0",
+        "launch-editor-middleware": "^2.2.1",
+        "lodash.defaultsdeep": "^4.6.1",
+        "lodash.mapvalues": "^4.6.0",
+        "lodash.transform": "^4.6.0",
+        "mini-css-extract-plugin": "^0.9.0",
+        "minimist": "^1.2.5",
+        "pnp-webpack-plugin": "^1.6.4",
+        "portfinder": "^1.0.26",
+        "postcss-loader": "^3.0.0",
+        "ssri": "^8.0.1",
+        "terser-webpack-plugin": "^1.4.4",
+        "thread-loader": "^2.1.3",
+        "url-loader": "^2.2.0",
+        "vue-loader": "^15.9.2",
+        "vue-loader-v16": "npm:vue-loader@^16.1.0",
+        "vue-style-loader": "^4.1.2",
+        "webpack": "^4.0.0",
+        "webpack-bundle-analyzer": "^3.8.0",
+        "webpack-chain": "^6.4.0",
+        "webpack-dev-server": "^3.11.0",
+        "webpack-merge": "^4.2.2"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "7.4.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "vue-loader-v16": {
+          "version": "npm:vue-loader@16.8.3",
+          "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
+          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "hash-sum": "^2.0.0",
+            "loader-utils": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@vue/cli-shared-utils": {
+      "version": "4.5.19",
+      "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.5.19.tgz",
+      "integrity": "sha512-JYpdsrC/d9elerKxbEUtmSSU6QRM60rirVubOewECHkBHj+tLNznWq/EhCjswywtePyLaMUK25eTqnTSZlEE+g==",
+      "dev": true,
+      "requires": {
+        "@achrinza/node-ipc": "9.2.2",
+        "@hapi/joi": "^15.0.1",
+        "chalk": "^2.4.2",
+        "execa": "^1.0.0",
+        "launch-editor": "^2.2.1",
+        "lru-cache": "^5.1.1",
+        "open": "^6.3.0",
+        "ora": "^3.4.0",
+        "read-pkg": "^5.1.1",
+        "request": "^2.88.2",
+        "semver": "^6.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
+      }
+    },
+    "@vue/compiler-sfc": {
+      "version": "2.7.14",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz",
+      "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==",
+      "requires": {
+        "@babel/parser": "^7.18.4",
+        "postcss": "^8.4.14",
+        "source-map": "^0.6.1"
+      }
+    },
+    "@vue/component-compiler-utils": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz",
+      "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==",
+      "dev": true,
+      "requires": {
+        "consolidate": "^0.15.1",
+        "hash-sum": "^1.0.2",
+        "lru-cache": "^4.1.2",
+        "merge-source-map": "^1.1.0",
+        "postcss": "^7.0.36",
+        "postcss-selector-parser": "^6.0.2",
+        "prettier": "^1.18.2 || ^2.0.0",
+        "source-map": "~0.6.1",
+        "vue-template-es2015-compiler": "^1.9.0"
+      },
+      "dependencies": {
+        "hash-sum": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
+          "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "4.1.5",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+          "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+          "dev": true,
+          "requires": {
+            "pseudomap": "^1.0.2",
+            "yallist": "^2.1.2"
+          }
+        },
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "yallist": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+          "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+          "dev": true
+        }
+      }
+    },
+    "@vue/eslint-config-prettier": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-6.0.0.tgz",
+      "integrity": "sha512-wFQmv45c3ige5EA+ngijq40YpVcIkAy0Lihupnsnd1Dao5CBbPyfCzqtejFLZX1EwH/kCJdpz3t6s+5wd3+KxQ==",
+      "dev": true,
+      "requires": {
+        "eslint-config-prettier": "^6.0.0"
+      }
+    },
+    "@vue/preload-webpack-plugin": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz",
+      "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==",
+      "dev": true
+    },
+    "@vue/web-component-wrapper": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz",
+      "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==",
+      "dev": true
+    },
+    "@webassemblyjs/ast": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+      "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+      "dev": true,
+      "requires": {
+        "@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": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+      "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-api-error": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+      "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-buffer": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+      "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-code-frame": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+      "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/wast-printer": "1.9.0"
+      }
+    },
+    "@webassemblyjs/helper-fsm": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+      "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-module-context": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+      "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0"
+      }
+    },
+    "@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+      "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-wasm-section": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+      "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
+      "dev": true,
+      "requires": {
+        "@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": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+      "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
+      "dev": true,
+      "requires": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "@webassemblyjs/leb128": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+      "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
+      "dev": true,
+      "requires": {
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@webassemblyjs/utf8": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+      "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
+      "dev": true
+    },
+    "@webassemblyjs/wasm-edit": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+      "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
+      "dev": true,
+      "requires": {
+        "@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": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+      "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
+      "dev": true,
+      "requires": {
+        "@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": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+      "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
+      "dev": true,
+      "requires": {
+        "@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": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+      "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
+      "dev": true,
+      "requires": {
+        "@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": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+      "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
+      "dev": true,
+      "requires": {
+        "@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": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+      "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+      "dev": true
+    },
+    "@xtuc/long": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+      "dev": true
+    },
+    "abbrev": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+      "dev": true
+    },
+    "abort-controller": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+      "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+      "requires": {
+        "event-target-shim": "^5.0.0"
+      }
+    },
+    "accepts": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+      "dev": true,
+      "requires": {
+        "mime-types": "~2.1.34",
+        "negotiator": "0.6.3"
+      }
+    },
+    "acorn": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
+      "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
+      "dev": true
+    },
+    "acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "dev": true
+    },
+    "acorn-walk": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+      "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+      "dev": true
+    },
+    "address": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
+      "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
+      "dev": true
+    },
+    "adler-32": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz",
+      "integrity": "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==",
+      "requires": {
+        "exit-on-epipe": "~1.0.1",
+        "printj": "~1.1.0"
+      }
+    },
+    "aggregate-error": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+      "requires": {
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      }
+    },
+    "ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "requires": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "ajv-errors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
+      "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
+      "dev": true
+    },
+    "ajv-keywords": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
+    },
+    "alphanum-sort": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+      "integrity": "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==",
+      "dev": true
+    },
+    "amdefine": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+      "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
+      "dev": true
+    },
+    "ansi-colors": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
+      "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
+      "dev": true
+    },
+    "ansi-escapes": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+      "dev": true,
+      "requires": {
+        "type-fest": "^0.21.3"
+      },
+      "dependencies": {
+        "type-fest": {
+          "version": "0.21.3",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+          "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+          "dev": true
+        }
+      }
+    },
+    "ansi-html-community": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
+      "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
+      "dev": true
+    },
+    "ansi-regex": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+      "dev": true
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "any-promise": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+      "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+      "dev": true
+    },
+    "anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+      "dev": true,
+      "requires": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      }
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+      "dev": true
+    },
+    "arch": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
+      "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
+      "dev": true
+    },
+    "are-we-there-yet": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
+      "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
+      "dev": true,
+      "requires": {
+        "delegates": "^1.0.0",
+        "readable-stream": "^2.0.6"
+      }
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "arr-diff": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+      "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==",
+      "dev": true
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+      "dev": true
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==",
+      "dev": true
+    },
+    "array-find-index": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+      "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==",
+      "dev": true
+    },
+    "array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+      "dev": true
+    },
+    "array-union": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+      "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==",
+      "dev": true,
+      "requires": {
+        "array-uniq": "^1.0.1"
+      }
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+      "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
+      "dev": true
+    },
+    "array-unique": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+      "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==",
+      "dev": true
+    },
+    "array.prototype.reduce": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz",
+      "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.20.4",
+        "es-array-method-boxes-properly": "^1.0.0",
+        "is-string": "^1.0.7"
+      }
+    },
+    "asn1": {
+      "version": "0.2.6",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+      "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "asn1.js": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+      "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "safer-buffer": "^2.1.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+          "dev": true
+        }
+      }
+    },
+    "assert": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
+      "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
+      "dev": true,
+      "requires": {
+        "object-assign": "^4.1.1",
+        "util": "0.10.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+          "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==",
+          "dev": true
+        },
+        "util": {
+          "version": "0.10.3",
+          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+          "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==",
+          "dev": true,
+          "requires": {
+            "inherits": "2.0.1"
+          }
+        }
+      }
+    },
+    "assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+      "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+      "dev": true
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==",
+      "dev": true
+    },
+    "astral-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+      "dev": true
+    },
+    "async": {
+      "version": "2.6.4",
+      "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
+      "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.14"
+      }
+    },
+    "async-each": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.5.tgz",
+      "integrity": "sha512-5QzqtU3BlagehwmdoqwaS2FBQF2P5eL6vFqXwNsb5jwoEsmtfAXg1ocFvW7I6/gGLFhBMKwcMwZuy7uv/Bo9jA==",
+      "dev": true
+    },
+    "async-foreach": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
+      "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==",
+      "dev": true
+    },
+    "async-limiter": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
+    },
+    "async-validator": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
+      "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
+      "requires": {
+        "babel-runtime": "6.x"
+      }
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "dev": true
+    },
+    "atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+      "dev": true
+    },
+    "autoprefixer": {
+      "version": "9.8.8",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz",
+      "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.12.0",
+        "caniuse-lite": "^1.0.30001109",
+        "normalize-range": "^0.1.2",
+        "num2fraction": "^1.2.2",
+        "picocolors": "^0.2.1",
+        "postcss": "^7.0.32",
+        "postcss-value-parser": "^4.1.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "available-typed-arrays": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+      "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+      "dev": true
+    },
+    "aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+      "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+      "dev": true
+    },
+    "aws4": {
+      "version": "1.12.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
+      "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
+      "dev": true
+    },
+    "axios": {
+      "version": "0.21.4",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+      "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
+      "requires": {
+        "follow-redirects": "^1.14.0"
+      }
+    },
+    "babel-eslint": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
+      "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "@babel/parser": "^7.7.0",
+        "@babel/traverse": "^7.7.0",
+        "@babel/types": "^7.7.0",
+        "eslint-visitor-keys": "^1.0.0",
+        "resolve": "^1.12.0"
+      }
+    },
+    "babel-helper-vue-jsx-merge-props": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
+      "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
+    },
+    "babel-loader": {
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz",
+      "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==",
+      "dev": true,
+      "requires": {
+        "find-cache-dir": "^3.3.1",
+        "loader-utils": "^2.0.0",
+        "make-dir": "^3.1.0",
+        "schema-utils": "^2.6.5"
+      }
+    },
+    "babel-plugin-dynamic-import-node": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+      "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+      "dev": true,
+      "requires": {
+        "object.assign": "^4.1.0"
+      }
+    },
+    "babel-plugin-polyfill-corejs2": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz",
+      "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.17.7",
+        "@babel/helper-define-polyfill-provider": "^0.3.3",
+        "semver": "^6.1.1"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "babel-plugin-polyfill-corejs3": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz",
+      "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-define-polyfill-provider": "^0.3.3",
+        "core-js-compat": "^3.25.1"
+      }
+    },
+    "babel-plugin-polyfill-regenerator": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz",
+      "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-define-polyfill-provider": "^0.3.3"
+      }
+    },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
+      "requires": {
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
+      },
+      "dependencies": {
+        "core-js": {
+          "version": "2.6.12",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+          "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
+        }
+      }
+    },
+    "balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "dev": true
+    },
+    "batch": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+      "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
+      "dev": true
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+      "dev": true,
+      "requires": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
+    "bfj": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz",
+      "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.5",
+        "check-types": "^8.0.3",
+        "hoopy": "^0.1.4",
+        "tryer": "^1.0.1"
+      }
+    },
+    "big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+      "dev": true
+    },
+    "binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+      "dev": true,
+      "optional": true
+    },
+    "block-stream": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+      "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "~2.0.0"
+      }
+    },
+    "bluebird": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+      "dev": true
+    },
+    "bn.js": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+      "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
+      "dev": true
+    },
+    "body-parser": {
+      "version": "1.20.1",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
+      "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
+      "dev": true,
+      "requires": {
+        "bytes": "3.1.2",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "http-errors": "2.0.0",
+        "iconv-lite": "0.4.24",
+        "on-finished": "2.4.1",
+        "qs": "6.11.0",
+        "raw-body": "2.5.1",
+        "type-is": "~1.6.18",
+        "unpipe": "1.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+          "dev": true
+        }
+      }
+    },
+    "bonjour": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
+      "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==",
+      "dev": true,
+      "requires": {
+        "array-flatten": "^2.1.0",
+        "deep-equal": "^1.0.1",
+        "dns-equal": "^1.0.0",
+        "dns-txt": "^2.0.2",
+        "multicast-dns": "^6.0.1",
+        "multicast-dns-service-types": "^1.1.0"
+      },
+      "dependencies": {
+        "array-flatten": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
+          "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
+          "dev": true
+        }
+      }
+    },
+    "boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+      "dev": true
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
+      "dev": true
+    },
+    "browserify-aes": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+      "dev": true,
+      "requires": {
+        "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": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+      "dev": true,
+      "requires": {
+        "browserify-aes": "^1.0.4",
+        "browserify-des": "^1.0.0",
+        "evp_bytestokey": "^1.0.0"
+      }
+    },
+    "browserify-des": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "des.js": "^1.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "browserify-rsa": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+      "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^5.0.0",
+        "randombytes": "^2.0.1"
+      }
+    },
+    "browserify-sign": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+      "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^5.1.1",
+        "browserify-rsa": "^4.0.1",
+        "create-hash": "^1.2.0",
+        "create-hmac": "^1.1.7",
+        "elliptic": "^6.5.3",
+        "inherits": "^2.0.4",
+        "parse-asn1": "^5.1.5",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "browserify-zlib": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+      "dev": true,
+      "requires": {
+        "pako": "~1.0.5"
+      }
+    },
+    "browserslist": {
+      "version": "4.21.5",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+      "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
+      "dev": true,
+      "requires": {
+        "caniuse-lite": "^1.0.30001449",
+        "electron-to-chromium": "^1.4.284",
+        "node-releases": "^2.0.8",
+        "update-browserslist-db": "^1.0.10"
+      }
+    },
+    "buffer": {
+      "version": "4.9.2",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
+      "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
+      "dev": true,
+      "requires": {
+        "base64-js": "^1.0.2",
+        "ieee754": "^1.1.4",
+        "isarray": "^1.0.0"
+      }
+    },
+    "buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+      "dev": true
+    },
+    "buffer-indexof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
+      "dev": true
+    },
+    "buffer-json": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz",
+      "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==",
+      "dev": true
+    },
+    "buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
+      "dev": true
+    },
+    "builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==",
+      "dev": true
+    },
+    "bytes": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+      "dev": true
+    },
+    "cacache": {
+      "version": "15.3.0",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
+      "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==",
+      "requires": {
+        "@npmcli/fs": "^1.0.0",
+        "@npmcli/move-file": "^1.0.1",
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "glob": "^7.1.4",
+        "infer-owner": "^1.0.4",
+        "lru-cache": "^6.0.0",
+        "minipass": "^3.1.1",
+        "minipass-collect": "^1.0.2",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.2",
+        "mkdirp": "^1.0.3",
+        "p-map": "^4.0.0",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^3.0.2",
+        "ssri": "^8.0.1",
+        "tar": "^6.0.2",
+        "unique-filename": "^1.1.1"
+      }
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+      "dev": true,
+      "requires": {
+        "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-loader": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz",
+      "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==",
+      "dev": true,
+      "requires": {
+        "buffer-json": "^2.0.0",
+        "find-cache-dir": "^3.0.0",
+        "loader-utils": "^1.2.3",
+        "mkdirp": "^0.5.1",
+        "neo-async": "^2.6.1",
+        "schema-utils": "^2.0.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        }
+      }
+    },
+    "call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      }
+    },
+    "call-me-maybe": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz",
+      "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==",
+      "dev": true
+    },
+    "caller-callsite": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
+      "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==",
+      "dev": true,
+      "requires": {
+        "callsites": "^2.0.0"
+      }
+    },
+    "caller-path": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
+      "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==",
+      "dev": true,
+      "requires": {
+        "caller-callsite": "^2.0.0"
+      }
+    },
+    "callsites": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
+      "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==",
+      "dev": true
+    },
+    "camel-case": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+      "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==",
+      "dev": true,
+      "requires": {
+        "no-case": "^2.2.0",
+        "upper-case": "^1.1.1"
+      }
+    },
+    "camelcase": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+      "dev": true
+    },
+    "camelcase-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+      "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==",
+      "dev": true,
+      "requires": {
+        "camelcase": "^2.0.0",
+        "map-obj": "^1.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+          "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==",
+          "dev": true
+        }
+      }
+    },
+    "caniuse-api": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+      "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-lite": "^1.0.0",
+        "lodash.memoize": "^4.1.2",
+        "lodash.uniq": "^4.5.0"
+      }
+    },
+    "caniuse-lite": {
+      "version": "1.0.30001450",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz",
+      "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==",
+      "dev": true
+    },
+    "case-sensitive-paths-webpack-plugin": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz",
+      "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==",
+      "dev": true
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+      "dev": true
+    },
+    "cfb": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz",
+      "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+      "requires": {
+        "adler-32": "~1.3.0",
+        "crc-32": "~1.2.0"
+      },
+      "dependencies": {
+        "adler-32": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz",
+          "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="
+        }
+      }
+    },
+    "chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      }
+    },
+    "chardet": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+      "dev": true
+    },
+    "check-types": {
+      "version": "8.0.3",
+      "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz",
+      "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==",
+      "dev": true
+    },
+    "chokidar": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "fsevents": "~2.3.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true,
+          "optional": true
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "chownr": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="
+    },
+    "chrome-trace-event": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+      "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+      "dev": true
+    },
+    "ci-info": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
+      "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==",
+      "dev": true
+    },
+    "cipher-base": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "clean-css": {
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz",
+      "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==",
+      "dev": true,
+      "requires": {
+        "source-map": "~0.6.0"
+      }
+    },
+    "clean-stack": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
+    },
+    "cli-cursor": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+      "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "^2.0.0"
+      }
+    },
+    "cli-highlight": {
+      "version": "2.1.11",
+      "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz",
+      "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==",
+      "dev": true,
+      "requires": {
+        "chalk": "^4.0.0",
+        "highlight.js": "^10.7.1",
+        "mz": "^2.4.0",
+        "parse5": "^5.1.1",
+        "parse5-htmlparser2-tree-adapter": "^6.0.0",
+        "yargs": "^16.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "cli-spinners": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz",
+      "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==",
+      "dev": true
+    },
+    "cli-width": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+      "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+      "dev": true
+    },
+    "clipboardy": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz",
+      "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==",
+      "dev": true,
+      "requires": {
+        "arch": "^2.1.1",
+        "execa": "^1.0.0",
+        "is-wsl": "^2.1.1"
+      },
+      "dependencies": {
+        "is-wsl": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+          "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+          "dev": true,
+          "requires": {
+            "is-docker": "^2.0.0"
+          }
+        }
+      }
+    },
+    "cliui": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+      "dev": true,
+      "requires": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^6.2.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        }
+      }
+    },
+    "clone": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+      "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+      "dev": true
+    },
+    "clone-deep": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+      "dev": true,
+      "requires": {
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.2",
+        "shallow-clone": "^3.0.0"
+      }
+    },
+    "coa": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
+      "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
+      "dev": true,
+      "requires": {
+        "@types/q": "^1.5.1",
+        "chalk": "^2.4.1",
+        "q": "^1.1.2"
+      }
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==",
+      "dev": true
+    },
+    "codepage": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
+      "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA=="
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==",
+      "dev": true,
+      "requires": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      }
+    },
+    "color": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
+      "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.3",
+        "color-string": "^1.6.0"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+      "dev": true
+    },
+    "color-string": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+      "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+      "dev": true,
+      "requires": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
+    },
+    "combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dev": true,
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
+    "commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+      "dev": true
+    },
+    "commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
+    },
+    "component-emitter": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+      "dev": true
+    },
+    "compressible": {
+      "version": "2.0.18",
+      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+      "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+      "dev": true,
+      "requires": {
+        "mime-db": ">= 1.43.0 < 2"
+      }
+    },
+    "compression": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+      "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "~2.0.16",
+        "debug": "2.6.9",
+        "on-headers": "~1.0.2",
+        "safe-buffer": "5.1.2",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "bytes": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+          "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
+          "dev": true
+        },
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+          "dev": true
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true
+        }
+      }
+    },
+    "compression-webpack-plugin": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-5.0.2.tgz",
+      "integrity": "sha512-F2G4cQfsMZ6CiPlG22Q5EDUCqnfyZqTjyJP5cMgNYUbBg/dUzV3hto8yTFFIogDCTWooVbePHQE0qL6FrJUSsA==",
+      "requires": {
+        "cacache": "^15.0.5",
+        "find-cache-dir": "^3.3.1",
+        "schema-utils": "^2.7.0",
+        "serialize-javascript": "^4.0.0",
+        "webpack-sources": "^1.4.3"
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+    },
+    "concat-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.2.2",
+        "typedarray": "^0.0.6"
+      }
+    },
+    "connect-history-api-fallback": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+      "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+      "dev": true
+    },
+    "console-browserify": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+      "dev": true
+    },
+    "console-control-strings": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+      "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
+      "dev": true
+    },
+    "consolidate": {
+      "version": "0.15.1",
+      "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz",
+      "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.1.1"
+      }
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
+      "dev": true
+    },
+    "content-disposition": {
+      "version": "0.5.4",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.2.1"
+      }
+    },
+    "content-type": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+      "dev": true
+    },
+    "convert-source-map": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+      "dev": true
+    },
+    "cookie": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+      "dev": true
+    },
+    "cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+      "dev": true
+    },
+    "copy-concurrently": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==",
+      "dev": true
+    },
+    "copy-webpack-plugin": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz",
+      "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==",
+      "dev": true,
+      "requires": {
+        "cacache": "^12.0.3",
+        "find-cache-dir": "^2.1.0",
+        "glob-parent": "^3.1.0",
+        "globby": "^7.1.1",
+        "is-glob": "^4.0.1",
+        "loader-utils": "^1.2.3",
+        "minimatch": "^3.0.4",
+        "normalize-path": "^3.0.0",
+        "p-limit": "^2.2.1",
+        "schema-utils": "^1.0.0",
+        "serialize-javascript": "^4.0.0",
+        "webpack-log": "^2.0.0"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "12.0.4",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        },
+        "chownr": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+          "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+          "dev": true
+        },
+        "find-cache-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+          "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+          "dev": true,
+          "requires": {
+            "commondir": "^1.0.1",
+            "make-dir": "^2.0.0",
+            "pkg-dir": "^3.0.0"
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
+              "dev": true,
+              "requires": {
+                "is-extglob": "^2.1.0"
+              }
+            }
+          }
+        },
+        "globby": {
+          "version": "7.1.1",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz",
+          "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==",
+          "dev": true,
+          "requires": {
+            "array-union": "^1.0.1",
+            "dir-glob": "^2.0.0",
+            "glob": "^7.1.2",
+            "ignore": "^3.3.5",
+            "pify": "^3.0.0",
+            "slash": "^1.0.0"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "3.0.0",
+              "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+              "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+              "dev": true
+            }
+          }
+        },
+        "ignore": {
+          "version": "3.3.10",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+          "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+          "dev": true
+        },
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "make-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+          "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+          "dev": true,
+          "requires": {
+            "pify": "^4.0.1",
+            "semver": "^5.6.0"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+          "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+          "dev": true,
+          "requires": {
+            "find-up": "^3.0.0"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        },
+        "slash": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+          "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==",
+          "dev": true
+        },
+        "ssri": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
+          "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
+      }
+    },
+    "core-js": {
+      "version": "3.27.2",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.2.tgz",
+      "integrity": "sha512-9ashVQskuh5AZEZ1JdQWp1GqSoC1e1G87MzRqg2gIfVAQ7Qn9K+uFj8EcniUFA4P2NLZfV+TOlX1SzoKfo+s7w=="
+    },
+    "core-js-compat": {
+      "version": "3.27.2",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz",
+      "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.21.4"
+      }
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
+      "dev": true
+    },
+    "cosmiconfig": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+      "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+      "dev": true,
+      "requires": {
+        "import-fresh": "^2.0.0",
+        "is-directory": "^0.3.1",
+        "js-yaml": "^3.13.1",
+        "parse-json": "^4.0.0"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
+          }
+        }
+      }
+    },
+    "crc-32": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
+    },
+    "create-ecdh": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+      "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "elliptic": "^6.5.3"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+          "dev": true
+        }
+      }
+    },
+    "create-hash": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+      "dev": true,
+      "requires": {
+        "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": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+      "dev": true,
+      "requires": {
+        "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": {
+      "version": "6.0.5",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+      "dev": true,
+      "requires": {
+        "nice-try": "^1.0.4",
+        "path-key": "^2.0.1",
+        "semver": "^5.5.0",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        }
+      }
+    },
+    "crypto-browserify": {
+      "version": "3.12.0",
+      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+      "dev": true,
+      "requires": {
+        "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-color-names": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
+      "integrity": "sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==",
+      "dev": true
+    },
+    "css-declaration-sorter": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
+      "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.1",
+        "timsort": "^0.3.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "css-loader": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz",
+      "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==",
+      "dev": true,
+      "requires": {
+        "camelcase": "^5.3.1",
+        "cssesc": "^3.0.0",
+        "icss-utils": "^4.1.1",
+        "loader-utils": "^1.2.3",
+        "normalize-path": "^3.0.0",
+        "postcss": "^7.0.32",
+        "postcss-modules-extract-imports": "^2.0.0",
+        "postcss-modules-local-by-default": "^3.0.2",
+        "postcss-modules-scope": "^2.2.0",
+        "postcss-modules-values": "^3.0.0",
+        "postcss-value-parser": "^4.1.0",
+        "schema-utils": "^2.7.0",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+          "dev": true
+        },
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "css-select": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
+      "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+      "dev": true,
+      "requires": {
+        "boolbase": "^1.0.0",
+        "css-what": "^3.2.1",
+        "domutils": "^1.7.0",
+        "nth-check": "^1.0.2"
+      }
+    },
+    "css-select-base-adapter": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+      "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
+      "dev": true
+    },
+    "css-tree": {
+      "version": "1.0.0-alpha.37",
+      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
+      "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
+      "dev": true,
+      "requires": {
+        "mdn-data": "2.0.4",
+        "source-map": "^0.6.1"
+      }
+    },
+    "css-what": {
+      "version": "3.4.2",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
+      "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
+      "dev": true
+    },
+    "cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+      "dev": true
+    },
+    "cssnano": {
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz",
+      "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "^5.0.0",
+        "cssnano-preset-default": "^4.0.8",
+        "is-resolvable": "^1.0.0",
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "cssnano-preset-default": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz",
+      "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==",
+      "dev": true,
+      "requires": {
+        "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.3",
+        "postcss-unique-selectors": "^4.0.1"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "cssnano-util-get-arguments": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
+      "integrity": "sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==",
+      "dev": true
+    },
+    "cssnano-util-get-match": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
+      "integrity": "sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==",
+      "dev": true
+    },
+    "cssnano-util-raw-cache": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
+      "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "cssnano-util-same-parent": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
+      "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
+      "dev": true
+    },
+    "csso": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+      "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+      "dev": true,
+      "requires": {
+        "css-tree": "^1.1.2"
+      },
+      "dependencies": {
+        "css-tree": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+          "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+          "dev": true,
+          "requires": {
+            "mdn-data": "2.0.14",
+            "source-map": "^0.6.1"
+          }
+        },
+        "mdn-data": {
+          "version": "2.0.14",
+          "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+          "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+          "dev": true
+        }
+      }
+    },
+    "csstype": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
+      "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
+    },
+    "currently-unhandled": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+      "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==",
+      "dev": true,
+      "requires": {
+        "array-find-index": "^1.0.1"
+      }
+    },
+    "cyclist": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
+      "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==",
+      "dev": true
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "dayjs": {
+      "version": "1.11.7",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz",
+      "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ=="
+    },
+    "de-indent": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+      "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
+      "dev": true
+    },
+    "debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
+      "requires": {
+        "ms": "2.1.2"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+      "dev": true
+    },
+    "decode-uri-component": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+      "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
+      "dev": true
+    },
+    "deep-equal": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
+      "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+      "dev": true,
+      "requires": {
+        "is-arguments": "^1.0.4",
+        "is-date-object": "^1.0.1",
+        "is-regex": "^1.0.4",
+        "object-is": "^1.0.1",
+        "object-keys": "^1.1.1",
+        "regexp.prototype.flags": "^1.2.0"
+      }
+    },
+    "deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true
+    },
+    "deepmerge": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
+      "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ=="
+    },
+    "default-gateway": {
+      "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-5.0.5.tgz",
+      "integrity": "sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==",
+      "dev": true,
+      "requires": {
+        "execa": "^3.3.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "execa": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz",
+          "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "human-signals": "^1.1.1",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.0",
+            "onetime": "^5.1.0",
+            "p-finally": "^2.0.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "is-stream": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+          "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+          "dev": true
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
+        "npm-run-path": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "onetime": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+          "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "p-finally": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
+          "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
+          "dev": true
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "dev": true
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "defaults": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+      "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+      "dev": true,
+      "requires": {
+        "clone": "^1.0.2"
+      }
+    },
+    "define-properties": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
+      "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
+      "dev": true,
+      "requires": {
+        "has-property-descriptors": "^1.0.0",
+        "object-keys": "^1.1.1"
+      }
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "dev": true,
+      "requires": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "del": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
+      "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
+      "dev": true,
+      "requires": {
+        "@types/glob": "^7.1.1",
+        "globby": "^6.1.0",
+        "is-path-cwd": "^2.0.0",
+        "is-path-in-cwd": "^2.0.0",
+        "p-map": "^2.0.0",
+        "pify": "^4.0.1",
+        "rimraf": "^2.6.3"
+      },
+      "dependencies": {
+        "globby": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+          "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==",
+          "dev": true,
+          "requires": {
+            "array-union": "^1.0.1",
+            "glob": "^7.0.3",
+            "object-assign": "^4.0.1",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "2.3.0",
+              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+              "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+              "dev": true
+            }
+          }
+        },
+        "p-map": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+          "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+          "dev": true
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "dev": true
+    },
+    "delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
+      "dev": true
+    },
+    "depd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+      "dev": true
+    },
+    "des.js": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+      "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "destroy": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+      "dev": true
+    },
+    "detect-node": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+      "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+      "dev": true
+    },
+    "diffie-hellman": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "miller-rabin": "^4.0.0",
+        "randombytes": "^2.0.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+          "dev": true
+        }
+      }
+    },
+    "dir-glob": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz",
+      "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==",
+      "dev": true,
+      "requires": {
+        "path-type": "^3.0.0"
+      }
+    },
+    "dns-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
+      "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==",
+      "dev": true
+    },
+    "dns-packet": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz",
+      "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==",
+      "dev": true,
+      "requires": {
+        "ip": "^1.1.0",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "dns-txt": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
+      "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==",
+      "dev": true,
+      "requires": {
+        "buffer-indexof": "^1.0.0"
+      }
+    },
+    "doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "requires": {
+        "esutils": "^2.0.2"
+      }
+    },
+    "dom-converter": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+      "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+      "dev": true,
+      "requires": {
+        "utila": "~0.4"
+      }
+    },
+    "dom-serializer": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "entities": "^2.0.0"
+      },
+      "dependencies": {
+        "domelementtype": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+          "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+          "dev": true
+        }
+      }
+    },
+    "domain-browser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+      "dev": true
+    },
+    "domelementtype": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+      "dev": true
+    },
+    "domhandler": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+      "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^2.2.0"
+      },
+      "dependencies": {
+        "domelementtype": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+          "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+          "dev": true
+        }
+      }
+    },
+    "domready": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/domready/-/domready-1.0.8.tgz",
+      "integrity": "sha512-uIzsOJUNk+AdGE9a6VDeessoMCzF8RrZvJCX/W8QtyfgdR6Uofn/MvRonih3OtCO79b2VDzDOymuiABrQ4z3XA==",
+      "dev": true
+    },
+    "domutils": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+      "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+      "dev": true,
+      "requires": {
+        "dom-serializer": "0",
+        "domelementtype": "1"
+      }
+    },
+    "dot-prop": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+      "dev": true,
+      "requires": {
+        "is-obj": "^2.0.0"
+      }
+    },
+    "dotenv": {
+      "version": "8.6.0",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
+      "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
+      "dev": true
+    },
+    "dotenv-expand": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
+      "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
+      "dev": true
+    },
+    "duplexer": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+      "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+      "dev": true
+    },
+    "duplexify": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
+      "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "easy-stack": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz",
+      "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==",
+      "dev": true
+    },
+    "ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+      "dev": true,
+      "requires": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "echarts": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.1.tgz",
+      "integrity": "sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==",
+      "requires": {
+        "tslib": "2.3.0",
+        "zrender": "5.4.1"
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+      "dev": true
+    },
+    "ejs": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz",
+      "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==",
+      "dev": true
+    },
+    "el-table-infinite-scroll": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/el-table-infinite-scroll/-/el-table-infinite-scroll-1.0.11.tgz",
+      "integrity": "sha512-yHIs/jbsCEOSHpBkFEhvxHadPyFkATwldDrPBfQONcgh0ZmvZnL0XR1q/jEPcyJcGi6AwoxW4hiKMaHqIXPYCQ==",
+      "requires": {
+        "core-js": "^2.6.5",
+        "element-ui": "^2.12.0",
+        "vue": "^2.6.10"
+      },
+      "dependencies": {
+        "core-js": {
+          "version": "2.6.12",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+          "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
+        }
+      }
+    },
+    "electron-to-chromium": {
+      "version": "1.4.286",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz",
+      "integrity": "sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ==",
+      "dev": true
+    },
+    "element-ui": {
+      "version": "2.15.12",
+      "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.12.tgz",
+      "integrity": "sha512-Y5FMT2BPOindU2GkDEQ5ZKUVxDawKONRNMh2eL3uBx1FOtvUJ+L6IxXLVsNxq4WnaX/UnVNgWXebl7DobygZMg==",
+      "requires": {
+        "async-validator": "~1.8.1",
+        "babel-helper-vue-jsx-merge-props": "^2.0.0",
+        "deepmerge": "^1.2.0",
+        "normalize-wheel": "^1.0.1",
+        "resize-observer-polyfill": "^1.5.0",
+        "throttle-debounce": "^1.0.1"
+      }
+    },
+    "elliptic": {
+      "version": "6.5.4",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+      "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.11.9",
+        "brorand": "^1.1.0",
+        "hash.js": "^1.0.0",
+        "hmac-drbg": "^1.0.1",
+        "inherits": "^2.0.4",
+        "minimalistic-assert": "^1.0.1",
+        "minimalistic-crypto-utils": "^1.0.1"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+          "dev": true
+        }
+      }
+    },
+    "emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true
+    },
+    "emojis-list": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+      "dev": true
+    },
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+      "dev": true
+    },
+    "end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "dev": true,
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "enhanced-resolve": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
+      "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "memory-fs": "^0.5.0",
+        "tapable": "^1.0.0"
+      },
+      "dependencies": {
+        "memory-fs": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+          "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+          "dev": true,
+          "requires": {
+            "errno": "^0.1.3",
+            "readable-stream": "^2.0.1"
+          }
+        }
+      }
+    },
+    "entities": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+      "dev": true
+    },
+    "errno": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+      "dev": true,
+      "requires": {
+        "prr": "~1.0.1"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "error-stack-parser": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
+      "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
+      "dev": true,
+      "requires": {
+        "stackframe": "^1.3.4"
+      }
+    },
+    "es-abstract": {
+      "version": "1.21.1",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz",
+      "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==",
+      "dev": true,
+      "requires": {
+        "available-typed-arrays": "^1.0.5",
+        "call-bind": "^1.0.2",
+        "es-set-tostringtag": "^2.0.1",
+        "es-to-primitive": "^1.2.1",
+        "function-bind": "^1.1.1",
+        "function.prototype.name": "^1.1.5",
+        "get-intrinsic": "^1.1.3",
+        "get-symbol-description": "^1.0.0",
+        "globalthis": "^1.0.3",
+        "gopd": "^1.0.1",
+        "has": "^1.0.3",
+        "has-property-descriptors": "^1.0.0",
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3",
+        "internal-slot": "^1.0.4",
+        "is-array-buffer": "^3.0.1",
+        "is-callable": "^1.2.7",
+        "is-negative-zero": "^2.0.2",
+        "is-regex": "^1.1.4",
+        "is-shared-array-buffer": "^1.0.2",
+        "is-string": "^1.0.7",
+        "is-typed-array": "^1.1.10",
+        "is-weakref": "^1.0.2",
+        "object-inspect": "^1.12.2",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.4",
+        "regexp.prototype.flags": "^1.4.3",
+        "safe-regex-test": "^1.0.0",
+        "string.prototype.trimend": "^1.0.6",
+        "string.prototype.trimstart": "^1.0.6",
+        "typed-array-length": "^1.0.4",
+        "unbox-primitive": "^1.0.2",
+        "which-typed-array": "^1.1.9"
+      }
+    },
+    "es-array-method-boxes-properly": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
+      "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
+      "dev": true
+    },
+    "es-set-tostringtag": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
+      "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+      "dev": true,
+      "requires": {
+        "get-intrinsic": "^1.1.3",
+        "has": "^1.0.3",
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+      "dev": true,
+      "requires": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      }
+    },
+    "es6-denodeify": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/es6-denodeify/-/es6-denodeify-0.1.5.tgz",
+      "integrity": "sha512-731Rf4NqlPvhkT1pIF7r8vZxESJlWocNpXLuyPlVnfEGXlwuJaMvU5WpyyDjpudDC2cgXVX849xljzvQqBg1QQ=="
+    },
+    "escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "dev": true
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+      "dev": true
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "dev": true
+    },
+    "eslint": {
+      "version": "6.8.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
+      "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "ajv": "^6.10.0",
+        "chalk": "^2.1.0",
+        "cross-spawn": "^6.0.5",
+        "debug": "^4.0.1",
+        "doctrine": "^3.0.0",
+        "eslint-scope": "^5.0.0",
+        "eslint-utils": "^1.4.3",
+        "eslint-visitor-keys": "^1.1.0",
+        "espree": "^6.1.2",
+        "esquery": "^1.0.1",
+        "esutils": "^2.0.2",
+        "file-entry-cache": "^5.0.1",
+        "functional-red-black-tree": "^1.0.1",
+        "glob-parent": "^5.0.0",
+        "globals": "^12.1.0",
+        "ignore": "^4.0.6",
+        "import-fresh": "^3.0.0",
+        "imurmurhash": "^0.1.4",
+        "inquirer": "^7.0.0",
+        "is-glob": "^4.0.0",
+        "js-yaml": "^3.13.1",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.3.0",
+        "lodash": "^4.17.14",
+        "minimatch": "^3.0.4",
+        "mkdirp": "^0.5.1",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.8.3",
+        "progress": "^2.0.0",
+        "regexpp": "^2.0.1",
+        "semver": "^6.1.2",
+        "strip-ansi": "^5.2.0",
+        "strip-json-comments": "^3.0.1",
+        "table": "^5.2.3",
+        "text-table": "^0.2.0",
+        "v8-compile-cache": "^2.0.3"
+      },
+      "dependencies": {
+        "eslint-scope": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+          "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+          "dev": true,
+          "requires": {
+            "esrecurse": "^4.3.0",
+            "estraverse": "^4.1.1"
+          }
+        },
+        "globals": {
+          "version": "12.4.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.8.1"
+          }
+        },
+        "import-fresh": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+          "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+          "dev": true,
+          "requires": {
+            "parent-module": "^1.0.0",
+            "resolve-from": "^4.0.0"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        },
+        "resolve-from": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+          "dev": true
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-config-prettier": {
+      "version": "6.15.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz",
+      "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==",
+      "dev": true,
+      "requires": {
+        "get-stdin": "^6.0.0"
+      }
+    },
+    "eslint-loader": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz",
+      "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==",
+      "dev": true,
+      "requires": {
+        "loader-fs-cache": "^1.0.0",
+        "loader-utils": "^1.0.2",
+        "object-assign": "^4.0.1",
+        "object-hash": "^1.1.4",
+        "rimraf": "^2.6.1"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "eslint-plugin-prettier": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz",
+      "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==",
+      "dev": true,
+      "requires": {
+        "prettier-linter-helpers": "^1.0.0"
+      }
+    },
+    "eslint-plugin-vue": {
+      "version": "6.2.2",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz",
+      "integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==",
+      "dev": true,
+      "requires": {
+        "natural-compare": "^1.4.0",
+        "semver": "^5.6.0",
+        "vue-eslint-parser": "^7.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-scope": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
+      "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "eslint-utils": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
+      "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
+      "dev": true,
+      "requires": {
+        "eslint-visitor-keys": "^1.1.0"
+      }
+    },
+    "eslint-visitor-keys": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+      "dev": true
+    },
+    "espree": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
+      "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
+      "dev": true,
+      "requires": {
+        "acorn": "^7.1.1",
+        "acorn-jsx": "^5.2.0",
+        "eslint-visitor-keys": "^1.1.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "7.4.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+          "dev": true
+        }
+      }
+    },
+    "esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "dev": true
+    },
+    "esquery": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.1.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+          "dev": true
+        }
+      }
+    },
+    "esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.2.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+          "dev": true
+        }
+      }
+    },
+    "estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+      "dev": true
+    },
+    "event-pubsub": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz",
+      "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==",
+      "dev": true
+    },
+    "event-target-shim": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+      "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
+    },
+    "eventemitter3": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+      "dev": true
+    },
+    "events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "dev": true
+    },
+    "eventsource": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.2.tgz",
+      "integrity": "sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA=="
+    },
+    "evp_bytestokey": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+      "dev": true,
+      "requires": {
+        "md5.js": "^1.3.4",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "execa": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+      "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+      "dev": true,
+      "requires": {
+        "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"
+      }
+    },
+    "exit-on-epipe": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
+      "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
+    },
+    "expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+      "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+          "dev": true
+        }
+      }
+    },
+    "express": {
+      "version": "4.18.2",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+      "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.8",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.20.1",
+        "content-disposition": "0.5.4",
+        "content-type": "~1.0.4",
+        "cookie": "0.5.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "1.2.0",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.7",
+        "qs": "6.11.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.2.1",
+        "send": "0.18.0",
+        "serve-static": "1.15.0",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+          "dev": true
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "dev": true
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+      "dev": true,
+      "requires": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "external-editor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+      "dev": true,
+      "requires": {
+        "chardet": "^0.7.0",
+        "iconv-lite": "^0.4.24",
+        "tmp": "^0.0.33"
+      }
+    },
+    "extglob": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+      "dev": true
+    },
+    "fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+    },
+    "fast-diff": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+      "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+      "dev": true
+    },
+    "fast-glob": {
+      "version": "2.2.7",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
+      "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
+      "dev": true,
+      "requires": {
+        "@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"
+      },
+      "dependencies": {
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
+              "dev": true,
+              "requires": {
+                "is-extglob": "^2.1.0"
+              }
+            }
+          }
+        }
+      }
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+      "dev": true
+    },
+    "faye-websocket": {
+      "version": "0.11.4",
+      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
+      "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+      "dev": true,
+      "requires": {
+        "websocket-driver": ">=0.5.1"
+      }
+    },
+    "fetch-cookie": {
+      "version": "0.7.3",
+      "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.7.3.tgz",
+      "integrity": "sha512-rZPkLnI8x5V+zYAiz8QonAHsTb4BY+iFowFBI1RFn0zrO343AVp9X7/yUj/9wL6Ef/8fLls8b/vGtzUvmyAUGA==",
+      "requires": {
+        "es6-denodeify": "^0.1.1",
+        "tough-cookie": "^2.3.3"
+      }
+    },
+    "figgy-pudding": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+      "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
+      "dev": true
+    },
+    "figures": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.5"
+      }
+    },
+    "file-entry-cache": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+      "dev": true,
+      "requires": {
+        "flat-cache": "^2.0.1"
+      }
+    },
+    "file-loader": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz",
+      "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.2.3",
+        "schema-utils": "^2.5.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "file-saver": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
+      "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
+    },
+    "filesize": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
+      "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==",
+      "dev": true
+    },
+    "fill-range": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+      "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "finalhandler": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+      "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "statuses": "2.0.1",
+        "unpipe": "~1.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+          "dev": true
+        }
+      }
+    },
+    "find-cache-dir": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+      "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+      "requires": {
+        "commondir": "^1.0.1",
+        "make-dir": "^3.0.2",
+        "pkg-dir": "^4.1.0"
+      }
+    },
+    "find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "requires": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      }
+    },
+    "flat-cache": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
+      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+      "dev": true,
+      "requires": {
+        "flatted": "^2.0.0",
+        "rimraf": "2.6.3",
+        "write": "1.0.3"
+      },
+      "dependencies": {
+        "rimraf": {
+          "version": "2.6.3",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+          "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "flatted": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+      "dev": true
+    },
+    "flush-write-stream": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
+      "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.3.6"
+      }
+    },
+    "follow-redirects": {
+      "version": "1.15.2",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+      "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
+    },
+    "for-each": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+      "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+      "dev": true,
+      "requires": {
+        "is-callable": "^1.1.3"
+      }
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
+      "dev": true
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+      "dev": true
+    },
+    "form-data": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+      "dev": true,
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.6",
+        "mime-types": "^2.1.12"
+      }
+    },
+    "forwarded": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+      "dev": true
+    },
+    "frac": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
+      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==",
+      "dev": true,
+      "requires": {
+        "map-cache": "^0.2.2"
+      }
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+      "dev": true
+    },
+    "from2": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0"
+      }
+    },
+    "fs-extra": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+      "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "jsonfile": "^4.0.0",
+        "universalify": "^0.1.0"
+      }
+    },
+    "fs-minipass": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "fs-write-stream-atomic": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "iferr": "^0.1.5",
+        "imurmurhash": "^0.1.4",
+        "readable-stream": "1 || 2"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+    },
+    "fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "dev": true,
+      "optional": true
+    },
+    "fstream": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
+      "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "inherits": "~2.0.0",
+        "mkdirp": ">=0.5 0",
+        "rimraf": "2"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+    },
+    "function.prototype.name": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
+      "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.0",
+        "functions-have-names": "^1.2.2"
+      }
+    },
+    "functional-red-black-tree": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
+      "dev": true
+    },
+    "functions-have-names": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+      "dev": true
+    },
+    "gauge": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+      "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
+          "dev": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
+          "dev": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        }
+      }
+    },
+    "gaze": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
+      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
+      "dev": true,
+      "requires": {
+        "globule": "^1.0.0"
+      }
+    },
+    "gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "dev": true
+    },
+    "get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "dev": true
+    },
+    "get-intrinsic": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
+      "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.3"
+      }
+    },
+    "get-stdin": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
+      "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
+      "dev": true
+    },
+    "get-stream": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+      "dev": true,
+      "requires": {
+        "pump": "^3.0.0"
+      }
+    },
+    "get-symbol-description": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+      "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.1.1"
+      }
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==",
+      "dev": true
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "requires": {
+        "is-glob": "^4.0.1"
+      }
+    },
+    "glob-to-regexp": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+      "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==",
+      "dev": true
+    },
+    "globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "dev": true
+    },
+    "globalthis": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+      "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3"
+      }
+    },
+    "globby": {
+      "version": "9.2.0",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz",
+      "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==",
+      "dev": true,
+      "requires": {
+        "@types/glob": "^7.1.1",
+        "array-union": "^1.0.2",
+        "dir-glob": "^2.2.2",
+        "fast-glob": "^2.2.6",
+        "glob": "^7.1.3",
+        "ignore": "^4.0.3",
+        "pify": "^4.0.1",
+        "slash": "^2.0.0"
+      }
+    },
+    "globule": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz",
+      "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==",
+      "dev": true,
+      "requires": {
+        "glob": "~7.1.1",
+        "lodash": "^4.17.21",
+        "minimatch": "~3.0.2"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.1.7",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+          "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        },
+        "minimatch": {
+          "version": "3.0.8",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
+          "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        }
+      }
+    },
+    "gopd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+      "dev": true,
+      "requires": {
+        "get-intrinsic": "^1.1.3"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.2.10",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+      "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+      "dev": true
+    },
+    "gzip-size": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz",
+      "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==",
+      "dev": true,
+      "requires": {
+        "duplexer": "^0.1.1",
+        "pify": "^4.0.1"
+      }
+    },
+    "handle-thing": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+      "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+      "dev": true
+    },
+    "har-schema": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+      "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
+      "dev": true
+    },
+    "har-validator": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.12.3",
+        "har-schema": "^2.0.0"
+      }
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+          "dev": true
+        }
+      }
+    },
+    "has-bigints": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+      "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+      "dev": true
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "dev": true
+    },
+    "has-property-descriptors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+      "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+      "dev": true,
+      "requires": {
+        "get-intrinsic": "^1.1.1"
+      }
+    },
+    "has-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+      "dev": true
+    },
+    "has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+    },
+    "has-tostringtag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+      "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+      "dev": true,
+      "requires": {
+        "has-symbols": "^1.0.2"
+      }
+    },
+    "has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+      "dev": true
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==",
+      "dev": true,
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "hash-base": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+      "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "hash-sum": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz",
+      "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+      "dev": true
+    },
+    "hash.js": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.1"
+      }
+    },
+    "he": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+      "dev": true
+    },
+    "hex-color-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
+      "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
+      "dev": true
+    },
+    "highlight.js": {
+      "version": "10.7.3",
+      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
+      "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+      "dev": true
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+      "dev": true,
+      "requires": {
+        "hash.js": "^1.0.3",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "hoopy": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
+      "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==",
+      "dev": true
+    },
+    "hosted-git-info": {
+      "version": "2.8.9",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+      "dev": true
+    },
+    "hpack.js": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+      "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "obuf": "^1.0.0",
+        "readable-stream": "^2.0.1",
+        "wbuf": "^1.1.0"
+      }
+    },
+    "hsl-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
+      "integrity": "sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==",
+      "dev": true
+    },
+    "hsla-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
+      "integrity": "sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==",
+      "dev": true
+    },
+    "html-entities": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz",
+      "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==",
+      "dev": true
+    },
+    "html-minifier": {
+      "version": "3.5.21",
+      "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz",
+      "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.17.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+          "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
+          "dev": true
+        }
+      }
+    },
+    "html-tags": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz",
+      "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==",
+      "dev": true
+    },
+    "html-webpack-plugin": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
+      "integrity": "sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==",
+      "dev": true,
+      "requires": {
+        "html-minifier": "^3.2.3",
+        "loader-utils": "^0.2.16",
+        "lodash": "^4.17.3",
+        "pretty-error": "^2.0.2",
+        "tapable": "^1.0.0",
+        "toposort": "^1.0.0",
+        "util.promisify": "1.0.0"
+      },
+      "dependencies": {
+        "big.js": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
+          "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
+          "dev": true
+        },
+        "emojis-list": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+          "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==",
+          "dev": true
+        },
+        "json5": {
+          "version": "0.5.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+          "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==",
+          "dev": true
+        },
+        "loader-utils": {
+          "version": "0.2.17",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
+          "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==",
+          "dev": true,
+          "requires": {
+            "big.js": "^3.1.3",
+            "emojis-list": "^2.0.0",
+            "json5": "^0.5.0",
+            "object-assign": "^4.0.1"
+          }
+        },
+        "util.promisify": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
+          "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
+          "dev": true,
+          "requires": {
+            "define-properties": "^1.1.2",
+            "object.getownpropertydescriptors": "^2.0.3"
+          }
+        }
+      }
+    },
+    "htmlparser2": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+      "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^4.0.0",
+        "domutils": "^2.5.2",
+        "entities": "^2.0.0"
+      },
+      "dependencies": {
+        "dom-serializer": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+          "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.0.1",
+            "domhandler": "^4.2.0",
+            "entities": "^2.0.0"
+          }
+        },
+        "domelementtype": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+          "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+          "dev": true
+        },
+        "domutils": {
+          "version": "2.8.0",
+          "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+          "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+          "dev": true,
+          "requires": {
+            "dom-serializer": "^1.0.1",
+            "domelementtype": "^2.2.0",
+            "domhandler": "^4.2.0"
+          }
+        }
+      }
+    },
+    "http-deceiver": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+      "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
+      "dev": true
+    },
+    "http-errors": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+      "dev": true,
+      "requires": {
+        "depd": "2.0.0",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "toidentifier": "1.0.1"
+      }
+    },
+    "http-parser-js": {
+      "version": "0.5.8",
+      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz",
+      "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==",
+      "dev": true
+    },
+    "http-proxy": {
+      "version": "1.18.1",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+      "dev": true,
+      "requires": {
+        "eventemitter3": "^4.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "http-proxy-middleware": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz",
+      "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==",
+      "dev": true,
+      "requires": {
+        "@types/http-proxy": "^1.17.5",
+        "http-proxy": "^1.18.1",
+        "is-glob": "^4.0.1",
+        "is-plain-obj": "^3.0.0",
+        "micromatch": "^4.0.2"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.5",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+          "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.2",
+            "picomatch": "^2.3.1"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "http-signature": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+      "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      }
+    },
+    "https-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+      "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==",
+      "dev": true
+    },
+    "human-signals": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+      "dev": true
+    },
+    "iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      }
+    },
+    "icss-utils": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
+      "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.14"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "dev": true
+    },
+    "iferr": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+      "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==",
+      "dev": true
+    },
+    "ignore": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+      "dev": true
+    },
+    "image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+      "dev": true
+    },
+    "import-cwd": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
+      "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==",
+      "dev": true,
+      "requires": {
+        "import-from": "^2.1.0"
+      }
+    },
+    "import-fresh": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
+      "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
+      "dev": true,
+      "requires": {
+        "caller-path": "^2.0.0",
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "import-from": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
+      "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "import-local": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
+      "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "^3.0.0",
+        "resolve-cwd": "^2.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+          "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+          "dev": true,
+          "requires": {
+            "find-up": "^3.0.0"
+          }
+        }
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="
+    },
+    "in-publish": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz",
+      "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==",
+      "dev": true
+    },
+    "indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
+    },
+    "indexes-of": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+      "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==",
+      "dev": true
+    },
+    "infer-owner": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "inquirer": {
+      "version": "7.3.3",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
+      "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.1.0",
+        "cli-cursor": "^3.1.0",
+        "cli-width": "^3.0.0",
+        "external-editor": "^3.0.3",
+        "figures": "^3.0.0",
+        "lodash": "^4.17.19",
+        "mute-stream": "0.0.8",
+        "run-async": "^2.4.0",
+        "rxjs": "^6.6.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "through": "^2.3.6"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "cli-cursor": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+          "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+          "dev": true,
+          "requires": {
+            "restore-cursor": "^3.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
+        "onetime": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+          "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "restore-cursor": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+          "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+          "dev": true,
+          "requires": {
+            "onetime": "^5.1.0",
+            "signal-exit": "^3.0.2"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "internal-ip": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
+      "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
+      "dev": true,
+      "requires": {
+        "default-gateway": "^4.2.0",
+        "ipaddr.js": "^1.9.0"
+      },
+      "dependencies": {
+        "default-gateway": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
+          "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
+          "dev": true,
+          "requires": {
+            "execa": "^1.0.0",
+            "ip-regex": "^2.1.0"
+          }
+        }
+      }
+    },
+    "internal-slot": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz",
+      "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==",
+      "dev": true,
+      "requires": {
+        "get-intrinsic": "^1.1.3",
+        "has": "^1.0.3",
+        "side-channel": "^1.0.4"
+      }
+    },
+    "ip": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
+      "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==",
+      "dev": true
+    },
+    "ip-regex": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+      "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==",
+      "dev": true
+    },
+    "ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+      "dev": true
+    },
+    "is-absolute-url": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
+      "integrity": "sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==",
+      "dev": true
+    },
+    "is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-arguments": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
+      "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-array-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz",
+      "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.1.3",
+        "is-typed-array": "^1.1.10"
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+      "dev": true
+    },
+    "is-bigint": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+      "dev": true,
+      "requires": {
+        "has-bigints": "^1.0.1"
+      }
+    },
+    "is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "binary-extensions": "^2.0.0"
+      }
+    },
+    "is-boolean-object": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "dev": true
+    },
+    "is-callable": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+      "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+      "dev": true
+    },
+    "is-ci": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz",
+      "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==",
+      "dev": true,
+      "requires": {
+        "ci-info": "^1.5.0"
+      }
+    },
+    "is-color-stop": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
+      "integrity": "sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==",
+      "dev": true,
+      "requires": {
+        "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-core-module": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+      "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-date-object": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+      "dev": true,
+      "requires": {
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+      "dev": true,
+      "requires": {
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
+        }
+      }
+    },
+    "is-directory": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+      "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==",
+      "dev": true
+    },
+    "is-docker": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+      "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+      "dev": true
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+      "dev": true
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "dev": true
+    },
+    "is-finite": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
+      "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
+      "dev": true
+    },
+    "is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "dev": true
+    },
+    "is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-negative-zero": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+      "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+      "dev": true
+    },
+    "is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-number-object": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+      "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+      "dev": true,
+      "requires": {
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-obj": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+      "dev": true
+    },
+    "is-path-cwd": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+      "dev": true
+    },
+    "is-path-in-cwd": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
+      "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
+      "dev": true,
+      "requires": {
+        "is-path-inside": "^2.1.0"
+      }
+    },
+    "is-path-inside": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
+      "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
+      "dev": true,
+      "requires": {
+        "path-is-inside": "^1.0.2"
+      }
+    },
+    "is-plain-obj": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+      "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+      "dev": true
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "is-regex": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-resolvable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+      "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+      "dev": true
+    },
+    "is-shared-array-buffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+      "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2"
+      }
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
+      "dev": true
+    },
+    "is-string": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+      "dev": true,
+      "requires": {
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-symbol": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+      "dev": true,
+      "requires": {
+        "has-symbols": "^1.0.2"
+      }
+    },
+    "is-typed-array": {
+      "version": "1.1.10",
+      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
+      "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
+      "dev": true,
+      "requires": {
+        "available-typed-arrays": "^1.0.5",
+        "call-bind": "^1.0.2",
+        "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+      "dev": true
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+      "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==",
+      "dev": true
+    },
+    "is-weakref": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+      "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2"
+      }
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+      "dev": true
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
+      "dev": true
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+      "dev": true
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "dev": true
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+      "dev": true
+    },
+    "javascript-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz",
+      "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==",
+      "dev": true
+    },
+    "jquery": {
+      "version": "3.6.3",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz",
+      "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg=="
+    },
+    "js-base64": {
+      "version": "2.6.4",
+      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz",
+      "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==",
+      "dev": true
+    },
+    "js-cookie": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
+      "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
+    },
+    "js-message": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz",
+      "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==",
+      "dev": true
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true
+    },
+    "js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+      "dev": true,
+      "requires": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      }
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+      "dev": true
+    },
+    "jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "dev": true
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+      "dev": true
+    },
+    "json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+      "dev": true
+    },
+    "json-schema": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+      "dev": true
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+    },
+    "json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+      "dev": true
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+      "dev": true
+    },
+    "json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "dev": true
+    },
+    "jsonfile": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+      "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "jsprim": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+      "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.4.0",
+        "verror": "1.10.0"
+      }
+    },
+    "killable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
+      "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
+      "dev": true
+    },
+    "kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "dev": true
+    },
+    "launch-editor": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz",
+      "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==",
+      "dev": true,
+      "requires": {
+        "picocolors": "^1.0.0",
+        "shell-quote": "^1.7.3"
+      }
+    },
+    "launch-editor-middleware": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.6.0.tgz",
+      "integrity": "sha512-K2yxgljj5TdCeRN1lBtO3/J26+AIDDDw+04y6VAiZbWcTdBwsYN6RrZBnW5DN/QiSIdKNjKdATLUUluWWFYTIA==",
+      "dev": true,
+      "requires": {
+        "launch-editor": "^2.6.0"
+      }
+    },
+    "levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2"
+      }
+    },
+    "lines-and-columns": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+      "dev": true
+    },
+    "load-json-file": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+      "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0",
+        "strip-bom": "^2.0.0"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+          "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.2.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+          "dev": true
+        }
+      }
+    },
+    "loader-fs-cache": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz",
+      "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==",
+      "dev": true,
+      "requires": {
+        "find-cache-dir": "^0.1.1",
+        "mkdirp": "^0.5.1"
+      },
+      "dependencies": {
+        "find-cache-dir": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz",
+          "integrity": "sha512-Z9XSBoNE7xQiV6MSgPuCfyMokH2K7JdpRkOYE1+mu3d4BFJtx3GW+f6Bo4q8IX6rlf5MYbLBKW0pjl2cWdkm2A==",
+          "dev": true,
+          "requires": {
+            "commondir": "^1.0.1",
+            "mkdirp": "^0.5.1",
+            "pkg-dir": "^1.0.0"
+          }
+        },
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+          "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==",
+          "dev": true,
+          "requires": {
+            "path-exists": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+          "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "pkg-dir": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
+          "integrity": "sha512-c6pv3OE78mcZ92ckebVDqg0aWSoKhOTbwCV6qbCWMk546mAL9pZln0+QsN/yQ7fkucd4+yJPLrCBXNt8Ruk+Eg==",
+          "dev": true,
+          "requires": {
+            "find-up": "^1.0.0"
+          }
+        }
+      }
+    },
+    "loader-runner": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
+      "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
+      "dev": true
+    },
+    "loader-utils": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+      "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+      "dev": true,
+      "requires": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^2.1.2"
+      }
+    },
+    "locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "requires": {
+        "p-locate": "^4.1.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+      "dev": true
+    },
+    "lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+      "dev": true
+    },
+    "lodash.defaultsdeep": {
+      "version": "4.6.1",
+      "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz",
+      "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==",
+      "dev": true
+    },
+    "lodash.kebabcase": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
+      "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==",
+      "dev": true
+    },
+    "lodash.mapvalues": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz",
+      "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==",
+      "dev": true
+    },
+    "lodash.memoize": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+      "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+      "dev": true
+    },
+    "lodash.transform": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz",
+      "integrity": "sha512-LO37ZnhmBVx0GvOU/caQuipEh4GN82TcWv3yHlebGDgOxbxiwwzW5Pcx2AcvpIv2WmvmSMoC492yQFNhy/l/UQ==",
+      "dev": true
+    },
+    "lodash.uniq": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+      "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+      "dev": true
+    },
+    "log-symbols": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+      "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.0.1"
+      }
+    },
+    "loglevel": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz",
+      "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==",
+      "dev": true
+    },
+    "loud-rejection": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+      "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==",
+      "dev": true,
+      "requires": {
+        "currently-unhandled": "^0.4.1",
+        "signal-exit": "^3.0.0"
+      }
+    },
+    "lower-case": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+      "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==",
+      "dev": true
+    },
+    "lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "requires": {
+        "yallist": "^4.0.0"
+      }
+    },
+    "make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+      "requires": {
+        "semver": "^6.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+        }
+      }
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
+      "dev": true
+    },
+    "map-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+      "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
+      "dev": true
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==",
+      "dev": true,
+      "requires": {
+        "object-visit": "^1.0.0"
+      }
+    },
+    "md5.js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "mdn-data": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
+      "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
+      "dev": true
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+      "dev": true
+    },
+    "memory-fs": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+      "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==",
+      "dev": true,
+      "requires": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "meow": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+      "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==",
+      "dev": true,
+      "requires": {
+        "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": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
+      "dev": true
+    },
+    "merge-options": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz",
+      "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==",
+      "dev": true,
+      "requires": {
+        "is-plain-obj": "^1.1"
+      },
+      "dependencies": {
+        "is-plain-obj": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+          "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+          "dev": true
+        }
+      }
+    },
+    "merge-source-map": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
+      "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
+      "dev": true,
+      "requires": {
+        "source-map": "^0.6.1"
+      }
+    },
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "dev": true
+    },
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true
+    },
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "3.1.10",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+      "dev": true,
+      "requires": {
+        "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": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+          "dev": true
+        }
+      }
+    },
+    "mime": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+      "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+      "dev": true
+    },
+    "mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "dev": true
+    },
+    "mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dev": true,
+      "requires": {
+        "mime-db": "1.52.0"
+      }
+    },
+    "mimic-fn": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+      "dev": true
+    },
+    "mini-css-extract-plugin": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz",
+      "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "normalize-url": "1.9.1",
+        "schema-utils": "^1.0.0",
+        "webpack-sources": "^1.1.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "normalize-url": {
+          "version": "1.9.1",
+          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
+          "integrity": "sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==",
+          "dev": true,
+          "requires": {
+            "object-assign": "^4.0.1",
+            "prepend-http": "^1.0.0",
+            "query-string": "^4.1.0",
+            "sort-keys": "^1.0.0"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        }
+      }
+    },
+    "minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+      "dev": true
+    },
+    "minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
+      "dev": true
+    },
+    "minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+      "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+      "dev": true
+    },
+    "minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "requires": {
+        "yallist": "^4.0.0"
+      }
+    },
+    "minipass-collect": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minipass-flush": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minipass-pipeline": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minizlib": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+      "requires": {
+        "minipass": "^3.0.0",
+        "yallist": "^4.0.0"
+      }
+    },
+    "mississippi": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
+      "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+      "dev": true,
+      "requires": {
+        "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": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.1.2.tgz",
+      "integrity": "sha512-3btxP0O9iGADGWAkteQ8mzDtEspZqu4I32y4GZYCV5BrwtzdcRpF4dQgNdJadCrbBx7Lu6Sq9AVrerMHR0Hkmw==",
+      "dev": true
+    },
+    "mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+      "dev": true,
+      "requires": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+    },
+    "move-concurrently": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+      "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "multicast-dns": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
+      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+      "dev": true,
+      "requires": {
+        "dns-packet": "^1.3.1",
+        "thunky": "^1.0.2"
+      }
+    },
+    "multicast-dns-service-types": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
+      "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==",
+      "dev": true
+    },
+    "mute-stream": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+      "dev": true
+    },
+    "mz": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+      "dev": true,
+      "requires": {
+        "any-promise": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "thenify-all": "^1.0.0"
+      }
+    },
+    "nan": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
+      "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==",
+      "dev": true
+    },
+    "nanoid": {
+      "version": "3.3.4",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+      "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
+    },
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+      "dev": true,
+      "requires": {
+        "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": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true
+    },
+    "negotiator": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+      "dev": true
+    },
+    "neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "dev": true
+    },
+    "nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+      "dev": true
+    },
+    "no-case": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+      "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+      "dev": true,
+      "requires": {
+        "lower-case": "^1.1.1"
+      }
+    },
+    "node-fetch": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
+      "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
+      "requires": {
+        "whatwg-url": "^5.0.0"
+      }
+    },
+    "node-forge": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
+      "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
+      "dev": true
+    },
+    "node-gyp": {
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
+      "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "semver": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+          "integrity": "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==",
+          "dev": true
+        },
+        "tar": {
+          "version": "2.2.2",
+          "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
+          "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
+          "dev": true,
+          "requires": {
+            "block-stream": "*",
+            "fstream": "^1.0.12",
+            "inherits": "2"
+          }
+        }
+      }
+    },
+    "node-libs-browser": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
+      "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+          "dev": true
+        }
+      }
+    },
+    "node-releases": {
+      "version": "2.0.9",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz",
+      "integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==",
+      "dev": true
+    },
+    "node-sass": {
+      "version": "4.14.1",
+      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz",
+      "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==",
+      "dev": true,
+      "requires": {
+        "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.15",
+        "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.5",
+        "stdout-stream": "^1.4.0",
+        "true-case-path": "^1.0.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        },
+        "cross-spawn": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+          "integrity": "sha512-eZ+m1WNhSZutOa/uRblAc9Ut5MQfukFrFMtPSm3bZCA888NmMd5AWXWdgRZ80zd+pTk1P2JrGjg9pUPTvl2PWQ==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "which": "^1.2.9"
+          }
+        },
+        "get-stdin": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+          "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "4.1.5",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+          "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+          "dev": true,
+          "requires": {
+            "pseudomap": "^1.0.2",
+            "yallist": "^2.1.2"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
+          "dev": true
+        },
+        "yallist": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+          "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+          "dev": true
+        }
+      }
+    },
+    "nopt": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+      "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==",
+      "dev": true,
+      "requires": {
+        "abbrev": "1"
+      }
+    },
+    "normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        }
+      }
+    },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true
+    },
+    "normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+      "dev": true
+    },
+    "normalize-url": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
+      "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
+      "dev": true
+    },
+    "normalize-wheel": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
+      "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+      "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
+      "dev": true,
+      "requires": {
+        "path-key": "^2.0.0"
+      }
+    },
+    "npmlog": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+      "dev": true,
+      "requires": {
+        "are-we-there-yet": "~1.1.2",
+        "console-control-strings": "~1.1.0",
+        "gauge": "~2.7.3",
+        "set-blocking": "~2.0.0"
+      }
+    },
+    "nprogress": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
+      "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA=="
+    },
+    "nth-check": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+      "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+      "dev": true,
+      "requires": {
+        "boolbase": "~1.0.0"
+      }
+    },
+    "num2fraction": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+      "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==",
+      "dev": true
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==",
+      "dev": true
+    },
+    "oauth-sign": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+      "dev": true
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "dev": true
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==",
+      "dev": true,
+      "requires": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "object-hash": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz",
+      "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==",
+      "dev": true
+    },
+    "object-inspect": {
+      "version": "1.12.3",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+      "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="
+    },
+    "object-is": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      }
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.assign": {
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+      "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "has-symbols": "^1.0.3",
+        "object-keys": "^1.1.1"
+      }
+    },
+    "object.getownpropertydescriptors": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz",
+      "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==",
+      "dev": true,
+      "requires": {
+        "array.prototype.reduce": "^1.0.5",
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.20.4"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "object.values": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
+      "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.20.4"
+      }
+    },
+    "obuf": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+      "dev": true
+    },
+    "on-finished": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+      "dev": true,
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+      "dev": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "onetime": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+      "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "^1.0.0"
+      }
+    },
+    "open": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz",
+      "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==",
+      "dev": true,
+      "requires": {
+        "is-wsl": "^1.1.0"
+      }
+    },
+    "opener": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
+      "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
+      "dev": true
+    },
+    "opn": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
+      "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
+      "dev": true,
+      "requires": {
+        "is-wsl": "^1.1.0"
+      }
+    },
+    "optionator": {
+      "version": "0.8.3",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+      "dev": true,
+      "requires": {
+        "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"
+      }
+    },
+    "ora": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz",
+      "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.2",
+        "cli-cursor": "^2.1.0",
+        "cli-spinners": "^2.0.0",
+        "log-symbols": "^2.2.0",
+        "strip-ansi": "^5.2.0",
+        "wcwidth": "^1.0.1"
+      },
+      "dependencies": {
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
+      "dev": true
+    },
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
+      "dev": true
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+      "dev": true
+    },
+    "osenv": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+      "dev": true,
+      "requires": {
+        "os-homedir": "^1.0.0",
+        "os-tmpdir": "^1.0.0"
+      }
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+      "dev": true
+    },
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "requires": {
+        "p-try": "^2.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "requires": {
+        "p-limit": "^2.2.0"
+      }
+    },
+    "p-map": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+      "requires": {
+        "aggregate-error": "^3.0.0"
+      }
+    },
+    "p-retry": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
+      "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
+      "dev": true,
+      "requires": {
+        "retry": "^0.12.0"
+      }
+    },
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+    },
+    "pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+      "dev": true
+    },
+    "parallel-transform": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
+      "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
+      "dev": true,
+      "requires": {
+        "cyclist": "^1.0.1",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.1.5"
+      }
+    },
+    "param-case": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+      "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==",
+      "dev": true,
+      "requires": {
+        "no-case": "^2.2.0"
+      }
+    },
+    "parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "requires": {
+        "callsites": "^3.0.0"
+      },
+      "dependencies": {
+        "callsites": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+          "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+          "dev": true
+        }
+      }
+    },
+    "parse-asn1": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+      "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+      "dev": true,
+      "requires": {
+        "asn1.js": "^5.2.0",
+        "browserify-aes": "^1.0.0",
+        "evp_bytestokey": "^1.0.0",
+        "pbkdf2": "^3.0.3",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "parse-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      }
+    },
+    "parse5": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
+      "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
+      "dev": true
+    },
+    "parse5-htmlparser2-tree-adapter": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
+      "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
+      "dev": true,
+      "requires": {
+        "parse5": "^6.0.1"
+      },
+      "dependencies": {
+        "parse5": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+          "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+          "dev": true
+        }
+      }
+    },
+    "parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "dev": true
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==",
+      "dev": true
+    },
+    "path-browserify": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
+      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
+      "dev": true
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==",
+      "dev": true
+    },
+    "path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
+    },
+    "path-is-inside": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+      "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==",
+      "dev": true
+    },
+    "path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
+    },
+    "path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
+      "dev": true
+    },
+    "path-type": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+      "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+      "dev": true,
+      "requires": {
+        "pify": "^3.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+          "dev": true
+        }
+      }
+    },
+    "pbkdf2": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+      "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+      "dev": true,
+      "requires": {
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "performance-now": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+      "dev": true
+    },
+    "picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+    },
+    "picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true
+    },
+    "pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+      "dev": true
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
+      "dev": true
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
+      "dev": true,
+      "requires": {
+        "pinkie": "^2.0.0"
+      }
+    },
+    "pkg-dir": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+      "requires": {
+        "find-up": "^4.0.0"
+      }
+    },
+    "pnp-webpack-plugin": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz",
+      "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==",
+      "dev": true,
+      "requires": {
+        "ts-pnp": "^1.1.6"
+      }
+    },
+    "portfinder": {
+      "version": "1.0.32",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz",
+      "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==",
+      "dev": true,
+      "requires": {
+        "async": "^2.6.4",
+        "debug": "^3.2.7",
+        "mkdirp": "^0.5.6"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.7",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        }
+      }
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==",
+      "dev": true
+    },
+    "postcss": {
+      "version": "8.4.21",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
+      "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
+      "requires": {
+        "nanoid": "^3.3.4",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      }
+    },
+    "postcss-calc": {
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz",
+      "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.27",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.0.2"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "postcss-colormin": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
+      "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "color": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-convert-values": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
+      "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-discard-comments": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
+      "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "postcss-discard-duplicates": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
+      "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "postcss-discard-empty": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
+      "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "postcss-discard-overridden": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
+      "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "postcss-load-config": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz",
+      "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "^5.0.0",
+        "import-cwd": "^2.0.0"
+      }
+    },
+    "postcss-loader": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz",
+      "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "postcss": "^7.0.0",
+        "postcss-load-config": "^2.0.0",
+        "schema-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        }
+      }
+    },
+    "postcss-merge-longhand": {
+      "version": "4.0.11",
+      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
+      "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
+      "dev": true,
+      "requires": {
+        "css-color-names": "0.0.4",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "stylehacks": "^4.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-merge-rules": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
+      "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "postcss-minify-font-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
+      "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-minify-gradients": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
+      "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "is-color-stop": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-minify-params": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
+      "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-minify-selectors": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
+      "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "postcss-modules-extract-imports": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz",
+      "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.5"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "postcss-modules-local-by-default": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz",
+      "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==",
+      "dev": true,
+      "requires": {
+        "icss-utils": "^4.1.1",
+        "postcss": "^7.0.32",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.1.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "postcss-modules-scope": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz",
+      "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.6",
+        "postcss-selector-parser": "^6.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "postcss-modules-values": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz",
+      "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==",
+      "dev": true,
+      "requires": {
+        "icss-utils": "^4.0.0",
+        "postcss": "^7.0.6"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "postcss-normalize-charset": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
+      "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "postcss-normalize-display-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
+      "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-positions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
+      "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-repeat-style": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
+      "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-string": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
+      "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-timing-functions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
+      "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-unicode": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
+      "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-url": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
+      "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
+      "dev": true,
+      "requires": {
+        "is-absolute-url": "^2.0.0",
+        "normalize-url": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-whitespace": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
+      "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-ordered-values": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
+      "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-prefix-selector": {
+      "version": "1.16.0",
+      "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz",
+      "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==",
+      "dev": true
+    },
+    "postcss-reduce-initial": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
+      "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "postcss-reduce-transforms": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
+      "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-selector-parser": {
+      "version": "6.0.11",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
+      "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==",
+      "dev": true,
+      "requires": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      }
+    },
+    "postcss-svgo": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz",
+      "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "svgo": "^1.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-unique-selectors": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
+      "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "postcss": "^7.0.0",
+        "uniqs": "^2.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "postcss-value-parser": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+      "dev": true
+    },
+    "posthtml": {
+      "version": "0.9.2",
+      "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz",
+      "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==",
+      "dev": true,
+      "requires": {
+        "posthtml-parser": "^0.2.0",
+        "posthtml-render": "^1.0.5"
+      }
+    },
+    "posthtml-parser": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz",
+      "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==",
+      "dev": true,
+      "requires": {
+        "htmlparser2": "^3.8.3",
+        "isobject": "^2.1.0"
+      },
+      "dependencies": {
+        "domhandler": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+          "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "1"
+          }
+        },
+        "entities": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+          "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+          "dev": true
+        },
+        "htmlparser2": {
+          "version": "3.10.1",
+          "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+          "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^1.3.1",
+            "domhandler": "^2.3.0",
+            "domutils": "^1.5.1",
+            "entities": "^1.1.1",
+            "inherits": "^2.0.1",
+            "readable-stream": "^3.1.1"
+          }
+        },
+        "isobject": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+          "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
+          "dev": true,
+          "requires": {
+            "isarray": "1.0.0"
+          }
+        },
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "posthtml-rename-id": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz",
+      "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "1.0.5"
+      }
+    },
+    "posthtml-render": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz",
+      "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==",
+      "dev": true
+    },
+    "posthtml-svg-mode": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz",
+      "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==",
+      "dev": true,
+      "requires": {
+        "merge-options": "1.0.1",
+        "posthtml": "^0.9.2",
+        "posthtml-parser": "^0.2.1",
+        "posthtml-render": "^1.0.6"
+      }
+    },
+    "prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+      "dev": true
+    },
+    "prepend-http": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+      "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==",
+      "dev": true
+    },
+    "prettier": {
+      "version": "2.8.3",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.3.tgz",
+      "integrity": "sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==",
+      "dev": true
+    },
+    "prettier-linter-helpers": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+      "dev": true,
+      "requires": {
+        "fast-diff": "^1.1.2"
+      }
+    },
+    "pretty-error": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz",
+      "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.20",
+        "renderkid": "^2.0.4"
+      }
+    },
+    "printj": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
+      "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
+    },
+    "process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+      "dev": true
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+      "dev": true
+    },
+    "progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+      "dev": true
+    },
+    "promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="
+    },
+    "proxy-addr": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+      "dev": true,
+      "requires": {
+        "forwarded": "0.2.0",
+        "ipaddr.js": "1.9.1"
+      }
+    },
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+      "dev": true
+    },
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+      "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
+      "dev": true
+    },
+    "psl": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+    },
+    "public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+          "dev": true
+        }
+      }
+    },
+    "pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "pumpify": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+      "dev": true,
+      "requires": {
+        "duplexify": "^3.6.0",
+        "inherits": "^2.0.3",
+        "pump": "^2.0.0"
+      },
+      "dependencies": {
+        "pump": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+          "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        }
+      }
+    },
+    "punycode": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+      "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="
+    },
+    "q": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+      "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+      "dev": true
+    },
+    "qs": {
+      "version": "6.11.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+      "requires": {
+        "side-channel": "^1.0.4"
+      }
+    },
+    "query-string": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
+      "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==",
+      "dev": true,
+      "requires": {
+        "object-assign": "^4.1.0",
+        "strict-uri-encode": "^1.0.0"
+      }
+    },
+    "querystring": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+      "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==",
+      "dev": true
+    },
+    "querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
+      "dev": true
+    },
+    "querystringify": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+      "dev": true
+    },
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "requires": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "dev": true
+    },
+    "raw-body": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+      "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+      "dev": true,
+      "requires": {
+        "bytes": "3.1.2",
+        "http-errors": "2.0.0",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
+      }
+    },
+    "raw-loader": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz",
+      "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==",
+      "dev": true
+    },
+    "read-pkg": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+      "dev": true,
+      "requires": {
+        "@types/normalize-package-data": "^2.4.0",
+        "normalize-package-data": "^2.5.0",
+        "parse-json": "^5.0.0",
+        "type-fest": "^0.6.0"
+      }
+    },
+    "read-pkg-up": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+      "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==",
+      "dev": true,
+      "requires": {
+        "find-up": "^1.0.0",
+        "read-pkg": "^1.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+          "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==",
+          "dev": true,
+          "requires": {
+            "path-exists": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+          "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "path-type": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+          "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+          "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==",
+          "dev": true,
+          "requires": {
+            "load-json-file": "^1.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^1.0.0"
+          }
+        }
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true
+        }
+      }
+    },
+    "readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "picomatch": "^2.2.1"
+      }
+    },
+    "redent": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+      "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==",
+      "dev": true,
+      "requires": {
+        "indent-string": "^2.1.0",
+        "strip-indent": "^1.0.1"
+      },
+      "dependencies": {
+        "get-stdin": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+          "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==",
+          "dev": true
+        },
+        "indent-string": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+          "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==",
+          "dev": true,
+          "requires": {
+            "repeating": "^2.0.0"
+          }
+        },
+        "strip-indent": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+          "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==",
+          "dev": true,
+          "requires": {
+            "get-stdin": "^4.0.1"
+          }
+        }
+      }
+    },
+    "regenerate": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+      "dev": true
+    },
+    "regenerate-unicode-properties": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz",
+      "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==",
+      "dev": true,
+      "requires": {
+        "regenerate": "^1.4.2"
+      }
+    },
+    "regenerator-runtime": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+    },
+    "regenerator-transform": {
+      "version": "0.15.1",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz",
+      "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.8.4"
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "regexp.prototype.flags": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
+      "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "functions-have-names": "^1.2.2"
+      }
+    },
+    "regexpp": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
+      "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
+      "dev": true
+    },
+    "regexpu-core": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz",
+      "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==",
+      "dev": true,
+      "requires": {
+        "regenerate": "^1.4.2",
+        "regenerate-unicode-properties": "^10.1.0",
+        "regjsgen": "^0.7.1",
+        "regjsparser": "^0.9.1",
+        "unicode-match-property-ecmascript": "^2.0.0",
+        "unicode-match-property-value-ecmascript": "^2.1.0"
+      }
+    },
+    "regjsgen": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz",
+      "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==",
+      "dev": true
+    },
+    "regjsparser": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+      "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+      "dev": true,
+      "requires": {
+        "jsesc": "~0.5.0"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+          "dev": true
+        }
+      }
+    },
+    "relateurl": {
+      "version": "0.2.7",
+      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+      "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+      "dev": true
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==",
+      "dev": true
+    },
+    "renderkid": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz",
+      "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==",
+      "dev": true,
+      "requires": {
+        "css-select": "^4.1.3",
+        "dom-converter": "^0.2.0",
+        "htmlparser2": "^6.1.0",
+        "lodash": "^4.17.21",
+        "strip-ansi": "^3.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+          "dev": true
+        },
+        "css-select": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+          "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+          "dev": true,
+          "requires": {
+            "boolbase": "^1.0.0",
+            "css-what": "^6.0.1",
+            "domhandler": "^4.3.1",
+            "domutils": "^2.8.0",
+            "nth-check": "^2.0.1"
+          }
+        },
+        "css-what": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+          "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+          "dev": true
+        },
+        "dom-serializer": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+          "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.0.1",
+            "domhandler": "^4.2.0",
+            "entities": "^2.0.0"
+          }
+        },
+        "domelementtype": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+          "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+          "dev": true
+        },
+        "domutils": {
+          "version": "2.8.0",
+          "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+          "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+          "dev": true,
+          "requires": {
+            "dom-serializer": "^1.0.1",
+            "domelementtype": "^2.2.0",
+            "domhandler": "^4.2.0"
+          }
+        },
+        "nth-check": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+          "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+          "dev": true,
+          "requires": {
+            "boolbase": "^1.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        }
+      }
+    },
+    "repeat-element": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz",
+      "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
+      "dev": true
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
+      "dev": true
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+      "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==",
+      "dev": true,
+      "requires": {
+        "is-finite": "^1.0.0"
+      }
+    },
+    "request": {
+      "version": "2.88.2",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+      "dev": true,
+      "requires": {
+        "aws-sign2": "~0.7.0",
+        "aws4": "^1.8.0",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.6",
+        "extend": "~3.0.2",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.3.2",
+        "har-validator": "~5.1.3",
+        "http-signature": "~1.2.0",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.19",
+        "oauth-sign": "~0.9.0",
+        "performance-now": "^2.1.0",
+        "qs": "~6.5.2",
+        "safe-buffer": "^5.1.2",
+        "tough-cookie": "~2.5.0",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.3.2"
+      },
+      "dependencies": {
+        "qs": {
+          "version": "6.5.3",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+          "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+          "dev": true
+        }
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+      "dev": true
+    },
+    "require-main-filename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+      "dev": true
+    },
+    "requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+      "dev": true
+    },
+    "resize-observer-polyfill": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+    },
+    "resolve": {
+      "version": "1.22.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+      "dev": true,
+      "requires": {
+        "is-core-module": "^2.9.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      }
+    },
+    "resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+      "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+      "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
+      "dev": true
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==",
+      "dev": true
+    },
+    "restore-cursor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+      "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==",
+      "dev": true,
+      "requires": {
+        "onetime": "^2.0.0",
+        "signal-exit": "^3.0.2"
+      }
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+      "dev": true
+    },
+    "retry": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+      "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+      "dev": true
+    },
+    "rgb-regex": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
+      "integrity": "sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==",
+      "dev": true
+    },
+    "rgba-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
+      "integrity": "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==",
+      "dev": true
+    },
+    "rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "ripemd160": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "run-async": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+      "dev": true
+    },
+    "run-queue": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+      "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1"
+      }
+    },
+    "rxjs": {
+      "version": "6.6.7",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+      "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+          "dev": true
+        }
+      }
+    },
+    "safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==",
+      "dev": true,
+      "requires": {
+        "ret": "~0.1.10"
+      }
+    },
+    "safe-regex-test": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+      "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.1.3",
+        "is-regex": "^1.1.4"
+      }
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
+    },
+    "sass-graph": {
+      "version": "2.2.5",
+      "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz",
+      "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.0.0",
+        "lodash": "^4.0.0",
+        "scss-tokenizer": "^0.2.3",
+        "yargs": "^13.3.2"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+          "dev": true
+        },
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+          "dev": true,
+          "requires": {
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
+          }
+        },
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+          "dev": true
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+          "dev": true
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          }
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "13.1.2",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
+    "sass-loader": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz",
+      "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==",
+      "dev": true,
+      "requires": {
+        "clone-deep": "^4.0.1",
+        "loader-utils": "^1.2.3",
+        "neo-async": "^2.6.1",
+        "schema-utils": "^2.6.1",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "sax": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+      "dev": true
+    },
+    "schema-utils": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+      "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+      "requires": {
+        "@types/json-schema": "^7.0.5",
+        "ajv": "^6.12.4",
+        "ajv-keywords": "^3.5.2"
+      }
+    },
+    "screenfull": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz",
+      "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA=="
+    },
+    "script-loader": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.2.tgz",
+      "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==",
+      "dev": true,
+      "requires": {
+        "raw-loader": "~0.5.1"
+      }
+    },
+    "scss-tokenizer": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
+      "integrity": "sha512-dYE8LhncfBUar6POCxMTm0Ln+erjeczqEvCJib5/7XNkdw1FkUGgwMPY360FY0FgPWQxHWCx29Jl3oejyGLM9Q==",
+      "dev": true,
+      "requires": {
+        "js-base64": "^2.1.8",
+        "source-map": "^0.4.2"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+          "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==",
+          "dev": true,
+          "requires": {
+            "amdefine": ">=0.0.4"
+          }
+        }
+      }
+    },
+    "select-hose": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+      "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+      "dev": true
+    },
+    "selfsigned": {
+      "version": "1.10.14",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz",
+      "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==",
+      "dev": true,
+      "requires": {
+        "node-forge": "^0.10.0"
+      }
+    },
+    "semver": {
+      "version": "7.3.8",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+      "requires": {
+        "lru-cache": "^6.0.0"
+      }
+    },
+    "send": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "mime": "1.6.0",
+        "ms": "2.1.3",
+        "on-finished": "2.4.1",
+        "range-parser": "~1.2.1",
+        "statuses": "2.0.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+              "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+              "dev": true
+            }
+          }
+        },
+        "mime": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+          "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+          "dev": true
+        }
+      }
+    },
+    "serialize-javascript": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+      "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+      "requires": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "serve-index": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+      "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "depd": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+          "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+          "dev": true
+        },
+        "http-errors": {
+          "version": "1.6.3",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+          "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+          "dev": true,
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.0",
+            "statuses": ">= 1.4.0 < 2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+          "dev": true
+        },
+        "setprototypeof": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+          "dev": true
+        },
+        "statuses": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+          "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+          "dev": true
+        }
+      }
+    },
+    "serve-static": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+      "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+      "dev": true,
+      "requires": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.18.0"
+      }
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+      "dev": true
+    },
+    "set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
+      "dev": true
+    },
+    "setprototypeof": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+      "dev": true
+    },
+    "sha.js": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^6.0.2"
+      }
+    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+      "dev": true
+    },
+    "shell-quote": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz",
+      "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==",
+      "dev": true
+    },
+    "side-channel": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+      "requires": {
+        "call-bind": "^1.0.0",
+        "get-intrinsic": "^1.0.2",
+        "object-inspect": "^1.9.0"
+      }
+    },
+    "signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+      "dev": true
+    },
+    "simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.3.1"
+      },
+      "dependencies": {
+        "is-arrayish": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+          "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+          "dev": true
+        }
+      }
+    },
+    "slash": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+      "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+      "dev": true
+    },
+    "slice-ansi": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.0",
+        "astral-regex": "^1.0.0",
+        "is-fullwidth-code-point": "^2.0.0"
+      },
+      "dependencies": {
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+          "dev": true
+        }
+      }
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+          "dev": true
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "dev": true,
+      "requires": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.2.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "sockjs": {
+      "version": "0.3.24",
+      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
+      "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+      "dev": true,
+      "requires": {
+        "faye-websocket": "^0.11.3",
+        "uuid": "^8.3.2",
+        "websocket-driver": "^0.7.4"
+      },
+      "dependencies": {
+        "uuid": {
+          "version": "8.3.2",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+          "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+          "dev": true
+        }
+      }
+    },
+    "sockjs-client": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz",
+      "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==",
+      "dev": true,
+      "requires": {
+        "debug": "^3.2.7",
+        "eventsource": "^2.0.2",
+        "faye-websocket": "^0.11.4",
+        "inherits": "^2.0.4",
+        "url-parse": "^1.5.10"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.7",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "eventsource": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz",
+          "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==",
+          "dev": true
+        }
+      }
+    },
+    "sort-keys": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
+      "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==",
+      "dev": true,
+      "requires": {
+        "is-plain-obj": "^1.0.0"
+      },
+      "dependencies": {
+        "is-plain-obj": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+          "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+          "dev": true
+        }
+      }
+    },
+    "sortablejs": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz",
+      "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
+    },
+    "source-list-map": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
+    },
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+    },
+    "source-map-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
+    },
+    "source-map-resolve": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+      "dev": true,
+      "requires": {
+        "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": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
+      "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
+      "dev": true
+    },
+    "spdx-correct": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.12",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz",
+      "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==",
+      "dev": true
+    },
+    "spdy": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+      "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "handle-thing": "^2.0.0",
+        "http-deceiver": "^1.2.7",
+        "select-hose": "^2.0.0",
+        "spdy-transport": "^3.0.0"
+      }
+    },
+    "spdy-transport": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+      "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "detect-node": "^2.0.4",
+        "hpack.js": "^2.1.6",
+        "obuf": "^1.1.2",
+        "readable-stream": "^3.0.6",
+        "wbuf": "^1.7.3"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.0"
+      }
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+      "dev": true
+    },
+    "ssf": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz",
+      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+      "requires": {
+        "frac": "~1.1.2"
+      }
+    },
+    "sshpk": {
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
+      "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
+      "dev": true,
+      "requires": {
+        "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": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
+      "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
+      "requires": {
+        "minipass": "^3.1.1"
+      }
+    },
+    "stable": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+      "dev": true
+    },
+    "stackframe": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+      "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
+      "dev": true
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==",
+      "dev": true,
+      "requires": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "statuses": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+      "dev": true
+    },
+    "stdout-stream": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
+      "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
+      "dev": true,
+      "requires": {
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "stream-browserify": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
+      "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+      "dev": true,
+      "requires": {
+        "inherits": "~2.0.1",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "stream-each": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
+      "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "stream-http": {
+      "version": "2.8.3",
+      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
+      "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+      "dev": true,
+      "requires": {
+        "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": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
+      "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
+      "dev": true
+    },
+    "strict-uri-encode": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+      "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==",
+      "dev": true
+    },
+    "string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "requires": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      }
+    },
+    "string.prototype.trimend": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
+      "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.20.4"
+      }
+    },
+    "string.prototype.trimstart": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
+      "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.20.4"
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true
+        }
+      }
+    },
+    "strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^5.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+          "dev": true
+        }
+      }
+    },
+    "strip-bom": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+      "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==",
+      "dev": true,
+      "requires": {
+        "is-utf8": "^0.2.0"
+      }
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==",
+      "dev": true
+    },
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true
+    },
+    "strip-indent": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+      "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==",
+      "dev": true
+    },
+    "strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true
+    },
+    "stylehacks": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
+      "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true
+    },
+    "svg-baker": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz",
+      "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.0",
+        "clone": "^2.1.1",
+        "he": "^1.1.1",
+        "image-size": "^0.5.1",
+        "loader-utils": "^1.1.0",
+        "merge-options": "1.0.1",
+        "micromatch": "3.1.0",
+        "postcss": "^5.2.17",
+        "postcss-prefix-selector": "^1.6.0",
+        "posthtml-rename-id": "^1.0",
+        "posthtml-svg-mode": "^1.0.3",
+        "query-string": "^4.3.2",
+        "traverse": "^0.6.6"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+          "dev": true,
+          "requires": {
+            "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"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
+              "dev": true
+            }
+          }
+        },
+        "clone": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+          "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+          "dev": true
+        },
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
+          "dev": true
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "6.0.3",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+              "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+              "dev": true
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "6.0.3",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+              "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+              "dev": true
+            }
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "6.0.3",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+              "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+              "dev": true
+            }
+          }
+        },
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "micromatch": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz",
+          "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.2.2",
+            "define-property": "^1.0.0",
+            "extend-shallow": "^2.0.1",
+            "extglob": "^2.0.2",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^5.0.2",
+            "nanomatch": "^1.2.1",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          }
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^1.1.3",
+            "js-base64": "^2.1.9",
+            "source-map": "^0.5.6",
+            "supports-color": "^3.2.3"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^1.0.0"
+          }
+        }
+      }
+    },
+    "svg-baker-runtime": {
+      "version": "1.4.7",
+      "resolved": "https://registry.npmjs.org/svg-baker-runtime/-/svg-baker-runtime-1.4.7.tgz",
+      "integrity": "sha512-Zorfwwj5+lWjk/oxwSMsRdS2sPQQdTmmsvaSpzU+i9ZWi3zugHLt6VckWfnswphQP0LmOel3nggpF5nETbt6xw==",
+      "dev": true,
+      "requires": {
+        "deepmerge": "1.3.2",
+        "mitt": "1.1.2",
+        "svg-baker": "^1.7.0"
+      },
+      "dependencies": {
+        "deepmerge": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.3.2.tgz",
+          "integrity": "sha512-qjMjTrk+RKv/sp4RPDpV5CnKhxjFI9p+GkLBOls5A8EEElldYWCWA9zceAkmfd0xIo2aU1nxiaLFoiya2sb6Cg==",
+          "dev": true
+        }
+      }
+    },
+    "svg-sprite-loader": {
+      "version": "6.0.11",
+      "resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-6.0.11.tgz",
+      "integrity": "sha512-TedsTf8wsHH6HgdwKjUveDZRC6q5gPloYV8A8/zZaRWP929J7x6TzQ6MvZFl+YYDJuJ0Akyuu/vNVJ+fbPuYXg==",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.0",
+        "deepmerge": "1.3.2",
+        "domready": "1.0.8",
+        "escape-string-regexp": "1.0.5",
+        "loader-utils": "^1.1.0",
+        "svg-baker": "^1.5.0",
+        "svg-baker-runtime": "^1.4.7",
+        "url-slug": "2.0.0"
+      },
+      "dependencies": {
+        "deepmerge": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.3.2.tgz",
+          "integrity": "sha512-qjMjTrk+RKv/sp4RPDpV5CnKhxjFI9p+GkLBOls5A8EEElldYWCWA9zceAkmfd0xIo2aU1nxiaLFoiya2sb6Cg==",
+          "dev": true
+        },
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "svg-tags": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+      "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
+      "dev": true
+    },
+    "svgo": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
+      "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        }
+      }
+    },
+    "table": {
+      "version": "5.4.6",
+      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.10.2",
+        "lodash": "^4.17.14",
+        "slice-ansi": "^2.1.0",
+        "string-width": "^3.0.0"
+      },
+      "dependencies": {
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "tapable": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+      "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+      "dev": true
+    },
+    "tar": {
+      "version": "6.1.13",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
+      "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
+      "requires": {
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "minipass": "^4.0.0",
+        "minizlib": "^2.1.1",
+        "mkdirp": "^1.0.3",
+        "yallist": "^4.0.0"
+      },
+      "dependencies": {
+        "minipass": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.1.tgz",
+          "integrity": "sha512-V9esFpNbK0arbN3fm2sxDKqMYgIp7XtVdE4Esj+PE4Qaaxdg1wIw48ITQIOn1sc8xXSmUviVL3cyjMqPlrVkiA=="
+        }
+      }
+    },
+    "terser": {
+      "version": "4.8.1",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz",
+      "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==",
+      "dev": true,
+      "requires": {
+        "commander": "^2.20.0",
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.12"
+      }
+    },
+    "terser-webpack-plugin": {
+      "version": "1.4.5",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz",
+      "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==",
+      "dev": true,
+      "requires": {
+        "cacache": "^12.0.2",
+        "find-cache-dir": "^2.1.0",
+        "is-wsl": "^1.1.0",
+        "schema-utils": "^1.0.0",
+        "serialize-javascript": "^4.0.0",
+        "source-map": "^0.6.1",
+        "terser": "^4.1.2",
+        "webpack-sources": "^1.4.0",
+        "worker-farm": "^1.7.0"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "12.0.4",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        },
+        "chownr": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+          "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+          "dev": true
+        },
+        "find-cache-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+          "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+          "dev": true,
+          "requires": {
+            "commondir": "^1.0.1",
+            "make-dir": "^2.0.0",
+            "pkg-dir": "^3.0.0"
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "make-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+          "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+          "dev": true,
+          "requires": {
+            "pify": "^4.0.1",
+            "semver": "^5.6.0"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+          "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+          "dev": true,
+          "requires": {
+            "find-up": "^3.0.0"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        },
+        "ssri": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
+          "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
+      }
+    },
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+      "dev": true
+    },
+    "thenify": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+      "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+      "dev": true,
+      "requires": {
+        "any-promise": "^1.0.0"
+      }
+    },
+    "thenify-all": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+      "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+      "dev": true,
+      "requires": {
+        "thenify": ">= 3.1.0 < 4"
+      }
+    },
+    "thread-loader": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz",
+      "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==",
+      "dev": true,
+      "requires": {
+        "loader-runner": "^2.3.1",
+        "loader-utils": "^1.1.0",
+        "neo-async": "^2.6.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "throttle-debounce": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
+      "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+      "dev": true
+    },
+    "through2": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+      "dev": true,
+      "requires": {
+        "readable-stream": "~2.3.6",
+        "xtend": "~4.0.1"
+      }
+    },
+    "thunky": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+      "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+      "dev": true
+    },
+    "timers-browserify": {
+      "version": "2.0.12",
+      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
+      "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
+      "dev": true,
+      "requires": {
+        "setimmediate": "^1.0.4"
+      }
+    },
+    "timsort": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
+      "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==",
+      "dev": true
+    },
+    "tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "dev": true,
+      "requires": {
+        "os-tmpdir": "~1.0.2"
+      }
+    },
+    "to-arraybuffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==",
+      "dev": true
+    },
+    "to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+      "dev": true
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+      "dev": true,
+      "requires": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      }
+    },
+    "toidentifier": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+      "dev": true
+    },
+    "toposort": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz",
+      "integrity": "sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==",
+      "dev": true
+    },
+    "tough-cookie": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+      "requires": {
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
+      }
+    },
+    "tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+    },
+    "traverse": {
+      "version": "0.6.7",
+      "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz",
+      "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==",
+      "dev": true
+    },
+    "trim-newlines": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+      "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==",
+      "dev": true
+    },
+    "true-case-path": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
+      "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.2"
+      }
+    },
+    "tryer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
+      "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
+      "dev": true
+    },
+    "ts-pnp": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz",
+      "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==",
+      "dev": true
+    },
+    "tslib": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
+      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+    },
+    "tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+      "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==",
+      "dev": true
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+      "dev": true
+    },
+    "type-check": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "~1.1.2"
+      }
+    },
+    "type-fest": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+      "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+      "dev": true
+    },
+    "type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "dev": true,
+      "requires": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      }
+    },
+    "typed-array-length": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+      "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "for-each": "^0.3.3",
+        "is-typed-array": "^1.1.9"
+      }
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+      "dev": true
+    },
+    "uglify-js": {
+      "version": "3.4.10",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz",
+      "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==",
+      "dev": true,
+      "requires": {
+        "commander": "~2.19.0",
+        "source-map": "~0.6.1"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.19.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+          "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
+          "dev": true
+        }
+      }
+    },
+    "unbox-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+      "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "has-bigints": "^1.0.2",
+        "has-symbols": "^1.0.3",
+        "which-boxed-primitive": "^1.0.2"
+      }
+    },
+    "unicode-canonical-property-names-ecmascript": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+      "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+      "dev": true
+    },
+    "unicode-match-property-ecmascript": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+      "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+      "dev": true,
+      "requires": {
+        "unicode-canonical-property-names-ecmascript": "^2.0.0",
+        "unicode-property-aliases-ecmascript": "^2.0.0"
+      }
+    },
+    "unicode-match-property-value-ecmascript": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
+      "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
+      "dev": true
+    },
+    "unicode-property-aliases-ecmascript": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+      "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+      "dev": true
+    },
+    "unidecode": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/unidecode/-/unidecode-0.1.8.tgz",
+      "integrity": "sha512-SdoZNxCWpN2tXTCrGkPF/0rL2HEq+i2gwRG1ReBvx8/0yTzC3enHfugOf8A9JBShVwwrRIkLX0YcDUGbzjbVCA==",
+      "dev": true
+    },
+    "union-value": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
+      }
+    },
+    "uniq": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+      "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==",
+      "dev": true
+    },
+    "uniqs": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
+      "integrity": "sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==",
+      "dev": true
+    },
+    "unique-filename": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+      "requires": {
+        "unique-slug": "^2.0.0"
+      }
+    },
+    "unique-slug": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
+      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+      "requires": {
+        "imurmurhash": "^0.1.4"
+      }
+    },
+    "universalify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+      "dev": true
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+      "dev": true
+    },
+    "unquote": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+      "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==",
+      "dev": true
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==",
+      "dev": true,
+      "requires": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+          "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==",
+          "dev": true,
+          "requires": {
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
+              "dev": true,
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==",
+          "dev": true
+        }
+      }
+    },
+    "upath": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+      "dev": true
+    },
+    "update-browserslist-db": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+      "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+      "dev": true,
+      "requires": {
+        "escalade": "^3.1.1",
+        "picocolors": "^1.0.0"
+      }
+    },
+    "upper-case": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+      "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==",
+      "dev": true
+    },
+    "uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==",
+      "dev": true
+    },
+    "url": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+      "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
+      "dev": true,
+      "requires": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+          "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==",
+          "dev": true
+        }
+      }
+    },
+    "url-loader": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz",
+      "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.2.3",
+        "mime": "^2.4.4",
+        "schema-utils": "^2.5.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "url-parse": {
+      "version": "1.5.10",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+      "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+      "dev": true,
+      "requires": {
+        "querystringify": "^2.1.1",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "url-slug": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/url-slug/-/url-slug-2.0.0.tgz",
+      "integrity": "sha512-aiNmSsVgrjCiJ2+KWPferjT46YFKoE8i0YX04BlMVDue022Xwhg/zYlnZ6V9/mP3p8Wj7LEp0myiTkC/p6sxew==",
+      "dev": true,
+      "requires": {
+        "unidecode": "0.1.8"
+      }
+    },
+    "use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+      "dev": true
+    },
+    "util": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
+      "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+          "dev": true
+        }
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+      "dev": true
+    },
+    "util.promisify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
+      "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.2",
+        "has-symbols": "^1.0.1",
+        "object.getownpropertydescriptors": "^2.1.0"
+      }
+    },
+    "utila": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+      "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
+      "dev": true
+    },
+    "utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+      "dev": true
+    },
+    "uuid": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+      "dev": true
+    },
+    "v8-compile-cache": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+      "dev": true
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+      "dev": true
+    },
+    "vendors": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz",
+      "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==",
+      "dev": true
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
+    },
+    "vm-browserify": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+      "dev": true
+    },
+    "vue": {
+      "version": "2.7.14",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz",
+      "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==",
+      "requires": {
+        "@vue/compiler-sfc": "2.7.14",
+        "csstype": "^3.1.0"
+      }
+    },
+    "vue-count-to": {
+      "version": "1.0.13",
+      "resolved": "https://registry.npmjs.org/vue-count-to/-/vue-count-to-1.0.13.tgz",
+      "integrity": "sha512-6R4OVBVNtQTlcbXu6SJ8ENR35M2/CdWt3Jmv57jOUM+1ojiFmjVGvZPH8DfHpMDSA+ITs+EW5V6qthADxeyYOQ=="
+    },
+    "vue-eslint-parser": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz",
+      "integrity": "sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.1",
+        "eslint-scope": "^5.1.1",
+        "eslint-visitor-keys": "^1.1.0",
+        "espree": "^6.2.1",
+        "esquery": "^1.4.0",
+        "lodash": "^4.17.21",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "eslint-scope": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+          "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+          "dev": true,
+          "requires": {
+            "esrecurse": "^4.3.0",
+            "estraverse": "^4.1.1"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "vue-hot-reload-api": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",
+      "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==",
+      "dev": true
+    },
+    "vue-loader": {
+      "version": "15.10.1",
+      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.1.tgz",
+      "integrity": "sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA==",
+      "dev": true,
+      "requires": {
+        "@vue/component-compiler-utils": "^3.1.0",
+        "hash-sum": "^1.0.2",
+        "loader-utils": "^1.1.0",
+        "vue-hot-reload-api": "^2.3.0",
+        "vue-style-loader": "^4.1.0"
+      },
+      "dependencies": {
+        "hash-sum": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
+          "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
+          "dev": true
+        },
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "vue-router": {
+      "version": "3.6.5",
+      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz",
+      "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ=="
+    },
+    "vue-style-loader": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
+      "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==",
+      "dev": true,
+      "requires": {
+        "hash-sum": "^1.0.2",
+        "loader-utils": "^1.0.2"
+      },
+      "dependencies": {
+        "hash-sum": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
+          "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
+          "dev": true
+        },
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "vue-template-compiler": {
+      "version": "2.7.14",
+      "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz",
+      "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==",
+      "dev": true,
+      "requires": {
+        "de-indent": "^1.0.2",
+        "he": "^1.2.0"
+      }
+    },
+    "vue-template-es2015-compiler": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz",
+      "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
+      "dev": true
+    },
+    "vuedraggable": {
+      "version": "2.24.3",
+      "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz",
+      "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
+      "requires": {
+        "sortablejs": "1.10.2"
+      }
+    },
+    "vuex": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz",
+      "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw=="
+    },
+    "watchpack": {
+      "version": "1.7.5",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz",
+      "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==",
+      "dev": true,
+      "requires": {
+        "chokidar": "^3.4.1",
+        "graceful-fs": "^4.1.2",
+        "neo-async": "^2.5.0",
+        "watchpack-chokidar2": "^2.0.1"
+      }
+    },
+    "watchpack-chokidar2": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz",
+      "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "chokidar": "^2.1.8"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "micromatch": "^3.1.4",
+            "normalize-path": "^2.1.1"
+          },
+          "dependencies": {
+            "normalize-path": {
+              "version": "2.1.1",
+              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+              "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "remove-trailing-separator": "^1.0.1"
+              }
+            }
+          }
+        },
+        "binary-extensions": {
+          "version": "1.13.1",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+          "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+          "dev": true,
+          "optional": true
+        },
+        "chokidar": {
+          "version": "2.1.8",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "anymatch": "^2.0.0",
+            "async-each": "^1.0.1",
+            "braces": "^2.3.2",
+            "fsevents": "^1.2.7",
+            "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"
+          }
+        },
+        "fsevents": {
+          "version": "1.2.13",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "nan": "^2.12.1"
+          }
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-extglob": "^2.1.0"
+              }
+            }
+          }
+        },
+        "is-binary-path": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+          "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "binary-extensions": "^1.0.0"
+          }
+        },
+        "readdirp": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+          "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "graceful-fs": "^4.1.11",
+            "micromatch": "^3.1.10",
+            "readable-stream": "^2.0.2"
+          }
+        }
+      }
+    },
+    "wbuf": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+      "dev": true,
+      "requires": {
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "wcwidth": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+      "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+      "dev": true,
+      "requires": {
+        "defaults": "^1.0.3"
+      }
+    },
+    "webidl-conversions": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+    },
+    "webpack": {
+      "version": "4.46.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz",
+      "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/wasm-edit": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "acorn": "^6.4.1",
+        "ajv": "^6.10.2",
+        "ajv-keywords": "^3.4.1",
+        "chrome-trace-event": "^1.0.2",
+        "enhanced-resolve": "^4.5.0",
+        "eslint-scope": "^4.0.3",
+        "json-parse-better-errors": "^1.0.2",
+        "loader-runner": "^2.4.0",
+        "loader-utils": "^1.2.3",
+        "memory-fs": "^0.4.1",
+        "micromatch": "^3.1.10",
+        "mkdirp": "^0.5.3",
+        "neo-async": "^2.6.1",
+        "node-libs-browser": "^2.2.1",
+        "schema-utils": "^1.0.0",
+        "tapable": "^1.1.3",
+        "terser-webpack-plugin": "^1.4.3",
+        "watchpack": "^1.7.4",
+        "webpack-sources": "^1.4.1"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        }
+      }
+    },
+    "webpack-bundle-analyzer": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz",
+      "integrity": "sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==",
+      "dev": true,
+      "requires": {
+        "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.19",
+        "mkdirp": "^0.5.1",
+        "opener": "^1.5.1",
+        "ws": "^6.0.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "7.4.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+          "dev": true
+        },
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        }
+      }
+    },
+    "webpack-chain": {
+      "version": "6.5.1",
+      "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz",
+      "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==",
+      "dev": true,
+      "requires": {
+        "deepmerge": "^1.5.2",
+        "javascript-stringify": "^2.0.1"
+      }
+    },
+    "webpack-dev-middleware": {
+      "version": "3.7.3",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz",
+      "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==",
+      "dev": true,
+      "requires": {
+        "memory-fs": "^0.4.1",
+        "mime": "^2.4.4",
+        "mkdirp": "^0.5.1",
+        "range-parser": "^1.2.1",
+        "webpack-log": "^2.0.0"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        }
+      }
+    },
+    "webpack-dev-server": {
+      "version": "3.11.3",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz",
+      "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==",
+      "dev": true,
+      "requires": {
+        "ansi-html-community": "0.0.8",
+        "bonjour": "^3.5.0",
+        "chokidar": "^2.1.8",
+        "compression": "^1.7.4",
+        "connect-history-api-fallback": "^1.6.0",
+        "debug": "^4.1.1",
+        "del": "^4.1.1",
+        "express": "^4.17.1",
+        "html-entities": "^1.3.1",
+        "http-proxy-middleware": "0.19.1",
+        "import-local": "^2.0.0",
+        "internal-ip": "^4.3.0",
+        "ip": "^1.1.5",
+        "is-absolute-url": "^3.0.3",
+        "killable": "^1.0.1",
+        "loglevel": "^1.6.8",
+        "opn": "^5.5.0",
+        "p-retry": "^3.0.1",
+        "portfinder": "^1.0.26",
+        "schema-utils": "^1.0.0",
+        "selfsigned": "^1.10.8",
+        "semver": "^6.3.0",
+        "serve-index": "^1.9.1",
+        "sockjs": "^0.3.21",
+        "sockjs-client": "^1.5.0",
+        "spdy": "^4.0.2",
+        "strip-ansi": "^3.0.1",
+        "supports-color": "^6.1.0",
+        "url": "^0.11.0",
+        "webpack-dev-middleware": "^3.7.2",
+        "webpack-log": "^2.0.0",
+        "ws": "^6.2.1",
+        "yargs": "^13.3.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+          "dev": true
+        },
+        "anymatch": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+          "dev": true,
+          "requires": {
+            "micromatch": "^3.1.4",
+            "normalize-path": "^2.1.1"
+          },
+          "dependencies": {
+            "normalize-path": {
+              "version": "2.1.1",
+              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+              "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==",
+              "dev": true,
+              "requires": {
+                "remove-trailing-separator": "^1.0.1"
+              }
+            }
+          }
+        },
+        "binary-extensions": {
+          "version": "1.13.1",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+          "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+          "dev": true
+        },
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+          "dev": true
+        },
+        "chokidar": {
+          "version": "2.1.8",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+          "dev": true,
+          "requires": {
+            "anymatch": "^2.0.0",
+            "async-each": "^1.0.1",
+            "braces": "^2.3.2",
+            "fsevents": "^1.2.7",
+            "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"
+          }
+        },
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+          "dev": true,
+          "requires": {
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "4.1.1",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+              "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+              "dev": true
+            },
+            "strip-ansi": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^4.1.0"
+              }
+            }
+          }
+        },
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+          "dev": true
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "fsevents": {
+          "version": "1.2.13",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "nan": "^2.12.1"
+          }
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
+              "dev": true,
+              "requires": {
+                "is-extglob": "^2.1.0"
+              }
+            }
+          }
+        },
+        "http-proxy-middleware": {
+          "version": "0.19.1",
+          "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
+          "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
+          "dev": true,
+          "requires": {
+            "http-proxy": "^1.17.0",
+            "is-glob": "^4.0.0",
+            "lodash": "^4.17.11",
+            "micromatch": "^3.1.10"
+          }
+        },
+        "is-absolute-url": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
+          "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
+          "dev": true
+        },
+        "is-binary-path": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+          "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==",
+          "dev": true,
+          "requires": {
+            "binary-extensions": "^1.0.0"
+          }
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+          "dev": true
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+          "dev": true
+        },
+        "readdirp": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+          "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.11",
+            "micromatch": "^3.1.10",
+            "readable-stream": "^2.0.2"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "4.1.1",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+              "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+              "dev": true
+            },
+            "strip-ansi": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^4.1.0"
+              }
+            }
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "4.1.1",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+              "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+              "dev": true
+            },
+            "strip-ansi": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^4.1.0"
+              }
+            }
+          }
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "13.1.2",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
+    "webpack-log": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
+      "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
+      "dev": true,
+      "requires": {
+        "ansi-colors": "^3.0.0",
+        "uuid": "^3.3.2"
+      }
+    },
+    "webpack-merge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
+      "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.15"
+      }
+    },
+    "webpack-sources": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+      "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+      "requires": {
+        "source-list-map": "^2.0.0",
+        "source-map": "~0.6.1"
+      }
+    },
+    "websocket-driver": {
+      "version": "0.7.4",
+      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
+      "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+      "dev": true,
+      "requires": {
+        "http-parser-js": ">=0.5.1",
+        "safe-buffer": ">=5.1.0",
+        "websocket-extensions": ">=0.1.1"
+      }
+    },
+    "websocket-extensions": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+      "dev": true
+    },
+    "whatwg-url": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+      "requires": {
+        "tr46": "~0.0.3",
+        "webidl-conversions": "^3.0.0"
+      }
+    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "dev": true,
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "which-boxed-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+      "dev": true,
+      "requires": {
+        "is-bigint": "^1.0.1",
+        "is-boolean-object": "^1.1.0",
+        "is-number-object": "^1.0.4",
+        "is-string": "^1.0.5",
+        "is-symbol": "^1.0.3"
+      }
+    },
+    "which-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+      "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
+      "dev": true
+    },
+    "which-typed-array": {
+      "version": "1.1.9",
+      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
+      "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
+      "dev": true,
+      "requires": {
+        "available-typed-arrays": "^1.0.5",
+        "call-bind": "^1.0.2",
+        "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
+        "has-tostringtag": "^1.0.0",
+        "is-typed-array": "^1.1.10"
+      }
+    },
+    "wide-align": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+      "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+      "dev": true,
+      "requires": {
+        "string-width": "^1.0.2 || 2 || 3 || 4"
+      }
+    },
+    "wmf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
+      "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
+    },
+    "word": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz",
+      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
+    },
+    "word-wrap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+      "dev": true
+    },
+    "worker-farm": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
+      "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
+      "dev": true,
+      "requires": {
+        "errno": "~0.1.7"
+      }
+    },
+    "wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        }
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+    },
+    "write": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+      "dev": true,
+      "requires": {
+        "mkdirp": "^0.5.1"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.6"
+          }
+        }
+      }
+    },
+    "ws": {
+      "version": "6.2.2",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
+      "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
+      "requires": {
+        "async-limiter": "~1.0.0"
+      }
+    },
+    "xlsx": {
+      "version": "0.17.5",
+      "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.17.5.tgz",
+      "integrity": "sha512-lXNU0TuYsvElzvtI6O7WIVb9Zar1XYw7Xb3VAx2wn8N/n0whBYrCnHMxtFyIiUU1Wjf09WzmLALDfBO5PqTb1g==",
+      "requires": {
+        "adler-32": "~1.2.0",
+        "cfb": "^1.1.4",
+        "codepage": "~1.15.0",
+        "crc-32": "~1.2.0",
+        "ssf": "~0.11.2",
+        "wmf": "~1.0.1",
+        "word": "~0.3.0"
+      }
+    },
+    "xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "dev": true
+    },
+    "y18n": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+      "dev": true
+    },
+    "yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
+    "yargs": {
+      "version": "16.2.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+      "dev": true,
+      "requires": {
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.0",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
+      },
+      "dependencies": {
+        "cliui": {
+          "version": "7.0.4",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+          "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^7.0.0"
+          }
+        },
+        "y18n": {
+          "version": "5.0.8",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+          "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+          "dev": true
+        }
+      }
+    },
+    "yargs-parser": {
+      "version": "20.2.9",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+      "dev": true
+    },
+    "yorkie": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz",
+      "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==",
+      "dev": true,
+      "requires": {
+        "execa": "^0.8.0",
+        "is-ci": "^1.0.10",
+        "normalize-path": "^1.0.0",
+        "strip-indent": "^2.0.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+          "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "0.8.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz",
+          "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        },
+        "get-stream": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+          "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "4.1.5",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+          "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+          "dev": true,
+          "requires": {
+            "pseudomap": "^1.0.2",
+            "yallist": "^2.1.2"
+          }
+        },
+        "normalize-path": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz",
+          "integrity": "sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==",
+          "dev": true
+        },
+        "yallist": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+          "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+          "dev": true
+        }
+      }
+    },
+    "zrender": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.1.tgz",
+      "integrity": "sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==",
+      "requires": {
+        "tslib": "2.3.0"
+      }
+    }
+  }
+}
diff --git a/qqjf-Web/package.json b/qqjf-Web/package.json
new file mode 100644
index 0000000..0a0411e
--- /dev/null
+++ b/qqjf-Web/package.json
@@ -0,0 +1,72 @@
+{
+  "name": "wbtoubiao",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build",
+    "lint": "vue-cli-service lint",
+    "start": "npm run serve"
+  },
+  "dependencies": {
+    "@microsoft/signalr": "^5.0.5",
+    "axios": "^0.21.1",
+    "compression-webpack-plugin": "^5.0.1",
+    "core-js": "^3.6.5",
+    "dayjs": "^1.11.1",
+    "echarts": "^5.1.2",
+    "el-table-infinite-scroll": "^1.0.10",
+    "element-ui": "^2.15.8",
+    "file-saver": "^2.0.5",
+    "jquery": "^3.6.0",
+    "js-cookie": "^2.2.1",
+    "nprogress": "^0.2.0",
+    "qs": "^6.5.2",
+    "screenfull": "^5.1.0",
+    "vue": "^2.6.11",
+    "vue-count-to": "^1.0.13",
+    "vue-router": "^3.2.0",
+    "vuedraggable": "^2.24.3",
+    "vuex": "^3.4.0",
+    "xlsx": "^0.17.0"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "~4.5.0",
+    "@vue/cli-plugin-eslint": "~4.5.0",
+    "@vue/cli-plugin-router": "~4.5.0",
+    "@vue/cli-plugin-vuex": "~4.5.0",
+    "@vue/cli-service": "~4.5.0",
+    "@vue/eslint-config-prettier": "^6.0.0",
+    "babel-eslint": "^10.1.0",
+    "eslint": "^6.7.2",
+    "eslint-plugin-prettier": "^3.3.1",
+    "eslint-plugin-vue": "^6.2.2",
+    "node-sass": "^4.12.0",
+    "prettier": "^2.2.1",
+    "sass-loader": "^8.0.2",
+    "script-loader": "^0.7.2",
+    "svg-sprite-loader": "^6.0.5",
+    "vue-template-compiler": "^2.6.11",
+    "webpack": "^4.46.0"
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true
+    },
+    "extends": [
+      "plugin:vue/essential",
+      "eslint:recommended",
+      "@vue/prettier"
+    ],
+    "parserOptions": {
+      "parser": "babel-eslint"
+    },
+    "rules": {}
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not dead"
+  ]
+}
diff --git a/qqjf-Web/public/favicon.ico b/qqjf-Web/public/favicon.ico
new file mode 100644
index 0000000..df36fcf
--- /dev/null
+++ b/qqjf-Web/public/favicon.ico
Binary files differ
diff --git a/qqjf-Web/public/index.html b/qqjf-Web/public/index.html
new file mode 100644
index 0000000..a945b71
--- /dev/null
+++ b/qqjf-Web/public/index.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+    <!-- <title><%= webpackConfig.name %></title> -->
+    <title><%= htmlWebpackPlugin.options.title %></title>
+  </head>
+  <body>
+
+    <div id="app"></div>
+    <!-- <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
+    <script type="text/javascript" src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
+    <% } %> -->
+    <!-- built files will be auto injected -->
+  </body>
+</html>
diff --git a/qqjf-Web/src/App.vue b/qqjf-Web/src/App.vue
new file mode 100644
index 0000000..e72a45d
--- /dev/null
+++ b/qqjf-Web/src/App.vue
@@ -0,0 +1,28 @@
+<template>
+  <div id="app" @click="clicked">
+    <router-view />
+  </div>
+</template>
+<script>
+import { getStorage, setStorage, clearStorage } from '@/utils/sessionStorage';
+export default {
+  name: 'App',
+  data() {
+    return {
+      lTime: new Date().getTime(), // 鏈�鍚庝竴娆$偣鍑荤殑鏃堕棿
+      ctTime: new Date().getTime(), //褰撳墠鏃堕棿
+      tOut: 10 * 60 * 1000 //瓒呮椂鏃堕棿10min
+    };
+  },
+  mounted() {
+    // window.setInterval(this.tTime, 1000);
+  },
+
+  methods: {
+    clicked() {
+      // this.lTime = new Date().getTime(); //褰撶晫闈㈣鐐瑰嚮鏇存柊鐐瑰嚮鏃堕棿
+    }
+  }
+};
+</script>
+<style lang="scss"></style>
diff --git a/qqjf-Web/src/Layout/components/Appmain.vue b/qqjf-Web/src/Layout/components/Appmain.vue
new file mode 100644
index 0000000..6fee26b
--- /dev/null
+++ b/qqjf-Web/src/Layout/components/Appmain.vue
@@ -0,0 +1,52 @@
+<!--  -->
+<template>
+<div id='appmain'>
+    
+</div>
+</template>
+
+<script>
+//杩欓噷鍙互瀵煎叆鍏朵粬鏂囦欢锛堟瘮濡傦細缁勪欢锛屽伐鍏穓s锛岀涓夋柟鎻掍欢js锛宩son鏂囦欢锛屽浘鐗囨枃浠剁瓑绛夛級
+//渚嬪锛歩mport 銆婄粍浠跺悕绉般�� from '銆婄粍浠惰矾寰勩��';
+
+export default {
+//name鏀惧叆妯℃澘鍚�,鏂逛究鍦ㄥ叾浠栧湴鏂瑰紩鐢�
+name: '',
+//import寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+components: {},
+data() {
+//杩欓噷瀛樻斁鏁版嵁
+return {
+
+};
+},
+//鐩戝惉灞炴�� 绫讳技浜巇ata姒傚康
+computed: {
+
+},
+//鐢熷懡鍛ㄦ湡 - 鍒涘缓瀹屾垚锛堝彲浠ヨ闂綋鍓峵his瀹炰緥锛�
+created() {
+
+},
+//鐢熷懡鍛ㄦ湡 - 鎸傝浇瀹屾垚锛堝彲浠ヨ闂瓺OM鍏冪礌锛�
+mounted() {
+
+},
+//鏂规硶闆嗗悎
+methods: {
+
+},
+//鐩戞帶data涓殑鏁版嵁鍙樺寲
+watch: {
+
+},
+//濡傛灉椤甸潰鏈塳eep-alive缂撳瓨鍔熻兘锛岃繖涓嚱鏁颁細瑙﹀彂
+activated() {
+
+},
+}
+</script>
+<style lang='scss' scoped>
+/* @import url(); 寮曞叆鍏叡css绫� */
+
+</style>
\ No newline at end of file
diff --git a/qqjf-Web/src/Layout/components/Sidebar/SidebarItem.vue b/qqjf-Web/src/Layout/components/Sidebar/SidebarItem.vue
new file mode 100644
index 0000000..affa514
--- /dev/null
+++ b/qqjf-Web/src/Layout/components/Sidebar/SidebarItem.vue
@@ -0,0 +1,49 @@
+<!--  -->
+<template>
+  <div class="sidebarItem">
+    <template v-if="!itemRoute.children">
+      <el-menu-item :index="itemRoute.path">
+        <item :icon="itemRoute.meta.icon" :title="itemRoute.meta.title" />
+      </el-menu-item>
+    </template>
+
+    <el-submenu v-else ref="subMenu" :index="itemRoute.path" popper-append-to-body>
+      <template slot="title">
+        <item :icon="itemRoute.meta.icon" :title="itemRoute.meta.title" />
+      </template>
+      <sidebar-item v-for="item in itemRoute.children" :key="item.path" :itemRoute="item" />
+    </el-submenu>
+  </div>
+</template>
+
+<script>
+//杩欓噷鍙互瀵煎叆鍏朵粬鏂囦欢锛堟瘮濡傦細缁勪欢锛屽伐鍏穓s锛岀涓夋柟鎻掍欢js锛宩son鏂囦欢锛屽浘鐗囨枃浠剁瓑绛夛級
+//渚嬪锛歩mport 銆婄粍浠跺悕绉般�� from '銆婄粍浠惰矾寰勩��';
+import item from './item';
+export default {
+  //name鏀惧叆妯℃澘鍚�,鏂逛究鍦ㄥ叾浠栧湴鏂瑰紩鐢�
+  name: 'SidebarItem',
+  props: ['itemRoute'],
+  //import寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { item },
+  data() {
+    //杩欓噷瀛樻斁鏁版嵁
+    return {};
+  },
+  //鐩戝惉灞炴�� 绫讳技浜巇ata姒傚康
+  computed: {},
+  //鐢熷懡鍛ㄦ湡 - 鍒涘缓瀹屾垚锛堝彲浠ヨ闂綋鍓峵his瀹炰緥锛�
+  created() {},
+  //鐢熷懡鍛ㄦ湡 - 鎸傝浇瀹屾垚锛堝彲浠ヨ闂瓺OM鍏冪礌锛�
+  mounted() {},
+  //鏂规硶闆嗗悎
+  methods: {},
+  //鐩戞帶data涓殑鏁版嵁鍙樺寲
+  watch: {},
+  //濡傛灉椤甸潰鏈塳eep-alive缂撳瓨鍔熻兘锛岃繖涓嚱鏁颁細瑙﹀彂
+  activated() {}
+};
+</script>
+<style lang="scss" scoped>
+/* @import url(); 寮曞叆鍏叡css绫� */
+</style>
diff --git a/qqjf-Web/src/Layout/components/Sidebar/index.vue b/qqjf-Web/src/Layout/components/Sidebar/index.vue
new file mode 100644
index 0000000..c10f201
--- /dev/null
+++ b/qqjf-Web/src/Layout/components/Sidebar/index.vue
@@ -0,0 +1,111 @@
+<!--  -->
+<template>
+  <div>
+    <el-scrollbar wrap-class="scrollbar-wrapper">
+      <div class="heard pointer" @click="homeclick">
+        <img :class="{ isimg: isCollapse }" class="heard-img" src="../../../assets/heard/heard.jpg" alt="" />
+      </div>
+      <el-menu
+        :default-active="activeMenu"
+        :background-color="variables.menuBg"
+        :text-color="variables.menuText"
+        :unique-opened="true"
+        :active-text-color="variables.menuActiveText"
+        :collapse-transition="false"
+        :collapse="isCollapse"
+        mode="vertical"
+        router
+      >
+        <sidebar-item v-for="route in routes" :key="route.path" :itemRoute="route" />
+      </el-menu>
+    </el-scrollbar>
+  </div>
+</template>
+
+<script>
+//杩欓噷鍙互瀵煎叆鍏朵粬鏂囦欢锛堟瘮濡傦細缁勪欢锛屽伐鍏穓s锛岀涓夋柟鎻掍欢js锛宩son鏂囦欢锛屽浘鐗囨枃浠剁瓑绛夛級
+//渚嬪锛歩mport 銆婄粍浠跺悕绉般�� from '銆婄粍浠惰矾寰勩��';
+import { mapGetters } from 'vuex';
+import variables from '@/styles/variables.scss';
+import { getStorage, setStorage } from '@/utils/sessionStorage';
+import SidebarItem from './SidebarItem';
+
+export default {
+  //name鏀惧叆妯℃澘鍚�,鏂逛究鍦ㄥ叾浠栧湴鏂瑰紩鐢�
+  name: '',
+  //import寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { SidebarItem },
+  data() {
+    //杩欓噷瀛樻斁鏁版嵁
+    return {};
+  },
+  //鐩戝惉灞炴�� 绫讳技浜巇ata姒傚康
+  computed: {
+    ...mapGetters(['sidebar']),
+    variables() {
+      return variables;
+    },
+    routes() {
+      let baseRoute = this.$store.state.permission.routes;
+      if (baseRoute.length > 13) {
+        return baseRoute[13].children;
+      }
+    },
+    activeMenu() {
+      const route = this.$route;
+      const { meta, path } = route;
+      console.log(route);
+      if (meta.activeMenu) {
+        return meta.activeMenu;
+      }
+
+      return path;
+    },
+    // activeMenu() {
+
+    //   return this.$route.matched[1].path;
+    // },
+    isCollapse() {
+      return this.sidebar;
+    }
+  },
+  //鐢熷懡鍛ㄦ湡 - 鍒涘缓瀹屾垚锛堝彲浠ヨ闂綋鍓峵his瀹炰緥锛�
+  created() {},
+  //鐢熷懡鍛ㄦ湡 - 鎸傝浇瀹屾垚锛堝彲浠ヨ闂瓺OM鍏冪礌锛�
+  mounted() {},
+  //鏂规硶闆嗗悎
+  methods: {
+    //璺宠浆棣栭〉
+    homeclick() {
+      // const { href } = this.$router.resolve({
+      //   path: '/home'
+      // });
+      // window.open(href, '_blank');
+    }
+  },
+  //鐩戞帶data涓殑鏁版嵁鍙樺寲
+  watch: {},
+  //濡傛灉椤甸潰鏈塳eep-alive缂撳瓨鍔熻兘锛岃繖涓嚱鏁颁細瑙﹀彂
+  activated() {}
+};
+</script>
+<style lang="scss" scoped>
+/* @import url(); 寮曞叆鍏叡css绫� */
+.heard {
+  text-align: center;
+  padding: 20px 0px;
+  background-color: #3a405a;
+  border-bottom: 1px solid rgb(72, 94, 122);
+  .heard-img {
+    width: 60px;
+    height: 60px;
+    border-radius: 30px;
+    transition: all 1s ease 0s;
+  }
+  .isimg {
+    width: 24px;
+    height: 24px;
+    border-radius: 15px;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/Layout/components/Sidebar/item.vue b/qqjf-Web/src/Layout/components/Sidebar/item.vue
new file mode 100644
index 0000000..d706562
--- /dev/null
+++ b/qqjf-Web/src/Layout/components/Sidebar/item.vue
@@ -0,0 +1,42 @@
+<script>
+export default {
+  name: 'MenuItem',
+  functional: true,
+  props: {
+    icon: {
+      type: String,
+      default: ''
+    },
+    title: {
+      type: String,
+      default: ''
+    }
+  },
+  render(h, context) {
+    const { icon, title } = context.props;
+    const vnodes = [];
+
+    if (icon) {
+      if (icon.includes('el-icon')) {
+        // vnodes.push(<i class={[icon, 'sub-el-icon']} />);
+        vnodes.push(<i class={icon} />);
+      } else {
+        vnodes.push(<svg-icon icon-class={icon} />);
+      }
+    }
+
+    if (title) {
+      vnodes.push(<span slot="title">{title}</span>);
+    }
+    return vnodes;
+  }
+};
+</script>
+
+<style scoped>
+.sub-el-icon {
+  color: currentColor;
+  width: 1em;
+  height: 1em;
+}
+</style>
diff --git a/qqjf-Web/src/Layout/components/TagsView/ScrollPane.vue b/qqjf-Web/src/Layout/components/TagsView/ScrollPane.vue
new file mode 100644
index 0000000..bb753a1
--- /dev/null
+++ b/qqjf-Web/src/Layout/components/TagsView/ScrollPane.vue
@@ -0,0 +1,94 @@
+<template>
+  <el-scrollbar ref="scrollContainer" :vertical="false" class="scroll-container" @wheel.native.prevent="handleScroll">
+    <slot />
+  </el-scrollbar>
+</template>
+
+<script>
+const tagAndTagSpacing = 4 // tagAndTagSpacing
+
+export default {
+  name: 'ScrollPane',
+  data() {
+    return {
+      left: 0
+    }
+  },
+  computed: {
+    scrollWrapper() {
+      return this.$refs.scrollContainer.$refs.wrap
+    }
+  },
+  mounted() {
+    this.scrollWrapper.addEventListener('scroll', this.emitScroll, true)
+  },
+  beforeDestroy() {
+    this.scrollWrapper.removeEventListener('scroll', this.emitScroll)
+  },
+  methods: {
+    handleScroll(e) {
+      const eventDelta = e.wheelDelta || -e.deltaY * 40
+      const $scrollWrapper = this.scrollWrapper
+      $scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4
+    },
+    emitScroll() {
+      this.$emit('scroll')
+    },
+    moveToTarget(currentTag) {
+      const $container = this.$refs.scrollContainer.$el
+      const $containerWidth = $container.offsetWidth
+      const $scrollWrapper = this.scrollWrapper
+      const tagList = this.$parent.$refs.tag
+
+      let firstTag = null
+      let lastTag = null
+
+      // find first tag and last tag
+      if (tagList.length > 0) {
+        firstTag = tagList[0]
+        lastTag = tagList[tagList.length - 1]
+      }
+
+      if (firstTag === currentTag) {
+        $scrollWrapper.scrollLeft = 0
+      } else if (lastTag === currentTag) {
+        $scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth
+      } else {
+        // find preTag and nextTag
+        const currentIndex = tagList.findIndex(item => item === currentTag)
+        const prevTag = tagList[currentIndex - 1]
+        const nextTag = tagList[currentIndex + 1]
+
+        // the tag's offsetLeft after of nextTag
+        const afterNextTagOffsetLeft = nextTag.$el.offsetLeft + nextTag.$el.offsetWidth + tagAndTagSpacing
+
+        // the tag's offsetLeft before of prevTag
+        const beforePrevTagOffsetLeft = prevTag.$el.offsetLeft - tagAndTagSpacing
+
+        if (afterNextTagOffsetLeft > $scrollWrapper.scrollLeft + $containerWidth) {
+          $scrollWrapper.scrollLeft = afterNextTagOffsetLeft - $containerWidth
+        } else if (beforePrevTagOffsetLeft < $scrollWrapper.scrollLeft) {
+          $scrollWrapper.scrollLeft = beforePrevTagOffsetLeft
+        }
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.scroll-container {
+  white-space: nowrap;
+  position: relative;
+  overflow: hidden;
+  width: 100%;
+  ::v-deep {
+    .el-scrollbar__bar {
+      bottom: 0px;
+    }
+    .el-scrollbar__wrap {
+      height: 49px;
+    }
+  }
+}
+</style>
diff --git a/qqjf-Web/src/Layout/components/TagsView/index.vue b/qqjf-Web/src/Layout/components/TagsView/index.vue
new file mode 100644
index 0000000..be6194b
--- /dev/null
+++ b/qqjf-Web/src/Layout/components/TagsView/index.vue
@@ -0,0 +1,294 @@
+<template>
+  <div id="tags-view-container" class="tags-view-container">
+    <scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll">
+      <router-link
+        v-for="tag in visitedViews"
+        ref="tag"
+        :key="tag.path"
+        :class="isActive(tag) ? 'active' : ''"
+        :to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
+        tag="span"
+        class="tags-view-item"
+        @click.middle.native="!isAffix(tag) ? closeSelectedTag(tag) : ''"
+        @contextmenu.prevent.native="openMenu(tag, $event)"
+      >
+        {{ tag.title }}
+        <span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
+      </router-link>
+    </scroll-pane>
+    <ul v-show="visible" :style="{ left: left + 'px', top: top + 'px' }" class="contextmenu">
+      <li @click="refreshSelectedTag(selectedTag)">鍒锋柊</li>
+      <li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)">鍏抽棴</li>
+      <li @click="closeOthersTags">鍏抽棴鍏跺畠</li>
+      <li @click="closeAllTags(selectedTag)">鍏ㄩ儴鍏抽棴</li>
+    </ul>
+  </div>
+</template>
+
+<script>
+import ScrollPane from './ScrollPane';
+import path from 'path';
+
+export default {
+  components: { ScrollPane },
+  data() {
+    return {
+      visible: false,
+      top: 0,
+      left: 0,
+      selectedTag: {},
+      affixTags: []
+    };
+  },
+  computed: {
+    visitedViews() {
+      return this.$store.state.tagsView.visitedViews;
+    },
+    routes() {
+      return this.$store.state.permission.routes;
+    }
+  },
+  watch: {
+    $route() {
+      this.addTags();
+      this.moveToCurrentTag();
+    },
+    visible(value) {
+      if (value) {
+        document.body.addEventListener('click', this.closeMenu);
+      } else {
+        document.body.removeEventListener('click', this.closeMenu);
+      }
+    }
+  },
+  mounted() {
+    this.initTags();
+    this.addTags();
+  },
+  methods: {
+    isActive(route) {
+      return route.path === this.$route.path;
+    },
+    isAffix(tag) {
+      return tag.meta && tag.meta.affix;
+    },
+    filterAffixTags(routes, basePath = '/') {
+      let tags = [];
+      routes.forEach(route => {
+        if (route.meta && route.meta.affix) {
+          const tagPath = path.resolve(basePath, route.path);
+          tags.push({
+            fullPath: tagPath,
+            path: tagPath,
+            name: route.name,
+            meta: { ...route.meta }
+          });
+        }
+        if (route.children) {
+          const tempTags = this.filterAffixTags(route.children, route.path);
+          if (tempTags.length >= 1) {
+            tags = [...tags, ...tempTags];
+          }
+        }
+      });
+      return tags;
+    },
+    initTags() {
+      const affixTags = (this.affixTags = this.filterAffixTags(this.routes));
+
+      for (const tag of affixTags) {
+        // Must have tag name
+        if (tag.name) {
+          this.$store.dispatch('tagsView/addVisitedView', tag);
+        }
+      }
+    },
+    addTags() {
+      const { name } = this.$route;
+      if (name) {
+        this.$store.dispatch('tagsView/addView', this.$route);
+      }
+      return false;
+    },
+    moveToCurrentTag() {
+      const tags = this.$refs.tag;
+      this.$nextTick(() => {
+        for (const tag of tags) {
+          if (tag.to.path === this.$route.path) {
+            this.$refs.scrollPane.moveToTarget(tag);
+            // when query is different then update
+            if (tag.to.fullPath !== this.$route.fullPath) {
+              this.$store.dispatch('tagsView/updateVisitedView', this.$route);
+            }
+            break;
+          }
+        }
+      });
+    },
+    refreshSelectedTag(view) {
+      this.$store.dispatch('tagsView/delCachedView', view).then(() => {
+        const { fullPath } = view;
+        this.$nextTick(() => {
+          this.$router.replace({
+            path: fullPath
+          });
+        });
+      });
+    },
+    closeSelectedTag(view) {
+      this.$store.dispatch('tagsView/delView', view).then(({ visitedViews }) => {
+        if (this.isActive(view)) {
+          this.toLastView(visitedViews, view);
+        }
+      });
+    },
+    closeOthersTags() {
+      this.$router.push(this.selectedTag);
+      this.$store.dispatch('tagsView/delOthersViews', this.selectedTag).then(() => {
+        this.moveToCurrentTag();
+      });
+    },
+    closeAllTags(view) {
+      this.$store.dispatch('tagsView/delAllViews').then(({ visitedViews }) => {
+        if (this.affixTags.some(tag => tag.path === view.path)) {
+          return;
+        }
+        this.toLastView(visitedViews, view);
+      });
+    },
+    toLastView(visitedViews, view) {
+      const latestView = visitedViews.slice(-1)[0];
+      if (latestView) {
+        this.$router.push(latestView.fullPath);
+      } else {
+        // now the default is to redirect to the home page if there is no tags-view,
+        // you can adjust it according to your needs.
+        if (view.name === 'Didproject') {
+          // to reload home page
+          this.$router.replace({ path: '/Layout' });
+          // this.$router.replace({ path: '/redirect' + view.fullPath });
+        } else {
+          this.$router.push('/');
+        }
+      }
+    },
+    openMenu(tag, e) {
+      const menuMinWidth = 105;
+      const offsetLeft = this.$el.getBoundingClientRect().left; // container margin left
+      const offsetWidth = this.$el.offsetWidth; // container width
+      const maxLeft = offsetWidth - menuMinWidth; // left boundary
+      const left = e.clientX - offsetLeft + 15; // 15: margin right
+
+      if (left > maxLeft) {
+        this.left = maxLeft;
+      } else {
+        this.left = left;
+      }
+
+      this.top = e.clientY;
+      this.visible = true;
+      this.selectedTag = tag;
+    },
+    closeMenu() {
+      this.visible = false;
+    },
+    handleScroll() {
+      this.closeMenu();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.tags-view-container {
+  height: 34px;
+  width: 100%;
+  background: #fff;
+  border-bottom: 1px solid #d8dce5;
+  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 0 3px 0 rgba(0, 0, 0, 0.04);
+  .tags-view-wrapper {
+    .tags-view-item {
+      display: inline-block;
+      position: relative;
+      cursor: pointer;
+      height: 26px;
+      line-height: 26px;
+      border: 1px solid #d8dce5;
+      color: #495060;
+      background: #fff;
+      padding: 0 8px;
+      font-size: 12px;
+      margin-left: 5px;
+      margin-top: 4px;
+      &:first-of-type {
+        margin-left: 15px;
+      }
+      &:last-of-type {
+        margin-right: 15px;
+      }
+      &.active {
+        background-color: #42b983;
+        color: #fff;
+        border-color: #42b983;
+        &::before {
+          content: '';
+          background: #fff;
+          display: inline-block;
+          width: 8px;
+          height: 8px;
+          border-radius: 50%;
+          position: relative;
+          margin-right: 2px;
+        }
+      }
+    }
+  }
+  .contextmenu {
+    margin: 0;
+    background: #fff;
+    z-index: 3000;
+    position: absolute;
+    list-style-type: none;
+    padding: 5px 0;
+    border-radius: 4px;
+    font-size: 12px;
+    font-weight: 400;
+    color: #333;
+    box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3);
+    li {
+      margin: 0;
+      padding: 7px 16px;
+      cursor: pointer;
+      &:hover {
+        background: #eee;
+      }
+    }
+  }
+}
+</style>
+
+<style lang="scss">
+//reset element css of el-icon-close
+.tags-view-wrapper {
+  .tags-view-item {
+    .el-icon-close {
+      width: 16px;
+      height: 16px;
+      vertical-align: 2px;
+      border-radius: 50%;
+      text-align: center;
+      transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+      transform-origin: 100% 50%;
+      &:before {
+        transform: scale(0.6);
+        display: inline-block;
+        vertical-align: -3px;
+      }
+      &:hover {
+        background-color: #b4bccc;
+        color: #fff;
+      }
+    }
+  }
+}
+</style>
diff --git a/qqjf-Web/src/Layout/components/index.js b/qqjf-Web/src/Layout/components/index.js
new file mode 100644
index 0000000..a81631d
--- /dev/null
+++ b/qqjf-Web/src/Layout/components/index.js
@@ -0,0 +1,2 @@
+export { default as NavTab } from './navbar.vue'
+export {default as sidebar} from './Sidebar/index.vue'
\ No newline at end of file
diff --git a/qqjf-Web/src/Layout/components/navbar.vue b/qqjf-Web/src/Layout/components/navbar.vue
new file mode 100644
index 0000000..0207379
--- /dev/null
+++ b/qqjf-Web/src/Layout/components/navbar.vue
@@ -0,0 +1,135 @@
+<!--  -->
+<template>
+  <div class="navtab">
+    <div class="flex heard-title align-center justify-between">
+      <div class="flex align-end">
+        <svg-icon
+          style="font-size: 20px"
+          class="svgicon margin-right pointer"
+          @click="toggleSideBar"
+          iconClass="align-right"
+          classNames="alignSvg"
+          :class="{ isActive: isCollapse }"
+        />
+        <p class="title">鏅鸿兘鍖栫珛浣撳簱绠$悊绯荤粺</p>
+      </div>
+
+      <div class="technical">
+        <el-dropdown class="right-menu">
+          <div class="avatar-wrapper flex align-center">
+            <img src="../../assets/heard/heard.jpg" class="user-avatar" />
+            <span class="margin-left pointer text-overflow">{{ userinfo.userName }}</span>
+          </div>
+          <el-dropdown-menu slot="dropdown">
+            <el-dropdown-item> {{ userinfo.deptName }} </el-dropdown-item>
+            <el-dropdown-item divided @click.native="logout">
+              <p>閫�鍑虹櫥褰�</p>
+            </el-dropdown-item>
+          </el-dropdown-menu>
+        </el-dropdown>
+      </div>
+    </div>
+    <div class="Breadcrumb">
+      <tags-view />
+    </div>
+  </div>
+</template>
+
+<script>
+//杩欓噷鍙互瀵煎叆鍏朵粬鏂囦欢锛堟瘮濡傦細缁勪欢锛屽伐鍏穓s锛岀涓夋柟鎻掍欢js锛宩son鏂囦欢锛屽浘鐗囨枃浠剁瓑绛夛級
+//渚嬪锛歩mport 銆婄粍浠跺悕绉般�� from '銆婄粍浠惰矾寰勩��';
+import { mapGetters } from 'vuex';
+import TagsView from './TagsView/index';
+import { getCache } from '@/utils/sessionStorage';
+import ResizeMixin from '@/mixins/layout';
+export default {
+  //name鏀惧叆妯℃澘鍚�,鏂逛究鍦ㄥ叾浠栧湴鏂瑰紩鐢�
+  name: '',
+  //import寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { TagsView },
+  mixins: [ResizeMixin],
+  data() {
+    //杩欓噷瀛樻斁鏁版嵁
+    return {
+      userinfo: getCache('userInfo')
+    };
+  },
+  //鐩戝惉灞炴�� 绫讳技浜巇ata姒傚康
+  computed: {
+    ...mapGetters(['sidebar']),
+    isCollapse() {
+      return this.sidebar;
+    }
+  },
+  //鐢熷懡鍛ㄦ湡 - 鍒涘缓瀹屾垚锛堝彲浠ヨ闂綋鍓峵his瀹炰緥锛�
+  created() {},
+  //鐢熷懡鍛ㄦ湡 - 鎸傝浇瀹屾垚锛堝彲浠ヨ闂瓺OM鍏冪礌锛�
+  mounted() {},
+  //鏂规硶闆嗗悎
+  methods: {
+    toggleSideBar() {
+      this.$store.dispatch('setting/togglesidebar');
+    },
+    async logout() {
+      await this.$store.dispatch('user/logout');
+      this.$store.dispatch('permission/generateRoutes', []);
+      this.$router.push({ path: '/login' });
+    }
+  },
+  //鐩戞帶data涓殑鏁版嵁鍙樺寲
+  watch: {},
+  //濡傛灉椤甸潰鏈塳eep-alive缂撳瓨鍔熻兘锛岃繖涓嚱鏁颁細瑙﹀彂
+  activated() {}
+};
+</script>
+<style lang="scss" scoped>
+/* @import url(); 寮曞叆鍏叡css绫� */
+.navtab {
+  width: 100%;
+  height: 80px;
+  border-bottom: 1px solid #d6e2e9;
+  box-shadow: 0 0 4px #345;
+  .isActive {
+    transform: rotate(180deg);
+  }
+  .Breadcrumb {
+    display: flex;
+    align-items: center;
+    .svgicon {
+      padding: 0 15px;
+    }
+  }
+  .technical {
+    display: flex;
+    align-items: center;
+    width: 11%;
+    justify-content: flex-end;
+    .right-menu {
+      margin-right: 15px;
+      .avatar-wrapper {
+        margin: auto;
+        display: flex;
+        .user-avatar {
+          cursor: pointer;
+          width: 24px;
+          height: 24px;
+          border-radius: 10px;
+        }
+      }
+    }
+    .full {
+      cursor: pointer;
+    }
+  }
+  .heard-title {
+    height: 50px;
+    padding-left: 10px;
+    background-color: rgb(255, 255, 255);
+    border-radius: 0px !important;
+    .title {
+      // padding: 13px 10px 10px;
+      font-size: 20px;
+    }
+  }
+}
+</style>
diff --git a/qqjf-Web/src/Layout/index.vue b/qqjf-Web/src/Layout/index.vue
new file mode 100644
index 0000000..76de728
--- /dev/null
+++ b/qqjf-Web/src/Layout/index.vue
@@ -0,0 +1,104 @@
+<!--  -->
+<template>
+  <div class="app-wrapper" :class="{ hidcontainer: isCollapse }">
+    <sidebar class="sidebar-container" />
+    <div class="main-container">
+      <nav-tab />
+      <!-- <right-panel v-if="showSettings">
+        <settings />
+      </right-panel> -->
+      <div class="main">
+        <transition name="fade-transform" mode="out-in">
+          <router-view />
+        </transition>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+//杩欓噷鍙互瀵煎叆鍏朵粬鏂囦欢锛堟瘮濡傦細缁勪欢锛屽伐鍏穓s锛岀涓夋柟鎻掍欢js锛宩son鏂囦欢锛屽浘鐗囨枃浠剁瓑绛夛級
+//渚嬪锛歩mport 銆婄粍浠跺悕绉般�� from '銆婄粍浠惰矾寰勩��';
+import { NavTab, sidebar } from './components';
+import { mapGetters } from 'vuex';
+import { getStorage, setStorage } from '@/utils/sessionStorage';
+// import sidebar from './components/Sidebar/index'
+// import ResizeMixin from './mixin/ResizeHandler';
+export default {
+  //name鏀惧叆妯℃澘鍚�,鏂逛究鍦ㄥ叾浠栧湴鏂瑰紩鐢�
+  name: '',
+  //import寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { sidebar, NavTab },
+  data() {
+    //杩欓噷瀛樻斁鏁版嵁
+    return {};
+  },
+  //鐩戝惉灞炴�� 绫讳技浜巇ata姒傚康
+  computed: {
+    ...mapGetters(['sidebar']),
+    isCollapse() {
+      return this.sidebar;
+    },
+    visitedViews() {
+      return this.$store.state.tagsView.visitedViews;
+    }
+  },
+  //鐢熷懡鍛ㄦ湡 - 鍒涘缓瀹屾垚锛堝彲浠ヨ闂綋鍓峵his瀹炰緥锛�
+  created() {},
+  //鐢熷懡鍛ㄦ湡 - 鎸傝浇瀹屾垚锛堝彲浠ヨ闂瓺OM鍏冪礌锛�
+  mounted() {},
+  //鏂规硶闆嗗悎
+  methods: {},
+  //鐩戞帶data涓殑鏁版嵁鍙樺寲
+  watch: {},
+  //濡傛灉椤甸潰鏈塳eep-alive缂撳瓨鍔熻兘锛岃繖涓嚱鏁颁細瑙﹀彂
+  activated() {},
+  beforeRouteLeave: function (to, from, next) {
+    console.log(this.$vnode);
+    if (to.name == 'Login' || to.name == 'login') {
+      if (this.$vnode && this.$vnode.data.keepAlive) {
+        if (this.$vnode.parent && this.$vnode.parent.componentInstance && this.$vnode.parent.componentInstance.cache) {
+          if (this.$vnode.componentOptions) {
+            var key =
+              this.$vnode.key == null
+                ? this.$vnode.componentOptions.Ctor.cid +
+                  (this.$vnode.componentOptions.tag ? `::${this.$vnode.componentOptions.tag}` : '')
+                : this.$vnode.key;
+            var cache = this.$vnode.parent.componentInstance.cache;
+            var keys = this.$vnode.parent.componentInstance.keys;
+            if (cache[key]) {
+              if (keys.length) {
+                var index = keys.indexOf(key);
+                if (index > -1) {
+                  keys.splice(index, 1);
+                }
+              }
+              delete cache[key];
+            }
+          }
+        }
+      }
+      this.$store.dispatch('tagsView/delAllViews').then(({ visitedViews }) => {});
+    }
+
+    next();
+  }
+};
+</script>
+<style lang="scss" scoped>
+.app-wrapper {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  .is-open {
+    width: calc(100% - 45px);
+  }
+  .main {
+    width: 98%;
+    height: calc(100% - 100px);
+    padding: 1%;
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/api/Didproject.js b/qqjf-Web/src/api/Didproject.js
new file mode 100644
index 0000000..5284d09
--- /dev/null
+++ b/qqjf-Web/src/api/Didproject.js
@@ -0,0 +1,79 @@
+import axios from '../utils/axios';
+import qs from 'qs';
+
+/**
+ * @description 浠婃棩鍑哄叆搴撴暟鎹�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function GetHomeNumData(param) {
+  return axios.post('/SummaryStatistics/GetHomeNumData', qs.stringify(param));
+}
+
+/**
+ * @description 鍚勭被鍨嬪簱浣嶄娇鐢ㄧ粺璁�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function GetHomePieData(data) {
+  return axios.post('/SummaryStatistics/GetHomePieData', qs.stringify(data));
+}
+
+/**
+ * @description 鑾峰彇闆朵欢鐨勫嚭鍏ュ簱鏁伴噺
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function GetHomeBarItemData(param) {
+  return axios.post('/SummaryStatistics/GetHomeBarItemData', qs.stringify(param));
+}
+
+/**
+ * @description 鑾峰彇鍣ㄥ叿鐨勫嚭鍏ュ簱鏁伴噺
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function GetHomeBarContainerData(param) {
+  return axios.post('/SummaryStatistics/GetHomeBarContainerData', qs.stringify(param));
+}
+
+/**
+ * @description 绔嬪簱鎬昏鍜屽埗浠舵�昏
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function GetStorageOverviewData(param) {
+  return axios.post('/SummaryStatistics/GetStorageOverviewData', qs.stringify(param));
+}
+
+/**
+ * @description 浠婃棩鍜屽簱浣嶅鍑�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function GetHomeNumDataByDate(param) {
+  return axios.post('/SummaryStatistics/GetHomeNumDataByDate', qs.stringify(param));
+}
+
+/**
+ * @description 璀︾ず淇℃伅
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function GetWarnings() {
+  return axios.post('/ItemStorage/SearchViewIndex');
+}
diff --git a/qqjf-Web/src/api/ProductionLine.js b/qqjf-Web/src/api/ProductionLine.js
new file mode 100644
index 0000000..f06f015
--- /dev/null
+++ b/qqjf-Web/src/api/ProductionLine.js
@@ -0,0 +1,38 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鐝嚎绠$悊
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+//  export function UserSearch(data) {
+//   return axios.post('/User/Search',qs.stringify(data) );
+// }
+
+ export function ProductionLineSearch(data,param) {
+  return axios.post('/ProductionLine/Search?page='+data,qs.stringify(param));
+}
+
+/**
+ * @description 鍒犻櫎鐝嚎
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function ProductionLineDelete(data) {
+  return axios.post('/ProductionLine/Delete',qs.stringify(data) );
+}
+/**
+ * @description 鏂板缂栬緫鐝嚎
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function ProductionLineAddOrUpdate(data) {
+  return axios.post('/ProductionLine/AddOrUpdate',qs.stringify(data) );
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/avroRecord.js b/qqjf-Web/src/api/avroRecord.js
new file mode 100644
index 0000000..92927bc
--- /dev/null
+++ b/qqjf-Web/src/api/avroRecord.js
@@ -0,0 +1,25 @@
+import axios from '../utils/axios';
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鍫嗗灈鏈轰换鍔¤褰�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+
+export function SrmTaskSearch(data, param) {
+  return axios.post('/SrmRecord/Search?page=' + data, qs.stringify(param));
+}
+/**
+ * @description 瀵煎嚭鍫嗗灈鏈轰换鍔¤褰�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+
+export function SearchAll(param) {
+  return axios.post('/SrmRecord/SearchAll', qs.stringify(param));
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/cass-line.js b/qqjf-Web/src/api/cass-line.js
new file mode 100644
index 0000000..336a3fc
--- /dev/null
+++ b/qqjf-Web/src/api/cass-line.js
@@ -0,0 +1,36 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鐝嚎绠$悊
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+
+
+ export function ProductionLineSearch(data,param) {
+  return axios.post('/ProductionLine/Search?page='+data,qs.stringify(param));
+}
+
+/**
+ * @description 鍒犻櫎鐝嚎
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function ProductionLineDelete(data) {
+  return axios.post('/ProductionLine/Delete',qs.stringify(data) );
+}
+/**
+ * @description 鏂板缂栬緫鐝嚎
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function ProductionLineAddOrUpdate(data) {
+  return axios.post('/ProductionLine/AddOrUpdate',qs.stringify(data) );
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/dept.js b/qqjf-Web/src/api/dept.js
new file mode 100644
index 0000000..3a7d5f0
--- /dev/null
+++ b/qqjf-Web/src/api/dept.js
@@ -0,0 +1,38 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鐢ㄦ埛
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+//  export function DeptSearch(data) {
+//   return axios.post('/Dept/Search',qs.stringify(data) );
+// }
+
+ export function DeptSearch(data,param) {
+  return axios.post('/Dept/Search?page='+data,qs.stringify(param));
+}
+
+/**
+ * @description 鍒犻櫎鐢ㄦ埛
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function DeptDelete(data) {
+  return axios.post('/Dept/Delete',qs.stringify(data) );
+}
+/**
+ * @description 鏂板缂栬緫鐢ㄦ埛
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function DeptAddOrUpdate(data) {
+  return axios.post('/Dept/AddOrUpdate',qs.stringify(data) );
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/enter.js b/qqjf-Web/src/api/enter.js
new file mode 100644
index 0000000..dccae39
--- /dev/null
+++ b/qqjf-Web/src/api/enter.js
@@ -0,0 +1,80 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储缁勭洏
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+//  export function UserSearch(data) {
+//   return axios.post('/User/Search',qs.stringify(data) );
+// }
+ export function ContainerVsItemSearch(data,param) {
+  return axios.post('/ContainerVsItem/Search?page='+data,qs.stringify(param));
+}
+/**
+ * @description 鍒犻櫎缁勭洏
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function ContainerVsItemDelete(data) {
+  return axios.post('/ContainerVsItem/DeleteOne',qs.stringify(data) );
+}
+/**
+ * @description 鏂板缁勭洏
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function ContainerVsItemAdd(data) {
+  return axios.post('/ContainerVsItem/Add',qs.stringify(data) );
+}
+/**
+ * @description 澶氭潯璁板綍鏂板缁勭洏
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function ContainerVsItemAddAll(data) {
+  return axios.post('/ContainerVsItem/AddOrUpdateAll',qs.stringify(data) );
+}
+
+
+
+/**
+ * @description 淇敼缁勭洏
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function ContainerVsItemUpdate(data) {
+  return axios.post('/ContainerVsItem/Update',qs.stringify(data) );
+}
+/**
+ * @description 鑾峰彇缁勭洏缂栧彿
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function GetCode(data) {
+  return axios.post('/ContainerVsItem/GetCode',qs.stringify(data) );
+}
+
+/**
+ * @description 鍐插帇鍏ュ簱璁″垝鍏宠仈
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function BindCviCode(data) {
+  return axios.post('/ContainerVsItem/BindCviCode',qs.stringify(data) );
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/enterchoose.js b/qqjf-Web/src/api/enterchoose.js
new file mode 100644
index 0000000..0b4a8ed
--- /dev/null
+++ b/qqjf-Web/src/api/enterchoose.js
@@ -0,0 +1,106 @@
+import axios from '../utils/axios';
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储闆朵欢
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+//  export function UserSearch(data) {
+//   return axios.post('/User/Search',qs.stringify(data) );
+// }
+
+export function itemSearch(data, param) {
+  return axios.post('/Item/Search?page=' + data, qs.stringify(param));
+}
+
+/**
+ * @description  瀵煎嚭鍏ㄩ儴闆朵欢
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+//  export function UserSearch(data) {
+//   return axios.post('/User/Search',qs.stringify(data) );
+// }
+
+export function GetAllItem(data, param) {
+  return axios.post('/Item/GetAllItem', qs.stringify(param));
+}
+/**
+ * @description 鍒犻櫎闆朵欢
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function ItemDelete(data) {
+  return axios.post('/Item/Delete', qs.stringify(data));
+}
+/**
+ * @description 鏂板闆朵欢
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function ItemAddOrUpdate(data) {
+  return axios.post('/Item/AddOrUpdate', qs.stringify(data));
+}
+/**
+ * @description 瀵煎叆闆朵欢鐨勫熀纭�鍗曚环鍜屾渶澶ф渶灏忓簱瀛橀噺銆佽秴鏈熸椂闂�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function ImportItemInfo(data) {
+  return axios.post('/Item/ImportItemInfo', qs.stringify(data));
+}
+
+/**
+ * @description 鎼滅储涓婁笅闄愭槸鍚﹀紑鍚�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function SearchStorageEnable() {
+  return axios.post('/Item/SearchStorageEnable');
+}
+
+/**
+ * @description 鍚敤/鍏抽棴涓婁笅闄愬垽鏂�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function UpdateStorageEnable(data) {
+  return axios.post('/Item/UpdateStorageEnable', qs.stringify(data));
+}
+
+/**
+ * @description 璁剧疆搴撳涓嬬嚎
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function UpdateMinStorage(data) {
+  return axios.post('/Item/UpdateMinStorage', qs.stringify(data));
+}
+
+/**
+ * @description 璁剧疆搴撳涓婄嚎
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function UpdateMaxStorage(data) {
+  return axios.post('/Item/UpdateMaxStorage', qs.stringify(data));
+}
diff --git a/qqjf-Web/src/api/equipmenttask.js b/qqjf-Web/src/api/equipmenttask.js
new file mode 100644
index 0000000..331d4a8
--- /dev/null
+++ b/qqjf-Web/src/api/equipmenttask.js
@@ -0,0 +1,26 @@
+import axios from '../utils/axios';
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鍫嗗灈鏈轰换鍔�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+
+export function SrmTaskSearch(data, param) {
+  return axios.post('/SrmTask/Search?page=' + data, qs.stringify(param));
+}
+
+/**
+ * @description 鎼滅储RGV浠诲姟
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+
+export function RgvTaskSearch(data, param) {
+  return axios.post('/RgvTask/Search?page=' + data, qs.stringify(param));
+}
diff --git a/qqjf-Web/src/api/forklift.js b/qqjf-Web/src/api/forklift.js
new file mode 100644
index 0000000..4572151
--- /dev/null
+++ b/qqjf-Web/src/api/forklift.js
@@ -0,0 +1,34 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鍙夎溅
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+
+ export function CarSearch(data,param) {
+  return axios.post('/Car/Search?page='+data,qs.stringify(param));
+}
+/**
+ * @description 鍒犻櫎鍙夎溅
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function CarDelete(data) {
+  return axios.post('/Car/Delete',qs.stringify(data) );
+}
+/**
+ * @description 鏂板淇敼鍙夎溅
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function CarAddOrUpdate(data) {
+  return axios.post('/Car/AddOrUpdate',qs.stringify(data) );
+}
diff --git a/qqjf-Web/src/api/forklifttasks.js b/qqjf-Web/src/api/forklifttasks.js
new file mode 100644
index 0000000..d0d6266
--- /dev/null
+++ b/qqjf-Web/src/api/forklifttasks.js
@@ -0,0 +1,55 @@
+import axios from '../utils/axios';
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鍙夎溅浠诲姟
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+
+export function CarTaskSearch(data, param) {
+  return axios.post('/CarTask/Search?page=' + data, qs.stringify(param));
+}
+/**
+ * @description 鍒犻櫎鍙夎溅浠诲姟
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function CarTaskDelete(data) {
+  return axios.post('/CarTask/Delete', qs.stringify(data));
+}
+/**
+ * @description 鏂板淇敼鍙夎溅浠诲姟
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function CarTaskAddOrUpdate(data) {
+  return axios.post('/CarTask/AddOrUpdate', qs.stringify(data));
+}
+/**
+ * @description 鑾峰彇鍙夎溅浠诲姟鍙�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function CarTaskGetCode(data) {
+  return axios.post('/CarTask/GetCode', qs.stringify(data));
+}
+
+/**
+ * @description 鑾峰彇鍙夎溅鍙告満
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function GetCarUser(data) {
+  return axios.post('/CarTask/GetCarUser', qs.stringify(data));
+}
diff --git a/qqjf-Web/src/api/intype.js b/qqjf-Web/src/api/intype.js
new file mode 100644
index 0000000..4e4b14a
--- /dev/null
+++ b/qqjf-Web/src/api/intype.js
@@ -0,0 +1,14 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鍏ュ簱绫诲瀷
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+
+ export function InTypeSearch(data,param) {
+  return axios.post('/InType/Search?page='+data,qs.stringify(param));
+}
diff --git a/qqjf-Web/src/api/inventory.js b/qqjf-Web/src/api/inventory.js
new file mode 100644
index 0000000..8e3fa93
--- /dev/null
+++ b/qqjf-Web/src/api/inventory.js
@@ -0,0 +1,57 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鑾峰彇缂栧彿
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+
+ export function PlaceVsContainerGetCode(data,param) {
+  return axios.post('/PlaceVsContainer/GetCode',qs.stringify(param));
+}
+
+/**
+ * @description 鎼滅储搴撳瓨绠$悊
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+
+ export function PlaceVsContainer(data,param) {
+  return axios.post('/PlaceVsContainer/Search?page='+data,qs.stringify(param));
+}
+
+/**
+ * @description 鍒犻櫎搴撳瓨
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function PlaceVsContainerDelete(data) {
+  return axios.post('/PlaceVsContainer/Delete',qs.stringify(data) );
+}
+/**
+ * @description 鏂板缂栬緫搴撳瓨
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function PlaceAddOrUpdate(data) {
+  return axios.post('/PlaceVsContainer/AddOrUpdate',qs.stringify(data) );
+}
+/**
+ * @description 鏌ユ壘搴撲綅绫诲瀷
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function ContainerTypeSearch(data) {
+  return axios.post('/Container/GetContainerType',qs.stringify(data) );
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/maintask.js b/qqjf-Web/src/api/maintask.js
new file mode 100644
index 0000000..2dffe51
--- /dev/null
+++ b/qqjf-Web/src/api/maintask.js
@@ -0,0 +1,77 @@
+import axios from '../utils/axios';
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储涓讳换鍔�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+
+export function TaskSearch(data, param) {
+  return axios.post('/Task/Search?page=' + data, qs.stringify(param));
+}
+/**
+ * @description 鍏ㄩ儴瀵煎嚭
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+
+export function GetAllMainTask(data) {
+  return axios.post('/Task/GetAllMainTask', qs.stringify(data));
+}
+
+/**
+ * @description 澶勭悊涓讳换鍔�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function TaskDeleteErrorTask(data) {
+  return axios.post('/Task/DeleteErrorTask', qs.stringify(data));
+}
+/**
+ * @description 鍒犻櫎涓讳换鍔�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function TaskDelete(data) {
+  return axios.post('/Task/Delete', qs.stringify(data));
+}
+/**
+ * @description 鏂板淇敼涓讳换鍔�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function TaskAddOrUpdate(data) {
+  return axios.post('/Task/AddOrUpdate', qs.stringify(data));
+}
+/**
+ * @description 鎻愰珮浼樺厛绾�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function UpTaskLevel(data) {
+  return axios.post('/Task/UpTaskLevel', qs.stringify(data));
+}
+
+/**
+ * @description 寮哄埗浼樺厛
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function MustTask(data) {
+  return axios.post('/Task/MustTask', qs.stringify(data));
+}
diff --git a/qqjf-Web/src/api/manage.js b/qqjf-Web/src/api/manage.js
new file mode 100644
index 0000000..9035dc4
--- /dev/null
+++ b/qqjf-Web/src/api/manage.js
@@ -0,0 +1,38 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鐢ㄦ埛
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+//  export function UserSearch(data) {
+//   return axios.post('/User/Search',qs.stringify(data) );
+// }
+
+ export function UserSearch(data,param) {
+  return axios.post('/User/Search?page='+data,qs.stringify(param) );
+}
+
+/**
+ * @description 鍒犻櫎鐢ㄦ埛
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function UserDelete(data) {
+  return axios.post('/User/Delete',qs.stringify(data) );
+}
+/**
+ * @description 鏂板缂栬緫鐢ㄦ埛
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function AddOrUpdate(data) {
+  return axios.post('/User/AddOrUpdate',qs.stringify(data) );
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/materials.js b/qqjf-Web/src/api/materials.js
new file mode 100644
index 0000000..b3f4817
--- /dev/null
+++ b/qqjf-Web/src/api/materials.js
@@ -0,0 +1,15 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+
+/**
+ * @description 鎼滅储鐗╂枡搴撳瓨
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+
+ export function ItemStorage(data,param) {
+  return axios.post('/ItemStorage/Search?page='+data,qs.stringify(param));
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/outbound.js b/qqjf-Web/src/api/outbound.js
new file mode 100644
index 0000000..0a9cfcd
--- /dev/null
+++ b/qqjf-Web/src/api/outbound.js
@@ -0,0 +1,60 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鍑哄簱绠$悊璁″垝
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+//  export function UserSearch(data) {
+//   return axios.post('/User/Search',qs.stringify(data) );
+// }
+ export function OutOrderSearch(data,param) {
+  return axios.post('/OutOrder/Search?page='+data,qs.stringify(param));
+}
+/**
+ * @description 鑾峰彇鍏ュ簱缂栧彿
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function OutOrderGetCode(data) {
+  return axios.post('/OutOrder/GetCode',qs.stringify(data) );
+}
+/**
+ * @description 鍒犻櫎鍏ュ簱璁″垝
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function OutOrderDelete(data) {
+  return axios.post('/OutOrder/Delete',qs.stringify(data) );
+}
+/**
+ * @description 鏂板淇敼鍏ュ簱
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function OutOrderAddOrUpdate(data) {
+  return axios.post('/OutOrder/AddOrUpdate',qs.stringify(data) );
+}
+/**
+ * @description 鍑哄簱鍗曚笅鍙�
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function CheckOutOrder(data) {
+  return axios.post('OutOrder/CheckOutOrder',qs.stringify(data) );
+}
+
+ export function GetForkliftWorkers(data) {
+  return axios.post('User/Search?page=1', data);
+}
diff --git a/qqjf-Web/src/api/output.js b/qqjf-Web/src/api/output.js
new file mode 100644
index 0000000..88c476b
--- /dev/null
+++ b/qqjf-Web/src/api/output.js
@@ -0,0 +1,14 @@
+import axios from '../utils/axios';
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鐗╂枡搴撳瓨
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+
+export function GetInOutCountByHour(param) {
+  return axios.post('/SummaryStatistics/GetInOutCountByHour', qs.stringify(param));
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/palte.js b/qqjf-Web/src/api/palte.js
new file mode 100644
index 0000000..852eba0
--- /dev/null
+++ b/qqjf-Web/src/api/palte.js
@@ -0,0 +1,63 @@
+import axios from '../utils/axios';
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鍣ㄥ叿绠$悊
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+//  export function UserSearch(data) {
+//   return axios.post('/User/Search',qs.stringify(data) );
+// }
+
+export function ContainerSearch(data, param) {
+  return axios.post('/Container/Search?page=' + data, qs.stringify(param));
+}
+
+/**
+ * @description 鎼滅储鍣ㄥ叿绠$悊
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+//  export function UserSearch(data) {
+//   return axios.post('/User/Search',qs.stringify(data) );
+// }
+
+export function GetAllContainer(data, param) {
+  return axios.post('/Container/GetAllContainer', qs.stringify(param));
+}
+
+/**
+ * @description 鏌ユ壘鍣ㄥ叿瑙勬牸
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ */
+export function PalletSearch(data, param) {
+  return axios.post('/Pallet/Search?page=' + data, qs.stringify(param));
+}
+
+/**
+ * @description 鍒犻櫎鍣ㄥ叿
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function ContainerDelete(data) {
+  return axios.post('/Container/Delete', qs.stringify(data));
+}
+/**
+ * @description 鏂板缂栬緫鍣ㄥ叿
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function ContainerAddOrUpdate(data) {
+  return axios.post('/Container/AddOrUpdate', qs.stringify(data));
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/position.js b/qqjf-Web/src/api/position.js
new file mode 100644
index 0000000..92d5321
--- /dev/null
+++ b/qqjf-Web/src/api/position.js
@@ -0,0 +1,45 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储璐т綅绠$悊
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function PlaceSearch(data,param) {
+  return axios.post('/Place/Search?page='+data,qs.stringify(param));
+}
+
+/**
+ * @description 鏍规嵁浠诲姟绫诲瀷鑾峰彇鍙敤鐨勫簱浣�
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function PlaceGetPlace(param) {
+  return axios.post('/Place/GetPlace',qs.stringify(param));
+}
+
+/**
+ * @description 鍒犻櫎璐т綅
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function ContainerDelete(data) {
+  return axios.post('/Container/Delete',qs.stringify(data) );
+}
+/**
+ * @description 鏂板缂栬緫璐т綅
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function PlaceAddOrUpdate(data) {
+  return axios.post('/Place/AddOrUpdate',qs.stringify(data) );
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/quotation.js b/qqjf-Web/src/api/quotation.js
new file mode 100644
index 0000000..65c959f
--- /dev/null
+++ b/qqjf-Web/src/api/quotation.js
@@ -0,0 +1,98 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鍏ュ簱绠$悊璁″垝
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+//  export function UserSearch(data) {
+//   return axios.post('/User/Search',qs.stringify(data) );
+// }
+ export function InOrderSearch(data,param) {
+  return axios.post('/InOrder/Search?page='+data,qs.stringify(param));
+}
+/**
+ * @description 鑾峰彇鍏ュ簱缂栧彿
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function InOrderGetCode(data) {
+  return axios.post('/InOrder/GetCode',qs.stringify(data) );
+}
+/**
+ * @description 鍒犻櫎鍏ュ簱璁″垝
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function InOrderDelete(data) {
+  return axios.post('/InOrder/Delete',qs.stringify(data) );
+}
+/**
+ * @description 鏂板淇敼鍏ュ簱
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function InOrderAddOrUpdate(data) {
+  return axios.post('/InOrder/AddOrUpdate',qs.stringify(data) );
+}
+/**
+ * @description 鍐插帇鍏ュ簱璁″垝瀵煎叆
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function ImportInOrder(data) {
+  return axios.post('/InOrder/ImportInOrder',qs.stringify(data) );
+}
+
+/**
+ * @description 淇敼绾夸笅浜や粯鏁伴噺
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function UpdateUnlineNum(data) {
+  return axios.post('/InOrder/UpdateUnlineNum',qs.stringify(data) );
+}
+
+/**
+ * @description 鎻愪氦瀹℃牳
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function InOrderSend(data) {
+  return axios.post('/InOrder/Send',qs.stringify(data) );
+}
+/**
+ * @description 瀹℃牳閫氳繃
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function InOrderCheck(data) {
+  return axios.post('/InOrder/Check',qs.stringify(data) );
+}
+/**
+ * @description 瀹℃牳椹冲洖
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function InOrderReject(data) {
+  return axios.post('/InOrder/Reject',qs.stringify(data) );
+}
diff --git a/qqjf-Web/src/api/register.js b/qqjf-Web/src/api/register.js
new file mode 100644
index 0000000..9d7c5fd
--- /dev/null
+++ b/qqjf-Web/src/api/register.js
@@ -0,0 +1,15 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+/**
+ * @description 鐢ㄦ埛鐧诲綍
+ * @param {string}  username
+ * @param {string}  password
+ * @returns {string} token
+ * qs.
+ * */
+//  export function login(data) {
+//   return axios.post('user/login?userName='+data.userName+'&password='+data.password );
+// }
+ export function login(data) {
+  return axios.post('user/login',qs.stringify(data) );
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/reportforms.js b/qqjf-Web/src/api/reportforms.js
new file mode 100644
index 0000000..6ee3670
--- /dev/null
+++ b/qqjf-Web/src/api/reportforms.js
@@ -0,0 +1,91 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+
+/**
+ * @description 浠诲姟鑺傛媿鍒嗘瀽
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function GetTaskBeatAnalysis(data) {
+  return axios.post('/SummaryStatistics/GetTaskBeatAnalysis',qs.stringify(data) );
+}
+
+/**
+ * @description 鍑哄叆搴撲换鍔″钩鍧囨椂闀�
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function GetInOutAverageTime(data) {
+  return axios.post('/SummaryStatistics/GetInOutAverageTime',qs.stringify(data) );
+}
+
+/**
+ * @description 搴撳瓨鍒嗙被缁熻
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function GetStockClassificationData(data) {
+  return axios.post('/SummaryStatistics/GetStockClassificationData',qs.stringify(data) );
+}
+
+/**
+ * @description 璐ф牸鍒╃敤鐜�
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function GetStorageVailability(data) {
+  return axios.post('/SummaryStatistics/GetStorageVailability',qs.stringify(data) );
+}
+
+/**
+ * @description 鍒朵欢鍛ㄨ浆鏃堕棿
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function GetPartTurnover(data) {
+  return axios.post('/SummaryStatistics/GetPartTurnover',qs.stringify(data) );
+}
+
+/**
+ * @description 璁惧鍙姩鐜�
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function GetDevMovable(data) {
+  return axios.post('/SummaryStatistics/GetDevMovable',qs.stringify(data) );
+}
+
+/**
+ * @description 璁惧鍒╃敤鐜�
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function GetDevAvailability(data) {
+  return axios.post('/SummaryStatistics/GetDevAvailability',qs.stringify(data) );
+}
+
+/**
+ * @description 鍦ㄥ埗鍝佽祫閲戝垎鏋�
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function GetStorageCapitalAnalysis(data) {
+  return axios.post('/SummaryStatistics/GetStorageCapitalAnalysis',qs.stringify(data) );
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/role-auth.js b/qqjf-Web/src/api/role-auth.js
new file mode 100644
index 0000000..fbeb602
--- /dev/null
+++ b/qqjf-Web/src/api/role-auth.js
@@ -0,0 +1,53 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鎵�鏈夎彍鍗�
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+//  export function DeptSearch(data) {
+//   return axios.post('/Dept/Search',qs.stringify(data) );
+// }
+
+export function GetUserRoleAllPermission(param) {
+  return axios.post('/Permission/GetUserRoleAllPermission',qs.stringify(param));
+}
+
+/**
+ * @description 鎼滅储鏉冮檺
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+//  export function DeptSearch(data) {
+//   return axios.post('/Dept/Search',qs.stringify(data) );
+// }
+
+ export function SearchPermission(param) {
+  return axios.post('/Permission/SearchPermission',qs.stringify(param));
+}
+
+/**
+ * @description 鎼滅储瑙掕壊鎷ユ湁鏉冮檺
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function SearchRoleVsPermission(data) {
+  return axios.post('/Permission/SearchRoleVsPermission',qs.stringify(data) );
+}
+/**
+ * @description 淇敼瑙掕壊鏉冮檺
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function AddOrUpdateRoleVsPermission(data) {
+  return axios.post('/Permission/AddOrUpdateRoleVsPermission',qs.stringify(data) );
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/role.js b/qqjf-Web/src/api/role.js
new file mode 100644
index 0000000..ea131b5
--- /dev/null
+++ b/qqjf-Web/src/api/role.js
@@ -0,0 +1,38 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鐢ㄦ埛
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+//  export function UserSearch(data) {
+//   return axios.post('/User/Search',qs.stringify(data) );
+// }
+
+ export function RoleSearch(data,param) {
+  return axios.post('/Role/Search?page='+data,qs.stringify(param));
+}
+
+/**
+ * @description 鍒犻櫎鐢ㄦ埛
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function RoleDelete(data) {
+  return axios.post('/Role/Delete',qs.stringify(data) );
+}
+/**
+ * @description 鏂板缂栬緫鐢ㄦ埛
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function RoleAddOrUpdate(data) {
+  return axios.post('/Role/AddOrUpdate',qs.stringify(data) );
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/stacker.js b/qqjf-Web/src/api/stacker.js
new file mode 100644
index 0000000..ecf988d
--- /dev/null
+++ b/qqjf-Web/src/api/stacker.js
@@ -0,0 +1,38 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储璐т綅绠$悊
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+//  export function UserSearch(data) {
+//   return axios.post('/User/Search',qs.stringify(data) );
+// }
+
+ export function DeviceSearch(data,param) {
+  return axios.post('/Device/Search?page='+data,qs.stringify(param));
+}
+
+/**
+ * @description 鍒犻櫎璐т綅
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+//  export function ContainerDelete(data) {
+//   return axios.post('/Container/Delete',qs.stringify(data) );
+// }
+/**
+ * @description 鏂板缂栬緫璐т綅
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function DeviceAddOrUpdate(data) {
+  return axios.post('/Device/AddOrUpdate',qs.stringify(data) );
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/statistics.js b/qqjf-Web/src/api/statistics.js
new file mode 100644
index 0000000..fd56c8c
--- /dev/null
+++ b/qqjf-Web/src/api/statistics.js
@@ -0,0 +1,14 @@
+import axios from '../utils/axios';
+import qs from 'qs';
+
+/**
+ * @description 鍑哄叆搴撶粺璁�
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+
+export function GetEnterNum(param) {
+  return axios.post('/Task/GetEnterNum', qs.stringify(param));
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/taskrecord.js b/qqjf-Web/src/api/taskrecord.js
new file mode 100644
index 0000000..73096a7
--- /dev/null
+++ b/qqjf-Web/src/api/taskrecord.js
@@ -0,0 +1,25 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储浠诲姟璁板綍
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+
+ export function TaskRecodeSearch(data,param) {
+  return axios.post('/TaskRecode/Search?page='+data,qs.stringify(param));
+}
+
+/**
+ * @description 鍒犻櫎浠诲姟
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function TaskRecodeDelete(data) {
+  return axios.post('/TaskRecode/Delete',qs.stringify(data) );
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/api/viewdata.js b/qqjf-Web/src/api/viewdata.js
new file mode 100644
index 0000000..a5c5bc1
--- /dev/null
+++ b/qqjf-Web/src/api/viewdata.js
@@ -0,0 +1,38 @@
+import axios from '../utils/axios'
+import qs from 'qs';
+
+/**
+ * @description 鑾峰彇鍚勭鐘舵�佺殑搴撲綅鏁伴噺
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+
+ export function GetAllStatusPlaceCount(param) {
+  return axios.post('/Place/GetAllStatusPlaceCount',qs.stringify(param));
+}
+
+/**
+ * @description 鑾峰彇鎸囧畾宸烽亾搴撶殑鎵�鏈夊簱浣嶄俊鎭�
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function GetAllPlaceInfo(data) {
+  return axios.post('/Place/GetAllPlaceInfo',qs.stringify(data) );
+}
+/**
+ * @description 鑾峰彇搴撲綅閲岀殑鎵樼洏鎴栬�呯墿鏂欎俊鎭�
+ * @param {string}  
+ * @param {string}  
+ * @returns {string} 
+ * qs.
+ * */
+ export function GetPVCVIInfo(data) {
+    return axios.post('/Place/GetPVCVIInfo',qs.stringify(data) );
+  }
+
+
+
diff --git a/qqjf-Web/src/api/warning.js b/qqjf-Web/src/api/warning.js
new file mode 100644
index 0000000..3dac3f9
--- /dev/null
+++ b/qqjf-Web/src/api/warning.js
@@ -0,0 +1,55 @@
+import axios from '../utils/axios';
+import qs from 'qs';
+
+/**
+ * @description 鎼滅储鎶ヨ淇℃伅
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+
+export function AlertSearch(data, param) {
+  return axios.post('/Alert/Search?page=' + data, qs.stringify(param));
+}
+/**
+ * @description 鑾峰彇缂栧彿
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function AlertGetCode(data) {
+  return axios.post('/Alert/GetCode', qs.stringify(data));
+}
+/**
+ * @description 鍒犻櫎鎶ヨ淇℃伅
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function AlertDelete(data) {
+  return axios.post('/Alert/Delete', qs.stringify(data));
+}
+/**
+ * @description 鏂板淇敼鎶ヨ淇℃伅
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function CarAddOrUpdate(data) {
+  return axios.post('/Alert/AddOrUpdate', qs.stringify(data));
+}
+
+/**
+ * @description 瀵煎嚭鍏ㄩ儴鏁版嵁
+ * @param {string}
+ * @param {string}
+ * @returns {string}
+ * qs.
+ * */
+export function GetAllAlarmInfo(data) {
+  return axios.post('/Alert/GetAllAlarmInfo', qs.stringify(data));
+}
diff --git a/qqjf-Web/src/assets/css/TimesNewRomanPSMT24163565.ttf b/qqjf-Web/src/assets/css/TimesNewRomanPSMT24163565.ttf
new file mode 100644
index 0000000..9201636
--- /dev/null
+++ b/qqjf-Web/src/assets/css/TimesNewRomanPSMT24163565.ttf
Binary files differ
diff --git a/qqjf-Web/src/assets/heard/heard.jpg b/qqjf-Web/src/assets/heard/heard.jpg
new file mode 100644
index 0000000..9de5ff8
--- /dev/null
+++ b/qqjf-Web/src/assets/heard/heard.jpg
Binary files differ
diff --git a/qqjf-Web/src/assets/heard/heard1.jpg b/qqjf-Web/src/assets/heard/heard1.jpg
new file mode 100644
index 0000000..bc76ecf
--- /dev/null
+++ b/qqjf-Web/src/assets/heard/heard1.jpg
Binary files differ
diff --git a/qqjf-Web/src/assets/heard/logbg.jpg b/qqjf-Web/src/assets/heard/logbg.jpg
new file mode 100644
index 0000000..864edf0
--- /dev/null
+++ b/qqjf-Web/src/assets/heard/logbg.jpg
Binary files differ
diff --git a/qqjf-Web/src/assets/heard/logo.png b/qqjf-Web/src/assets/heard/logo.png
new file mode 100644
index 0000000..31001fa
--- /dev/null
+++ b/qqjf-Web/src/assets/heard/logo.png
Binary files differ
diff --git a/qqjf-Web/src/assets/login/bg.jpg b/qqjf-Web/src/assets/login/bg.jpg
new file mode 100644
index 0000000..28aa853
--- /dev/null
+++ b/qqjf-Web/src/assets/login/bg.jpg
Binary files differ
diff --git a/qqjf-Web/src/components/SvgIcon/index.vue b/qqjf-Web/src/components/SvgIcon/index.vue
new file mode 100644
index 0000000..dd583d6
--- /dev/null
+++ b/qqjf-Web/src/components/SvgIcon/index.vue
@@ -0,0 +1,49 @@
+<template>
+  <svg :class="svgClass" aria-hidden="true" v-on="$listeners">
+    <use :xlink:href="iconName" />
+  </svg>
+</template>
+
+<script>
+export default {
+  name: 'SvgIcon',
+  props: {
+    iconClass: {
+      type: String,
+      required: true
+    },
+    className: {
+      type: String,
+      default: ''
+    }
+  },
+  computed: {
+    iconName() {
+      return `#icon-${this.iconClass}`
+    },
+    svgClass() {
+      if (this.className) {
+        return 'svg-icon ' + this.className
+      } else {
+        return 'svg-icon'
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.svg-icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+
+.svg-external-icon {
+  background-color: currentColor;
+  mask-size: cover!important;
+  display: inline-block;
+}
+</style>
diff --git a/qqjf-Web/src/components/TreeTable/eval.js b/qqjf-Web/src/components/TreeTable/eval.js
new file mode 100644
index 0000000..ea8b1dd
--- /dev/null
+++ b/qqjf-Web/src/components/TreeTable/eval.js
@@ -0,0 +1,30 @@
+/* eslint-disable */
+/* *
+ * @Author: jianglei
+ * @Date:   2017-10-12 12:06:49
+ */
+"use strict";
+import Vue from "vue";
+export default function treeToArray(data, expandAll, parent = null, level = null) {
+  let tmp = [];
+  Array.from(data).forEach(function(record) {
+    if (record._expanded === undefined) {
+      Vue.set(record, "_expanded", expandAll);
+    }
+    let _level = 1;
+    if (level !== undefined && level !== null) {
+      _level = level + 1;
+    }
+    Vue.set(record, "_level", _level);
+    //  濡傛灉鏈夌埗鍏冪礌
+    if (parent) {
+      Vue.set(record, "parent", parent);
+    }
+    tmp.push(record);
+    if (record.children && record.children.length > 0 && record._expanded) {
+      const children = treeToArray(record.children, expandAll, record, _level);
+      tmp = tmp.concat(children);
+    }
+  });
+  return tmp;
+}
diff --git a/qqjf-Web/src/components/TreeTable/index.vue b/qqjf-Web/src/components/TreeTable/index.vue
new file mode 100644
index 0000000..edbf10f
--- /dev/null
+++ b/qqjf-Web/src/components/TreeTable/index.vue
@@ -0,0 +1,159 @@
+<template>
+  <el-table
+    :data="formatData"
+    :row-style="showRow"
+    v-bind="$attrs"
+    :class="'abc-' + columns.length"
+    highlight-current-row
+    size="mini"
+  >
+    <el-table-column v-if="columns.length === 0" :label="treeColumnLabel" width="280">
+      <template slot-scope="scope">
+        <el-checkbox
+          v-model="scope.row.isSelected"
+          @change="
+            isSelected => {
+              rowSelected(isSelected, scope.row);
+            }
+          "
+        ></el-checkbox>
+        <span v-for="space in scope.row._level" :key="space" class="ms-tree-space" />
+        <span v-if="iconShow(0, scope.row)" class="tree-ctrl" @click="toggleExpanded(scope.$index)">
+          <i v-if="!scope.row._expanded" class="el-icon-plus" />
+          <i v-else class="el-icon-minus" />
+        </span>
+        {{ scope.row.menuName }}
+      </template>
+    </el-table-column>
+    <el-table-column
+      v-for="(column, index) in columns"
+      v-else
+      :key="column.value"
+      :label="column.text"
+      :width="column.width"
+    >
+      <template slot-scope="scope">
+        <span v-for="space in scope.row._level" v-if="index === 0" :key="space" class="ms-tree-space" />
+        <span v-if="iconShow(index, scope.row)" class="tree-ctrl" @click="toggleExpanded(scope.$index)">
+          <i v-if="!scope.row._expanded" class="el-icon-plus" />
+          <i v-else class="el-icon-minus" />
+        </span>
+        {{ scope.row[column.value] }}
+      </template>
+    </el-table-column>
+    <slot />
+  </el-table>
+</template>
+
+<script>
+import treeToArray from './eval';
+export default {
+  name: 'TreeTable',
+  props: {
+    /* eslint-disable */
+    data: {
+      type: [Array, Object],
+      required: true
+    },
+    // 鏍戝鑸垪澶村悕绉�
+    treeColumnLabel: {
+      type: String,
+      default: '瀵艰埅绫诲埆'
+    },
+    columns: {
+      type: Array,
+      default: () => []
+    },
+    evalFunc: Function,
+    evalArgs: Array,
+    expandAll: {
+      type: Boolean,
+      default: false
+    }
+  },
+  computed: {
+    //  鏍煎紡鍖栨暟鎹簮
+    formatData: function () {
+      let tmp;
+      if (!Array.isArray(this.data)) {
+        tmp = [this.data];
+      } else {
+        tmp = this.data;
+      }
+      const func = this.evalFunc || treeToArray;
+      const args = this.evalArgs ? Array.concat([tmp, this.expandAll], this.evalArgs) : [tmp, this.expandAll];
+      return func.apply(null, args);
+    }
+  },
+  methods: {
+    showRow: function (row) {
+      const show = row.row.parent ? row.row.parent._expanded && row.row.parent._show : true;
+      row.row._show = show;
+      return show ? 'animation:treeTableShow 1s;-webkit-animation:treeTableShow 1s;' : 'display:none;';
+    },
+    // 鍒囨崲涓嬬骇鏄惁灞曞紑
+    toggleExpanded: function (trIndex) {
+      const record = this.formatData[trIndex];
+      record._expanded = !record._expanded;
+    },
+    // 鍥炬爣鏄剧ず
+    iconShow(index, record) {
+      return index === 0 && record.children && record.children.length > 0;
+    },
+    // 琛屽墠闈㈠閫夋閫変腑浜嬩欢
+    rowSelected(isSelected, row) {
+      this.$emit('row-selected', isSelected, row);
+    }
+  }
+};
+</script>
+<style rel="stylesheet/css">
+@keyframes treeTableShow {
+  from {
+    opacity: 0;
+  }
+  to {
+    opacity: 1;
+  }
+}
+@-webkit-keyframes treeTableShow {
+  from {
+    opacity: 0;
+  }
+  to {
+    opacity: 1;
+  }
+}
+</style>
+
+<style lang="scss" rel="stylesheet/scss" scoped>
+$color-blue: #2196f3;
+$space-width: 18px;
+.ms-tree-space {
+  position: relative;
+  top: 1px;
+  display: inline-block;
+  font-style: normal;
+  font-weight: 400;
+  line-height: 1;
+  width: $space-width;
+  height: 14px;
+  &::before {
+    content: '';
+  }
+}
+.processContainer {
+  width: 100%;
+  height: 100%;
+}
+table td {
+  line-height: 26px;
+}
+
+.tree-ctrl {
+  position: relative;
+  cursor: pointer;
+  color: $color-blue;
+  margin-left: -$space-width;
+}
+</style>
diff --git a/qqjf-Web/src/components/TreeTable/readme.md b/qqjf-Web/src/components/TreeTable/readme.md
new file mode 100644
index 0000000..2a3b5af
--- /dev/null
+++ b/qqjf-Web/src/components/TreeTable/readme.md
@@ -0,0 +1,89 @@
+## 鍐欏湪鍓嶉潰
+姝ょ粍浠朵粎鎻愪緵涓�涓垱寤篢reeTable鐨勮В鍐虫�濊矾
+
+## prop璇存槑
+#### *data*
+  **蹇呭~**
+
+  鍘熷鏁版嵁,瑕佹眰鏄竴涓暟缁勬垨鑰呭璞�
+  ```javascript
+    [{
+      key1: value1,
+      key2: value2,
+      children: [{
+        key1: value1
+      },
+      {
+        key1: value1
+      }]
+    },
+    {
+      key1: value1
+    }]
+  ```
+  鎴栬��
+ ```javascript
+    {
+      key1: value1,
+      key2: value2,
+      children: [{
+        key1: value1
+      },
+      {
+        key1: value1
+      }]
+    }
+  ```
+
+#### columns
+  鍒楀睘鎬�,瑕佹眰鏄竴涓暟缁�
+
+  1. text: 鏄剧ず鍦ㄨ〃澶寸殑鏂囧瓧
+  2. value: 瀵瑰簲data鐨刱ey銆倀reeTable灏嗘樉绀虹浉搴旂殑value
+  3. width: 姣忓垪鐨勫搴︼紝涓轰竴涓暟瀛�(鍙��)
+  
+  濡傛灉浣犳兂瑕佹瘡涓瓧娈甸兘鏈夎嚜瀹氫箟鐨勬牱寮忔垨鑰呭祵濂楀叾浠栫粍浠讹紝columns鍙笉鎻愪緵锛岀洿鎺ュ儚鍦╡l-table涓�鏍峰啓鍗冲彲锛屽鏋滄病鏈夎嚜瀹氫箟鍐呭锛屾彁渚沜olumns灏嗘洿鍔犵殑渚挎嵎鏂逛究
+  
+  濡傛灉浣犳湁鍑犱釜瀛楁鏄渶瑕佽嚜瀹氫箟鐨勶紝鍑犱釜涓嶉渶瑕侊紝閭d箞鍙互灏嗕笉闇�瑕佽嚜瀹氫箟鐨勫瓧娈垫斁鍏olumns锛屽皢闇�瑕佽嚜瀹氫箟鐨勫唴瀹规斁鍏ュ埌slot涓紝璇︽儏瑙佸悗鏂�
+  ```javascript
+  [{
+    value:string,
+    text:string,
+    width:number
+  },{
+    value:string,
+    text:string,
+    width:number
+  }]
+  ```
+
+#### expandAll
+  鏄惁榛樿鍏ㄩ儴灞曞紑锛宐oolean鍊硷紝榛樿涓篺alse
+
+#### evalFunc
+  瑙f瀽鍑芥暟锛宖unction锛岄潪蹇呴』
+
+  濡傛灉涓嶆彁渚涳紝灏嗕娇鐢ㄩ粯璁ょ殑[evalFunc](./eval.js)
+
+  濡傛灉鎻愪緵浜唀valFunc,閭d箞浼氱敤鎻愪緵鐨別valFunc鍘昏В鏋恉ata锛屽苟杩斿洖treeTable娓叉煋鎵�闇�瑕佺殑鍊笺�傚浣曠紪鍐欎竴涓猠valFunc锛岃鍙傝�僛*eval.js*](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/components/TreeTable/eval.js)鎴朳*customEval.js*](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/example/table/treeTable/customEval.js)
+
+#### evalArgs
+  瑙f瀽鍑芥暟鐨勫弬鏁帮紝鏄竴涓暟缁�
+
+  **璇锋敞鎰忥紝鑷畾涔夌殑瑙f瀽鍑芥暟鍙傛暟绗竴涓负this.data锛岀浜屼釜鍙傛暟涓猴紝 this.expandAll,浣犱笉闇�瑕佸湪evalArgs濉啓銆備竴瀹氳浣忥紝杩欎袱涓弬鏁版槸寮哄埗鎬х殑锛屽苟涓斾綅缃笉鍙鍊�** *this.data涓洪渶瑕佽В鏋愮殑鏁版嵁锛宼his.expandAll涓烘槸鍚﹂粯璁ゅ睍寮�*
+
+  濡備綘鐨勮В鏋愬嚱鏁伴渶瑕佺殑鍙傛暟涓篳(this.data, this.expandAll,1,2,3,4)`锛岄偅涔堜綘鍙渶瑕佸皢`[1,2,3,4]`璧嬪�肩粰`evalArgs`灏卞彲浠ヤ簡
+  
+  濡傛灉浣犵殑瑙f瀽鍑芥暟鍙傛暟鍙湁`(this.data, this.expandAll)`,閭d箞灏卞彲浠ヤ笉鐢ㄥ~鍐檈valArgs浜�
+  
+  鍏蜂綋鍙弬鑰僛*customEval.js*](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/example/table/treeTable/customEval.js)鐨勫嚱鏁板弬鏁板拰[customTreeTable](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/example/table/treeTable/customTreeTable.vue)鐨刞evalArgs`灞炴�у��
+
+ ## slot
+ 杩欐槸涓�涓嚜瀹氫箟鍒楃殑鎻掓Ы銆�
+ 
+ 榛樿鎯呭喌涓嬶紝treeTable鍙湁涓�琛岃灞曠ず鏁版嵁鐨勫姛鑳姐�備絾鏄竴鑸儏鍐典笅锛屾垜浠細瑕佺粰琛屽姞涓婁竴涓搷浣滄寜閽垨鑰呮牴鎹綋琛屾暟鎹睍绀轰笉鍚岀殑鏍峰紡锛岃繖鏃舵垜浠氨闇�瑕佽嚜瀹氫箟鍒椾簡銆傝鍙傝�僛customTreeTable](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/example/table/treeTable/customTreeTable.vue)锛孾瀹炰緥鏁堟灉](http://panjiachen.github.io/vue-element-admin/#/example/table/custom-tree-table)
+ 
+ `slot`鍜宍columns灞炴�鍙悓鏃跺瓨鍦�,columns閲岄潰鐨勬暟鎹垪浼氬湪slot鑷畾涔夊垪鐨勫乏杈瑰睍绀�
+
+ ## 鍏朵粬
+  濡傛灉鏈夊叾浠栫殑闇�姹傦紝璇峰弬鑰僛el-table](http://element-cn.eleme.io/#/en-US/component/table)鐨刟pi鑷淇敼index.vue
diff --git a/qqjf-Web/src/components/autoscroll/eleResize.js b/qqjf-Web/src/components/autoscroll/eleResize.js
new file mode 100644
index 0000000..e04bca2
--- /dev/null
+++ b/qqjf-Web/src/components/autoscroll/eleResize.js
@@ -0,0 +1,110 @@
+/**
+ * Created by taozh on 2017/5/6.
+ * taozh1982@gmail.com
+ */
+var EleResize = {
+    _handleResize: function (e) {
+        var ele = e.target || e.srcElement;
+        var trigger = ele.__resizeTrigger__;
+        if (trigger) {
+            var handlers = trigger.__z_resizeListeners;
+            if (handlers) {
+                var size = handlers.length;
+                for (var i = 0; i < size; i++) {
+                    var h = handlers[i];
+                    var handler = h.handler;
+                    var context = h.context;
+                    handler.apply(context, [e]);
+                }
+            }
+        }
+    },
+    _removeHandler: function (ele, handler, context) {
+        var handlers = ele.__z_resizeListeners;
+        if (handlers) {
+            var size = handlers.length;
+            for (var i = 0; i < size; i++) {
+                var h = handlers[i];
+                if (h.handler === handler && h.context === context) {
+                    handlers.splice(i, 1);
+                    return;
+                }
+            }
+        }
+    },
+    _createResizeTrigger: function (ele) {
+        var obj = document.createElement('object');
+        obj.setAttribute('style',
+            'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden;opacity: 0; pointer-events: none; z-index: -1;');
+        obj.onload = EleResize._handleObjectLoad;
+        obj.type = 'text/html';
+        ele.appendChild(obj);
+        obj.data = 'about:blank';
+        return obj;
+    },
+    _handleObjectLoad: function (evt) {
+        this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__;
+        this.contentDocument.defaultView.addEventListener('resize', EleResize._handleResize);
+    }
+};
+if (document.attachEvent) {//ie9-10
+    EleResize.on = function (ele, handler, context) {
+        var handlers = ele.__z_resizeListeners;
+        if (!handlers) {
+            handlers = [];
+            ele.__z_resizeListeners = handlers;
+            ele.__resizeTrigger__ = ele;
+            ele.attachEvent('onresize', EleResize._handleResize);
+        }
+        handlers.push({
+            handler: handler,
+            context: context
+        });
+    };
+    EleResize.off = function (ele, handler, context) {
+        var handlers = ele.__z_resizeListeners;
+        if (handlers) {
+            EleResize._removeHandler(ele, handler, context);
+            if (handlers.length === 0) {
+                ele.detachEvent('onresize', EleResize._handleResize);
+                delete  ele.__z_resizeListeners;
+            }
+        }
+    }
+} else {
+    EleResize.on = function (ele, handler, context) {
+        var handlers = ele.__z_resizeListeners;
+        if (!handlers) {
+            handlers = [];
+            ele.__z_resizeListeners = handlers;
+
+            if (getComputedStyle(ele, null).position === 'static') {
+                ele.style.position = 'relative';
+            }
+            var obj = EleResize._createResizeTrigger(ele);
+            ele.__resizeTrigger__ = obj;
+            obj.__resizeElement__ = ele;
+        }
+        handlers.push({
+            handler: handler,
+            context: context
+        });
+    };
+    EleResize.off = function (ele, handler, context) {
+        var handlers = ele.__z_resizeListeners;
+        if (handlers) {
+            EleResize._removeHandler(ele, handler, context);
+            if (handlers.length === 0) {
+                var trigger = ele.__resizeTrigger__;
+                if (trigger) {
+                    trigger.contentDocument.defaultView.removeEventListener('resize', EleResize._handleResize);
+                    ele.removeChild(trigger);
+                    delete ele.__resizeTrigger__;
+                }
+                delete  ele.__z_resizeListeners;
+            }
+        }
+    }
+}
+
+export default EleResize
\ No newline at end of file
diff --git a/qqjf-Web/src/components/autoscroll/index.vue b/qqjf-Web/src/components/autoscroll/index.vue
new file mode 100644
index 0000000..a0883d8
--- /dev/null
+++ b/qqjf-Web/src/components/autoscroll/index.vue
@@ -0,0 +1,197 @@
+<template>
+  <div class="auto-scroll-compontent" :style="{ width, height }">
+    <div class="auto-scroll-outer" ref="frame" :class="[dir === 'vertical' ? 'vertical-outer' : 'horizontal-outer']">
+      <div
+        class="auto-scroll-wrapper"
+        ref="wrapper"
+        :key="refreshKey"
+        :class="[dir === 'vertical' ? 'vertical-wrapper' : 'horizontal-wrapper']"
+        :style="{
+          top: moveTop + 'px',
+          marginLeft: moveLeft + 'px',
+          transition: transition
+        }"
+      >
+        <slot></slot>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import eleResize from './eleResize.js';
+export default {
+  name: 'autoScrollCompontent',
+  props: {
+    dir: {
+      type: String,
+      default: 'vertical' /* 鏂瑰悜鍊硷細姘村钩-horizontal 绔�-vertical */
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '100%'
+    },
+    stepSpeed: {
+      type: Number,
+      default: 500 /* 绉诲姩閫熷害锛屽崟浣� ms/100px */
+    },
+    wait: {
+      type: Number,
+      default: 3000 /* 鍗曟鍔ㄧ敾缁撴潫鍚庣殑绛夊緟鏃堕棿锛屽崟浣� ms */
+    }
+  },
+  data() {
+    return {
+      $frame: null,
+      refreshKey: 0,
+      outerWidth: 0,
+      outerHeight: 0,
+      wrapperWidth: 0,
+      wrapperHeight: 0,
+      moveDistance: 0,
+      moveTop: 0,
+      moveLeft: 0,
+      transition: 'all 0',
+      interval: null,
+      roundTime: 0 /* 涓�涓粴鍔ㄥ懆鏈熼渶瑕佺殑鏃堕棿 */
+    };
+  },
+  mounted() {
+    this.init();
+  },
+  beforeDestroy() {
+    this.clearInterval();
+    this.destroyEleResize();
+  },
+  methods: {
+    init() {
+      this.moveTop = 0;
+      this.moveLeft = 0;
+      this.callSize();
+      this.createAnimation();
+      this.createEleResize();
+    },
+    /* 鍒涘缓div瀹介珮鍙樺寲鐩戝惉鍣� */
+    createEleResize() {
+      this.$frame = this.$refs.frame;
+      eleResize.on(this.$frame, this.eleListener);
+    },
+    /* div瀹介珮鐩戝惉鍣ㄧ洃鍚簨浠� */
+    eleListener() {
+      this.moveTop = 0;
+      this.moveLeft = 0;
+      this.callSize();
+      this.clearInterval();
+      this.createAnimation();
+    },
+    /* 瀹介珮璁$畻 */
+    callSize() {
+      if (this.dir === 'vertical') {
+        this.outerHeight = this.$refs.frame.offsetHeight;
+        this.wrapperHeight = this.$refs.wrapper.offsetHeight;
+        if (this.wrapperHeight > this.outerHeight) {
+          this.moveDistance = this.wrapperHeight - this.outerHeight;
+          this.roundTime = Math.floor((this.moveDistance / 100) * this.stepSpeed);
+          this.transition = 'top ' + this.roundTime + 'ms linear';
+        }
+      } else {
+        this.outerWidth = this.$refs.frame.offsetWidth;
+        this.wrapperWidth = this.$refs.wrapper.scrollWidth;
+        if (this.wrapperWidth > this.outerWidth) {
+          this.moveDistance = this.wrapperWidth - this.outerWidth;
+          this.roundTime = Math.floor((this.moveDistance / 100) * this.stepSpeed);
+          this.transition = 'margin-left ' + this.roundTime + 'ms linear';
+        }
+      }
+    },
+    /* 鍒涘缓鍔ㄧ敾璁℃椂鍣� */
+    createAnimation() {
+      if (this.roundTime) {
+        if (this.dir === 'vertical') {
+          this.animationVer();
+          this.interval = window.setInterval(this.animationVer, this.roundTime + this.wait);
+        } else {
+          this.animationHor();
+          this.interval = window.setInterval(this.animationHor, this.roundTime + this.wait);
+        }
+      }
+    },
+    /* 绾靛悜婊氬姩鍊煎彉鍖� */
+    animationVer() {
+      if (this.moveTop === 0) {
+        this.moveTop = -this.moveDistance;
+      } else {
+        this.moveTop = 0;
+      }
+    },
+    /* 妯悜婊氬姩鍊煎彉鍖� */
+    animationHor() {
+      if (this.moveLeft === 0) {
+        this.moveLeft = -this.moveDistance;
+      } else {
+        this.moveLeft = 0;
+      }
+    },
+    /* 璁℃椂鍣ㄦ竻妤� */
+    clearInterval() {
+      try {
+        window.clearInterval(this.interval);
+        this.interval = null;
+      } catch (e) {
+        //TODO handle the exception
+      }
+    },
+    /* div瀹介珮鍙樺寲浜嬩欢绉婚櫎 */
+    destroyEleResize() {
+      try {
+        eleResize.off(this.$frame, this.eleListener);
+      } catch (e) {
+        //TODO handle the exception
+      }
+    }
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.auto-scroll-compontent {
+  .auto-scroll-outer {
+    overflow: hidden;
+    width: 100%;
+    height: 100%;
+    &.vertical-outer {
+      position: relative;
+    }
+    &.horizontal-outer {
+    }
+  }
+  .auto-scroll-wrapper {
+    &.vertical-wrapper {
+      position: absolute;
+      width: 100%;
+      height: auto;
+      left: 0;
+    }
+    &.horizontal-wrapper {
+      display: flex;
+      width: 100%;
+      height: 100%;
+    }
+  }
+}
+</style>
+<style lang="scss">
+.auto-scroll-compontent {
+  .auto-scroll-wrapper {
+    &.horizontal-wrapper {
+      & > * {
+        flex-shrink: 0;
+      }
+    }
+  }
+}
+</style>
diff --git a/qqjf-Web/src/components/choose/addchoose.vue b/qqjf-Web/src/components/choose/addchoose.vue
new file mode 100644
index 0000000..e088432
--- /dev/null
+++ b/qqjf-Web/src/components/choose/addchoose.vue
@@ -0,0 +1,183 @@
+<template>
+  <div class="addchoose height overflow">
+    <div class="centent-form overflowy-auto">
+      <el-form
+        class="margin-auto width90"
+        ref="registerForm"
+        :model="registerForm"
+        size="mini"
+        :rules="rules"
+        label-position="left"
+        label-width="100px"
+      >
+        <el-form-item label="闆朵欢缂栧彿:" prop="itemName">
+          <el-input v-model="registerForm.itemName" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="闆朵欢鍚嶇О:" prop="enable">
+          <el-input v-model="registerForm.itemDes" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="閲�:" prop="creatorid">
+          <el-input type="number" v-model="registerForm.weight" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="绫诲瀷:" prop="creatorid">
+          <el-input v-model="registerForm.palletType" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鍗曚釜鍏樊:" prop="creatorid">
+          <el-input v-model="registerForm.weightDifference" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鍚敤:" prop="creatorid">
+          <el-select v-model="registerForm.enable" clearable placeholder="璇烽�夋嫨">
+            <el-option v-for="item in enableList" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鐢熶骇鐝嚎:" prop="creatorid">
+          <!-- <el-input v-model="registerForm.createLine" clearable></el-input> -->
+          <el-select v-model="registerForm.createLine" clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="(item, index) in createLineList"
+              :key="'productionLineName' + index"
+              :label="item.productionLineName"
+              :value="item.productionLineName"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="瑁呯鏁伴噺:" prop="creatorid">
+          <el-input v-model="registerForm.maxNum" type="number" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鍗曚环:" prop="creatorid">
+          <el-input v-model="registerForm.price" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鍗曚綅:" prop="creatorid">
+          <el-input v-model="registerForm.unit" clearable></el-input>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="addchoose-button text-right margin-right15 margin-top2">
+      <el-button type="primary" size="mini" class="form-buttom" @click="submitForm('registerForm')">鎻愪氦</el-button>
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { ItemAddOrUpdate } from '@/api/enterchoose';
+import { ProductionLineSearch } from '@/api/ProductionLine';
+export default {
+  data() {
+    return {
+      registerForm: {},
+      containerTypeList: [
+        {
+          label: 'P71-2222',
+          value: 'P71-2222'
+        },
+        {
+          label: 'P71-3333',
+          value: 'P71-3333'
+        }
+      ],
+      statusList: [
+        {
+          label: 0,
+          value: 0
+        },
+        {
+          label: 1,
+          value: 1
+        }
+      ],
+      enableList: [
+        {
+          label: '鍚敤',
+          value: 1
+        },
+        {
+          label: '绂佺敤',
+          value: 0
+        }
+      ],
+      createLineList: [],
+
+      rules: {
+        itemName: { required: true, message: '璇疯緭闆朵欢缂栧彿', trigger: 'change' }
+      }
+    };
+  },
+  props: {
+    //     rowitem: {
+    //       type: Object,
+    //       default: {}
+    //     }
+  },
+  mounted() {
+    // if (JSON.stringify(this.rowitem) != '{}') {
+    //   this.registerForm = this.rowitem;
+    // }
+    this.ProductionLineSearch();
+  },
+  methods: {
+    //鐝嚎
+    ProductionLineSearch() {
+      ProductionLineSearch('1&onePageNum=999').then(res => {
+        if (res.code == 0) {
+          let data = res.data || [];
+          this.createLineList = data;
+        }
+      });
+    },
+    submitForm(registerForm) {
+      this.$refs[registerForm].validate(valid => {
+        if (valid) {
+          ItemAddOrUpdate(this.registerForm).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.$emit('addsubmit');
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触'
+              });
+            }
+          });
+        } else {
+        }
+      });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.addchoose {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .addchoose-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/components/choose/choose.vue b/qqjf-Web/src/components/choose/choose.vue
new file mode 100644
index 0000000..6b46f25
--- /dev/null
+++ b/qqjf-Web/src/components/choose/choose.vue
@@ -0,0 +1,211 @@
+<template>
+  <div class="choose height overflow">
+    <div class="width overflow height92">
+      <div class="chose-height">
+        <div class="flex margintopbot justify-between">
+          <div class="width50 flex align-center">
+            <label class="width40 textalign">闆朵欢缂栧彿锛�</label>
+            <el-input size="mini"
+                      clearable
+                      v-model="iqnuer.itemName"
+                      class="width60"> </el-input>
+          </div>
+          <div class="width50 flex align-center">
+            <label class="width40 textalign">闆朵欢鍚嶇О锛�</label>
+            <el-input size="mini"
+                      clearable
+                      v-model="iqnuer.itemDes"
+                      class="width60"> </el-input>
+          </div>
+          <el-button type="primary"
+                     size="mini"
+                     @click="itemSearch">鏌ヨ</el-button>
+        </div>
+        <div class="flex width justify-between"></div>
+      </div>
+      <div class="width chose-tebleheight margin-top2 overflow">
+        <table-container height="91%"
+                         :wipelist="wipelist"
+                         :tableHead="tableHead"
+                         :tableData="tableData"
+                         :operation="false"
+                         :currentPage="page"
+                         :pageSize="pageSize"
+                         :totle="totle"
+                         :setshow="false"
+                         :delShow="true"
+                         :selectionShow="true"
+                         @del="del"
+                         @handleSelectionChange="handleSelectionChange"
+                         @CurrentChange="CurrentChange" />
+      </div>
+    </div>
+    <div class="choose-button text-right margin-right15 margin-top2">
+      <el-button type="primary"
+                 size="mini"
+                 class="form-buttom"
+                 @click="submitForm">纭閫夋嫨</el-button>
+      <el-button type="primary"
+                 size="mini"
+                 class="form-buttom"
+                 @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import { itemSearch, ItemDelete } from '@/api/enterchoose';
+const { edterchoose } = require('@/components/tableContainer/tableHead');
+export default {
+  data () {
+    return {
+      iqnuer: {},
+      inOrderCodelist: [
+        {
+          label: '鏃�',
+          value: ''
+        }
+      ],
+      tableData: [],
+      handlelist: [], //鍕鹃�夋暟鎹�
+      totle: 0,
+      page: 1,
+      pageSize: 20
+    };
+  },
+  props: {
+    wipelist: {
+      type: Array,
+      default: () => []
+    },
+    inOrderCodeShow: {
+      type: Boolean,
+      default: true
+    },
+    choice: {
+      type: Boolean,
+      default: true
+    }
+  },
+  components: { TableContainer },
+  computed: {
+    tableHead () {
+      return edterchoose;
+    }
+  },
+  mounted () {
+    this.itemSearch();
+  },
+  methods: {
+    //鏌ヨ
+    itemSearch () {
+      itemSearch(this.page + '&onePageNum=' + this.pageSize, this.iqnuer).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.image = process.env.IMAGE_URL + item.image;
+          });
+          this.tableData = data;
+          this.totle = res.num;
+        }
+      });
+    },
+    CurrentChange (e) {
+      this.page = e;
+      this.itemSearch();
+    },
+    //鍕鹃��
+    handleSelectionChange (e) {
+      console.log(e);
+      this.handlelist = e;
+    },
+    submitForm () {
+      if (this.choice) {
+        if (this.handlelist.length == 1) {
+          this.$emit('chooseClick', this.handlelist, this.iqnuer.inOrderCode);
+        } else if (this.handlelist.length == 0) {
+          this.$message({
+            type: 'warning',
+            message: '璇峰嬀閫変竴鏉℃暟鎹�'
+          });
+        } else if (this.handlelist.length > 1) {
+          this.$message({
+            type: 'warning',
+            message: '鍙兘鍕鹃�変竴鏉℃暟鎹�'
+          });
+        }
+      } else {
+        this.$emit('chooseClick', this.handlelist, this.iqnuer.inOrderCode);
+      }
+    },
+    //鍒犻櫎
+    del (row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          const { itemName } = { ...row };
+          ItemDelete({ itemName }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛'
+              });
+              this.itemSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鍒犻櫎澶辫触'
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.choose {
+  width: 98%;
+  padding: 1%;
+  .chose-height {
+    height: 40px;
+  }
+  .chose-tebleheight {
+    height: calc(100% - 60px);
+  }
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .choose-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    // width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/components/chooseRelevanceFinishedPart/index.vue b/qqjf-Web/src/components/chooseRelevanceFinishedPart/index.vue
new file mode 100644
index 0000000..9bf3866
--- /dev/null
+++ b/qqjf-Web/src/components/chooseRelevanceFinishedPart/index.vue
@@ -0,0 +1,358 @@
+<!-- 閫夋嫨鍏宠仈瀹屽伐鍏ュ簱闆朵欢浠诲姟 -->
+<template>
+  <div class="chooseRelevanceFinishedPart height overflow">
+    <div class="width overflow height92">
+      <div class="chose-height">
+        <div class="flex margintopbot justify-between">
+          <div class="width50 flex align-center">
+            <label class="width40 textalign">闆朵欢缂栧彿锛�</label>
+            <el-input size="mini"
+                      disabled
+                      clearable
+                      v-model="iqnuer.itemName"
+                      class="width60"> </el-input>
+          </div>
+          <div class="width50 flex align-center">
+            <label class="width40 textalign">闆朵欢鍚嶇О锛�</label>
+            <el-input size="mini"
+                      clearable
+                      disabled
+                      v-model="iqnuer.itemDes"
+                      class="width60"> </el-input>
+          </div>
+          <el-button type="primary"
+                     size="mini"
+                     @click="itemSearch">鏌ヨ</el-button>
+        </div>
+        <div class="flex width justify-between"></div>
+      </div>
+      <div class="width chose-tebleheight margin-top2 overflow">
+        <table-container height="91%"
+                         :wipelist="wipelist"
+                         :tableHead="tableHead"
+                         :tableData="tableData"
+                         :operation="false"
+                         :currentPage="page"
+                         :pageSize="pageSize"
+                         :totle="totle"
+                         :setshow="false"
+                         :delShow="true"
+                         :selectionShow="true"
+                         @del="del"
+                         @handleSelectionChange="handleSelectionChange"
+                         @CurrentChange="CurrentChange" />
+      </div>
+    </div>
+    <div class="chooseRelevanceFinishedPart-button text-right margin-right15 margin-top2">
+      <el-button type="primary"
+                 size="mini"
+                 class="form-buttom"
+                 @click="submitForm">纭閫夋嫨</el-button>
+      <el-button type="primary"
+                 size="mini"
+                 class="form-buttom"
+                 @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import { ItemDelete } from '@/api/enterchoose';
+import { ContainerVsItemSearch } from '@/api/enter';
+//const { edterchoose } = require('@/components/tableContainer/tableHead');
+//鏄剧ず琛ㄥご
+const chooseRelevanceFinishedPartHeader = [{
+  columnDescription: '闆朵欢缂栧彿',
+  columnName: 'itemName',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '闆朵欢鍚嶇О',
+  columnName: 'itemDes',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '闆朵欢鏁�',
+  columnName: 'itemNum',
+  sortable: true,
+  wipe: true,
+  width: 90
+},
+{
+  columnDescription: '闆朵欢閲嶉噺',
+  columnName: 'itemWeight',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '闆朵欢绫诲瀷',
+  columnName: 'itemType',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '闆朵欢鍏樊',
+  columnName: 'itemWeightDifference',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍣ㄥ叿缂栧彿',
+  columnName: 'containerName',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '鍣ㄥ叿绫诲瀷',
+  columnName: 'containerType',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+// {
+//   columnDescription: '鎵樼洏鐘舵��',
+//   columnName: 'containerStatus',
+//   sortable: true,
+//   wipe:true,
+// },
+{
+  columnDescription: '鍣ㄥ叿閲嶉噺',
+  columnName: 'containerWeight',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍣ㄥ叿鍏樊',
+  columnName: 'containerWeightDifference',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+// {
+//   columnDescription: '鍏ュ簱璁″垝',
+//   columnName: 'inOrderCode',
+//   sortable: true,
+//   wipe: true,
+//   width: 130
+// },
+{
+  columnDescription: '鍑哄簱璁″垝',
+  columnName: 'outOrderCode',
+  sortable: true,
+  wipe: true,
+  width: 130
+},
+{
+  columnDescription: '鏇存柊鏃堕棿',
+  columnName: 'updateTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+{
+  columnDescription: '闇�杩斾慨',
+  columnName: 'isBad',
+  sortable: true,
+  wipe: true,
+  width: 90
+},
+{
+  columnDescription: '杩斾慨杞﹂棿',
+  columnName: 'badByFactory',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鐢熶骇鐝嚎',
+  columnName: 'createLine',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍒涘缓浜�',
+  columnName: 'createUser',
+  sortable: true,
+  wipe: true
+}
+  // {
+  //   columnDescription: '鍚敤',
+  //   columnName: 'enable',
+  //   sortable: true,
+  //   wipe:true,
+  // },
+];
+export default {
+  data () {
+    return {
+      iqnuer: {
+        isSearchNoRelevanceInOrder: true, //琛ㄧず鏄煡璇㈡湭鍏宠仈鍐插帇鐢熶骇璁″垝鐨勪换鍔�
+        itemName: this.pItemName,
+        itemDes: this.pItemDes
+      },
+      inOrderCodelist: [
+        {
+          label: '鏃�',
+          value: ''
+        }
+      ],
+      tableData: [],
+      handlelist: [], //鍕鹃�夋暟鎹�
+      totle: 0,
+      page: 1,
+      pageSize: 20
+    };
+  },
+  props: {
+    wipelist: {
+      type: Array,
+      default: () => []
+    },
+    inOrderCodeShow: {
+      type: Boolean,
+      default: true
+    },
+    choice: {
+      type: Boolean,
+      default: true
+    },
+    pItemName: {
+      type: String
+    },
+    pItemDes: {
+      type: String
+    }
+  },
+  components: { TableContainer },
+  computed: {
+    tableHead () {
+      return chooseRelevanceFinishedPartHeader;
+    }
+  },
+  mounted () {
+    this.itemSearch();
+  },
+  methods: {
+    //鏌ヨ-宸茬粡瀹屽伐鍏ュ簱鐨勪换鍔�
+    itemSearch () {
+      ContainerVsItemSearch(this.page + '&onePageNum=' + this.pageSize, this.iqnuer).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.image = process.env.IMAGE_URL + item.image;
+          });
+          this.tableData = data;
+          this.totle = res.num;
+        }
+      });
+    },
+    CurrentChange (e) {
+      this.page = e;
+      this.itemSearch();
+    },
+    //鍕鹃��
+    handleSelectionChange (e) {
+      console.log(e);
+      this.handlelist = e;
+    },
+    submitForm () {
+      if (this.choice) {
+        if (this.handlelist.length > 0) {
+          this.$emit('submitForm', this.handlelist, this.iqnuer.inOrderCode);
+        } else if (this.handlelist.length == 0) {
+          this.$message({
+            type: 'warning',
+            message: '璇峰嬀閫夎嚦灏戜竴鏉℃暟鎹�'
+          });
+        }
+        // else if (this.handlelist.length > 1) {
+        //   this.$message({
+        //     type: 'warning',
+        //     message: '鍙兘鍕鹃�変竴鏉℃暟鎹�'
+        //   });
+        // }
+      } else {
+        this.$emit('submitForm', this.handlelist, this.iqnuer.inOrderCode);
+      }
+    },
+    //鍒犻櫎
+    del (row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          const { itemName } = { ...row };
+          ItemDelete({ itemName }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛'
+              });
+              this.itemSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鍒犻櫎澶辫触'
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.chooseRelevanceFinishedPart {
+  width: 98%;
+  padding: 1%;
+  .chose-height {
+    height: 40px;
+  }
+  .chose-tebleheight {
+    height: calc(100% - 60px);
+  }
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .chooseRelevanceFinishedPart-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    // width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/components/chooseUser/index.vue b/qqjf-Web/src/components/chooseUser/index.vue
new file mode 100644
index 0000000..142051c
--- /dev/null
+++ b/qqjf-Web/src/components/chooseUser/index.vue
@@ -0,0 +1,212 @@
+<!--閫夋嫨鐢ㄦ埛-->
+<template>
+  <div class="choose height overflow">
+    <div class="width overflow height92">
+      <div class="chose-height">
+        <div class="flex margintopbot justify-between">
+          <div class="width50 flex align-center">
+            <label class="width40 textalign">鐧诲綍鍚嶏細</label>
+            <el-input size="mini"
+                      clearable
+                      v-model="iqnuer.itemName"
+                      class="width60"> </el-input>
+          </div>
+          <div class="width50 flex align-center">
+            <label class="width40 textalign">鐪熷疄濮撳悕锛�</label>
+            <el-input size="mini"
+                      clearable
+                      v-model="iqnuer.itemDes"
+                      class="width60"> </el-input>
+          </div>
+          <el-button type="primary"
+                     size="mini"
+                     @click="itemSearch">鏌ヨ</el-button>
+        </div>
+        <div class="flex width justify-between"></div>
+      </div>
+      <div class="width chose-tebleheight margin-top2 overflow">
+        <table-container height="91%"
+                         :wipelist="wipelist"
+                         :tableHead="tableHead"
+                         :tableData="tableData"
+                         :operation="false"
+                         :currentPage="page"
+                         :pageSize="pageSize"
+                         :totle="totle"
+                         :setshow="false"
+                         :delShow="true"
+                         :selectionShow="true"
+                         @del="del"
+                         @handleSelectionChange="handleSelectionChange"
+                         @CurrentChange="CurrentChange" />
+      </div>
+    </div>
+    <div class="choose-button text-right margin-right15 margin-top2">
+      <el-button type="primary"
+                 size="mini"
+                 class="form-buttom"
+                 @click="submitForm">纭閫夋嫨</el-button>
+      <el-button type="primary"
+                 size="mini"
+                 class="form-buttom"
+                 @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import { itemSearch, ItemDelete } from '@/api/enterchoose';
+import { UserSearch, UserDelete } from '@/api/manage';
+const { manage } = require('@/components/tableContainer/tableHead');
+export default {
+  data () {
+    return {
+      iqnuer: {
+        IsWeldingAuditGroup: true
+      },
+      inOrderCodelist: [
+        {
+          label: '鏃�',
+          value: ''
+        }
+      ],
+      tableData: [],
+      handlelist: [], //鍕鹃�夋暟鎹�
+      totle: 0,
+      page: 1,
+      pageSize: 20
+    };
+  },
+  props: {
+    wipelist: {
+      type: Array,
+      default: () => []
+    },
+    inOrderCodeShow: {
+      type: Boolean,
+      default: true
+    },
+    choice: {
+      type: Boolean,
+      default: true
+    }
+  },
+  components: { TableContainer },
+  computed: {
+    tableHead () {
+      return manage;
+    }
+  },
+  mounted () {
+    this.itemSearch();
+  },
+  methods: {
+    //鏌ヨ
+    itemSearch () {
+      UserSearch(this.page + '&onePageNum=' + this.pageSize, this.iqnuer).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          this.tableData = data;
+          this.totle = res.num;
+        }
+      });
+    },
+    CurrentChange (e) {
+      this.page = e;
+      this.itemSearch();
+    },
+    //鍕鹃��
+    handleSelectionChange (e) {
+      console.log(e);
+      this.handlelist = e;
+    },
+    submitForm () {
+      if (this.choice) {
+        if (this.handlelist.length == 1) {
+          this.$emit('submitForm', this.handlelist, this.iqnuer.inOrderCode);
+        } else if (this.handlelist.length == 0) {
+          this.$message({
+            type: 'warning',
+            message: '璇峰嬀閫変竴鏉℃暟鎹�'
+          });
+        } else if (this.handlelist.length > 1) {
+          this.$message({
+            type: 'warning',
+            message: '鍙兘鍕鹃�変竴鏉℃暟鎹�'
+          });
+        }
+      } else {
+        this.$emit('submitForm', this.handlelist, this.iqnuer.inOrderCode);
+      }
+    },
+    //鍒犻櫎
+    del (row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          const { itemName } = { ...row };
+          ItemDelete({ itemName }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛'
+              });
+              this.itemSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鍒犻櫎澶辫触'
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.choose {
+  width: 98%;
+  padding: 1%;
+  .chose-height {
+    height: 40px;
+  }
+  .chose-tebleheight {
+    height: calc(100% - 60px);
+  }
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .choose-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    // width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/components/index.js b/qqjf-Web/src/components/index.js
new file mode 100644
index 0000000..fe33c83
--- /dev/null
+++ b/qqjf-Web/src/components/index.js
@@ -0,0 +1,7 @@
+export { default as TableContainer } from './tableContainer/index.vue'
+export { default as Modal } from './modal/index.vue'
+export { default as Choose } from './choose/choose.vue'
+export { default as AddChoose } from './choose/addchoose.vue'
+export { default as chooseRelevanceFinishedPart } from './chooseRelevanceFinishedPart/index.vue'
+export { default as chooseUser } from './chooseUser/index.vue'
+
diff --git a/qqjf-Web/src/components/modal/index.vue b/qqjf-Web/src/components/modal/index.vue
new file mode 100644
index 0000000..16dcd30
--- /dev/null
+++ b/qqjf-Web/src/components/modal/index.vue
@@ -0,0 +1,115 @@
+<!--  :style="modabg ? 'background:unset; position: absolute;' : ''"-->
+<template>
+  <div id="deta-modal">
+    <!-- <draggable element="ul" v-model="list"> -->
+    <div class="box-modal borderR8"
+         :style="modalStyle">
+      <div class="title-modal">
+        <p class="p-title">
+          <slot name="title"></slot>
+        </p>
+        <i class="el-icon-close pointer fontSize1_2"
+           @click="$emit('cancel')"></i>
+      </div>
+      <div class="centent-modal">
+        <!-- <el-scrollbar wrap-class="scrollbar-wrapper" style="height:100%"> -->
+        <slot name="centent"></slot>
+        <!-- </el-scrollbar> -->
+      </div>
+    </div>
+    <!-- </draggable> -->
+  </div>
+</template>
+
+<script>
+import { number } from 'echarts';
+//杩欓噷鍙互瀵煎叆鍏朵粬鏂囦欢锛堟瘮濡傦細缁勪欢锛屽伐鍏穓s锛岀涓夋柟鎻掍欢js锛宩son鏂囦欢锛屽浘鐗囨枃浠剁瓑绛夛級
+//渚嬪锛歩mport 銆婄粍浠跺悕绉般�� from '銆婄粍浠惰矾寰勩��';
+import draggable from 'vuedraggable';
+export default {
+  data () {
+    //杩欓噷瀛樻斁鏁版嵁
+    return {
+      ismodal: false,
+      list: [{ name: '1' }]
+    };
+  },
+  props: {
+    modabg: {
+      type: Boolean,
+      default: false
+    },
+    modalStyle: {
+      type: Object,
+      default: {
+        width: '45%' //璁剧疆榛樿鐨勫搴�,鍘熷厛鏄� 40% 銆怑ditBy shaocx,2022-11-10銆�
+      }
+    }
+  },
+  components: { draggable },
+  //鏂规硶闆嗗悎
+  methods: {
+    cancel () {
+      this.$emit('cancel');
+    }
+  },
+  //鐩戞帶data涓殑鏁版嵁鍙樺寲
+  watch: {},
+  //濡傛灉椤甸潰鏈塳eep-alive缂撳瓨鍔熻兘锛岃繖涓嚱鏁颁細瑙﹀彂
+  activated () { }
+};
+</script>
+<style lang="scss" scoped>
+#deta-modal {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.3);
+  // transition: all 0.3s;
+  z-index: 999;
+  .box-modal {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    width: 40%;
+    height: 85%;
+    border-radius: 6px;
+    transform: translate(-50%, -50%);
+    background: #fff;
+    box-shadow: 0 0 4px #345;
+    // transition: all 0.5s;
+    overflow: hidden;
+    .title-modal {
+      padding: 10px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      border-bottom: 1px solid #e6eaf1;
+      background: #f5f7fa;
+      .p-title {
+        font-size: 20px;
+        padding-left: 5px;
+      }
+      .fontSize1_2 {
+        font-size: 20px;
+        margin-right: 15px;
+        &:hover {
+          transition: all 0.3s;
+          transform: rotate(360deg);
+        }
+      }
+    }
+    .centent-modal {
+      width: 98%;
+      height: calc(100% - 62px);
+      padding: 1%;
+      overflow: hidden;
+    }
+  }
+  // .el-scrollbar__view {
+  //     height: 100%;
+  // }
+}
+</style>
diff --git a/qqjf-Web/src/components/tableContainer/index.vue b/qqjf-Web/src/components/tableContainer/index.vue
new file mode 100644
index 0000000..93b3a01
--- /dev/null
+++ b/qqjf-Web/src/components/tableContainer/index.vue
@@ -0,0 +1,654 @@
+<template>
+  <div id="tableContainer"
+       class="scrollCss"
+       :key="number">
+    <!-- @row-click="handleRowClick"   v-el-table-infinite-scroll="load"
+      :infinite-scroll-disabled="infintedisabled"   :style="{ height: $slots.default ? '91%' : '95%' }" -->
+    <el-table class="borderR8"
+              :data="tablelist"
+              v-loading="loading"
+              element-loading-text="鎷煎懡鍔犺浇涓�"
+              element-loading-spinner="el-icon-loading"
+              highlight-current-row
+              :border="bordershow"
+              :show-summary="showSummary"
+              stripe
+              :cell-style="cellStyle"
+              height="100%"
+              style="height: calc(100% - 35px) !important"
+              :key="number"
+              @selection-change="handleSelectionChange"
+              @row-dblclick="rowdblclick"
+              @row-click="rowclick"
+              ref="tableCommon">
+      <el-table-column v-if="selectionShow"
+                       type="selection"
+                       header-align="center"
+                       align="center"
+                       width="55">
+      </el-table-column>
+      <el-table-column header-align="center"
+                       type="index"
+                       label="搴忓彿"
+                       width="60"
+                       v-if="containHead.length > 0"></el-table-column>
+      <template v-for="item in containHead">
+        <el-table-column header-align="left"
+                         align="left"
+                         :label="item.columnDescription"
+                         :prop="item.columnName"
+                         :key="item.columnName"
+                         :sortable="item.sortable"
+                         v-if="item.wipe && wipelist.indexOf(item.columnName) == -1"
+                         :min-width="fixWidth(item.columnDescription)"
+                         :width="item.width ? item.width : ''">
+          <template slot-scope="{ row }">
+            <!-- v-if="item.columnName != 'maxNum' && item.coucolumnName != 'image'" -->
+            <p :style="
+                item.columnName == 'stStatus' && row[item.columnName] == '棰勮'
+                  ? 'color: #f8b360'
+                  : item.columnName == 'stStatus' && row[item.columnName] == '瓒呮湡'
+                  ? 'color:#E36168'
+                  : ''
+              "
+               v-if="plist.indexOf(item.columnName) == -1">
+              {{ row[item.columnName] }}
+            </p>
+            <el-image v-if="item.columnName == 'image'"
+                      style="width: 35px; height: 35px"
+                      :src="row[item.columnName]"
+                      :preview-src-list="[row[item.columnName]]">
+            </el-image>
+
+            <p class=""
+               v-if="item.columnName == 'inOrderCode' && !row.edit">
+              {{ row[item.columnName] }}
+            </p>
+            <p class=""
+               v-if="item.columnName == 'maxNum' && !row.edit">
+              {{ row[item.columnName] }}
+            </p>
+            <p class=""
+               v-if="item.columnName == 'doTime' && !row.edit">{{ row[item.columnName] }}</p>
+            <el-input oninput="value=value.replace(/[^\d.]/g,'')"
+                      size="mini"
+                      v-if="row.edit && item.columnName == 'maxNum'"
+                      v-model="row.maxNum"></el-input>
+            <el-select v-if="row.edit && item.columnName == 'inOrderCode'"
+                       v-model="row.inOrderCode"
+                       placeholder="璇烽�夋嫨"
+                       size="mini">
+              <el-option v-for="(item, index) in inOrderCodeList"
+                         :key="index + 'inOrderCode'"
+                         :label="item.inOrderCode"
+                         :value="item.inOrderCode">
+                <span style="float: left">{{ item.inOrderCode }}</span>
+                <span style="float: right; color: #ff0000;font-weight:bold; font-size: 17px">{{ item.totalNum }}</span>
+              </el-option>
+            </el-select>
+            <el-date-picker style="width: 100%"
+                            v-if="row.edit && item.columnName == 'doTime'"
+                            v-model="row.doTime"
+                            size="mini"
+                            value-format="yyyy-MM-dd HH:mm:ss"
+                            type="datetime"
+                            placeholder="閫夋嫨鏃ユ湡鏃堕棿">
+            </el-date-picker>
+          </template>
+        </el-table-column>
+      </template>
+
+      <el-table-column v-if="operation"
+                       :width="operationwidth"
+                       fixed="right"
+                       align="center">
+        <template slot="header"
+                  slot-scope="scope">
+          <span>鎿嶄綔</span>
+          <span v-if="setshow"
+                class="set"
+                @click="modalShow = true">璁剧疆</span>
+        </template>
+        <template v-if="buttonshow"
+                  slot-scope="scope">
+          <el-button class="elbuttonsize"
+                     v-if="mustFirstShow"
+                     :disabled="scope.row.taskStatus == '瀹屾垚' || scope.row.taskStatus == '寮傚父/鍙栨秷'"
+                     :style="
+              scope.row.taskStatus == '瀹屾垚' || scope.row.taskStatus == '寮傚父/鍙栨秷'
+                ? 'color: #909399'
+                : 'color: #f8b360'
+            "
+                     @click.native.prevent="$emit('mustFirst', scope.row)"
+                     type="text">
+            寮哄埗浼樺厛
+          </el-button>
+
+          <el-button class="elbuttonsize"
+                     v-if="issuShow"
+                     :disabled="scope.row.orderStatus != '鏈笅鍙�' && scope.row.orderStatus != '鏂板缓'"
+                     :style="
+              scope.row.orderStatus == '鏈笅鍙�' || scope.row.orderStatus == '鏂板缓' ? 'color: #f8b360' : 'color: #909399'
+            "
+                     @click.native.prevent="$emit('issu', scope.row)"
+                     type="text">
+            涓嬪彂
+          </el-button>
+          <!-- 瀹屽伐鍝佽緭鍏ラ〉闈� -->
+          <el-button class="elbuttonsize"
+                     v-if="relevanceShow"
+                     :style="
+             'color: #426ab3' 
+            "
+                     @click.native.prevent="$emit('relevance', scope.row)"
+                     type="text">
+            鍏宠仈
+          </el-button>
+          <el-button class="elbuttonsize"
+                     v-if="weldingAuditShow"
+                     :style="
+             'color: #426ab3' 
+            "
+                     @click.native.prevent="$emit('weldingAudit', scope.row)"
+                     type="text">
+            鎻愪氦瀹℃牳
+          </el-button>
+          <el-button class="elbuttonsize"
+                     v-if="unlineCommitShow"
+                     :style="
+             'color: #426ab3' 
+            "
+                     @click.native.prevent="$emit('unlineCommit', scope.row)"
+                     type="text">
+            绾夸笅浜や粯
+          </el-button>
+          <el-button class="elbuttonsize"
+                     v-if="editShow"
+                     style="color: #f8b360"
+                     @click.native.prevent="edit(scope.row)"
+                     type="text">
+            {{ scope.row.edit == true ? '淇濆瓨' : scope.row.edit == false ? '缂栬緫' : '缂栬緫' }}
+          </el-button>
+
+          <el-button class="elbuttonsize"
+                     v-if="maintask"
+                     :disabled="scope.row.taskStatus == '瀹屾垚' || scope.row.taskStatus == '寮傚父/鍙栨秷'"
+                     :style="
+              scope.row.taskStatus == '瀹屾垚' || scope.row.taskStatus == '寮傚父/鍙栨秷'
+                ? 'color: #909399'
+                : 'color: #f8b360'
+            "
+                     @click.native.prevent="$emit('abnormal', scope.row)"
+                     type="text">
+            寮傚父澶勭悊
+          </el-button>
+          <el-button class="elbuttonsize"
+                     v-if="delShow"
+                     style="color: #f8b360"
+                     @click.native.prevent="del(scope.row)"
+                     type="text">
+            鍒犻櫎
+          </el-button>
+          <el-button class="elbuttonsize"
+                     v-if="viewShow"
+                     style="color: #7fb80e"
+                     @click.native.prevent="view(scope.row)"
+                     type="text">
+            鏌ョ湅
+          </el-button>
+          <el-button v-if="passShow"
+                     size="mini"
+                     type="text"
+                     :style="
+             'color:#1d953f' 
+            "
+                     @click.native.prevent="$emit('passCommit', scope.row)">
+            閫氳繃
+          </el-button>
+          <el-button v-if="rejectShow"
+                     type="text"
+                     size="mini"
+                     :style="
+             'color: #d71345' 
+            "
+                     @click.native.prevent="$emit('rejectCommit', scope.row)">
+            椹冲洖
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-pagination v-if="paginationshow"
+                   class="elpagin"
+                   background
+                   small
+                   @size-change="handleSizeChange"
+                   @current-change="handleCurrentChange"
+                   :current-page="currentPage"
+                   :page-sizes="[5, 15, , 20, , 50, 100, 200, 300, 400, 1000]"
+                   :page-size="pageSize"
+                   layout="total, sizes, prev, pager, next, jumper"
+                   :total="totle">
+    </el-pagination>
+    <transition name="modal">
+      <modal v-if="modalShow"
+             :modabg="true"
+             @cancel="modalShow = false">
+        <p slot="title">鍙傛暟璁剧疆</p>
+        <div class="height"
+             slot="centent">
+          <div class="width height overflow">
+            <p class="width modal-title">鐐瑰嚮鍙充晶寮�鍏冲彲浠ヨ缃瓧娈垫槸鍚︽樉绀�</p>
+            <div class="modal-item margintopbot flex align-center justify-between">
+              <p>瀛楁鍚�</p>
+              <p>
+                <span>鏄剧ず鎺掑簭</span>
+                <span class="margin-left">瀛楁鏄剧ず</span>
+              </p>
+            </div>
+            <div class="applyheight overflowy-auto">
+              <draggable v-model="containHead"
+                         :move="fielSetMove"
+                         class="draggable-main"
+                         tag="ul"
+                         ghost-class="ghost"
+                         chosen-class="chosen"
+                         filter=".forbid"
+                         animation="300"
+                         @start="startDrag"
+                         @end="endDrag">
+                <template v-for="item in containHead">
+                  <div :key="item.columnName"
+                       class="modal-item margintopbot flex align-center justify-between">
+                    <p>{{ item.columnDescription }}</p>
+                    <p>
+                      <span>
+                        <el-switch v-model="item.sortable"
+                                   :active-value="true"
+                                   :inactive-value="false"> </el-switch>
+                      </span>
+                      <span class="margin-left">
+                        <el-switch v-model="item.wipe"
+                                   :active-value="true"
+                                   :inactive-value="false"> </el-switch>
+                      </span>
+                    </p>
+                  </div>
+                </template>
+              </draggable>
+            </div>
+            <div class="text-right margin-top2">
+              <el-button type="primary"
+                         size="mini">纭畾</el-button>
+              <el-button size="mini">鍙栨秷</el-button>
+            </div>
+          </div>
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import elTableInfiniteScroll from 'el-table-infinite-scroll';
+import draggable from 'vuedraggable';
+import Modal from '../modal/index';
+import { getimestampDate } from '@/utils/date';
+
+export default {
+  directives: {
+    'el-table-infinite-scroll': elTableInfiniteScroll
+  },
+  name: 'tableCommon',
+  props: {
+    //琛屾牱寮�
+    cellStyle: {
+      type: Function
+    },
+    tableHead: Array,
+    height: String,
+    tableData: {
+      type: Array,
+      default: () => []
+    },
+    totle: {
+      type: [String, Number],
+      default: '0'
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    paginationshow: {
+      type: Boolean,
+      default: true
+    },
+    //鏌ョ湅
+    viewShow: {
+      type: Boolean,
+      default: false
+    },
+    bordershow: {
+      type: Boolean,
+      default: false
+    },
+    passShow: {
+      type: Boolean,
+      default: false
+    },
+    rejectShow: {
+      type: Boolean,
+      default: false
+    },
+    showSummary: {
+      type: Boolean,
+      default: false
+    },
+    selectionShow: {
+      type: Boolean,
+      default: false
+    },
+    operation: {
+      type: Boolean,
+      default: true
+    },
+    buttonshow: {
+      type: Boolean,
+      default: true
+    },
+    weldingAuditShow: {
+      type: Boolean,
+      default: false
+    },
+    unlineCommitShow: {
+      type: Boolean,
+      default: false
+    },
+    mustFirstShow: {
+      type: Boolean,
+      default: false
+    },
+    editShow: {
+      type: Boolean,
+      default: false
+    },
+    delShow: {
+      type: Boolean,
+      default: false
+    },
+    issuShow: {
+      type: Boolean,
+      default: false
+    },
+    inputshow: {
+      type: Boolean,
+      default: false
+    },
+    relevanceShow: {
+      type: Boolean,
+      default: false
+    },
+    wipelist: {
+      type: Array,
+      default: () => []
+    },
+    maintask: {
+      type: Boolean,
+      default: false
+    },
+    setshow: {
+      type: Boolean,
+      default: true
+    },
+    operationwidth: {
+      type: [Number, String],
+      default: 120
+    },
+    currentPage: {
+      type: [Number, String],
+      defaults: 1
+    },
+    pageSize: {
+      type: [Number, String],
+      defaults: 20
+    },
+    naxnumShow: {
+      type: Boolean,
+      default: false
+    },
+    inOrderCodeList: {
+      type: Array,
+      default: () => []
+    }
+  },
+  components: { Modal, draggable },
+  data () {
+    const that = this;
+    return {
+      number: Math.random() * 100,
+      tablelist: [],
+      containHead: [],
+      // currentPage: 1,
+      modalShow: false,
+      plist: ['doTime', 'maxNum', 'image', 'inOrderCode'],
+      rowedit: false
+    };
+  },
+  mounted () {
+    this.containHead = this.tableHead;
+    this.conversion(JSON.stringify(this.tableData));
+  },
+  methods: {
+    //涓嬫媺鍔犺浇
+    load () { },
+    fixWidth (val) {
+      let length = 0;
+      if (val.indexOf('(') != -1) {
+        length = val.length * 16 + 10;
+      } else {
+        length = val.length * 25 + 10;
+      }
+      length = val == '鐢熶骇璁″垝鍗曞彿' || val == '鍑哄簱璁″垝鍗曞彿' ? 130 : length;
+      if (length < 100) {
+        length = 90;
+      }
+      return length;
+    },
+    //鍒嗛〉
+    handleCurrentChange (e) {
+      this.$emit('CurrentChange', e);
+    },
+    handleSizeChange (e) {
+      this.$emit('SizeChange', e);
+    },
+    //绛涢��
+    conversion (nl) {
+      this.tablelist = JSON.parse(nl);
+      this.tablelist.filter(item => {
+        item.enable = item.enable == 1 ? '鏄�' : item.enable == 0 ? '鍚�' : item.enable;
+        item.isLock = item.isLock == 1 ? '鏄�' : item.isLock == 0 ? '鍚�' : item.isLock;
+        item.isBad = item.isBad == 1 ? '鏄�' : item.isBad == 0 ? '鍚�' : item.isBad;
+        item.isWork = item.isWork == 1 ? '鏄�' : item.isWork == 0 ? '鍚�' : item.isWork;
+        item.isErp = item.isErp == 1 ? '鏄�' : item.isErp == 0 ? '鍚�' : item.isErp;
+
+        item.isFull = item.isFull == 1 ? '鏄�' : item.isFull == 0 ? '鍚�' : item.isFull;
+        item.isDestination = item.isDestination == 1 ? '鏄�' : item.isDestination == 0 ? '鍚�' : item.isDestination;
+        item.isError = item.isError == 1 ? '鏄�' : item.isError == 0 ? '鍚�' : item.isError;
+        item.isMainOut = item.isMainOut == 1 ? '鏄�' : item.isMainOut == 0 ? '鍚�' : item.isMainOut;
+
+        item.taskType == 1 ? '鍏ュ簱' : item.taskType == 2 ? '鍑哄簱' : item.taskType == 3 ? '绉诲簱' : item.taskType;
+        item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
+        item.updateTime = item.updateTime ? getimestampDate(item.updateTime) : '';
+        item.createTime = item.createTime ? getimestampDate(item.createTime) : '';
+        item.taskCreateTime = item.taskCreateTime ? getimestampDate(item.taskCreateTime) : '';
+        item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
+        item.CheckTime = item.CheckTime ? getimestampDate(item.CheckTime) : '';//瀹℃牳鏃堕棿
+        item.SendTime = item.SendTime ? getimestampDate(item.SendTime) : '';//鎻愪氦瀹℃牳鏃堕棿
+
+        if (item.IsWeldingAuditGroup != undefined) {
+          item.IsWeldingAuditGroupText = item.IsWeldingAuditGroup ? '鏄�' : item.IsWeldingAuditGroup == false ? '鍚�' : item.IsWeldingAuditGroup;
+        }
+
+        //
+      });
+    },
+    //鎷栨嫿寮�濮�
+    startDrag (e) { },
+    //鎷栨嫿缁撴潫
+    endDrag (e) {
+      this.number = Math.random() * 100;
+    },
+    //缂栬緫
+    edit (row) {
+      let rowobj = { ...row };
+      rowobj.enable = rowobj.enable == '鏄�' ? 1 : rowobj.enable == '鍚�' ? 0 : rowobj.enable;
+      rowobj.isLock = rowobj.isLock == '鏄�' ? 1 : rowobj.isLock == '鍚�' ? 0 : rowobj.isLock;
+      rowobj.isBad = rowobj.isBad == '鏄�' ? 1 : rowobj.isBad == '鍚�' ? 0 : rowobj.isBad;
+      rowobj.isWork = rowobj.isWork == 1 ? '鏄�' : rowobj.isWork == 0 ? '鍚�' : rowobj.isWork;
+      rowobj.isErp = rowobj.isErp == 1 ? '鏄�' : rowobj.isErp == 0 ? '鍚�' : rowobj.isErp;
+      rowobj.isFull = rowobj.isFull == '鏄�' ? 1 : rowobj.isFull == '鍚�' ? 0 : rowobj.isFull;
+      rowobj.isDestination = rowobj.isDestination == 1 ? '鏄�' : rowobj.isDestination == 0 ? '鍚�' : rowobj.isDestination;
+      rowobj.isError = rowobj.isError == '鏄�' ? 1 : rowobj.isError == '鍚�' ? 0 : rowobj.isError;
+      rowobj.taskType =
+        rowobj.taskType == '鍏ュ簱' ? 1 : rowobj.taskType == '鍑哄簱' ? 2 : rowobj.taskType == '绉诲簱' ? 3 : rowobj.taskType;
+      rowobj.isMainOut = rowobj.isMainOut == 1 ? '鏄�' : rowobj.isMainOut == 0 ? '鍚�' : rowobj.isMainOut;
+      console.log(this.inputshow);
+      if (this.inputshow) {
+        this.rowdblclick(row);
+      } else {
+        this.$emit('edit', rowobj);
+      }
+    },
+    //鏌ョ湅
+    view (row) {
+      let rowobj = { ...row };
+      rowobj.enable = rowobj.enable == '鏄�' ? 1 : rowobj.enable == '鍚�' ? 0 : rowobj.enable;
+      rowobj.isLock = rowobj.isLock == '鏄�' ? 1 : rowobj.isLock == '鍚�' ? 0 : rowobj.isLock;
+      rowobj.isBad = rowobj.isBad == '鏄�' ? 1 : rowobj.isBad == '鍚�' ? 0 : rowobj.isBad;
+      rowobj.isWork = rowobj.isWork == 1 ? '鏄�' : rowobj.isWork == 0 ? '鍚�' : rowobj.isWork;
+      rowobj.isErp = rowobj.isErp == 1 ? '鏄�' : rowobj.isErp == 0 ? '鍚�' : rowobj.isErp;
+      rowobj.isFull = rowobj.isFull == '鏄�' ? 1 : rowobj.isFull == '鍚�' ? 0 : rowobj.isFull;
+      rowobj.isDestination = rowobj.isDestination == 1 ? '鏄�' : rowobj.isDestination == 0 ? '鍚�' : rowobj.isDestination;
+      rowobj.isError = rowobj.isError == '鏄�' ? 1 : rowobj.isError == '鍚�' ? 0 : rowobj.isError;
+      rowobj.taskType =
+        rowobj.taskType == '鍏ュ簱' ? 1 : rowobj.taskType == '鍑哄簱' ? 2 : rowobj.taskType == '绉诲簱' ? 3 : rowobj.taskType;
+      rowobj.isMainOut = rowobj.isMainOut == 1 ? '鏄�' : rowobj.isMainOut == 0 ? '鍚�' : rowobj.isMainOut;
+      console.log(this.inputshow);
+      if (this.inputshow) {
+        this.rowdblclick(row);
+      } else {
+        this.$emit('view', rowobj);
+      }
+    },
+    //鍒犻櫎
+    del (row) {
+      let rowobj = { ...row };
+      rowobj.enable = rowobj.enable == '鏄�' ? 1 : rowobj.enable == '鍚�' ? 0 : rowobj.enable;
+      rowobj.isLock = rowobj.isLock == '鏄�' ? 1 : rowobj.isLock == '鍚�' ? 0 : rowobj.isLock;
+      rowobj.isBad = rowobj.isBad == '鏄�' ? 1 : rowobj.isBad == '鍚�' ? 0 : rowobj.isBad;
+      this.$emit('del', rowobj);
+    },
+    //鍕鹃��
+    handleSelectionChange (e) {
+      this.$emit('handleSelectionChange', e);
+    },
+    //鍙屽嚮琛�
+    rowdblclick (item) {
+      item.edit = !item.edit;
+      this.$emit('itemchange', this.tablelist, item);
+    },
+    //鍗曟満琛�
+    rowclick (row) {
+      this.$emit('rowchange', row);
+    },
+    tableRowClassName ({ row, rowIndex }) {
+      this.$emit('tableRowClassName', row, rowIndex);
+    },
+    fielSetMove () { }
+  },
+  watch: {
+    tableData: {
+      handler (nl, ol) {
+        this.number = Math.random() * 1000;
+        this.conversion(JSON.stringify(nl));
+      },
+      deep: true
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+#tableContainer {
+  position: relative;
+  z-index: 6;
+  height: 100%;
+  .widthscope {
+    width: 200px;
+  }
+  .elbuttonsize {
+    font-size: 0.8rem;
+  }
+  .set {
+    color: #0465a8;
+    cursor: pointer;
+    display: inline-block;
+    margin-left: 20px;
+  }
+  .modal-title {
+    background-color: #f0f9eb;
+    color: #67c23a;
+    font-size: 14px;
+    padding: 4px 10px;
+    border-radius: 4px;
+  }
+  .modal-item {
+    border: 1px solid #f8f8f8;
+    padding: 4px 10px;
+    background-color: #f3f3f3;
+    font-size: 14px;
+  }
+  .draggable-main {
+    margin: 0;
+    padding: 0;
+    cursor: pointer;
+    .drag {
+      border: 1px dotted rgb(44, 104, 163);
+      background-color: #409eff;
+    }
+
+    .chosen {
+      background-color: #409eff;
+      color: #fff;
+    }
+
+    .ghost {
+      background-color: #409eff;
+    }
+  }
+  ::v-deep {
+    .el-table__fixed-right {
+      right: 1px !important;
+    }
+    .el-table--border td {
+      // border-right: none !important;
+    }
+  }
+  ::v-deep .el-table {
+    height: calc(100% - 35px) !important;
+  }
+
+  ::v-deep .el-button + .el-button {
+    margin-left: 5px;
+  }
+  ::v-deep .el-table__empty-text {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+  }
+  ::v-deep .el-table td,
+  .el-table th {
+    padding: 4px 0;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/components/tableContainer/tableHead.js b/qqjf-Web/src/components/tableContainer/tableHead.js
new file mode 100644
index 0000000..a10c18e
--- /dev/null
+++ b/qqjf-Web/src/components/tableContainer/tableHead.js
@@ -0,0 +1,2084 @@
+const manage = [{
+  columnDescription: '鐧诲綍鍚�',
+  columnName: 'userName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鐪熷疄濮撳悕',
+  columnName: 'userTrueName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '閮ㄩ棬',
+  columnName: 'deptName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鎵�灞炶鑹�',
+  columnName: 'roleName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍚敤鐘舵��',
+  columnName: 'enable',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏄惁鐒婅瀹℃牳缁�',
+  columnName: 'IsWeldingAuditGroupText',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍒涘缓浜�',
+  columnName: 'creatorId',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '淇敼鏃堕棿',
+  columnName: 'updateTime',
+  sortable: true,
+  wipe: true
+}
+];
+const dept = [{
+  columnDescription: '閮ㄩ棬鍚嶇О',
+  columnName: 'deptName',
+  sortable: true,
+  wipe: true
+},
+
+{
+  columnDescription: '閮ㄩ棬鎻忚堪',
+  columnName: 'deptDes',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏄惁鍚敤',
+  columnName: 'enable',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏇存柊鏃堕棿',
+  columnName: 'updateTime',
+  sortable: true,
+  wipe: true
+}
+];
+const role = [{
+  columnDescription: '瑙掕壊鍚嶇О',
+  columnName: 'roleName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏄惁鍚敤',
+  columnName: 'enable',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍒涘缓浜�',
+  columnName: 'userName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '淇敼鏃堕棿',
+  columnName: 'updateTime',
+  sortable: true,
+  wipe: true
+}
+];
+const storage = [{
+  columnDescription: '浠撳簱缂栫爜',
+  columnName: 'storageCode',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '浠撳簱鍚嶇О',
+  columnName: 'storageName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏄惁鍙敤',
+  columnName: 'enable',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍏徃鍚嶇О',
+  columnName: 'shipperCompanyName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '浠撳簱鍦板潃',
+  columnName: 'shipperAddress',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍒涘缓鏃堕棿',
+  columnName: 'createDate',
+  sortable: true,
+  wipe: true
+}
+];
+const position = [{
+  columnDescription: '搴撲綅鍚嶇О',
+  columnName: 'place',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '搴撲綅绫诲瀷',
+  columnName: 'placeType',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '搴撲綅瑙勬牸',
+  columnName: 'specification',
+  sortable: true,
+  wipe: true,
+  width: 200
+},
+// {
+//   columnDescription: '鏈夎揣',
+//   columnName: 'isFull',
+//   sortable: true,
+//   wipe:true,
+// },
+{
+  columnDescription: '閿佸畾',
+  columnName: 'isLock',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鎺掓暟',
+  columnName: 'row',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍒楁暟',
+  columnName: 'col',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '灞傛暟',
+  columnName: 'layer',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '宸烽亾(鍫嗗灈鏈�)鍙�',
+  columnName: 'srmId',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '闀�',
+  columnName: 'length',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '瀹�',
+  columnName: 'width',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '楂�',
+  columnName: 'height',
+  sortable: true,
+  wipe: true
+}
+];
+const palte = [{
+  columnDescription: '鍣ㄥ叿缂栧彿',
+  columnName: 'containerName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍣ㄥ叿瑙勬牸',
+  columnName: 'containerType',
+  sortable: true,
+  wipe: true
+},
+// {
+//   columnDescription: '鐘舵��',
+//   columnName: 'status',
+//   sortable: true,
+//   wipe:true,
+// },
+{
+  columnDescription: '閲�',
+  columnName: 'weight',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '闀�',
+  columnName: 'length',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '瀹�',
+  columnName: 'width',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '楂�',
+  columnName: 'height',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍏樊',
+  columnName: 'weightDifference',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '瑙勬牸缂栧彿',
+  columnName: 'palletCode',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '瑙勬牸鎻忚堪',
+  columnName: 'palletType',
+  sortable: true,
+  wipe: true,
+  width: 180
+},
+{
+  columnDescription: '鏄惁閿佸畾',
+  columnName: 'isLock',
+  sortable: true,
+  wipe: true
+}
+  // {
+  //   columnDescription: '鏄惁鍚敤',
+  //   columnName: 'enable',
+  //   sortable: true,
+  //   wipe: true
+  // }
+];
+const stacker = [{
+  columnDescription: '璁惧鍚�',
+  columnName: 'deviceName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '璁惧绫诲瀷',
+  columnName: 'deviceType',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '璁惧缂栧彿',
+  columnName: 'deviceId',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏄惁閿佸畾',
+  columnName: 'isLock',
+  sortable: true,
+  wipe: true
+}
+];
+//鍐插帇鐢熶骇璁″垝琛ㄥご
+const quotation = [{
+  columnDescription: '鐢熶骇璁″垝鍗曞彿',
+  columnName: 'inOrderCode',
+  sortable: true,
+  wipe: true,
+  width: 200
+},
+{
+  columnDescription: '鐢熶骇绫诲瀷',
+  columnName: 'orderType',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+
+{
+  columnDescription: '璁㈠崟鐘舵��',
+  columnName: 'orderStatus',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '闆朵欢缂栧彿',
+  columnName: 'itemName',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+{
+  columnDescription: '闆朵欢鍚嶇О',
+  columnName: 'itemDes',
+  sortable: true,
+  wipe: true,
+  width: 200
+},
+{
+  columnDescription: '璁″垝鏁伴噺',
+  columnName: 'totalNum',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '宸插畬鎴愭暟閲�',
+  columnName: 'doneNum',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '鎻愪氦浜�',
+  columnName: 'senderName',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鎻愪氦鏃堕棿',
+  columnName: 'SendTime',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '瀹℃牳浜�',
+  columnName: 'checkerName',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '瀹℃牳缁撴灉',
+  columnName: 'CheckResult',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '瀹℃牳鏃堕棿',
+  columnName: 'CheckTime',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '瀹℃牳璇存槑',
+  columnName: 'CheckRemark',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '澶囨敞',
+  columnName: 'deviceName5',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍒涘缓浜�',
+  columnName: 'createName',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍒涘缓鏃堕棿',
+  columnName: 'createTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+}, {
+  columnDescription: '淇敼浜�',
+  columnName: 'updateName',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '淇敼鏃堕棿',
+  columnName: 'updateTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+}
+];
+const quotationedit = [{
+  columnDescription: '闆朵欢缂栧彿',
+  columnName: 'itemName',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '闆朵欢鍚嶇О',
+  columnName: 'itemDes',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '璁″垝鏁伴噺',
+  columnName: 'maxNum',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鐢熶骇鐝嚎',
+  columnName: 'createLine',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '璁″垝鏃ユ湡',
+  columnName: 'doTime',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍥剧墖',
+  columnName: 'image',
+  sortable: true,
+  wipe: true
+}
+];
+//閫佺鍗曞叧鑱斿畬宸ユ暟琛ㄥ崟
+const quotaion_relevanceEdit = [{
+  columnDescription: '闆朵欢缂栧彿',
+  columnName: 'itemName',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '闆朵欢鍚嶇О',
+  columnName: 'itemDes',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '鍏ュ簱鏁伴噺',
+  columnName: 'itemNum',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鐢熶骇鐝嚎',
+  columnName: 'createLine',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍏ュ簱鏃ユ湡',
+  columnName: 'updateTime',
+  sortable: true,
+  wipe: true
+}
+];
+const enter = [{
+  columnDescription: '闆朵欢缂栧彿',
+  columnName: 'itemName',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '闆朵欢鍚嶇О',
+  columnName: 'itemDes',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '闆朵欢閲嶉噺',
+  columnName: 'itemWeight',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '闆朵欢绫诲瀷',
+  columnName: 'itemType',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '闆朵欢鍏樊',
+  columnName: 'itemWeightDifference',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍣ㄥ叿缂栧彿',
+  columnName: 'containerName',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '鍣ㄥ叿绫诲瀷',
+  columnName: 'containerType',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+// {
+//   columnDescription: '鎵樼洏鐘舵��',
+//   columnName: 'containerStatus',
+//   sortable: true,
+//   wipe:true,
+// },
+{
+  columnDescription: '鍣ㄥ叿閲嶉噺',
+  columnName: 'containerWeight',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍣ㄥ叿鍏樊',
+  columnName: 'containerWeightDifference',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍏ュ簱璁″垝',
+  columnName: 'inOrderCode',
+  sortable: true,
+  wipe: true,
+  width: 130
+},
+{
+  columnDescription: '鍑哄簱璁″垝',
+  columnName: 'outOrderCode',
+  sortable: true,
+  wipe: true,
+  width: 130
+},
+{
+  columnDescription: '鏇存柊鏃堕棿',
+  columnName: 'updateTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+{
+  columnDescription: '闆朵欢鏁�',
+  columnName: 'itemNum',
+  sortable: true,
+  wipe: true,
+  width: 90
+},
+{
+  columnDescription: '闇�杩斾慨',
+  columnName: 'isBad',
+  sortable: true,
+  wipe: true,
+  width: 90
+},
+{
+  columnDescription: '杩斾慨杞﹂棿',
+  columnName: 'badByFactory',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鐢熶骇鐝嚎',
+  columnName: 'createLine',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍒涘缓浜�',
+  columnName: 'createUser',
+  sortable: true,
+  wipe: true
+}
+  // {
+  //   columnDescription: '鍚敤',
+  //   columnName: 'enable',
+  //   sortable: true,
+  //   wipe:true,
+  // },
+];
+const enterEdit = [{
+  columnDescription: '鐢熶骇璁″垝鍗曞彿',
+  columnName: 'inOrderCode',
+  width: 180,
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '闆朵欢缂栧彿',
+  columnName: 'itemName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '闆朵欢鍚嶇О',
+  columnName: 'itemDes',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '涓嬬嚎鏁伴噺',
+  columnName: 'maxNum',
+  sortable: true,
+  wipe: true,
+  edit: false
+},
+{
+  columnDescription: '鍗曚綅閲嶉噺',
+  columnName: 'weight',
+  sortable: true,
+  wipe: true
+}
+  // {
+  //   columnDescription: '鍥剧墖',
+  //   columnName: 'image',
+  //   sortable: true,
+  //   wipe:true,
+  // },
+  // {
+  //   columnDescription: '鐢熶骇鏃ユ湡',
+  //   columnName: 'deviceName6',
+  //   sortable: true,
+  //   wipe:true,
+  // },
+];
+const edterchoose = [
+  // {
+  //   columnDescription: '鐢熶骇璁″垝鍗曞彿',
+  //   columnName: 'inOrderCode',
+  //   sortable: true,
+  //   wipe:true,
+  // },
+  {
+    columnDescription: '闆朵欢缂栧彿',
+    columnName: 'itemName',
+    sortable: true,
+    wipe: true,
+    width: 120
+  },
+  {
+    columnDescription: '闆朵欢鎻忚堪',
+    columnName: 'itemDes',
+    sortable: true,
+    wipe: true,
+    width: 180
+  },
+  {
+    columnDescription: '鍗曚綅',
+    columnName: 'unit',
+    sortable: true,
+    wipe: true,
+    width: 80
+  },
+  {
+    columnDescription: '鍗曚环',
+    columnName: 'price',
+    sortable: true,
+    wipe: true,
+    width: 80
+  },
+  {
+    columnDescription: '閲嶉噺',
+    columnName: 'weight',
+    sortable: true,
+    wipe: true,
+    width: 80
+  },
+  {
+    columnDescription: '鍗曚釜鍏樊',
+    columnName: 'weightDifference',
+    sortable: true,
+    wipe: true,
+    width: 100
+  },
+  {
+    columnDescription: '鐓х墖',
+    columnName: 'image',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '鐢熶骇鐝嚎',
+    columnName: 'createLine',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '瑁呯鏁伴噺',
+    columnName: 'maxNum',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '搴撳鏈�澶ч噺',
+    columnName: 'maxStorage',
+    sortable: true,
+    wipe: true,
+    width: 120
+  },
+  {
+    columnDescription: '搴撳鏈�灏忛噺',
+    columnName: 'minStorage',
+    sortable: true,
+    wipe: true,
+    width: 120
+  },
+  {
+    columnDescription: '瓒呮湡鏃堕棿',
+    columnName: 'overDueTime',
+    sortable: true,
+    wipe: true,
+    width: 100
+  },
+  {
+    columnDescription: '鏄惁閿佸畾',
+    columnName: 'isLock',
+    sortable: true,
+    wipe: true,
+    width: 100
+  },
+  {
+    columnDescription: '鎵�闇�鍣ㄥ叿瑙勬牸',
+    columnName: 'useContainerType',
+    sortable: true,
+    wipe: true,
+    width: 130
+  }
+];
+const plant = [{
+  columnDescription: '鍑哄簱璁″垝鍗曞彿',
+  columnName: 'outOrderCode',
+  sortable: true,
+  wipe: true,
+  width: 200
+},
+{
+  columnDescription: '闆朵欢缂栧彿',
+  columnName: 'itemName',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '闆朵欢鍚嶇О',
+  columnName: 'itemDes',
+  sortable: true,
+  wipe: true,
+  width: 200
+},
+{
+  columnDescription: '鍑哄簱绫诲瀷',
+  columnName: 'orderType',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '璁㈠崟鐘舵��',
+  columnName: 'orderStatus',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍚堣鏁伴噺',
+  columnName: 'totalOutNum',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍑哄簱鍙�',
+  columnName: 'tranLine',
+  sortable: true,
+  wipe: true,
+  width: 90
+},
+{
+  columnDescription: '鐩爣鐝嚎',
+  columnName: 'productionLineName',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '宸插嚭搴撴暟閲�',
+  columnName: 'checkOutNum',
+  sortable: true,
+  wipe: true,
+  width: 115
+},
+{
+  columnDescription: '鏄惁鏉ヨ嚜ERP',
+  columnName: 'isErp',
+  sortable: true,
+  wipe: true,
+  width: 130
+},
+{
+  columnDescription: '鍒涘缓鏃堕棿',
+  columnName: 'doTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+{
+  columnDescription: '鍒涘缓浜�',
+  columnName: 'userName',
+  sortable: true,
+  wipe: true
+}
+];
+const plantEdit = [
+  // {
+  //   columnDescription: '鍑哄簱璁″垝鍗曞彿',
+  //   columnName: 'outOrderCode',
+  //   sortable: true,
+  //   wipe:true,
+  // },
+  {
+    columnDescription: '闆朵欢缂栧彿',
+    columnName: 'itemName',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '闆朵欢鍚嶇О',
+    columnName: 'itemDes',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '璁″垝鏁伴噺',
+    columnName: 'maxNum',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '璁″垝鏃ユ湡',
+    columnName: 'doTime',
+    sortable: true,
+    wipe: true
+  }
+];
+const cassline = [{
+  columnDescription: '鐝嚎缂栧彿',
+  columnName: 'productionCode',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鐝嚎鍚嶇О',
+  columnName: 'productionName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鑳藉惁浣滀负鐩殑鍦�	',
+  columnName: 'isDestination',
+  sortable: true,
+  wipe: true
+}
+];
+const inventory = [{
+  columnDescription: '搴撲綅鍙�',
+  columnName: 'place',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍣ㄥ叿缂栧彿',
+  columnName: 'containerName',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '鍣ㄥ叿瑙勬牸',
+  columnName: 'palletType',
+  sortable: true,
+  wipe: true,
+  width: 220
+},
+{
+  columnDescription: '闆朵欢鍙�',
+  columnName: 'itemName',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '闆朵欢鍚嶇О',
+  columnName: 'itemDes',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+{
+  columnDescription: '闆朵欢鏁�',
+  columnName: 'itemNum',
+  sortable: true,
+  wipe: true,
+  width: 90
+},
+{
+  columnDescription: '鍏ュ簱绫诲瀷',
+  columnName: 'taskType',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '浠锋牸',
+  columnName: 'price',
+  sortable: true,
+  wipe: true,
+  width: 80
+},
+{
+  columnDescription: '鍗曚綅',
+  columnName: 'unit',
+  sortable: true,
+  wipe: true,
+  width: 80
+},
+{
+  columnDescription: '鏇存柊鏃堕棿',
+  columnName: 'updateTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+{
+  columnDescription: '鐘舵��',
+  columnName: 'status',
+  sortable: true,
+  wipe: true,
+  width: 80
+},
+{
+  columnDescription: '瓒呮湡鏃ユ湡',
+  columnName: 'dueTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+{
+  columnDescription: '鏄惁杩斾慨',
+  columnName: 'isBad',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '杩斾慨绫诲瀷',
+  columnName: 'badByFactory',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鏄惁绌虹洏',
+  columnName: 'isEmptyContainer',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '搴撻緞',
+  columnName: 'stAge',
+  sortable: true,
+  wipe: true,
+  width: 80
+},
+{
+  columnDescription: '搴撻緞鐘舵��',
+  columnName: 'stStatus',
+  sortable: true,
+  wipe: true,
+  width: 100
+}
+  // {
+  //   columnDescription: '鍚敤',
+  //   columnName: 'enable',
+  //   sortable: true,
+  //   wipe:true,
+  // },
+];
+const intype = [{
+  columnDescription: '鍏ュ簱绫诲瀷鍚�',
+  columnName: 'inType',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍏ュ簱鐩爣浠撳簱',
+  columnName: 'storeName',
+  sortable: true,
+  wipe: true
+}
+];
+const forklift = [{
+  columnDescription: '鍙夎溅鍚�',
+  columnName: 'carName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍙夎溅鍙�',
+  columnName: 'carCode',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '椹鹃┒鍛�/缁存姢鍛�',
+  columnName: 'userName',
+  sortable: true,
+  wipe: true
+},
+// {
+//   columnDescription: '鎵ц浠诲姟鍚�',
+//   columnName: 'carTaskName',
+//   sortable: true,
+//   wipe:true,
+// },
+// {
+//   columnDescription: '鐘舵��',
+//   columnName: 'status',
+//   sortable: true,
+//   wipe:true,
+// },
+{
+  columnDescription: '鏄惁宸ヤ綔',
+  columnName: 'isWork',
+  sortable: true,
+  wipe: true
+}
+];
+const forklifttasks = [{
+  columnDescription: '浠诲姟缂栧彿',
+  columnName: 'carTaskName',
+  sortable: true,
+  wipe: true,
+  width: 180
+},
+{
+  columnDescription: '鐩殑鍦�',
+  columnName: 'toDestination',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍙栬揣鍦�',
+  columnName: 'fromDestination',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍣ㄥ叿缂栧彿',
+  columnName: 'containerName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '璁㈠崟鐘舵��',
+  columnName: 'taskStatus',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '棰嗙敤浜�',
+  columnName: 'userName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍒涘缓鏃堕棿',
+  columnName: 'createTime',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏇存柊鏃堕棿',
+  columnName: 'updateTime',
+  sortable: true,
+  wipe: true
+}
+];
+const taskrecord = [{
+  columnDescription: '浠诲姟ID',
+  columnName: 'taskId',
+  sortable: true,
+  wipe: true,
+  width: 90
+},
+{
+  columnDescription: '闆朵欢缂栧彿',
+  columnName: 'itemName',
+  sortable: true,
+  wipe: true,
+  width: 115
+},
+{
+  columnDescription: '闆朵欢鍚嶇О',
+  columnName: 'itemDes',
+  sortable: true,
+  wipe: true,
+  width: 135
+},
+{
+  columnDescription: '璧峰浣�',
+  columnName: 'sourcePlace',
+  sortable: true,
+  wipe: true,
+  width: 90
+},
+{
+  columnDescription: '鐩爣浣�',
+  columnName: 'toPlace',
+  sortable: true,
+  wipe: true,
+  width: 90
+},
+{
+  columnDescription: '浠诲姟绫诲瀷',
+  columnName: 'taskType',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '浠诲姟鐘舵��',
+  columnName: 'taskStatus',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '浠诲姟鍒涘缓鏃堕棿',
+  columnName: 'taskCreateTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+{
+  columnDescription: '鍣ㄥ叿缂栧彿',
+  columnName: 'containerName',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '鏄惁涓昏闆朵欢',
+  columnName: 'isMainOut',
+  sortable: true,
+  wipe: true,
+  width: 130
+},
+{
+  columnDescription: '闆朵欢鏁伴噺',
+  columnName: 'itemCount',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+// {
+//   columnDescription: '鍚敤',
+//   columnName: 'enable',
+//   sortable: true,
+//   wipe:true,
+// },
+{
+  columnDescription: '璁″垝鍗曞彿',
+  columnName: 'outOrderCode',
+  sortable: true,
+  wipe: true,
+  width: 140
+},
+{
+  columnDescription: '鍒涘缓浜�',
+  columnName: 'createUser',
+  sortable: true,
+  wipe: true,
+  width: 90
+},
+{
+  columnDescription: '寮�濮嬫椂闂�',
+  columnName: 'doTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+{
+  columnDescription: '缁撴潫鏃堕棿',
+  columnName: 'finishTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+}
+];
+const warning = [{
+  columnDescription: '鏁呴殰鍚嶇О',
+  columnName: 'alertName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏁呴殰鎻忚堪',
+  columnName: 'alertDes',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏁呴殰璁惧',
+  columnName: 'deviceName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏁呴殰缂栧彿',
+  columnName: 'alertCode',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍒涘缓鏃堕棿',
+  columnName: 'createTime',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '缁撴潫鏃堕棿',
+  columnName: 'finishTime',
+  sortable: true,
+  wipe: true
+}
+];
+const maintask = [{
+  columnDescription: '浠诲姟鍙�',
+  columnName: 'id',
+  sortable: true,
+  wipe: true,
+  width: 90
+},
+{
+  columnDescription: '鍣ㄥ叿缂栧彿',
+  columnName: 'containerName',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '鍣ㄥ叿瑙勬牸',
+  columnName: 'palletType',
+  sortable: true,
+  wipe: true,
+  width: 180
+},
+
+{
+  columnDescription: '璧峰浣�',
+  columnName: 'sourcePlace',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鐩爣浣�',
+  columnName: 'toPlace',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '浠诲姟绫诲瀷',
+  columnName: 'taskType',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '浠诲姟鐘舵��',
+  columnName: 'taskStatus',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍑哄簱鍗曞彿',
+  columnName: 'outOrderCode',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+{
+  columnDescription: '鍒涘缓浜哄悕绉�',
+  columnName: 'userName',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '浠诲姟浼樺厛绾�',
+  columnName: 'taskLevel',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '鏄惁鏁呴殰',
+  columnName: 'isError',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鏄惁涓浆',
+  columnName: 'isExchange',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鎵�鍦ㄤ綅缃�',
+  columnName: 'localDevice',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '绉伴噸鏁版嵁',
+  columnName: 'lastWeight',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  // columnDescription: '鏁呴殰璁惧id',
+  // columnName: 'errorDeviceId',
+  // sortable: true,
+  // wipe:true,
+},
+
+{
+  columnDescription: '鏃犳硶涓嬪彂鍘熷洜',
+  columnName: 'canNotDo',
+  sortable: true,
+  wipe: true,
+  width: 200
+},
+
+{
+  columnDescription: '鍒涘缓鏃堕棿',
+  columnName: 'createTime',
+  sortable: true,
+  wipe: true,
+  width: 160
+},
+{
+  columnDescription: '寮�濮嬫椂闂�',
+  columnName: 'doTime',
+  sortable: true,
+  wipe: true,
+  width: 160
+},
+{
+  columnDescription: '缁撴潫鏃堕棿',
+  columnName: 'finishTime',
+  sortable: true,
+  wipe: true,
+  width: 160
+},
+{
+  columnDescription: '鍓╀綑鏃堕棿',
+  columnName: 'needTime',
+  sortable: true,
+  wipe: true,
+  width: 100
+}
+];
+const viewdata = [{
+  columnDescription: '搴撲綅鍙�',
+  columnName: 'place',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '闆朵欢缂栧彿',
+  columnName: 'itemName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '闆朵欢鍚嶇О',
+  columnName: 'itemDes',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍣ㄥ叿缂栧彿',
+  columnName: 'containerName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '闆朵欢鏁�',
+  columnName: 'itemNum',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏄惁杩斾慨',
+  columnName: 'isBad',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '杩斾慨绫诲瀷',
+  columnName: 'badByFactory',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '浠锋牸',
+  columnName: 'price',
+  sortable: true,
+  wipe: true
+},
+
+{
+  columnDescription: '鍗曚綅',
+  columnName: 'unit',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏇存柊鏃堕棿',
+  columnName: 'updateTime',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鐘舵��',
+  columnName: 'status',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏄惁鏈夊櫒鍏�',
+  columnName: 'isFull',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '缂栧彿',
+  columnName: 'pvcCode',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '闆朵欢鍚嶇О',
+  columnName: 'itemDes',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '浜х嚎',
+  columnName: 'createLine',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍏ュ簱绫诲瀷',
+  columnName: 'inType',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍣ㄥ叿瑙勬牸',
+  columnName: 'palletType',
+  sortable: true,
+  wipe: true
+}
+];
+const materials = [{
+  columnDescription: '闆朵欢缂栧彿',
+  columnName: 'itemName',
+  sortable: true,
+  wipe: true,
+  width: 140
+},
+{
+  columnDescription: '闆朵欢鍚嶇О',
+  columnName: 'itemDes',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+{
+  columnDescription: '搴撳瓨鏁伴噺',
+  columnName: 'itemNum',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鏈�灏忓簱瀹�',
+  columnName: 'minStorage',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鏈�澶у簱瀹�',
+  columnName: 'maxStorage',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍗犵敤搴撲綅鏁�',
+  columnName: 'placeCount',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '浜х嚎',
+  columnName: 'createLine',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍗曚环',
+  columnName: 'price',
+  sortable: true,
+  wipe: true,
+  width: 80
+},
+{
+  columnDescription: '鍗曚綅',
+  columnName: 'unit',
+  sortable: true,
+  wipe: true,
+  width: 80
+},
+{
+  columnDescription: '閲嶉噺',
+  columnName: 'weight',
+  sortable: true,
+  wipe: true,
+  width: 80
+},
+{
+  columnDescription: '瑁呯鏁伴噺',
+  columnName: 'maxNum',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鎵�鐢ㄥ櫒鍏疯鏍�',
+  columnName: 'useContainerType',
+  sortable: true,
+  wipe: true,
+  width: 130
+},
+{
+  columnDescription: '鍏樊',
+  columnName: 'weightDifference',
+  sortable: true,
+  wipe: true,
+  width: 80
+},
+{
+  columnDescription: '搴撳悕',
+  columnName: 'storageName',
+  sortable: true,
+  wipe: true,
+  width: 80
+},
+{
+  columnDescription: '鎬讳环',
+  columnName: 'totalCost',
+  sortable: true,
+  wipe: true,
+  width: 80
+},
+{
+  columnDescription: '鏄惁瓒呭簱瀛�',
+  columnName: 'isOverDay',
+  sortable: true,
+  wipe: true,
+  width: 120
+}
+];
+const rgvtask = [{
+  columnDescription: '涓讳换鍔�',
+  columnName: 'mainTask',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鐩爣浣嶇疆',
+  columnName: 'toPlace',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '璧峰浣嶇疆',
+  columnName: 'sourcePlace',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '浠诲姟绫诲瀷',
+  columnName: 'taskType',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: 'RGV缂栧彿',
+  columnName: 'useRgvId',
+  sortable: true,
+  wipe: true
+},
+
+{
+  columnDescription: '鏄惁瀹屾垚',
+  columnName: 'hasFinished',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '璁惧鍚嶇О',
+  columnName: 'devName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍒嗕换鍔″彿',
+  columnName: 'preTask',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏄惁宸插紑濮嬫墽琛�',
+  columnName: 'isReleased',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '璧峰鏃堕棿',
+  columnName: 'doTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+{
+  columnDescription: '瀹屾垚鏃堕棿',
+  columnName: 'finishTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+}
+];
+const piler = [{
+  columnDescription: '涓讳换鍔�',
+  columnName: 'mainTask',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鐩爣浣嶇疆',
+  columnName: 'toPlace',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '璧峰浣嶇疆',
+  columnName: 'sourcePlace',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏄惁瀹屾垚',
+  columnName: 'hasFinished',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '璁惧鍚嶇О',
+  columnName: 'devName',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鏄惁寮�濮嬫墽琛�',
+  columnName: 'isReleased',
+  sortable: true,
+  wipe: true,
+  width: 130
+},
+{
+  columnDescription: '浠诲姟绫诲瀷',
+  columnName: 'taskType',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍣ㄥ叿瑙勬牸绫诲瀷',
+  columnName: 'palletType',
+  sortable: true,
+  wipe: true,
+  width: 130
+},
+{
+  columnDescription: '鍫嗗灈鏈哄彿',
+  columnName: 'useSrmId',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '璧峰鏃堕棿',
+  columnName: 'doTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+{
+  columnDescription: '鎴鏃堕棿',
+  columnName: 'finishTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+}
+];
+const avroRecord = [{
+  columnDescription: '璧峰搴撲綅',
+  columnName: 'sourcePlace',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鐩爣搴撲綅',
+  columnName: 'toPlace',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '宸烽亾鍙�',
+  columnName: 'useSrmId',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '涓讳换鍔″彿',
+  columnName: 'fastherTaskId',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍣ㄥ叿鍙�',
+  columnName: 'containerName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '闆朵欢鍙�',
+  columnName: 'itemName',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '闆朵欢鍚嶇О',
+  columnName: 'itemDes',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '闆朵欢鏁伴噺',
+  columnName: 'itemCount',
+  sortable: true,
+  wipe: true
+},
+
+{
+  columnDescription: '宸插畬鎴�',
+  columnName: 'hasFinished',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍒涘缓鏃堕棿',
+  columnName: 'createTime',
+  sortable: true,
+  wipe: true
+}
+];
+const statistics = [{
+  columnDescription: '鍚堣',
+  columnName: 'allNum',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鏃堕棿',
+  columnName: 'time',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '鍑哄簱浠诲姟缁熻',
+  sortable: true,
+  wipe: true,
+  children: [{
+    columnDescription: '鍑哄簱鎬绘暟',
+    columnName: 'outNum',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '1鍙峰彛',
+    columnName: 'out_one_mark',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '2鍙峰彛',
+    columnName: 'out_two_mark',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '3鍙峰彛',
+    columnName: 'out_three_mark',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '4鍙峰彛',
+    columnName: 'out_four_mark',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '5鍙峰彛',
+    columnName: 'out_five_mark',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '6鍙峰彛',
+    columnName: 'out_six_mark',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '7鍙峰彛',
+    columnName: 'out_seven_mark',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '8鍙峰彛',
+    columnName: 'out_eight_mark',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '鍑哄簱缁忚繃涓浆鍙�',
+    columnName: 'outExchange',
+    sortable: true,
+    wipe: true,
+    width: 150
+  }
+  ]
+},
+
+{
+  columnDescription: '鍏ュ簱浠诲姟缁熻',
+  sortable: true,
+  wipe: true,
+  children: [{
+    columnDescription: '鍏ュ簱鎬绘暟',
+    columnName: 'inNum',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '1鍙峰彛',
+    columnName: 'in_one_mark',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '2鍙峰彛',
+    columnName: 'in_two_mark',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '3鍙峰彛',
+    columnName: 'in_three_mark',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '4鍙峰彛',
+    columnName: 'in_four_mark',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '5鍙峰彛',
+    columnName: 'in_five_mark',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '7鍙峰彛',
+    columnName: 'in_seven_mark',
+    sortable: true,
+    wipe: true
+  },
+  {
+    columnDescription: '鍏ュ簱缁忚繃涓浆鍙�',
+    columnName: 'inExchange',
+    sortable: true,
+    wipe: true,
+    width: 150
+  }
+  ]
+}
+];
+const Didproject = [{
+  columnDescription: '鏃堕棿',
+  columnName: 'time'
+},
+
+{
+  columnDescription: '鍏ュ簱闆朵欢鏁�',
+  columnName: 'in_part'
+},
+{
+  columnDescription: '鍑哄簱闆朵欢鏁�',
+  columnName: 'out_part'
+},
+{
+  columnDescription: '鍏ュ簱鍣ㄥ叿鏁�',
+  columnName: 'in_appliance'
+},
+{
+  columnDescription: '鍑哄簱鍣ㄥ叿鏁�',
+  columnName: 'out_appliance'
+},
+{
+  columnDescription: '瓒呮湡闆朵欢鏁伴噺',
+  columnName: 'exceed_part'
+},
+{
+  columnDescription: '搴撲綅鎬绘暟',
+  columnName: 'stortage_num'
+},
+{
+  columnDescription: '鏈夎揣搴撲綅',
+  columnName: 'available_stortage'
+},
+{
+  columnDescription: '甯︿欢鍣ㄥ叿',
+  columnName: 'take_appliance'
+},
+{
+  columnDescription: '绌哄櫒鍏锋暟',
+  columnName: 'empty_appliance'
+},
+{
+  columnDescription: '鍒朵欢鎬绘暟',
+  columnName: 'workpiece_num'
+}
+];
+module.exports = {
+  quotaion_relevanceEdit,
+  manage,
+  dept,
+  role,
+  storage,
+  position,
+  palte,
+  stacker,
+  quotation,
+  quotationedit,
+  enter,
+  enterEdit,
+  edterchoose,
+  plant,
+  plantEdit,
+  cassline,
+  inventory,
+  intype,
+  forklift,
+  forklifttasks,
+  taskrecord,
+  warning,
+  maintask,
+  viewdata,
+  materials,
+  rgvtask,
+  piler,
+  avroRecord,
+  statistics,
+  Didproject
+};
\ No newline at end of file
diff --git a/qqjf-Web/src/components/title/index.vue b/qqjf-Web/src/components/title/index.vue
new file mode 100644
index 0000000..8cf2a94
--- /dev/null
+++ b/qqjf-Web/src/components/title/index.vue
@@ -0,0 +1,26 @@
+<template>
+  <div id="gloal-title">{{ title }}</div>
+</template>
+
+<script>
+export default {
+  props: {
+    title: {
+      type: String,
+      default: "",
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+#gloal-title {
+  // position: absolute;
+  // left: 10px;
+  // top: 0;
+  margin-left: 10px;
+  padding-left: 10px;
+  font-size: 20px;
+  border-left: 4px solid #409eff;
+}
+</style>
diff --git a/qqjf-Web/src/icons/index.js b/qqjf-Web/src/icons/index.js
new file mode 100644
index 0000000..2bdb20d
--- /dev/null
+++ b/qqjf-Web/src/icons/index.js
@@ -0,0 +1,9 @@
+import Vue from 'vue'
+import SvgIcon from '@/components/SvgIcon'// svg component
+
+// register globally
+Vue.component('svg-icon', SvgIcon)
+
+const req = require.context('./svg', false, /\.svg$/)
+const requireAll = requireContext => requireContext.keys().map(requireContext)
+requireAll(req)
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/404.svg b/qqjf-Web/src/icons/svg/404.svg
new file mode 100644
index 0000000..6df5019
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/404.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M121.718 73.272v9.953c3.957-7.584 6.199-16.05 6.199-24.995C127.917 26.079 99.273 0 63.958 0 28.644 0 0 26.079 0 58.23c0 .403.028.806.028 1.21l22.97-25.953h13.34l-19.76 27.187h6.42V53.77l13.728-19.477v49.361H22.998V73.272H2.158c5.951 20.284 23.608 36.208 45.998 41.399-1.44 3.3-5.618 11.263-12.565 12.674-8.607 1.764 23.358.428 46.163-13.178 17.519-4.611 31.938-15.849 39.77-30.513h-13.506V73.272H85.02V59.464l22.998-25.977h13.008l-19.429 27.187h6.421v-7.433l13.727-19.402v39.433h-.027zm-78.24 2.822a10.516 10.516 0 0 1-.996-4.535V44.548c0-1.613.332-3.124.996-4.535a11.66 11.66 0 0 1 2.713-3.68c1.134-1.032 2.49-1.864 4.04-2.468 1.55-.605 3.21-.908 4.982-.908h11.292c1.77 0 3.431.303 4.981.908 1.522.604 2.85 1.41 3.986 2.418l-12.26 16.303v-2.898a1.96 1.96 0 0 0-.665-1.512c-.443-.403-.996-.604-1.66-.604-.665 0-1.218.201-1.661.604a1.96 1.96 0 0 0-.664 1.512v9.071L44.364 77.606a10.556 10.556 0 0 1-.886-1.512zm35.73-4.535c0 1.613-.332 3.124-.997 4.535a11.66 11.66 0 0 1-2.712 3.68c-1.134 1.032-2.49 1.864-4.04 2.469-1.55.604-3.21.907-4.982.907H55.185c-1.77 0-3.431-.303-4.981-.907-1.55-.605-2.906-1.437-4.041-2.47a12.49 12.49 0 0 1-1.384-1.512l13.727-18.217v6.375c0 .605.222 1.109.665 1.512.442.403.996.604 1.66.604.664 0 1.218-.201 1.66-.604a1.96 1.96 0 0 0 .665-1.512V53.87L75.97 36.838c.913.932 1.66 1.99 2.214 3.175.664 1.41.996 2.922.996 4.535v27.011h.028z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/align-right.svg b/qqjf-Web/src/icons/svg/align-right.svg
new file mode 100644
index 0000000..9e7d9a9
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/align-right.svg
@@ -0,0 +1 @@
+<svg t="1595485877113" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="28328" width="32" height="32"><path d="M278.935873 315.505767L66.741054 503.436974l212.194819 187.931206zM78.371952 122.398678h878.886994v111.315248H78.371952zM356.659049 345.028151h600.599897v111.314225H356.659049zM356.659049 567.657624h600.599897v111.315248H356.659049zM78.371952 790.287097h878.886994v111.314225H78.371952z" fill="#345" p-id="28329"></path></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/bug.svg b/qqjf-Web/src/icons/svg/bug.svg
new file mode 100644
index 0000000..05a150d
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/bug.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M127.88 73.143c0 1.412-.506 2.635-1.518 3.669-1.011 1.033-2.209 1.55-3.592 1.55h-17.887c0 9.296-1.783 17.178-5.35 23.645l16.609 17.044c1.011 1.034 1.517 2.257 1.517 3.67 0 1.412-.506 2.635-1.517 3.668-.958 1.033-2.155 1.55-3.593 1.55-1.438 0-2.635-.517-3.593-1.55l-15.811-16.063a15.49 15.49 0 0 1-1.196 1.06c-.532.434-1.65 1.208-3.353 2.322a50.104 50.104 0 0 1-5.192 2.974c-1.758.87-3.94 1.658-6.546 2.364-2.607.706-5.189 1.06-7.748 1.06V47.044H58.89v73.062c-2.716 0-5.417-.367-8.106-1.102-2.688-.734-5.003-1.631-6.945-2.692a66.769 66.769 0 0 1-5.268-3.179c-1.571-1.057-2.73-1.94-3.476-2.65L33.9 109.34l-14.611 16.877c-1.066 1.14-2.344 1.711-3.833 1.711-1.277 0-2.422-.434-3.434-1.304-1.012-.978-1.557-2.187-1.635-3.627-.079-1.44.333-2.705 1.236-3.794l16.129-18.51c-3.087-6.197-4.63-13.644-4.63-22.342H5.235c-1.383 0-2.58-.517-3.592-1.55S.125 74.545.125 73.132c0-1.412.506-2.635 1.518-3.668 1.012-1.034 2.21-1.55 3.592-1.55h17.887V43.939L9.308 29.833c-1.012-1.033-1.517-2.256-1.517-3.669 0-1.412.505-2.635 1.517-3.668 1.012-1.034 2.21-1.55 3.593-1.55s2.58.516 3.593 1.55l13.813 14.106h67.396l13.814-14.106c1.012-1.034 2.21-1.55 3.592-1.55 1.384 0 2.581.516 3.593 1.55 1.012 1.033 1.518 2.256 1.518 3.668 0 1.413-.506 2.636-1.518 3.67l-13.814 14.105v23.975h17.887c1.383 0 2.58.516 3.593 1.55 1.011 1.033 1.517 2.256 1.517 3.668l-.005.01zM89.552 26.175H38.448c0-7.23 2.489-13.386 7.466-18.469C50.892 2.623 56.92.082 64 .082c7.08 0 13.108 2.541 18.086 7.624 4.977 5.083 7.466 11.24 7.466 18.469z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/chart.svg b/qqjf-Web/src/icons/svg/chart.svg
new file mode 100644
index 0000000..27728fb
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/chart.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h36.571V128H0V54.857zM91.429 27.43H128V128H91.429V27.429zM45.714 0h36.572v128H45.714V0z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/clipboard.svg b/qqjf-Web/src/icons/svg/clipboard.svg
new file mode 100644
index 0000000..90923ff
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/clipboard.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.857 118.857h64V73.143H89.143c-1.902 0-3.52-.668-4.855-2.002-1.335-1.335-2.002-2.954-2.002-4.855V36.57H54.857v82.286zM73.143 16v-4.571a2.2 2.2 0 0 0-.677-1.61 2.198 2.198 0 0 0-1.609-.676H20.571c-.621 0-1.158.225-1.609.676a2.198 2.198 0 0 0-.676 1.61V16a2.2 2.2 0 0 0 .676 1.61c.451.45.988.676 1.61.676h50.285c.622 0 1.158-.226 1.61-.677.45-.45.676-.987.676-1.609zm18.286 48h21.357L91.43 42.642V64zM128 73.143v48c0 1.902-.667 3.52-2.002 4.855-1.335 1.335-2.953 2.002-4.855 2.002H52.57c-1.901 0-3.52-.667-4.854-2.002-1.335-1.335-2.003-2.953-2.003-4.855v-11.429H6.857c-1.902 0-3.52-.667-4.855-2.002C.667 106.377 0 104.759 0 102.857v-96c0-1.902.667-3.52 2.002-4.855C3.337.667 4.955 0 6.857 0h77.714c1.902 0 3.52.667 4.855 2.002 1.335 1.335 2.003 2.953 2.003 4.855V30.29c1 .622 1.856 1.29 2.569 2.003l29.147 29.147c1.335 1.335 2.478 3.145 3.429 5.43.95 2.287 1.426 4.383 1.426 6.291v-.018z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/component.svg b/qqjf-Web/src/icons/svg/component.svg
new file mode 100644
index 0000000..207ada3
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/component.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h54.857v54.857H0V0zm0 73.143h54.857V128H0V73.143zm73.143 0H128V128H73.143V73.143zm27.428-18.286C115.72 54.857 128 42.577 128 27.43 128 12.28 115.72 0 100.571 0 85.423 0 73.143 12.28 73.143 27.429c0 15.148 12.28 27.428 27.428 27.428z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/dashboard.svg b/qqjf-Web/src/icons/svg/dashboard.svg
new file mode 100644
index 0000000..5317d37
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/dashboard.svg
@@ -0,0 +1 @@
+<svg width="128" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M27.429 63.638c0-2.508-.893-4.65-2.679-6.424-1.786-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.465 2.662-1.785 1.774-2.678 3.916-2.678 6.424 0 2.508.893 4.65 2.678 6.424 1.786 1.775 3.94 2.662 6.465 2.662 2.524 0 4.678-.887 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm13.714-31.801c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM71.714 65.98l7.215-27.116c.285-1.23.107-2.378-.536-3.443-.643-1.064-1.56-1.762-2.75-2.094-1.19-.33-2.333-.177-3.429.462-1.095.639-1.81 1.573-2.143 2.804l-7.214 27.116c-2.857.237-5.405 1.266-7.643 3.088-2.238 1.822-3.738 4.152-4.5 6.992-.952 3.644-.476 7.098 1.429 10.364 1.905 3.265 4.69 5.37 8.357 6.317 3.667.947 7.143.474 10.429-1.42 3.285-1.892 5.404-4.66 6.357-8.305.762-2.84.619-5.607-.429-8.305-1.047-2.697-2.762-4.85-5.143-6.46zm47.143-2.342c0-2.508-.893-4.65-2.678-6.424-1.786-1.775-3.94-2.662-6.465-2.662-2.524 0-4.678.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.786 1.775 3.94 2.662 6.464 2.662 2.524 0 4.679-.887 6.465-2.662 1.785-1.775 2.678-3.916 2.678-6.424zm-45.714-45.43c0-2.509-.893-4.65-2.679-6.425C68.68 10.01 66.524 9.122 64 9.122c-2.524 0-4.679.887-6.464 2.661-1.786 1.775-2.679 3.916-2.679 6.425 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm32 13.629c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM128 63.638c0 12.351-3.357 23.78-10.071 34.286-.905 1.372-2.19 2.058-3.858 2.058H13.93c-1.667 0-2.953-.686-3.858-2.058C3.357 87.465 0 76.037 0 63.638c0-8.613 1.69-16.847 5.071-24.703C8.452 31.08 13 24.312 18.714 18.634c5.715-5.68 12.524-10.199 20.429-13.559C47.048 1.715 55.333.035 64 .035c8.667 0 16.952 1.68 24.857 5.04 7.905 3.36 14.714 7.88 20.429 13.559 5.714 5.678 10.262 12.446 13.643 20.301 3.38 7.856 5.071 16.09 5.071 24.703z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/documentation.svg b/qqjf-Web/src/icons/svg/documentation.svg
new file mode 100644
index 0000000..7043122
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/documentation.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M71.984 44.815H115.9L71.984 9.642v35.173zM16.094.05h63.875l47.906 38.37v76.74c0 3.392-1.682 6.645-4.677 9.044-2.995 2.399-7.056 3.746-11.292 3.746H16.094c-4.236 0-8.297-1.347-11.292-3.746-2.995-2.399-4.677-5.652-4.677-9.044V12.84C.125 5.742 7.23.05 16.094.05zm71.86 102.32V89.58h-71.86v12.79h71.86zm23.952-25.58V64H16.094v12.79h95.812z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/drag.svg b/qqjf-Web/src/icons/svg/drag.svg
new file mode 100644
index 0000000..4185d3c
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/drag.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M73.137 29.08h-9.209 29.7L63.886.093 34.373 29.08h20.49v27.035H27.238v17.948h27.625v27.133h18.274V74.063h27.41V56.115h-27.41V29.08zm-9.245 98.827l27.518-26.711H36.59l27.302 26.71zM.042 64.982l27.196 27.029V38.167L.042 64.982zm100.505-26.815V92.01l27.41-27.029-27.41-26.815z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/edit.svg b/qqjf-Web/src/icons/svg/edit.svg
new file mode 100644
index 0000000..d26101f
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/edit.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M106.133 67.2a4.797 4.797 0 0 0-4.8 4.8c0 .187.014.36.027.533h-.027V118.4H9.6V26.667h50.133c2.654 0 4.8-2.147 4.8-4.8 0-2.654-2.146-4.8-4.8-4.8H9.6a9.594 9.594 0 0 0-9.6 9.6V118.4c0 5.307 4.293 9.6 9.6 9.6h91.733c5.307 0 9.6-4.293 9.6-9.6V72.533h-.026c.013-.173.026-.346.026-.533 0-2.653-2.146-4.8-4.8-4.8z"/><path d="M125.16 13.373L114.587 2.8c-3.747-3.747-9.854-3.72-13.6.027l-52.96 52.96a4.264 4.264 0 0 0-.907 1.36L33.813 88.533c-.746 1.76-.226 3.534.907 4.68 1.133 1.147 2.92 1.667 4.693.92l31.4-13.293c.507-.213.96-.52 1.36-.907l52.96-52.96c3.747-3.746 3.774-9.853.027-13.6zM66.107 72.4l-18.32 7.76 7.76-18.32L92.72 24.667l10.56 10.56L66.107 72.4zm52.226-52.227l-8.266 8.267-10.56-10.56 8.266-8.267.027-.026 10.56 10.56-.027.026z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/education.svg b/qqjf-Web/src/icons/svg/education.svg
new file mode 100644
index 0000000..7bfb01d
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/education.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M88.883 119.565c-7.284 0-19.434 2.495-21.333 8.25v.127c-4.232.13-5.222 0-7.108 0-1.895-5.76-14.045-8.256-21.333-8.256H0V0h42.523c9.179 0 17.109 5.47 21.47 13.551C68.352 5.475 76.295 0 85.478 0H128v119.57l-39.113-.005h-.004zM60.442 24.763c0-9.651-8.978-16.507-17.777-16.507H7.108V111.43H39.11c7.054-.14 18.177.082 21.333 6.12v-4.628c-.134-5.722-.004-13.522 0-13.832V27.413l.004-2.655-.004.005zm60.442-16.517h-35.55c-8.802 0-17.78 6.856-17.78 16.493v74.259c.004.32.138 8.115 0 13.813v4.627c3.155-6.022 14.279-6.26 21.333-6.114h32V8.25l-.003-.005z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/email.svg b/qqjf-Web/src/icons/svg/email.svg
new file mode 100644
index 0000000..74d25e2
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/email.svg
@@ -0,0 +1 @@
+<svg width="128" height="96" xmlns="http://www.w3.org/2000/svg"><path d="M64.125 56.975L120.188.912A12.476 12.476 0 0 0 115.5 0h-103c-1.588 0-3.113.3-4.513.838l56.138 56.137z"/><path d="M64.125 68.287l-62.3-62.3A12.42 12.42 0 0 0 0 12.5v71C0 90.4 5.6 96 12.5 96h103c6.9 0 12.5-5.6 12.5-12.5v-71a12.47 12.47 0 0 0-1.737-6.35L64.125 68.287z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/example.svg b/qqjf-Web/src/icons/svg/example.svg
new file mode 100644
index 0000000..46f42b5
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/example.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M96.258 57.462h31.421C124.794 27.323 100.426 2.956 70.287.07v31.422a32.856 32.856 0 0 1 25.971 25.97zm-38.796-25.97V.07C27.323 2.956 2.956 27.323.07 57.462h31.422a32.856 32.856 0 0 1 25.97-25.97zm12.825 64.766v31.421c30.46-2.885 54.507-27.253 57.713-57.712H96.579c-2.886 13.466-13.146 23.726-26.292 26.291zM31.492 70.287H.07c2.886 30.46 27.253 54.507 57.713 57.713V96.579c-13.466-2.886-23.726-13.146-26.291-26.292z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/excel.svg b/qqjf-Web/src/icons/svg/excel.svg
new file mode 100644
index 0000000..74d97b8
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/excel.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.208 16.576v8.384h38.72v5.376h-38.72v8.704h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.512h38.72v5.376h-38.72v11.136H128v-94.72H78.208zM0 114.368L72.128 128V0L0 13.632v100.736z"/><path d="M28.672 82.56h-11.2l14.784-23.488-14.08-22.592h11.52l8.192 14.976 8.448-14.976h11.136l-14.08 22.208L58.368 82.56H46.656l-8.768-15.68z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/exit-fullscreen.svg b/qqjf-Web/src/icons/svg/exit-fullscreen.svg
new file mode 100644
index 0000000..485c128
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/exit-fullscreen.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M49.217 41.329l-.136-35.24c-.06-2.715-2.302-4.345-5.022-4.405h-3.65c-2.712-.06-4.866 2.303-4.806 5.016l.152 19.164-24.151-23.79a6.698 6.698 0 0 0-9.499 0 6.76 6.76 0 0 0 0 9.526l23.93 23.713-18.345.074c-2.712-.069-5.228 1.813-5.64 5.02v3.462c.069 2.721 2.31 4.97 5.022 5.03l35.028-.207c.052.005.087.025.133.025l2.457.054a4.626 4.626 0 0 0 3.436-1.38c.88-.874 1.205-2.096 1.169-3.462l-.262-2.465c0-.048.182-.081.182-.136h.002zm52.523 51.212l18.32-.073c2.713.06 5.224-1.609 5.64-4.815v-3.462c-.068-2.722-2.317-4.97-5.021-5.04l-34.58.21c-.053 0-.086-.021-.138-.021l-2.451-.06a4.64 4.64 0 0 0-3.445 1.381c-.885.868-1.201 2.094-1.174 3.46l.27 2.46c.005.06-.177.095-.177.141l.141 34.697c.069 2.713 2.31 4.338 5.022 4.397l3.45.006c2.705.062 4.867-2.31 4.8-5.026l-.153-18.752 24.151 23.946a6.69 6.69 0 0 0 9.494 0 6.747 6.747 0 0 0 0-9.523L101.74 92.54v.001zM48.125 80.662a4.636 4.636 0 0 0-3.437-1.382l-2.457.06c-.05 0-.082.022-.137.022l-35.025-.21c-2.712.07-4.957 2.318-5.022 5.04v3.462c.409 3.206 2.925 4.874 5.633 4.814l18.554.06-24.132 23.928c-2.62 2.626-2.62 6.89 0 9.524a6.694 6.694 0 0 0 9.496 0l24.155-23.79-.155 18.866c-.06 2.722 2.094 5.093 4.801 5.025h3.65c2.72-.069 4.962-1.685 5.022-4.406l.141-34.956c0-.05-.182-.082-.182-.136l.262-2.46c.03-1.366-.286-2.592-1.166-3.46h-.001zM80.08 47.397a4.62 4.62 0 0 0 3.443 1.374l2.45-.054c.055 0 .088-.02.143-.028l35.08.21c2.712-.062 4.953-2.312 5.021-5.033l.009-3.463c-.417-3.211-2.937-5.084-5.64-5.025l-18.615-.073 23.917-23.715c2.63-2.623 2.63-6.879.008-9.513a6.691 6.691 0 0 0-9.494 0L92.251 26.016l.155-19.312c.065-2.713-2.097-5.085-4.802-5.025h-3.45c-2.713.069-4.954 1.693-5.022 4.406l-.139 35.247c0 .054.18.088.18.136l-.267 2.465c-.028 1.366.288 2.588 1.174 3.463v.001z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/eye-open.svg b/qqjf-Web/src/icons/svg/eye-open.svg
new file mode 100644
index 0000000..88dcc98
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/eye-open.svg
@@ -0,0 +1 @@
+<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><style/></defs><path d="M512 128q69.675 0 135.51 21.163t115.498 54.997 93.483 74.837 73.685 82.006 51.67 74.837 32.17 54.827L1024 512q-2.347 4.992-6.315 13.483T998.87 560.17t-31.658 51.669-44.331 59.99-56.832 64.34-69.504 60.16-82.347 51.5-94.848 34.687T512 896q-69.675 0-135.51-21.163t-115.498-54.826-93.483-74.326-73.685-81.493-51.67-74.496-32.17-54.997L0 513.707q2.347-4.992 6.315-13.483t18.816-34.816 31.658-51.84 44.331-60.33 56.832-64.683 69.504-60.331 82.347-51.84 94.848-34.816T512 128.085zm0 85.333q-46.677 0-91.648 12.331t-81.152 31.83-70.656 47.146-59.648 54.485-48.853 57.686-37.675 52.821-26.325 43.99q12.33 21.674 26.325 43.52t37.675 52.351 48.853 57.003 59.648 53.845T339.2 767.02t81.152 31.488T512 810.667t91.648-12.331 81.152-31.659 70.656-46.848 59.648-54.186 48.853-57.344 37.675-52.651T927.957 512q-12.33-21.675-26.325-43.648t-37.675-52.65-48.853-57.345-59.648-54.186-70.656-46.848-81.152-31.659T512 213.334zm0 128q70.656 0 120.661 50.006T682.667 512 632.66 632.661 512 682.667 391.339 632.66 341.333 512t50.006-120.661T512 341.333zm0 85.334q-35.328 0-60.33 25.002T426.666 512t25.002 60.33T512 597.334t60.33-25.002T597.334 512t-25.002-60.33T512 426.666z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/eye.svg b/qqjf-Web/src/icons/svg/eye.svg
new file mode 100644
index 0000000..16ed2d8
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/eye.svg
@@ -0,0 +1 @@
+<svg width="128" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M127.072 7.994c1.37-2.208.914-5.152-.914-6.87-2.056-1.717-4.797-1.226-6.396.982-.229.245-25.586 32.382-55.74 32.382-29.24 0-55.74-32.382-55.968-32.627-1.6-1.963-4.57-2.208-6.397-.49C-.17 3.086-.399 6.275 1.2 8.238c.457.736 5.94 7.36 14.62 14.72L4.17 35.96c-1.828 1.963-1.6 5.152.228 6.87.457.98 1.6 1.471 2.742 1.471s2.284-.49 3.198-1.472l12.564-13.983c5.94 4.416 13.021 8.587 20.788 11.53l-4.797 17.418c-.685 2.699.686 5.397 3.198 6.133h1.37c2.057 0 3.884-1.472 4.341-3.68L52.6 42.83c3.655.736 7.538 1.227 11.422 1.227 3.883 0 7.767-.49 11.422-1.227l4.797 17.173c.457 2.208 2.513 3.68 4.34 3.68.457 0 .914 0 1.143-.246 2.513-.736 3.883-3.434 3.198-6.133l-4.797-17.172c7.767-2.944 14.848-7.114 20.788-11.53l12.336 13.738c.913.981 2.056 1.472 3.198 1.472s2.284-.49 3.198-1.472c1.828-1.963 1.828-4.906.228-6.87l-11.65-13.001c9.366-7.36 14.849-14.474 14.849-14.474z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/form.svg b/qqjf-Web/src/icons/svg/form.svg
new file mode 100644
index 0000000..dcbaa18
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/form.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.068 23.784c-1.02 0-1.877-.32-2.572-.96a8.588 8.588 0 0 1-1.738-2.237 11.524 11.524 0 0 1-1.042-2.621c-.232-.895-.348-1.641-.348-2.238V0h.278c.834 0 1.622.085 2.363.256.742.17 1.645.575 2.711 1.214 1.066.64 2.363 1.535 3.892 2.686 1.53 1.15 3.453 2.664 5.77 4.54 2.502 2.045 4.494 3.771 5.977 5.178 1.483 1.406 2.618 2.6 3.406 3.58.787.98 1.274 1.812 1.46 2.494.185.682.277 1.278.277 1.79v2.046H84.068zM127.3 84.01c.278.682.464 1.535.556 2.558.093 1.023-.37 2.003-1.39 2.94-.463.427-.88.832-1.25 1.215-.372.384-.696.704-.974.96a6.69 6.69 0 0 1-.973.767l-11.816-10.741a44.331 44.331 0 0 0 1.877-1.535 31.028 31.028 0 0 1 1.737-1.406c1.112-.938 2.317-1.343 3.615-1.215 1.297.128 2.363.405 3.197.83.927.427 1.923 1.173 2.989 2.239 1.065 1.065 1.876 2.195 2.432 3.388zM78.23 95.902c2.038 0 3.752-.511 5.143-1.534l-26.969 25.83H18.037c-1.761 0-3.684-.47-5.77-1.407a24.549 24.549 0 0 1-5.838-3.709 21.373 21.373 0 0 1-4.518-5.306c-1.204-2.003-1.807-4.07-1.807-6.202V16.495c0-1.79.44-3.665 1.32-5.626A18.41 18.41 0 0 1 5.04 5.562a21.798 21.798 0 0 1 5.213-3.964C12.198.533 14.237 0 16.37 0h53.24v15.984c0 1.62.278 3.367.834 5.242a16.704 16.704 0 0 0 2.572 5.179c1.159 1.577 2.665 2.898 4.518 3.964 1.853 1.066 4.078 1.598 6.673 1.598h20.295v42.325L85.458 92.45c1.02-1.364 1.529-2.856 1.529-4.476 0-2.216-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1c-2.409 0-4.448.789-6.116 2.366-1.668 1.577-2.502 3.474-2.502 5.69 0 2.217.834 4.092 2.502 5.626 1.668 1.535 3.707 2.302 6.117 2.302h52.13zM26.1 47.951c-2.41 0-4.449.789-6.117 2.366-1.668 1.577-2.502 3.473-2.502 5.69 0 2.216.834 4.092 2.502 5.626 1.668 1.534 3.707 2.302 6.117 2.302h52.13c2.409 0 4.47-.768 6.185-2.302 1.715-1.534 2.572-3.41 2.572-5.626 0-2.217-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1zm52.407 64.063l1.807-1.663 3.476-3.196a479.75 479.75 0 0 0 4.587-4.284 500.757 500.757 0 0 1 5.004-4.667c3.985-3.666 8.48-7.758 13.485-12.276l11.677 10.741-13.485 12.404-5.004 4.603-4.587 4.22a179.46 179.46 0 0 0-3.267 3.068c-.88.853-1.367 1.322-1.46 1.407-.463.341-.973.703-1.529 1.087-.556.383-1.112.703-1.668.959-.556.256-1.413.575-2.572.959a83.5 83.5 0 0 1-3.545 1.087 72.2 72.2 0 0 1-3.475.895c-1.112.256-1.946.426-2.502.511-1.112.17-1.854.043-2.224-.383-.371-.426-.464-1.151-.278-2.174.092-.511.278-1.279.556-2.302.278-1.023.602-2.067.973-3.132l1.042-3.005c.325-.938.58-1.577.765-1.918a10.157 10.157 0 0 1 2.224-2.941z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/fullscreen.svg b/qqjf-Web/src/icons/svg/fullscreen.svg
new file mode 100644
index 0000000..0e86b6f
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/fullscreen.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M38.47 52L52 38.462l-23.648-23.67L43.209 0H.035L0 43.137l14.757-14.865L38.47 52zm74.773 47.726L89.526 76 76 89.536l23.648 23.672L84.795 128h43.174L128 84.863l-14.757 14.863zM89.538 52l23.668-23.648L128 43.207V.038L84.866 0 99.73 14.76 76 38.472 89.538 52zM38.46 76L14.792 99.651 0 84.794v43.173l43.137.033-14.865-14.757L52 89.53 38.46 76z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/guide.svg b/qqjf-Web/src/icons/svg/guide.svg
new file mode 100644
index 0000000..b271001
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/guide.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M1.482 70.131l36.204 16.18 69.932-65.485-61.38 70.594 46.435 18.735c1.119.425 2.397-.17 2.797-1.363v-.085L127.998.047 1.322 65.874c-1.12.597-1.519 1.959-1.04 3.151.32.511.72.937 1.2 1.107zm44.676 57.821L64.22 107.26l-18.062-7.834v28.527z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/him.svg b/qqjf-Web/src/icons/svg/him.svg
new file mode 100644
index 0000000..030b5fd
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/him.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1624246657816" class="icon" viewBox="0 0 1228 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2010" xmlns:xlink="http://www.w3.org/1999/xlink" width="38.375" height="32"><defs><style type="text/css"></style></defs><path d="M1016.88888897 63.99999999a28.444444 28.444444 0 0 0-28.444445 28.444444v187.164445H248.88888897V92.44444399a28.444444 28.444444 0 0 0-56.888889 0v796.444445a28.444444 28.444444 0 0 0 56.888889 0v-63.431111h739.555555V888.88888899a28.444444 28.444444 0 0 0 56.888889 0V92.44444399a28.444444 28.444444 0 0 0-28.444444-28.444444z m-28.444445 704.568889H248.88888897v-187.733333h739.555555z m0-244.622222H248.88888897V336.49777799h739.555555z"  p-id="2011"></path></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/homePage.svg b/qqjf-Web/src/icons/svg/homePage.svg
new file mode 100644
index 0000000..a886d69
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/homePage.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1621487598758" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2368" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M566.55497187 51.95428531a77.02857187 77.02857187 0 0 0-103.47428625 0L44.68068594 449.16571437a38.5828575 38.5828575 0 0 0 51.67999969 57.32571375l6.65142843-6.33142781V914.74285719A77.16571406 77.16571406 0 0 0 180.2235425 992h224.64V759.65714281a54.33142875 54.33142875 0 0 1 54.37714313-54.40000031h105.69142875a54.35428594 54.35428594 0 0 1 54.40000031 54.40000031V992h229.94285719a77.23428563 77.23428563 0 0 0 77.23428562-77.25714281V505.21142844c17.14285687 15.52000031 41.4628575 14.33142844 55.74857063-1.55428594a38.5828575 38.5828575 0 0 0-2.78857125-54.51428531L566.55497187 51.9771425z" fill="#ffffff" p-id="2369"></path></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/icon.svg b/qqjf-Web/src/icons/svg/icon.svg
new file mode 100644
index 0000000..82be8ee
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/icon.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.147.062a13 13 0 0 1 4.94.945c1.55.63 2.907 1.526 4.069 2.688a13.148 13.148 0 0 1 2.761 4.069c.678 1.55 1.017 3.245 1.017 5.086v102.3c0 3.681-1.187 6.733-3.56 9.155-2.373 2.422-5.352 3.633-8.937 3.633H12.992c-3.875 0-7-1.26-9.373-3.779-2.373-2.518-3.56-5.667-3.56-9.445V12.704c0-3.39 1.163-6.345 3.488-8.863C5.872 1.32 8.972.062 12.847.062h102.3zM81.434 109.047c1.744 0 3.003-.412 3.778-1.235.775-.824 1.163-1.914 1.163-3.27 0-1.26-.388-2.325-1.163-3.197-.775-.872-2.034-1.307-3.778-1.307H72.57c.097-.194.145-.485.145-.872V27.09h9.01c1.743 0 2.954-.436 3.633-1.308.678-.872 1.017-1.938 1.017-3.197 0-1.26-.34-2.325-1.017-3.197-.679-.872-1.89-1.308-3.633-1.308H46.268c-1.743 0-2.954.436-3.632 1.308-.678.872-1.018 1.938-1.018 3.197 0 1.26.34 2.325 1.018 3.197.678.872 1.889 1.308 3.632 1.308h8.138v72.075c0 .193.024.339.073.436.048.096.072.242.072.436H46.56c-1.744 0-3.003.435-3.778 1.307-.775.872-1.163 1.938-1.163 3.197 0 1.356.388 2.446 1.163 3.27.775.823 2.034 1.235 3.778 1.235h34.875z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/in-storage.svg b/qqjf-Web/src/icons/svg/in-storage.svg
new file mode 100644
index 0000000..ec3c665
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/in-storage.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1623139027497" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4941" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><defs><style type="text/css"></style></defs><path d="M258.701056 193.045226l512.00016 0 0 63.99952L258.701056 257.044746 258.701056 193.045226zM256.993602 321.671065l511.99916 0 0 63.99952L256.993602 385.670585 256.993602 321.671065zM256.993602 449.663108l131.31098 0 0 64.00052L256.993602 513.663628 256.993602 449.663108zM256.993602 577.665147l57.948456 0 0 64.00052-57.948456 0L256.993602 577.665147zM898.701256 0 130.701016 0C95.356326 0 66.702495 28.653831 66.702495 64.00052l0 895.998281c0 35.34469 28.653831 63.99952 63.99952 63.99952l299.403191-0.327895 0-63.99952-299.403191 0.327895L130.702015 64.00052l768.00024 0 0 611.622281 63.99952 0L962.701775 64.00052C962.700776 28.653831 934.041947 0 898.701256 0L898.701256 0z" p-id="4942" ></path><path d="M962.700776 998.077615c-4.265635-63.979527-29.857446-375.345889-362.549984-392.40643l0-98.101607c0-4.265635 0-17.06154-8.53027-29.857446s-25.591811-12.795905-46.917986-4.265635l-4.265635 0-187.672945 204.734485c-4.265635 4.265635-21.326176 25.591811-21.326176 46.917986 0 25.591811 21.326176 46.917986 25.591811 46.917986l187.672945 213.264755c4.265635 4.265635 17.06154 17.06154 29.857446 17.06154 12.795905 0 21.326176-8.53027 25.591811-17.06154 4.265635-8.53027 4.265635-17.06154 4.265635-29.857446L604.417426 831.731846c55.449256 0 208.99912 8.53027 302.836092 174.877039 6.536908 14.430382 17.06154 17.06154 25.591811 17.06154l8.53027 0 6.380958-1.880398C960.551464 1017.524392 962.700776 1002.34325 962.700776 998.077615L962.700776 998.077615zM617.212332 789.078495c-21.326176 0-34.122081 0-34.122081 0l-21.326176 4.265635 0 145.019594L391.151671 742.160509c-4.265635-4.265635-12.795905-12.795905-12.795905-17.06154 0-4.265635 4.265635-12.795905 8.53027-17.06154l166.346769-179.142674 0 123.693418 21.326176 0c238.856566 0 311.366363 162.081134 332.692538 272.978647C809.149912 801.8744 676.926224 789.078495 617.212332 789.078495L617.212332 789.078495z" p-id="4943" ></path></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/inbound.svg b/qqjf-Web/src/icons/svg/inbound.svg
new file mode 100644
index 0000000..15f85fc
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/inbound.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1621487711672" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4691" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M258.701056 193.045226l512.00016 0 0 63.99952L258.701056 257.044746 258.701056 193.045226zM256.993602 321.671065l511.99916 0 0 63.99952L256.993602 385.670585 256.993602 321.671065zM256.993602 449.663108l131.31098 0 0 64.00052L256.993602 513.663628 256.993602 449.663108zM256.993602 577.665147l57.948456 0 0 64.00052-57.948456 0L256.993602 577.665147zM898.701256 0 130.701016 0C95.356326 0 66.702495 28.653831 66.702495 64.00052l0 895.998281c0 35.34469 28.653831 63.99952 63.99952 63.99952l299.403191-0.327895 0-63.99952-299.403191 0.327895L130.702015 64.00052l768.00024 0 0 611.622281 63.99952 0L962.701775 64.00052C962.700776 28.653831 934.041947 0 898.701256 0L898.701256 0z" p-id="4692"></path><path d="M962.700776 998.077615c-4.265635-63.979527-29.857446-375.345889-362.549984-392.40643l0-98.101607c0-4.265635 0-17.06154-8.53027-29.857446s-25.591811-12.795905-46.917986-4.265635l-4.265635 0-187.672945 204.734485c-4.265635 4.265635-21.326176 25.591811-21.326176 46.917986 0 25.591811 21.326176 46.917986 25.591811 46.917986l187.672945 213.264755c4.265635 4.265635 17.06154 17.06154 29.857446 17.06154 12.795905 0 21.326176-8.53027 25.591811-17.06154 4.265635-8.53027 4.265635-17.06154 4.265635-29.857446L604.417426 831.731846c55.449256 0 208.99912 8.53027 302.836092 174.877039 6.536908 14.430382 17.06154 17.06154 25.591811 17.06154l8.53027 0 6.380958-1.880398C960.551464 1017.524392 962.700776 1002.34325 962.700776 998.077615L962.700776 998.077615zM617.212332 789.078495c-21.326176 0-34.122081 0-34.122081 0l-21.326176 4.265635 0 145.019594L391.151671 742.160509c-4.265635-4.265635-12.795905-12.795905-12.795905-17.06154 0-4.265635 4.265635-12.795905 8.53027-17.06154l166.346769-179.142674 0 123.693418 21.326176 0c238.856566 0 311.366363 162.081134 332.692538 272.978647C809.149912 801.8744 676.926224 789.078495 617.212332 789.078495L617.212332 789.078495z" p-id="4693"></path></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/international.svg b/qqjf-Web/src/icons/svg/international.svg
new file mode 100644
index 0000000..e9b56ee
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/international.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M83.287 103.01c-1.57-3.84-6.778-10.414-15.447-19.548-2.327-2.444-2.182-4.306-1.338-9.862v-.64c.553-3.81 1.513-6.05 14.313-8.087 6.516-1.018 8.203 1.57 10.589 5.178l.785 1.193a12.625 12.625 0 0 0 6.43 5.207c1.134.524 2.53 1.164 4.421 2.24 4.596 2.53 4.596 5.41 4.596 11.753v.727a26.91 26.91 0 0 1-5.178 17.454 59.055 59.055 0 0 1-19.025 11.026c3.49-6.546.814-14.313 0-16.553l-.146-.087zM64 5.12a58.502 58.502 0 0 1 25.484 5.818 54.313 54.313 0 0 0-12.859 10.327c-.93 1.28-1.716 2.473-2.472 3.579-2.444 3.694-3.637 5.352-5.818 5.614a25.105 25.105 0 0 1-4.219 0c-4.276-.29-10.094-.64-11.956 4.422-1.193 3.23-1.396 11.956 2.444 16.495.66 1.077.778 2.4.32 3.578a7.01 7.01 0 0 1-2.066 3.229 18.938 18.938 0 0 1-2.909-2.91 18.91 18.91 0 0 0-8.32-6.603c-1.25-.349-2.647-.64-3.985-.93-3.782-.786-8.03-1.688-9.019-3.812a14.895 14.895 0 0 1-.727-5.818 21.935 21.935 0 0 0-1.396-9.25 8.873 8.873 0 0 0-5.557-4.946A58.705 58.705 0 0 1 64 5.12zM0 64c0 35.346 28.654 64 64 64 35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/language.svg b/qqjf-Web/src/icons/svg/language.svg
new file mode 100644
index 0000000..0082b57
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/language.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.742 36.8c2.398 7.2 5.595 12.8 11.19 18.4 4.795-4.8 7.992-11.2 10.39-18.4h-21.58zm-52.748 40h20.78l-10.39-28-10.39 28z"/><path d="M111.916 0H16.009C7.218 0 .025 7.2.025 16v96c0 8.8 7.193 16 15.984 16h95.907c8.791 0 15.984-7.2 15.984-16V16c0-8.8-6.394-16-15.984-16zM72.754 103.2c-1.598 1.6-3.197 1.6-4.795 1.6-.8 0-2.398 0-3.197-.8-.8-.8-1.599 0-1.599-.8s-.799-1.6-1.598-3.2c-.8-1.6-.8-2.4-1.599-4l-3.196-8.8H28.797L25.6 96c-1.598 3.2-2.398 5.6-3.197 7.2-.8 1.6-2.398 1.6-4.795 1.6-1.599 0-3.197-.8-4.796-1.6-1.598-1.6-2.397-2.4-2.397-4 0-.8 0-1.6.799-3.2.8-1.6.8-2.4 1.598-4l17.583-44.8c.8-1.6.8-3.2 1.599-4.8.799-1.6 1.598-3.2 2.397-4 .8-.8 1.599-2.4 3.197-3.2 1.599-.8 3.197-.8 4.796-.8 1.598 0 3.196 0 4.795.8 1.598.8 2.398 1.6 3.197 3.2.799.8 1.598 2.4 2.397 4 .8 1.6 1.599 3.2 2.398 5.6l17.583 44c1.598 3.2 2.398 5.6 2.398 7.2-.8.8-1.599 2.4-2.398 4zM116.711 72c-8.791-3.2-15.185-7.2-20.78-12-5.594 5.6-12.787 9.6-21.579 12l-2.397-4c8.791-2.4 15.984-5.6 21.579-11.2C87.939 51.2 83.144 44 81.545 36h-7.992v-3.2h21.58c-1.6-2.4-3.198-5.6-4.796-8l2.397-.8c1.599 2.4 3.997 5.6 5.595 8.8h19.98v4h-7.992c-2.397 8-6.393 15.2-11.189 20 5.595 4.8 11.988 8.8 20.78 11.2l-3.197 4z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/link.svg b/qqjf-Web/src/icons/svg/link.svg
new file mode 100644
index 0000000..48197ba
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/link.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.625 127.937H.063V12.375h57.781v12.374H12.438v90.813h90.813V70.156h12.374z"/><path d="M116.426 2.821l8.753 8.753-56.734 56.734-8.753-8.745z"/><path d="M127.893 37.982h-12.375V12.375H88.706V0h39.187z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/list.svg b/qqjf-Web/src/icons/svg/list.svg
new file mode 100644
index 0000000..20259ed
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/list.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M1.585 12.087c0 6.616 3.974 11.98 8.877 11.98 4.902 0 8.877-5.364 8.877-11.98 0-6.616-3.975-11.98-8.877-11.98-4.903 0-8.877 5.364-8.877 11.98zM125.86.107H35.613c-1.268 0-2.114 1.426-2.114 2.852v18.255c0 1.712 1.057 2.853 2.114 2.853h90.247c1.268 0 2.114-1.426 2.114-2.853V2.96c0-1.711-1.057-2.852-2.114-2.852zM.106 62.86c0 6.615 3.974 11.979 8.876 11.979 4.903 0 8.877-5.364 8.877-11.98 0-6.616-3.974-11.98-8.877-11.98-4.902 0-8.876 5.364-8.876 11.98zM124.17 50.88H33.921c-1.268 0-2.114 1.425-2.114 2.851v18.256c0 1.711 1.057 2.852 2.114 2.852h90.247c1.268 0 2.114-1.426 2.114-2.852V53.73c0-1.426-.846-2.852-2.114-2.852zM.106 115.913c0 6.616 3.974 11.98 8.876 11.98 4.903 0 8.877-5.364 8.877-11.98 0-6.616-3.974-11.98-8.877-11.98-4.902 0-8.876 5.364-8.876 11.98zm124.064-11.98H33.921c-1.268 0-2.114 1.426-2.114 2.853v18.255c0 1.711 1.057 2.852 2.114 2.852h90.247c1.268 0 2.114-1.426 2.114-2.852v-18.255c0-1.427-.846-2.853-2.114-2.853z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/lock.svg b/qqjf-Web/src/icons/svg/lock.svg
new file mode 100644
index 0000000..74fee54
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/lock.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M119.88 49.674h-7.987V39.52C111.893 17.738 90.45.08 63.996.08 37.543.08 16.1 17.738 16.1 39.52v10.154H8.113c-4.408 0-7.987 2.94-7.987 6.577v65.13c0 3.637 3.57 6.577 7.987 6.577H119.88c4.407 0 7.987-2.94 7.987-6.577v-65.13c-.008-3.636-3.58-6.577-7.987-6.577zm-23.953 0H32.065V39.52c0-14.524 14.301-26.295 31.931-26.295 17.63 0 31.932 11.777 31.932 26.295v10.153z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/logo.svg b/qqjf-Web/src/icons/svg/logo.svg
new file mode 100644
index 0000000..cd7e1d9
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/logo.svg
@@ -0,0 +1 @@
+<svg t="1595484202945" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12292" width="32" height="32"><path d="M483.2 4.16c180.544-3.072 279.36 58.304 376.512 136.448 28.864 23.168 45.184 58.432 71.744 83.648l-0.96 1.92-102.656 52.864C774.4 184.768 584.96 82.56 422.4 128.64a462.72 462.72 0 0 0-117.568 49.792l-60.8-64.768c-6.528-6.528-20.48-15.488-15.936-23.872l40.832-24.896c30.4-15.936 62.08-29.248 94.72-39.808 26.24-8.96 55.616-12.608 84.608-17.92L483.2 4.16z m-26.944 1015.808c-57.856 0.832-114.304-23.104-155.456-42.88-140.544-67.456-231.296-172.928-280.96-331.584-46.144-147.712 5.184-317.184 65.792-408.32 15.552-23.424 30.848-51.84 52.8-68.736h1.984l77.696 82.688-3.968 3.968-28.864 37.824a477.376 477.376 0 0 0-53.76 117.504c-10.944 35.328-18.56 89.856-11.008 133.504 5.44 31.552 5.12 56.96 13.952 83.648 35.84 108.16 101.376 181.888 192.256 235.008 24.192 14.08 54.144 24.192 82.688 32.832l46.848 9.984v114.56z m112.576 0l1.024-116.544c47.552 0.128 96.32-23.936 128.512-42.88 108.608-63.744 174.528-148.16 204.16-291.712 8.576-41.408 5.12-102.144-4.928-138.432l-14.976-51.84 102.656-52.736c12.16 31.36 20.48 65.728 28.864 101.568 13.888 59.584 7.616 148.416-6.976 200.192-44.16 156.928-122.368 263.424-252.032 333.632-49.472 26.752-114.048 57.92-186.304 58.752z m180.352-673.28c110.976-2.816 79.552 158.208-21.952 115.584l-139.52 100.544c0.576 42.944-42.752 77.696-86.656 57.792-36.48-16.576-26.496-29.44-37.824-53.76l-164.416-57.792c-37.248 48.064-127.232-7.104-98.56-69.76 26.88-58.816 120.32-44.672 118.528 32.896l157.44 55.808a60.16 60.16 0 0 1 97.6-4.032l125.504-92.608c-15.808-57.6 22.784-81.92 49.856-84.608z m-266.048 2.048c32.896-6.016 62.528 11.264 71.744 47.808a54.72 54.72 0 0 1-1.984 33.792c1.472 0.512 58.112 34.752 60.8 41.856l-32.896 23.872-51.84-34.816c-26.112 19.84-48.384 11.392-70.72-1.024l-33.92 28.928-42.752-14.976c17.92-16.256 54.272-47.808 53.76-48.768-11.968-48.832 27.904-71.232 47.808-76.672z m269.056 80.64c22.016 7.296 36.864-28.864 13.952-40.832-30.912-10.24-44.16 30.848-14.016 40.832z m-500.16 13.952c25.6-6.336 37.184 39.168 7.04 41.856-26.24 2.304-34.176-35.2-7.04-41.856z m430.4 73.728l51.84 34.816c12.928-3.584 24.512-13.696 44.8-9.984 40.64 7.488 70.592 58.624 40.832 98.56-26.88 36.16-89.856 28.224-106.624-11.904-5.632-13.504 0-37.12-4.928-46.784l-58.816-39.872v-0.96l32.896-23.872z m-367.616 15.872l41.856 16-7.04 7.936-38.784 33.856c24.512 79.36-63.04 118.976-104.64 64.704-29.504-38.4-5.376-92.032 36.864-100.608 16.896-3.392 29.44 3.584 40.832 6.016l30.912-27.904z m205.248 9.984c-26.432 9.472-16.448 48.32 10.88 41.856 27.456-6.464 15.488-51.328-10.88-41.856z" fill="#1890FF" p-id="12293"></path></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/message.svg b/qqjf-Web/src/icons/svg/message.svg
new file mode 100644
index 0000000..14ca817
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/message.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 20.967v59.59c0 11.59 8.537 20.966 19.075 20.966h28.613l1 26.477L76.8 101.523h32.125c10.538 0 19.075-9.377 19.075-20.966v-59.59C128 9.377 119.463 0 108.925 0h-89.85C8.538 0 0 9.377 0 20.967zm82.325 33.1c0-5.524 4.013-9.935 9.037-9.935 5.026 0 9.038 4.41 9.038 9.934 0 5.524-4.025 9.934-9.038 9.934-5.024 0-9.037-4.41-9.037-9.934zm-27.613 0c0-5.524 4.013-9.935 9.038-9.935s9.037 4.41 9.037 9.934c0 5.524-4.025 9.934-9.037 9.934-5.025 0-9.038-4.41-9.038-9.934zm-27.1 0c0-5.524 4.013-9.935 9.038-9.935s9.038 4.41 9.038 9.934c0 5.524-4.026 9.934-9.05 9.934-5.013 0-9.025-4.41-9.025-9.934z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/money.svg b/qqjf-Web/src/icons/svg/money.svg
new file mode 100644
index 0000000..c1580de
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/money.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.122 127.892v-28.68H7.513V87.274h46.609v-12.4H7.513v-12.86h38.003L.099 0h22.6l32.556 45.07c3.617 5.144 6.44 9.611 8.487 13.385 1.788-3.05 4.89-7.779 9.301-14.186L103.93 0h24.01L82.385 62.013h38.34v12.862h-46.41v12.4h46.41v11.937h-46.41v28.68H54.123z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/nested.svg b/qqjf-Web/src/icons/svg/nested.svg
new file mode 100644
index 0000000..06713a8
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/nested.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.002 9.2c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-5.043-3.58-9.132-7.997-9.132S.002 4.157.002 9.2zM31.997.066h95.981V18.33H31.997V.066zm0 45.669c0 5.044 3.58 9.132 7.998 9.132 4.417 0 7.997-4.088 7.997-9.132 0-3.263-1.524-6.278-3.998-7.91-2.475-1.63-5.524-1.63-7.998 0-2.475 1.632-4 4.647-4 7.91zM63.992 36.6h63.986v18.265H63.992V36.6zm-31.995 82.2c0 5.043 3.58 9.132 7.998 9.132 4.417 0 7.997-4.089 7.997-9.132 0-5.044-3.58-9.133-7.997-9.133s-7.998 4.089-7.998 9.133zm31.995-9.131h63.986v18.265H63.992V109.67zm0-27.404c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-3.263-1.524-6.277-3.998-7.909-2.475-1.631-5.524-1.631-7.998 0-2.475 1.632-4 4.646-4 7.91zm31.995-9.13h31.991V91.4H95.987V73.135z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/out-storage.svg b/qqjf-Web/src/icons/svg/out-storage.svg
new file mode 100644
index 0000000..c655390
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/out-storage.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1623138991555" class="icon" viewBox="0 0 1189 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3253" width="37.15625" height="32" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M702.776889 539.932444l178.716444-137.955555a17.237333 17.237333 0 0 0 0-27.306667l-178.716444-137.955555a17.237333 17.237333 0 0 0-27.761778 13.653333V329.955556c-168.96 18.005333-293.205333 142.592-278.869333 281.742222 45.795556-89.685333 151.04-156.16 278.528-162.133334l0.341333 0.312889v76.430223a17.237333 17.237333 0 0 0 27.761778 13.653333zM98.816 168.504889H461.937778v56.888889H98.816zM98.816 362.609778h246.613333v56.888889h-246.613333zM98.816 556.743111h165.973333v56.888889H98.816z"  p-id="3254"></path><path d="M838.769778 636.017778L835.555556 824.888889H56.888889V56.888889h778.296889v85.646222a26.481778 26.481778 0 0 0 0.768 3.754667h55.381333a26.481778 26.481778 0 0 0 0.739556-3.754667V34.844444A34.816 34.816 0 0 0 857.372444 0H34.702222A34.816 34.816 0 0 0 0 34.844444v812.088889A34.816 34.816 0 0 0 34.702222 881.777778h822.698667a34.702222 34.702222 0 0 0 34.702222-34.360889l3.584-211.399111z"  p-id="3255"></path></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/outbound.svg b/qqjf-Web/src/icons/svg/outbound.svg
new file mode 100644
index 0000000..251af61
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/outbound.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1621487819085" class="icon" viewBox="0 0 1189 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5547" xmlns:xlink="http://www.w3.org/1999/xlink" width="232.2265625" height="200"><defs><style type="text/css"></style></defs><path d="M702.776889 539.932444l178.716444-137.955555a17.237333 17.237333 0 0 0 0-27.306667l-178.716444-137.955555a17.237333 17.237333 0 0 0-27.761778 13.653333V329.955556c-168.96 18.005333-293.205333 142.592-278.869333 281.742222 45.795556-89.685333 151.04-156.16 278.528-162.133334l0.341333 0.312889v76.430223a17.237333 17.237333 0 0 0 27.761778 13.653333zM98.816 168.504889H461.937778v56.888889H98.816zM98.816 362.609778h246.613333v56.888889h-246.613333zM98.816 556.743111h165.973333v56.888889H98.816z"  p-id="5548"></path><path d="M838.769778 636.017778L835.555556 824.888889H56.888889V56.888889h778.296889v85.646222a26.481778 26.481778 0 0 0 0.768 3.754667h55.381333a26.481778 26.481778 0 0 0 0.739556-3.754667V34.844444A34.816 34.816 0 0 0 857.372444 0H34.702222A34.816 34.816 0 0 0 0 34.844444v812.088889A34.816 34.816 0 0 0 34.702222 881.777778h822.698667a34.702222 34.702222 0 0 0 34.702222-34.360889l3.584-211.399111z"  p-id="5549"></path></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/password.svg b/qqjf-Web/src/icons/svg/password.svg
new file mode 100644
index 0000000..e291d85
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/password.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M108.8 44.322H89.6v-5.36c0-9.04-3.308-24.163-25.6-24.163-23.145 0-25.6 16.881-25.6 24.162v5.361H19.2v-5.36C19.2 15.281 36.798 0 64 0c27.202 0 44.8 15.281 44.8 38.961v5.361zm-32 39.356c0-5.44-5.763-9.832-12.8-9.832-7.037 0-12.8 4.392-12.8 9.832 0 3.682 2.567 6.808 6.407 8.477v11.205c0 2.718 2.875 4.962 6.4 4.962 3.524 0 6.4-2.244 6.4-4.962V92.155c3.833-1.669 6.393-4.795 6.393-8.477zM128 64v49.201c0 8.158-8.645 14.799-19.2 14.799H19.2C8.651 128 0 121.359 0 113.201V64c0-8.153 8.645-14.799 19.2-14.799h89.6c10.555 0 19.2 6.646 19.2 14.799z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/pdf.svg b/qqjf-Web/src/icons/svg/pdf.svg
new file mode 100644
index 0000000..957aa0c
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/pdf.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M869.073 277.307H657.111V65.344l211.962 211.963zm-238.232 26.27V65.344l-476.498-.054v416.957h714.73v-178.67H630.841zm-335.836 360.57c-5.07-3.064-10.944-5.133-17.61-6.201-6.67-1.064-13.603-1.6-20.81-1.6h-48.821v85.641h48.822c7.206 0 14.14-.532 20.81-1.6 6.665-1.065 12.54-3.133 17.609-6.202 5.064-3.063 9.134-7.406 12.208-13.007 3.065-5.602 4.6-12.937 4.6-22.011 0-9.07-1.535-16.408-4.6-22.01-3.074-5.603-7.144-9.94-12.208-13.01zM35.82 541.805v416.904h952.358V541.805H35.821zm331.421 191.179c-3.6 11.071-9.343 20.879-17.209 29.413-7.874 8.542-18.078 15.408-30.617 20.61-12.544 5.206-27.747 7.807-45.621 7.807h-66.036v102.45h-62.831V607.517h128.867c17.874 0 33.077 2.6 45.62 7.802 12.541 5.207 22.745 12.076 30.618 20.615 7.866 8.538 13.604 18.277 17.21 29.212 3.6 10.943 5.401 22.278 5.401 34.018 0 11.477-1.8 22.752-5.402 33.819zM644.9 806.417c-5.343 17.61-13.408 32.818-24.212 45.627-10.807 12.803-24.283 22.879-40.423 30.213-16.146 7.343-35.155 11.007-57.03 11.007h-123.26V607.518h123.26c18.41 0 35.552 2.941 51.428 8.808 15.873 5.869 29.618 14.671 41.22 26.412 11.608 11.744 20.674 26.411 27.217 44.02 6.535 17.61 9.803 38.288 9.803 62.035 0 20.81-2.67 40.02-8.003 57.624zm245.362-146.07h-138.07v66.03h119.66v48.829h-119.66v118.058h-62.83V607.518h200.9v52.829h-.001zm-318.2 25.611c-6.402-8.266-14.877-14.604-25.412-19.01-10.544-4.402-23.551-6.602-39.019-6.602h-44.825v180.088h56.029c9.07 0 17.872-1.463 26.415-4.401 8.535-2.932 16.14-7.802 22.812-14.609 6.665-6.8 12.007-15.667 16.007-26.61 4.003-10.94 6.003-24.275 6.003-40.021 0-14.408-1.4-27.416-4.202-39.019-2.8-11.607-7.406-21.542-13.808-29.816zm0 0"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/people.svg b/qqjf-Web/src/icons/svg/people.svg
new file mode 100644
index 0000000..2bd54ae
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/people.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M104.185 95.254c8.161 7.574 13.145 17.441 13.145 28.28 0 1.508-.098 2.998-.285 4.466h-10.784c.238-1.465.403-2.948.403-4.465 0-8.983-4.36-17.115-11.419-23.216C86 104.66 75.355 107.162 64 107.162c-11.344 0-21.98-2.495-31.22-6.83-7.064 6.099-11.444 14.218-11.444 23.203 0 1.517.165 3 .403 4.465H10.955a35.444 35.444 0 0 1-.285-4.465c0-10.838 4.974-20.713 13.127-28.291C9.294 85.42.003 70.417.003 53.58.003 23.99 28.656.001 64 .001s63.997 23.988 63.997 53.58c0 16.842-9.299 31.85-23.812 41.673zM64 36.867c-29.454 0-53.33-10.077-53.33 15.342 0 25.418 23.876 46.023 53.33 46.023 29.454 0 53.33-20.605 53.33-46.023 0-25.419-23.876-15.342-53.33-15.342zm24.888 25.644c-3.927 0-7.111-2.665-7.111-5.953 0-3.288 3.184-5.954 7.11-5.954 3.928 0 7.111 2.666 7.111 5.954s-3.183 5.953-7.11 5.953zm-3.556 16.372c0 4.11-9.55 7.442-21.332 7.442-11.781 0-21.332-3.332-21.332-7.442 0-1.06.656-2.064 1.8-2.976 3.295 2.626 10.79 4.465 19.532 4.465 8.743 0 16.237-1.84 19.531-4.465 1.145.912 1.801 1.916 1.801 2.976zm-46.22-16.372c-3.927 0-7.11-2.665-7.11-5.953 0-3.288 3.183-5.954 7.11-5.954 3.927 0 7.111 2.666 7.111 5.954s-3.184 5.953-7.11 5.953z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/peoples.svg b/qqjf-Web/src/icons/svg/peoples.svg
new file mode 100644
index 0000000..aab852e
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/peoples.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M95.648 118.762c0 5.035-3.563 9.121-7.979 9.121H7.98c-4.416 0-7.979-4.086-7.979-9.121C0 100.519 15.408 83.47 31.152 76.75c-9.099-6.43-15.216-17.863-15.216-30.987v-9.128c0-20.16 14.293-36.518 31.893-36.518s31.894 16.358 31.894 36.518v9.122c0 13.137-6.123 24.556-15.216 30.993 15.738 6.726 31.141 23.769 31.141 42.012z"/><path d="M106.032 118.252h15.867c3.376 0 6.101-3.125 6.101-6.972 0-13.957-11.787-26.984-23.819-32.123 6.955-4.919 11.638-13.66 11.638-23.704v-6.985c0-15.416-10.928-27.926-24.39-27.926-1.674 0-3.306.193-4.89.561 1.936 4.713 3.018 9.974 3.018 15.526v9.121c0 13.137-3.056 23.111-11.066 30.993 14.842 4.41 27.312 23.42 27.541 41.509z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/qq.svg b/qqjf-Web/src/icons/svg/qq.svg
new file mode 100644
index 0000000..ee13d4e
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/qq.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M18.448 57.545l-.244-.744-.198-.968-.132-.53v-2.181l.236-.859.24-.908.317-.953.428-1.06.561-1.103.794-1.104v-.773l.077-.724.123-.984.34-1.106.313-1.194.25-.548.289-.511.371-.569.405-.423v-2.73l.234-1.407.236-1.633.42-1.955.577-2.035.43-1.118.426-1.217.468-1.135.559-1.216.57-1.332.655-1.247.737-1.331.929-1.33.43-.762.457-.624.995-1.406 1.025-1.403 1.163-1.444 1.246-1.405 1.352-1.384 1.41-1.423 1.708-1.536 1.083-.934 1.322-1.008 1.34-.89 1.448-.855 1.392-.76 1.57-.63 1.667-.775 1.657-.532 1.653-.552 1.787-.548 1.785-.417 1.876-.347L59.128.68l1.879-.245 1.876-.252 2.002-.106h5.912l1.97.243 1.981.231 2.019.207 1.874.441 1.979.413 1.857.475 2.035.53 1.862.646 1.782.738 1.904.78 1.736.853 1.689.95 1.655 1.044 1.425.971.662.548.693.401 1.323 1.1 1.115 1.064 1.112 1.1 1.083 1.214.894 1.178 1.064 1.217.74 1.306.752 1.162.798 1.352.661 1.175 1.113 2.489.546 1.286.428 1.192.428 1.294.384 1.217.267 1.047.347 1.231.607 2.198.388 1.924.253 1.861.217 1.497.342 2.28.077.362.274.41.737 1.18.473.8.42.832.534.892.472 1.07.307 1.093.334 1.2.252 1.232.115.605.106.746v.648l-.106.643v.8l-.192.774-.35 1.5-.403.76-.299.852v.213l.142.264.4.623 1.746 2.53 1.377 1.9.66 1.267.889 1.389.774 1.52.893 1.627.894 1.828 1.006 2.069.567 1.268.518 1.239.447 1.307.44 1.175.336 1.235.342 1.16.432 2.261.343 2.31.235 2.05v2.891l-.158 1.025-.226 1.768-.308 1.59-.48 1.44-.18.588-.336.707-.28.493-.375.607-.33.383-.42.494-.375.4-.401.34-.48.207-.432.207-.355.114h-.543l-.346-.114-.66-.32-.302-.212-.317-.223-.347-.304-.35-.342-.579-.63-.684-.89-.539-.917-.538-.734-.526-.855-.741-1.517-.833-1.579-.098-.055h-.138l-.338.247-.196.415-.326.516-.567 1.533-.856 2.182-1.096 2.626-.824 1.308-.864 1.366-1.027 1.536-1.09 1.503-.557.68-.676.743-1.555 1.497.136.135.21.214.777.446 3.235 1.524 1.41.779 1.347.756 1.332.953 1.187.982.574.443.432.511.445.593.367.643.198.533.242.64.105.554.115.647-.115.433v.44l-.105.454-.242.415-.092.325-.22.394-.587.784-.543.627-.42.47-.35.348-.893.638-1.01.556-1.077.532-1.155.511-1.287.495-.693.207-.608.167-1.496.342-1.545.325-1.552.323-1.689.27-1.74.072-1.785.21h-5.539l-1.998-.114-1.86-.168-2.005-.27-1.99-.209-2.095-.286-2.03-.495-1.981-.374-1.968-.552-2.019-.707-1.98-.585-1.044-.342-.927-.323-.586-.223-.582-.12h-1.647l-1.904-.131-.962-.096-1.24-.135-.795.705-1.085.665-1.471.701-1.628.875-.99.475-1.033.376-2.281.914-1.24.305-1.3.343-1.803.344-1.13.086-1.193.1-1.246.135-1.45.053h-5.926l-3.346-.053-3.25-.321-1.644-.23-1.589-.23-1.546-.227-1.547-.305-1.442-.456-1.434-.325-1.294-.51-1.223-.474-1.142-.533-.99-.583-.984-.71-.336-.343-.44-.415-.334-.362-.3-.417-.278-.415-.215-.42-.311-.89-.109-.46-.138-.51v-.473l.138-.533v-.53l.109-.53v-1.069l.052-.564.259-.647.215-.646.39-.779.286-.3.236-.348.615-.738.49-.38.464-.266.428-.338.676-.21.543-.324.676-.341.77-.227.775-.231.897-.192.85-.11 1.008-.13 1.093-.081.284-.092h.063l.137-.115v-.13l-.2-.266-.58-.27-1.45-1.231-.975-.761-1.127-.967-1.136-1.082-1.181-1.382-1.36-1.558-.508-.843-.672-.87-.58-1.007-.522-1.1-.704-1.047-.459-1.194-.547-1.192-.546-1.33-.397-1.273-.378-1.575-.112-.057h-.115l-.059-.113h-.14l-.23.113-.114.057-.158.264-.057.321-.119.286-.206.477-.664 1.157-.345.701-.546.612-.58.736-.641.816-.677.724-.795.701-.734.658-.814.524-.89.546-.855.325-1.008.247-.99.095h-.233l-.228-.095-.18-.384-.29-.188-.38-.912-.237-.493-.255-.707-.21-.734-.113-.724-.313-1.648-.12-.972v-3.185l.12-2.379.196-1.214.23-1.252.21-1.347.374-1.254.42-1.443.431-1.407.578-1.448.545-1.38.754-1.4.699-1.52.855-1.425 1.006-1.538 1.023-1.382 1.069-1.538.891-1.071 1.142-1.227 1.202-1.237.56-.59.678-.662.985-.836 1.012-.853 1.647-1.446 1.242-.889z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/record-chart.svg b/qqjf-Web/src/icons/svg/record-chart.svg
new file mode 100644
index 0000000..39d98c0
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/record-chart.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1623139100922" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6811" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><defs><style type="text/css"></style></defs><path d="M846.5 990h-669c-40.3 0-73-32.7-73-73V107c0-40.3 32.7-73 73-73h669c40.3 0 73 32.7 73 73v810c0 40.3-32.7 73-73 73z m-669-900c-9.4 0-17 7.6-17 17v810c0 9.4 7.6 17 17 17h669c9.4 0 17-7.6 17-17V107c0-9.4-7.6-17-17-17h-669z"  p-id="6812"></path><path d="M316.2 356.7h192v56h-192zM316.6 228.8h256v56h-256zM225 62.9h56v898.2h-56zM726 897.1h-50c-40.3 0-73-32.7-73-73V357.5l98-98 98 98v466.6c0 40.2-32.7 73-73 73z m-67-516.4v443.4c0 9.4 7.6 17 17 17h50c9.4 0 17-7.6 17-17V380.7l-42-42-42 42z"  p-id="6813"></path></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/search.svg b/qqjf-Web/src/icons/svg/search.svg
new file mode 100644
index 0000000..84233dd
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/search.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M124.884 109.812L94.256 79.166c-.357-.357-.757-.629-1.129-.914a50.366 50.366 0 0 0 8.186-27.59C101.327 22.689 78.656 0 50.67 0 22.685 0 0 22.688 0 50.663c0 27.989 22.685 50.663 50.656 50.663 10.186 0 19.643-3.03 27.6-8.201.286.385.557.771.9 1.114l30.628 30.632a10.633 10.633 0 0 0 7.543 3.129c2.728 0 5.457-1.043 7.543-3.115 4.171-4.157 4.171-10.915.014-15.073M50.671 85.338C31.557 85.338 16 69.78 16 50.663c0-19.102 15.557-34.661 34.67-34.661 19.115 0 34.657 15.559 34.657 34.675 0 19.102-15.557 34.661-34.656 34.661"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/shopping.svg b/qqjf-Web/src/icons/svg/shopping.svg
new file mode 100644
index 0000000..87513e7
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/shopping.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M42.913 101.36c1.642 0 3.198.332 4.667.996a12.28 12.28 0 0 1 3.89 2.772c1.123 1.184 1.987 2.582 2.592 4.193.605 1.612.908 3.318.908 5.118 0 1.8-.303 3.507-.908 5.118-.605 1.611-1.469 3.01-2.593 4.194a13.3 13.3 0 0 1-3.889 2.843 10.582 10.582 0 0 1-4.667 1.066c-1.729 0-3.306-.355-4.732-1.066a13.604 13.604 0 0 1-3.825-2.843c-1.123-1.185-1.988-2.583-2.593-4.194a14.437 14.437 0 0 1-.907-5.118c0-1.8.302-3.506.907-5.118.605-1.61 1.47-3.009 2.593-4.193a12.515 12.515 0 0 1 3.825-2.772c1.426-.664 3.003-.996 4.732-.996zm53.932.285c1.643 0 3.22.331 4.733.995a11.386 11.386 0 0 1 3.889 2.772c1.08 1.185 1.945 2.583 2.593 4.194.648 1.61.972 3.317.972 5.118 0 1.8-.324 3.506-.972 5.117-.648 1.611-1.513 3.01-2.593 4.194a12.253 12.253 0 0 1-3.89 2.843 11 11 0 0 1-4.732 1.066 10.58 10.58 0 0 1-4.667-1.066 12.478 12.478 0 0 1-3.824-2.843c-1.08-1.185-1.945-2.583-2.593-4.194a13.581 13.581 0 0 1-.973-5.117c0-1.801.325-3.507.973-5.118.648-1.611 1.512-3.01 2.593-4.194a11.559 11.559 0 0 1 3.824-2.772 11.212 11.212 0 0 1 4.667-.995zm21.781-80.747c2.42 0 4.3.355 5.64 1.066 1.34.71 2.29 1.587 2.852 2.63a6.427 6.427 0 0 1 .778 3.34c-.044 1.185-.195 2.204-.454 3.057-.26.853-.8 2.606-1.62 5.26a589.268 589.268 0 0 1-2.788 8.743 1236.373 1236.373 0 0 0-3.047 9.453c-.994 3.128-1.75 5.592-2.269 7.393-1.123 3.79-2.55 6.42-4.278 7.89-1.728 1.469-3.846 2.203-6.352 2.203H39.023l1.945 12.795h65.342c4.148 0 6.223 1.943 6.223 5.828 0 1.896-.41 3.53-1.232 4.905-.821 1.374-2.442 2.061-4.862 2.061H38.505c-1.729 0-3.176-.426-4.343-1.28-1.167-.852-2.14-1.966-2.917-3.34a21.277 21.277 0 0 1-1.88-4.478 44.128 44.128 0 0 1-1.102-4.55c-.087-.568-.324-1.942-.713-4.122-.39-2.18-.865-4.904-1.426-8.174l-1.88-10.947c-.692-4.027-1.383-8.079-2.075-12.154-1.642-9.572-3.5-20.234-5.574-31.986H6.87c-1.296 0-2.377-.356-3.24-1.067a9.024 9.024 0 0 1-2.14-2.558 10.416 10.416 0 0 1-1.167-3.2C.108 8.53 0 7.488 0 6.54c0-1.896.583-3.46 1.75-4.69C2.917.615 4.494 0 6.482 0h13.095c1.728 0 3.111.284 4.148.853 1.037.569 1.858 1.28 2.463 2.132a8.548 8.548 0 0 1 1.297 2.701c.26.948.475 1.754.648 2.417.173.758.346 1.825.519 3.199.173 1.374.345 2.772.518 4.193.26 1.706.519 3.507.778 5.403h88.678z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/size.svg b/qqjf-Web/src/icons/svg/size.svg
new file mode 100644
index 0000000..ddb25b8
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/size.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h54.796v18.286H36.531V128H18.265V73.143H0V54.857zm127.857-36.571H91.935V128H72.456V18.286H36.534V0h91.326l-.003 18.286z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/skill.svg b/qqjf-Web/src/icons/svg/skill.svg
new file mode 100644
index 0000000..a3b7312
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/skill.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M31.652 93.206h33.401c1.44 2.418 3.077 4.663 4.93 6.692h-38.33v-6.692zm0-10.586h28.914a44.8 44.8 0 0 1-1.264-6.688h-27.65v6.688zm0-17.27H59.39c.288-2.286.714-4.532 1.34-6.687H31.65v6.687h.003zm53.913 44.84v5.85c0 2.798-2.095 5.075-4.667 5.075h-70.07c-2.576 0-4.663-2.277-4.663-5.075V31.26l23.22-20.96v22.25H17.16v6.688h18.39V6.688h45.348c2.576 0 4.667 2.277 4.667 5.066v20.009c1.987-.675 4.053-1.128 6.17-1.445v-18.56C91.738 5.28 86.874 0 80.902 0H31.15L0 28.118v87.917c0 6.48 4.859 11.759 10.832 11.759h70.07c5.974 0 10.837-5.27 10.837-11.759v-4.41c-2.117-.312-4.183-.765-6.17-1.435h-.004zM23.279 58.667h-7.96v6.688h7.96v-6.688zm-7.956 41.23h7.96v-6.691h-7.96v6.692zm7.956-23.96h-7.96v6.687h7.96v-6.688zm89.718-15.042l-4.896-4.07-12.447 17.613-11.19-9.305-3.762 5.311 16.091 13.38 16.204-22.929zM128 70.978c0-18.632-13.97-33.782-31.147-33.782-17.168 0-31.135 15.155-31.135 33.782 0 18.628 13.97 33.783 31.135 33.783 17.172 0 31.143-15.15 31.143-33.783H128zm-6.17 0c0 14.933-11.203 27.1-24.981 27.1-13.77 0-24.987-12.158-24.987-27.1 0-14.941 11.195-27.099 24.987-27.099 13.778 0 24.982 12.158 24.982 27.1z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/star.svg b/qqjf-Web/src/icons/svg/star.svg
new file mode 100644
index 0000000..6cf86e6
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/star.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M70.66 4.328l14.01 29.693c1.088 2.29 3.177 3.882 5.603 4.25l31.347 4.76c6.087.926 8.528 8.756 4.117 13.247L103.05 79.395c-1.75 1.78-2.544 4.352-2.132 6.867l5.352 32.641c1.043 6.337-5.33 11.182-10.778 8.19l-28.039-15.409a7.13 7.13 0 0 0-6.91 0l-28.039 15.41c-5.448 2.99-11.821-1.854-10.777-8.19l5.352-32.642c.415-2.515-.387-5.088-2.136-6.867L2.264 56.278C-2.146 51.787.286 43.957 6.38 43.031l31.343-4.76c2.419-.368 4.51-1.96 5.595-4.25L57.334 4.328c2.728-5.77 10.605-5.77 13.325 0z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/storage.svg b/qqjf-Web/src/icons/svg/storage.svg
new file mode 100644
index 0000000..eb6b41b
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/storage.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1621487921042" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8725" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M747.08 489.45A212.73 212.73 0 1 0 534.27 276.7c0 45.56-0.34 182.31-0.35 183.68l-0.07 27.62 28.06 0.26c1.29-0.02 129.76 1.19 185.17 1.19zM590.78 276.7c0-86.67 70.12-157.18 156.3-157.18S903.39 190 903.39 276.7s-70.12 157.18-156.31 157.18c-39.22 0-115.39-0.61-156.58-1 0.1-42.66 0.28-123.22 0.28-156.18zM277.06 534.11a212.71 212.71 0 1 0 212.82 212.75c0-45.56 0.34-182.31 0.34-183.68l0.07-27.59-28.06-0.26c-1.28-0.02-129.75-1.22-185.17-1.22z m156.3 212.75c0 86.64-70.12 157.13-156.3 157.13S120.81 833.5 120.81 746.86s70.1-157.18 156.25-157.18c39.22 0 115.4 0.61 156.58 1-0.1 42.66-0.27 123.22-0.27 156.18zM489.88 276.7A212.81 212.81 0 0 0 126.4 126.46a212.74 212.74 0 0 0 150.66 363c55.42 0 183.88-1.2 185.18-1.21l28.06-0.26-0.07-27.59c-0.01-1.4-0.35-138.15-0.35-183.7zM277.06 433.88c-86.16 0-156.25-70.51-156.25-157.18s70.1-157.18 156.25-157.18S433.37 190 433.37 276.7c0 33 0.18 113.52 0.28 156.22-41.19 0.35-117.37 0.96-156.59 0.96zM747.08 534.11c-55.41 0-183.88 1.2-185.18 1.21l-28.06 0.26 0.07 27.59c0 1.38 0.35 138.13 0.35 183.68a212.84 212.84 0 1 0 212.82-212.74z m0 369.88c-86.19 0-156.3-70.49-156.3-157.13 0-33-0.18-113.52-0.28-156.22 41.19-0.35 117.36-1 156.58-1 86.19 0 156.31 70.51 156.31 157.18S833.27 904 747.08 904z" p-id="8726"></path></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/sys.svg b/qqjf-Web/src/icons/svg/sys.svg
new file mode 100644
index 0000000..e854f49
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/sys.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1621487976998" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10630" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M446.475758 660.107444C442.182118 660.107444 437.789395 659.281744 433.561811 657.465204 371.832486 631.240975 331.934666 570.865798 331.934666 503.620797 331.934666 411.538743 406.610966 336.59822 498.428796 336.59822 590.246626 336.59822 664.922926 411.538743 664.922926 503.620797 664.922926 569.874958 626.907702 630.118023 568.051813 657.101897 551.43873 664.698336 531.853129 657.465204 524.223661 640.852122 516.66025 624.272068 523.926409 604.653438 540.506464 597.056999 575.945504 580.807225 598.866933 544.113121 598.866933 503.620797 598.866933 447.935595 553.816746 402.654212 498.428796 402.654212 443.040846 402.654212 397.990659 447.935595 397.990659 503.620797 397.990659 544.311289 422.101097 580.840253 459.422733 596.660663 476.200955 603.827738 484.02859 623.215172 476.894543 639.993394 471.544007 652.544033 459.323649 660.107444 446.475758 660.107444" p-id="10631"></path><path d="M542.851451 996.708967 454.039169 996.708967C408.724758 996.708967 371.865514 959.849723 371.865514 914.56834L371.865514 821.561502C363.245207 818.985318 353.435892 815.847658 344.088969 812.577887L293.622191 863.011637C262.608902 894.057954 208.476016 894.057954 177.462727 863.011637L114.643478 800.225416C82.606322 768.18826 82.606322 716.070081 114.61045 684.032925L138.985112 659.691291C151.899058 646.777345 172.772752 646.777345 185.686698 659.691291 198.600645 672.605238 198.600645 693.478932 185.686698 706.392878L161.345065 730.734512C155.069746 737.042859 155.069746 747.215482 161.345065 753.523829L224.164314 816.31005C228.259786 820.405522 233.048845 821.033054 235.525945 821.033054 238.036073 821.033054 242.792104 820.405522 246.887576 816.31005L312.778429 750.452226C322.686828 740.510799 337.747594 737.934615 350.463372 744.044794 365.788363 751.410037 401.029235 761.41752 413.282622 764.654264 427.81494 768.452484 437.921507 781.564598 437.921507 796.559308L437.921507 914.56834C437.921507 923.419843 445.154638 930.652974 454.039169 930.652974L542.851451 930.652974C551.735982 930.652974 558.936086 923.419843 558.936086 914.56834L558.936086 796.559308C558.936086 780.70587 570.23166 767.065308 585.820875 764.125816 606.463372 760.228512 626.841646 753.457773 646.427248 744.044794 659.143027 737.934615 674.170765 740.510799 684.079164 750.452226L749.970017 816.31005C754.098516 820.405522 758.854548 821.033054 761.331648 821.033054 763.808747 821.033054 768.597807 820.405522 772.726306 816.31005L835.545555 753.523829C841.787847 747.215482 841.787847 737.042859 835.512527 730.734512L769.654703 664.876687C759.746304 654.968288 757.17012 639.841466 763.247271 627.191743 772.66025 607.672197 779.43099 587.293923 783.328293 566.651426 786.267785 551.029183 799.908347 539.733609 815.761786 539.733609L914.647607 539.733609C923.532138 539.733609 930.765269 532.500477 930.765269 523.648974L930.765269 434.803664C930.765269 425.952161 923.532138 418.71903 914.647607 418.71903L815.761786 418.71903C799.908347 418.71903 786.267785 407.423455 783.328293 391.834241 779.43099 371.257799 772.66025 350.846497 763.247271 331.260895 757.17012 318.611173 759.746304 303.48435 769.654703 293.575951L835.545555 227.718127C841.787847 221.409779 841.787847 211.237156 835.512527 204.928809L772.726306 142.142588C768.597807 138.047117 763.808747 137.419585 761.331648 137.419585 758.854548 137.419585 754.098516 138.047117 749.970017 142.142588L684.079164 208.000413C674.170765 217.94184 659.143027 220.518023 646.427248 214.407844 626.841646 204.994865 606.463372 198.224126 585.820875 194.326822 570.23166 191.387331 558.936086 177.746768 558.936086 161.89333L558.936086 82.130719C558.936086 73.246188 551.735982 66.046084 542.851451 66.046084L454.039169 66.046084C445.154638 66.046084 437.921507 73.246188 437.921507 82.130719L437.921507 161.89333C437.921507 177.317404 427.220436 190.759799 412.126642 194.095626 397.495239 197.398426 369.025106 205.490285 350.463372 214.407844 337.747594 220.518023 322.686828 217.94184 312.778429 208.000413L246.920604 142.142588C242.792104 138.047117 238.036073 137.419585 235.525945 137.419585 233.048845 137.419585 228.259786 138.047117 224.164314 142.142588L161.345065 204.928809C155.069746 211.237156 155.069746 221.409779 161.345065 227.718127L227.20289 293.575951C236.913121 303.286182 239.621417 317.950613 233.973629 330.468223 227.665282 344.505122 217.162379 372.810115 213.562327 391.834241 210.622836 407.423455 196.982273 418.71903 181.095807 418.71903L82.209986 418.71903C73.358483 418.71903 66.125352 425.952161 66.125352 434.803664L66.125352 523.648974C66.125352 532.500477 73.358483 539.733609 82.209986 539.733609L111.935183 539.733609C130.166637 539.733609 144.963179 554.497123 144.963179 572.761605 144.963179 591.026087 130.166637 605.789601 111.935183 605.789601L82.209986 605.789601C36.928603 605.789601 0.069359 568.930357 0.069359 523.648974L0.069359 434.803664C0.069359 389.522281 36.928603 352.663037 82.209986 352.663037L155.433054 352.663037C158.405573 342.820694 161.807457 333.176519 165.011173 324.75438L114.643478 274.419714C82.606322 242.382557 82.606322 190.264379 114.61045 158.227222L177.462727 95.441001C208.476016 64.394685 262.608902 64.394685 293.622191 95.441001L343.857773 145.643556C353.336808 142.10956 363.047039 139.004928 371.865514 136.395717L371.865514 82.130719C371.865514 36.849336 408.724758-0.009908 454.039169-0.009908L542.851451-0.009908C588.165862-0.009908 624.992078 36.849336 624.992078 82.130719L624.992078 135.834241C634.537169 138.542536 643.983176 141.713224 653.297071 145.41236L703.26843 95.441001C734.24869 64.394685 788.414605 64.394685 819.427893 95.441001L882.247142 158.227222C914.251271 190.264379 914.251271 242.382557 882.247142 274.419714L832.275784 324.391072C835.941891 333.704967 839.112579 343.150974 841.853903 352.663037L914.647607 352.663037C959.962018 352.663037 996.821262 389.522281 996.821262 434.803664L996.821262 523.648974C996.821262 568.930357 959.962018 605.789601 914.647607 605.789601L841.853903 605.789601C839.112579 615.301664 835.941891 624.747671 832.275784 634.094594L882.247142 684.032925C914.251271 716.070081 914.251271 768.18826 882.247142 800.225416L819.427893 863.011637C788.414605 894.057954 734.281718 894.057954 703.235402 863.011637L653.297071 813.040279C643.983176 816.739414 634.537169 819.910102 624.992078 822.618398L624.992078 914.56834C624.992078 959.849723 588.165862 996.708967 542.851451 996.708967" p-id="10632"></path></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/tab.svg b/qqjf-Web/src/icons/svg/tab.svg
new file mode 100644
index 0000000..b4b48e4
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/tab.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.921.052H49.08c-1.865 0-3.198 1.599-3.198 3.464v6.661c0 1.865 1.6 3.464 3.198 3.464h29.84c1.865 0 3.198-1.599 3.198-3.464V3.516C82.385 1.65 80.786.052 78.92.052zm45.563 0H94.642c-1.865 0-3.464 1.599-3.464 3.464v6.661c0 1.865 1.599 3.464 3.464 3.464h29.842c1.865-.266 3.464-1.599 3.464-3.464V3.516c0-1.865-1.599-3.464-3.464-3.464zm0 22.382H40.02c-1.866 0-3.464-1.599-3.464-3.464V3.516c0-1.865-1.599-3.464-3.464-3.464H3.516C1.65.052.052 1.651.052 3.516V124.75c0 1.598 1.599 3.197 3.464 3.197h120.968c1.865 0 3.464-1.599 3.464-3.464V25.898c0-1.865-1.599-3.464-3.464-3.464z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/table.svg b/qqjf-Web/src/icons/svg/table.svg
new file mode 100644
index 0000000..0e3dc9d
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/table.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/theme.svg b/qqjf-Web/src/icons/svg/theme.svg
new file mode 100644
index 0000000..5982a2f
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/theme.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M125.5 36.984L95.336 2.83C93.735 1.018 91.565 0 89.3 0c-2.263 0-4.433 1.018-6.033 2.83l-3.786 4.286c-1.6 1.812-3.77 2.83-6.032 2.831H54.553c-2.263 0-4.434-1.018-6.033-2.83L44.734 2.83C43.134 1.018 40.964 0 38.701 0c-2.263 0-4.434 1.018-6.034 2.83L2.5 36.984C.9 38.796 0 41.254 0 43.815c0 2.562.899 5.02 2.5 6.831L14.565 64.31c2.178 2.468 5.367 3.403 8.33 2.444 1.35-.435 2.709.592 2.709 2.18v49.407c0 5.313 3.84 9.66 8.532 9.66h59.726c4.693 0 8.532-4.347 8.532-9.66V68.934c0-1.59 1.36-2.616 2.71-2.181 2.962.96 6.15.024 8.329-2.444L125.5 50.646c1.6-1.811 2.499-4.269 2.499-6.83 0-2.563-.899-5.02-2.5-6.832z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/trade.svg b/qqjf-Web/src/icons/svg/trade.svg
new file mode 100644
index 0000000..967197e
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/trade.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1623139067675" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5837" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><defs><style type="text/css"></style></defs><path d="M908.629333 743.765333H257.877333c-19.285333 0-37.376-7.509333-50.858666-21.162666-13.482667-13.653333-20.992-31.573333-20.821334-50.858667l2.389334-479.232c0-19.114667-6.656-31.914667-39.765334-37.205333h-0.170666l-95.573334-16.384c-9.216-1.536-15.530667-10.410667-13.994666-19.626667 1.536-9.216 10.410667-15.530667 19.626666-13.994667l95.402667 16.384c45.397333 7.168 68.437333 31.061333 68.437333 70.997334L220.16 672.085333c0 10.069333 3.754667 19.456 10.922667 26.453334 7.168 7.168 16.554667 11.093333 26.624 11.093333h650.752c9.386667 0 17.066667 7.68 17.066666 17.066667s-7.509333 17.066667-16.896 17.066666z"  p-id="5838"></path><path d="M859.989333 645.802667l-602.624-1.877334c-18.944-0.170667-36.693333-7.509333-50.005333-20.992-13.312-13.482667-20.48-31.232-20.48-50.176l1.877333-353.962666L870.570667 269.653333c30.890667 1.194667 55.125333 26.282667 55.125333 57.173334V580.266667c0 36.181333-29.525333 65.536-65.706667 65.536zM257.706667 609.792l602.453333 1.877333c17.408 0 31.573333-14.165333 31.573333-31.402666V326.826667c0-12.458667-9.898667-22.698667-22.357333-23.04h-0.682667l-645.632-48.128-1.536 317.44c0 9.728 3.754667 18.944 10.581334 25.941333 6.485333 6.826667 15.701333 10.752 25.6 10.752z"  p-id="5839"></path><path d="M324.096 800.085333m-63.658667 0a63.658667 63.658667 0 1 0 127.317334 0 63.658667 63.658667 0 1 0-127.317334 0Z"  p-id="5840"></path><path d="M324.096 880.810667c-44.544 0-80.725333-36.181333-80.725333-80.725334s36.181333-80.725333 80.725333-80.725333c44.544 0 80.725333 36.181333 80.725333 80.725333s-36.181333 80.725333-80.725333 80.725334z m0-127.317334c-25.770667 0-46.592 20.821333-46.592 46.592s20.821333 46.592 46.592 46.592 46.592-20.821333 46.592-46.592-20.821333-46.592-46.592-46.592z"  p-id="5841"></path><path d="M812.714667 800.085333m-63.658667 0a63.658667 63.658667 0 1 0 127.317333 0 63.658667 63.658667 0 1 0-127.317333 0Z"  p-id="5842"></path><path d="M812.714667 880.810667c-44.544 0-80.725333-36.181333-80.725334-80.725334s36.181333-80.725333 80.725334-80.725333 80.725333 36.181333 80.725333 80.725333-36.181333 80.725333-80.725333 80.725334z m0-127.317334c-25.770667 0-46.592 20.821333-46.592 46.592s20.821333 46.592 46.592 46.592 46.592-20.821333 46.592-46.592-20.821333-46.592-46.592-46.592z"  p-id="5843"></path><path d="M710.314667 417.962667H362.496c-9.386667 0-17.066667-7.68-17.066667-17.066667s7.68-17.066667 17.066667-17.066667h347.818667c9.386667 0 17.066667 7.68 17.066666 17.066667s-7.68 17.066667-17.066666 17.066667zM710.314667 516.096H362.496c-9.386667 0-17.066667-7.68-17.066667-17.066667s7.68-17.066667 17.066667-17.066666h347.818667c9.386667 0 17.066667 7.68 17.066666 17.066666s-7.68 17.066667-17.066666 17.066667z"  p-id="5844"></path></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/tree-table.svg b/qqjf-Web/src/icons/svg/tree-table.svg
new file mode 100644
index 0000000..8aafdb8
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/tree-table.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M44.8 0h79.543C126.78 0 128 1.422 128 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H44.8c-2.438 0-3.657-1.422-3.657-4.267V4.267C41.143 1.422 42.362 0 44.8 0zm22.857 48h56.686c2.438 0 3.657 1.422 3.657 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H67.657C65.22 80 64 78.578 64 75.733V52.267C64 49.422 65.219 48 67.657 48zm0 48h56.686c2.438 0 3.657 1.422 3.657 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H67.657C65.22 128 64 126.578 64 123.733v-23.466C64 97.422 65.219 96 67.657 96zM50.286 68.267c2.02 0 3.657-1.91 3.657-4.267 0-2.356-1.638-4.267-3.657-4.267H17.37V32h6.4c2.02 0 3.658-1.91 3.658-4.267V4.267C27.429 1.91 25.79 0 23.77 0H3.657C1.637 0 0 1.91 0 4.267v23.466C0 30.09 1.637 32 3.657 32h6.4v80c0 2.356 1.638 4.267 3.657 4.267h36.572c2.02 0 3.657-1.91 3.657-4.267 0-2.356-1.638-4.267-3.657-4.267H17.37V68.267h32.915z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/tree.svg b/qqjf-Web/src/icons/svg/tree.svg
new file mode 100644
index 0000000..dd4b7dd
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/tree.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M126.713 90.023c.858.985 1.287 2.134 1.287 3.447v29.553c0 1.423-.429 2.6-1.287 3.53-.858.93-1.907 1.395-3.146 1.395H97.824c-1.145 0-2.146-.465-3.004-1.395-.858-.93-1.287-2.107-1.287-3.53V93.47c0-.875.19-1.696.572-2.462.382-.766.906-1.368 1.573-1.806a3.84 3.84 0 0 1 2.146-.657h9.725V69.007a3.84 3.84 0 0 0-.43-1.806 3.569 3.569 0 0 0-1.143-1.313 2.714 2.714 0 0 0-1.573-.492h-36.47v23.149h9.725c1.144 0 2.145.492 3.004 1.478.858.985 1.287 2.134 1.287 3.447v29.553c0 .876-.191 1.696-.573 2.463-.38.766-.905 1.368-1.573 1.806a3.84 3.84 0 0 1-2.145.656H51.915a3.84 3.84 0 0 1-2.145-.656c-.668-.438-1.216-1.04-1.645-1.806a4.96 4.96 0 0 1-.644-2.463V93.47c0-1.313.43-2.462 1.288-3.447.858-.986 1.907-1.478 3.146-1.478h9.582v-23.15h-37.9c-.953 0-1.74.356-2.359 1.068-.62.711-.93 1.56-.93 2.544v19.538h9.726c1.239 0 2.264.492 3.074 1.478.81.985 1.216 2.134 1.216 3.447v29.553c0 1.423-.405 2.6-1.216 3.53-.81.93-1.835 1.395-3.074 1.395H4.29c-.476 0-.93-.082-1.358-.246a4.1 4.1 0 0 1-1.144-.657 4.658 4.658 0 0 1-.93-1.067 5.186 5.186 0 0 1-.643-1.395 5.566 5.566 0 0 1-.215-1.56V93.47c0-.437.048-.875.143-1.313a3.95 3.95 0 0 1 .429-1.15c.19-.328.429-.656.715-.984.286-.329.572-.602.858-.821.286-.22.62-.383 1.001-.493.382-.11.763-.164 1.144-.164h9.726V61.619c0-.985.31-1.833.93-2.544.619-.712 1.358-1.068 2.216-1.068h44.335V39.62h-9.582c-1.24 0-2.288-.492-3.146-1.477a5.09 5.09 0 0 1-1.287-3.448V5.14c0-1.423.429-2.627 1.287-3.612.858-.985 1.907-1.477 3.146-1.477h25.743c.763 0 1.478.246 2.145.739a5.17 5.17 0 0 1 1.573 1.888c.382.766.573 1.587.573 2.462v29.553c0 1.313-.43 2.463-1.287 3.448-.859.985-1.86 1.477-3.004 1.477h-9.725v18.389h42.762c.954 0 1.74.355 2.36 1.067.62.711.93 1.56.93 2.545v26.925h9.582c1.239 0 2.288.492 3.146 1.478z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/user.svg b/qqjf-Web/src/icons/svg/user.svg
new file mode 100644
index 0000000..0ba0716
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/user.svg
@@ -0,0 +1 @@
+<svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/wechat.svg b/qqjf-Web/src/icons/svg/wechat.svg
new file mode 100644
index 0000000..c586e55
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/wechat.svg
@@ -0,0 +1 @@
+<svg width="128" height="110" xmlns="http://www.w3.org/2000/svg"><path d="M86.635 33.334c1.467 0 2.917.113 4.358.283C87.078 14.392 67.58.111 45.321.111 20.44.111.055 17.987.055 40.687c0 13.104 6.781 23.863 18.115 32.209l-4.527 14.352 15.82-8.364c5.666 1.182 10.207 2.395 15.858 2.395 1.42 0 2.829-.073 4.227-.189-.886-3.19-1.398-6.53-1.398-9.996 0-20.845 16.98-37.76 38.485-37.76zm-24.34-12.936c3.407 0 5.665 2.363 5.665 5.954 0 3.576-2.258 5.97-5.666 5.97-3.392 0-6.795-2.395-6.795-5.97 0-3.591 3.403-5.954 6.795-5.954zM30.616 32.323c-3.393 0-6.818-2.395-6.818-5.971 0-3.591 3.425-5.954 6.818-5.954 3.392 0 5.65 2.363 5.65 5.954 0 3.576-2.258 5.97-5.65 5.97z"/><path d="M127.945 70.52c0-19.075-18.108-34.623-38.448-34.623-21.537 0-38.5 15.548-38.5 34.623 0 19.108 16.963 34.622 38.5 34.622 4.508 0 9.058-1.2 13.584-2.395l12.414 7.167-3.404-11.923c9.087-7.184 15.854-16.712 15.854-27.471zm-50.928-5.97c-2.254 0-4.53-2.362-4.53-4.773 0-2.378 2.276-4.771 4.53-4.771 3.422 0 5.665 2.393 5.665 4.771 0 2.41-2.243 4.773-5.665 4.773zm24.897 0c-2.24 0-4.498-2.362-4.498-4.773 0-2.378 2.258-4.771 4.498-4.771 3.392 0 5.665 2.393 5.665 4.771 0 2.41-2.273 4.773-5.665 4.773z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/icons/svg/zip.svg b/qqjf-Web/src/icons/svg/zip.svg
new file mode 100644
index 0000000..f806fc4
--- /dev/null
+++ b/qqjf-Web/src/icons/svg/zip.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.527 116.793c.178.008.348.024.527.024h40.233c4.711-.005 8.53-3.677 8.534-8.21V18.895c-.004-4.532-3.823-8.204-8.534-8.209H79.054c-.179 0-.353.016-.527.024V0L0 10.082v107.406l78.527 10.342v-11.037zm0-101.362c.174-.024.348-.052.527-.052h40.233c2.018 0 3.659 1.578 3.659 3.52v89.713c-.003 1.942-1.64 3.517-3.659 3.519H79.054c-.179 0-.353-.028-.527-.052V15.431zM30.262 75.757l-18.721-.46V72.37l11.3-16.673v-.148l-10.266.164v-4.51l17.504-.44v3.264L18.696 70.76v.144l11.566.176v4.678zm9.419.231l-5.823-.144V50.671l5.823-.144v25.461zm22.255-11.632c-2.168 1.922-5.353 2.76-9.02 2.736-.702.004-1.402-.04-2.097-.131v9.303l-5.997-.148V50.743c1.852-.352 4.473-.647 8.218-.743 3.838-.096 6.608.539 8.48 1.913 1.807 1.306 3.032 3.5 3.032 6.112s-.926 4.833-2.612 6.331h-.004zM53.36 54.45c-.856-.01-1.71.083-2.541.275v7.682c.523.116 1.167.152 2.06.152 3.301-.004 5.36-1.614 5.36-4.314 0-2.425-1.772-3.843-4.875-3.791l-.004-.004zm39.847-37.066h9.564v3.795h-9.564v-3.795zm-9.568 5.68h9.564v3.8h-9.564v-3.8zm9.568 6.216h9.564v3.799h-9.564V29.28zm0 12h9.564v3.794h-9.564V41.28zm-9.568-6.096h9.564v3.795h-9.564v-3.795zm9.472 47.064c2.512 0 4.921-.96 6.697-2.67 1.776-1.708 2.773-4.026 2.772-6.442l-1.748-15.263c0-5.033-2.492-9.112-7.725-9.112-5.232 0-7.72 4.079-7.72 9.112l-1.752 15.263c-.001 2.417.996 4.735 2.773 6.444 1.777 1.71 4.187 2.669 6.7 2.668h.003zm-3.135-16.75h6.27v12.743h-6.27V65.5z"/></svg>
\ No newline at end of file
diff --git a/qqjf-Web/src/main.js b/qqjf-Web/src/main.js
new file mode 100644
index 0000000..dcf3613
--- /dev/null
+++ b/qqjf-Web/src/main.js
@@ -0,0 +1,35 @@
+import Vue from 'vue';
+import App from './App.vue';
+import router from './router';
+import store from './store';
+import Element from 'element-ui';
+import 'element-ui/lib/theme-chalk/index.css';
+import '@/styles/index.scss';
+import './icons';
+import './permission'; // 璺敱瀵艰埅瀹堝崼
+/**
+ * 瑙e喅璺敱鍦板潃鎶ラ敊浣嗘甯歌繍琛�
+ * 姝ゅ鐞嗘柟妗堝彧閽堝浜巚ue-router 3.0浠ヤ笂鐗堟湰
+ */
+import Router from 'vue-router';
+
+const originalPush = Router.prototype.push;
+Router.prototype.push = function push(location) {
+  return originalPush.call(this, location).catch(err => err);
+};
+// import $ from "jquery";
+Vue.config.productionTip = false;
+Vue.use(Element);
+
+//鍔犺浇鍔ㄧ敾
+import Vab from './utils/vab';
+Vue.use(Vab);
+// Vue.use(Element, {
+//   size: Cookies.get('size') || 'medium', // set element-ui default size
+//   locale: enLang // 濡傛灉浣跨敤涓枃锛屾棤闇�璁剧疆锛岃鍒犻櫎
+// })
+new Vue({
+  router,
+  store,
+  render: h => h(App)
+}).$mount('#app');
\ No newline at end of file
diff --git a/qqjf-Web/src/mixins/layout.js b/qqjf-Web/src/mixins/layout.js
new file mode 100644
index 0000000..1658239
--- /dev/null
+++ b/qqjf-Web/src/mixins/layout.js
@@ -0,0 +1,33 @@
+import store from '@/store';
+
+const { body } = document;
+const WIDTH = 992;
+
+export default {
+  beforeMount() {
+    window.addEventListener('resize', this.$_resizeHandler);
+  },
+  beforeDestroy() {
+    window.removeEventListener('resize', this.$_resizeHandler);
+  },
+  mounted() {
+    const isMobile = this.$_isMobile();
+    if (isMobile) {
+      store.dispatch('setting/togglesidebar', false);
+    }
+  },
+
+  methods: {
+    $_isMobile() {
+     
+      const rect = body.getBoundingClientRect();
+      return rect.width - 1 < WIDTH;
+    },
+    $_resizeHandler() {
+      const isMobile = this.$_isMobile();
+      if (isMobile) {
+        store.dispatch('setting/togglesidebar', false);
+      }
+    }
+  }
+};
diff --git a/qqjf-Web/src/mixins/resize.js b/qqjf-Web/src/mixins/resize.js
new file mode 100644
index 0000000..f479ced
--- /dev/null
+++ b/qqjf-Web/src/mixins/resize.js
@@ -0,0 +1,65 @@
+import {
+  debounce
+} from '@/utils/debounce';
+export default {
+  data() {
+    return {
+      myChart: null,
+      resizeHandler: null
+    };
+  },
+  computed: {
+    open() {
+      console.log(this.$store.state.setting.opened);
+      return this.$store.state.setting.opened;
+    }
+  },
+  mounted() {
+    this.resizeHandler = debounce(() => {
+      if (this.myChart) {
+        this.myChart.resize();
+      }
+    }, 100);
+    this.initResizeEvent();
+  },
+
+  methods: {
+    //鐩戝惉resize
+    initResizeEvent() {
+      window.addEventListener('resize', this.resizeHandler);
+    },
+    //绉婚櫎resize
+    destroyResizeEvent() {
+      window.removeEventListener('resize', this.resizeHandler);
+    }
+  },
+
+  beforeDestroy() {
+    this.destroyResizeEvent();
+    if (!this.myChart) {
+      return;
+    }
+    this.myChart.dispose();
+    this.myChart.off('click');
+    this.myChart = null;
+  },
+
+  activated() {
+    this.initResizeEvent();
+    if (this.myChart) {
+      this.myChart.resize();
+    }
+  },
+
+  deactivated() {
+    this.destroyResizeEvent();
+  },
+  watch: {
+    open() {
+      if (this.myChart) {
+        console.log(123);
+        this.myChart.resize();
+      }
+    }
+  }
+};
\ No newline at end of file
diff --git a/qqjf-Web/src/permission.js b/qqjf-Web/src/permission.js
new file mode 100644
index 0000000..8a5b079
--- /dev/null
+++ b/qqjf-Web/src/permission.js
@@ -0,0 +1,134 @@
+import router from './router';
+import store from './store';
+import qs from 'qs';
+import axios from '@/utils/axios';
+import {
+  asyncRoutes,
+  baseRoute
+} from '@/router';
+import NProgress from 'nprogress'; // progress bar
+import 'nprogress/nprogress.css'; // progress bar style
+import {
+  getCache,
+  setCache
+} from '@/utils/sessionStorage';
+import getPageTitle from '@/utils/getPageTitle';
+const _import = require('./router/_import_production'); // 鑾峰彇缁勪欢鐨勬柟娉�
+const _mainImport = require('./router/_import_development');
+
+import Layout from '@/Layout';
+
+let getRouter = ''; // 鐢ㄦ潵鑾峰彇鍚庡彴鎷垮埌鐨勮矾鐢�
+NProgress.configure({
+  showSpinner: false
+}); // NProgress Configuration
+let _this = this;
+router.beforeEach(async (to, from, next) => {
+  document.title = to.meta.title + ' - 鏅鸿兘鍖栫珛浣撳簱绠$悊绯荤粺';
+  NProgress.start();
+  const isLogin = getCache('userInfo');
+  if (to.path == '/Login') {
+    getRouter = '';
+
+    next();
+  } else {
+    if (!JSON.stringify(isLogin)) {
+      getRouter = '';
+      next('/Login');
+      NProgress.done();
+    } else {
+      if (store.state.permission.addRoutes.length > 0) {
+        NProgress.done();
+        next();
+      } else {
+        axios
+          .post(
+            '/Permission/GetUserRolePermission',
+            qs.stringify({
+              roleName: isLogin.roleName,
+              type: 1
+            })
+          )
+          .then(res => {
+            if (res.code == 0) {
+              let data = res.data || [];
+              let Didproject = null;
+              data.filter((item, index) => {
+                if (item.name == 'Didproject') {
+                  Didproject = item;
+                  Didproject.meta.affix = true;
+                  return data.splice(index, 1);
+                }
+              });
+              data.unshift(Didproject);
+              let baserouter = routerchildren(res.data);
+
+              let layer = [{
+                path: '/',
+                redirect: '/Didproject',
+                children: baserouter
+              }];
+
+              getRouter = layer;
+              routerGo(to, next); // 鎵ц璺敱璺宠浆鏂规硶
+            }
+          });
+      }
+    }
+  }
+});
+
+// router.
+//杩囨护璺敱涓殑children
+function routerchildren(basrouter) {
+  basrouter.filter(item => {
+    if (item.children == null) {
+      delete item.children;
+    } else if (item.children.length > 0) {
+      routerchildren(item.children);
+    }
+    return true;
+  });
+  return basrouter;
+}
+
+function routerGo(to, next) {
+  getRouter = filterAsyncRouter(getRouter); // 杩囨护璺敱
+
+  console.log(getRouter);
+
+  setCache('baserouter', getRouter);
+  console.log(getRouter);
+  global.addRoutes = getRouter; // 灏嗚矾鐢辨暟鎹紶閫掔粰鍏ㄥ眬鍙橀噺锛屽仛渚ц竟鏍忚彍鍗曟覆鏌撳伐浣�
+  store.dispatch('permission/generateRoutes', getRouter);
+  router.addRoutes(getRouter); // 鍔ㄦ�佹坊鍔犺矾鐢�
+
+  next({
+    ...to,
+    replace: true
+  });
+}
+
+function filterAsyncRouter(asyncRouterMap) {
+  // 閬嶅巻鍚庡彴浼犳潵鐨勮矾鐢卞瓧绗︿覆锛岃浆鎹负缁勪欢瀵硅薄
+  asyncRouterMap.forEach(route => {
+    if (route.path) {
+      if (route.path == '/') {
+        route.component = _mainImport('Layout');
+      } else {
+        route.component = _import(route.path);
+      }
+    } else {
+      route.path = '/test';
+    }
+    if (route.children && route.children.length > 0) {
+      route.children = filterAsyncRouter(route.children);
+    }
+  });
+
+  return asyncRouterMap;
+}
+router.afterEach(() => {
+  // finish progress bar
+  NProgress.done();
+});
\ No newline at end of file
diff --git a/qqjf-Web/src/plugins/cdn.js b/qqjf-Web/src/plugins/cdn.js
new file mode 100644
index 0000000..f7f1800
--- /dev/null
+++ b/qqjf-Web/src/plugins/cdn.js
@@ -0,0 +1,11 @@
+const VueCDN = 'https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js';
+const AxiosCDN = 'https://cdn.bootcdn.net/ajax/libs/axios/0.21.0/axios.min.js';
+const VueRouterCDN = 'https://cdn.bootcdn.net/ajax/libs/vue-router/3.2.0/vue-router.min.js';
+const VuexCDN = 'https://cdn.bootcdn.net/ajax/libs/vuex/3.5.1/vuex.min.js';
+
+module.exports = {
+  VueCDN,
+  AxiosCDN,
+  VueRouterCDN,
+  VuexCDN
+};
diff --git a/qqjf-Web/src/plugins/mapServer.js b/qqjf-Web/src/plugins/mapServer.js
new file mode 100644
index 0000000..d4eb452
--- /dev/null
+++ b/qqjf-Web/src/plugins/mapServer.js
@@ -0,0 +1,5 @@
+// const salineLand = 'http://59.110.28.240:6080/arcgis/rest/services/YJD/YBSFQDK_2018_1_1/MapServer';
+
+module.exports = {
+  // salineLand
+};
diff --git a/qqjf-Web/src/router/_import_development.js b/qqjf-Web/src/router/_import_development.js
new file mode 100644
index 0000000..da6126f
--- /dev/null
+++ b/qqjf-Web/src/router/_import_development.js
@@ -0,0 +1,3 @@
+// module.exports = file => () => import('@' + file )
+module.exports = file => () => import(/* webpackChunkName: "chunkName" */  `@/${file}` )
+
diff --git a/qqjf-Web/src/router/_import_production.js b/qqjf-Web/src/router/_import_production.js
new file mode 100644
index 0000000..0857818
--- /dev/null
+++ b/qqjf-Web/src/router/_import_production.js
@@ -0,0 +1,2 @@
+// module.exports = file => () => import('@/views' + file + '/index.vue')
+module.exports = file => () => import(/* webpackChunkName: "chunkName" */  `@/views${file}/index.vue`)
\ No newline at end of file
diff --git a/qqjf-Web/src/router/index.js b/qqjf-Web/src/router/index.js
new file mode 100644
index 0000000..a0f30a6
--- /dev/null
+++ b/qqjf-Web/src/router/index.js
@@ -0,0 +1,140 @@
+import Vue from 'vue';
+import VueRouter from 'vue-router';
+import BasRoute from './modules/base';
+import Layout from '@/Layout';
+Vue.use(VueRouter);
+
+export const baseRoute = [{
+    name: 'login',
+    path: '/login',
+    meta: {
+      title: '鐧诲綍'
+    },
+    component: () => import('@/views/login/index')
+  },
+  {
+    name: 'home',
+    path: '/home',
+    component: () => import('@/views/Home/index')
+  },
+  {
+    name: 'taskbeat',
+    path: '/taskbeat',
+    meta: {
+      title: '浠诲姟鑺傛媿'
+    },
+    component: () => import('@/views/dataview/taskbeat.vue')
+  },
+  {
+    name: 'classified',
+    path: '/classified',
+    meta: {
+      title: '鍒嗙被缁熻'
+    },
+    component: () => import('@/views/dataview/classified.vue')
+  },
+  {
+    name: 'movablerate',
+    path: '/movablerate',
+    meta: {
+      title: '璁惧鍙姩'
+    },
+    component: () => import('@/views/dataview/movablerate.vue')
+  },
+  {
+    name: 'product',
+    path: '/product',
+    meta: {
+      title: '鍦ㄥ埗鍝佽祫閲�'
+    },
+    component: () => import('@/views/dataview/product.vue')
+  },
+  {
+    name: 'rateequipment',
+    path: '/rateequipment',
+    meta: {
+      title: '璁惧鍒╃敤鐜�'
+    },
+    component: () => import('@/views/dataview/rateequipment.vue')
+  },
+  {
+    name: 'tasktime',
+    path: '/tasktime',
+    meta: {
+      title: '骞冲潎鏃堕暱'
+    },
+    component: () => import('@/views/dataview/tasktime.vue')
+  },
+  {
+    name: 'turnover',
+    path: '/turnover',
+    meta: {
+      title: '鍒朵欢鍛ㄨ浆'
+    },
+    component: () => import('@/views/dataview/turnover.vue')
+  },
+  {
+    name: 'warehouse',
+    path: '/warehouse',
+    meta: {
+      title: '璐ф牸鍒╃敤鐜�'
+    },
+    component: () => import('@/views/dataview/warehouse.vue')
+  },
+  {
+    name: 'statelibrary',
+    path: '/statelibrary',
+    meta: {
+      title: '绔嬪簱鎬昏'
+    },
+    component: () => import('@/views/dataview/statelibrary.vue')
+  },
+  {
+    name: 'workpiece',
+    path: '/workpiece',
+    meta: {
+      title: '鍒朵欢鎬昏'
+    },
+    component: () => import('@/views/dataview/workpiece.vue')
+  },
+  {
+    name: 'output',
+    path: '/output',
+    meta: {
+      title: '闆朵欢鍑哄叆搴�'
+    },
+    component: () => import('@/views/dataview/output.vue')
+  }
+];
+
+export const asyncRoutes = [{
+  path: '/',
+  component: Layout,
+  redirect: '/Didproject',
+  children: BasRoute
+}];
+// const router = new VueRouter({
+//   // base: process.env.BASE_URL,
+//   routes:baseRoute
+// });
+// const router = new VueRouter({
+//   // base: process.env.BASE_URL,
+//   routes:baseRoute
+// });
+const createRouter = function () {
+  return new VueRouter({
+    routes: baseRoute
+  });
+};
+const router = createRouter();
+export function resetRouter() {
+  router.matcher = createRouter().matcher;
+}
+//閲嶅畾鍚戞椂鎶ラ敊锛岀敤杩欎釜涓嶈浠栨姤閿�
+const originalPush = VueRouter.prototype.push;
+VueRouter.prototype.push = function push(location, onResolve, onReject) {
+  if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject);
+  return originalPush.call(this, location).catch(err => err);
+};
+
+export default router;
\ No newline at end of file
diff --git a/qqjf-Web/src/router/modules/base.js b/qqjf-Web/src/router/modules/base.js
new file mode 100644
index 0000000..edbf55c
--- /dev/null
+++ b/qqjf-Web/src/router/modules/base.js
@@ -0,0 +1,379 @@
+import { role } from '@/components/tableContainer/tableHead'
+
+const baseRoute=[
+    {
+        path:'/Didproject',
+        name:'Didproject',
+        meta:{
+            title:'棣栭〉',
+            icon:'homePage',
+            roles: [],
+            affix: true
+        },
+        component:()=>import('@/views/Didproject/index')
+    },
+    {
+        path: '/inbound',
+        name: 'inbound',
+        meta: {
+            title: '鍏ュ簱',
+            icon: 'inbound',
+            roles:[]
+        },
+        component: () => import('@/views/inbound/index'),
+        children: [
+            {
+                path: '/inbound/purchase',
+                name: 'purchase',
+                meta: {
+                    title: '鍏ュ簱绠$悊',
+                    icon: '',
+                    roles:[]
+                },
+                component: () => import('@/views/inbound/purchase/index'),
+                children: [
+                    {
+                        path: '/inbound/purchase/quotation',
+                        name: 'quotation',
+                        meta: {
+                            title: '鍐插帇鐢熶骇璁″垝',
+                            icon: '',
+                            roles:[]
+                        },
+                        component: () => import('@/views/inbound/purchase/quotation/index'),
+                    },
+                    {
+                        path: '/inbound/purchase/enter',
+                        name: 'enter',
+                        meta: {
+                            title: '缁勭洏鍏ュ簱',
+                            icon: '',
+                            roles:[]
+                        },
+                        component: () => import('@/views/inbound/purchase/enter/index'),
+                    },
+                    {
+                        path: '/inbound/purchase/intype',
+                        name: 'intype',
+                        meta: {
+                            title: '鍏ュ簱绫诲瀷',
+                            icon: '',
+                            roles:[]
+                        },
+                        component: () => import('@/views/inbound/purchase/intype/index'),
+                    },
+                ]
+            }
+        ]
+    },
+    {
+        path: '/outbound',
+        name: 'outbound',
+        meta: {
+            title: '鍑哄簱',
+            icon: 'inbound',
+            roles:[]
+        },
+        component: () => import('@/views/outbound/index'),
+        children: [
+            {
+                path: '/outbound/regulator',
+                name: 'regulator',
+                meta: {
+                    title: '鍑哄簱绠$悊',
+                    icon: '',
+                    roles:[]
+                },
+                component: () => import('@/views/outbound/regulator/index'),
+                children: [
+                    {
+                        path: '/outbound/regulator/plant',
+                        name: 'plant',
+                        meta: {
+                            title: '鍑哄簱璁″垝',
+                            icon: '',
+                            roles:[]
+                        },
+                        component: () => import('@/views/outbound/regulator/plant/index'),
+                    }
+                ]
+            }
+        ]
+    },
+    {
+        path:'/task',
+        name:'task',
+        meta:{
+            title:'浠诲姟',
+            icon:'storage',
+            roles: [],
+        },
+        component: () => import('@/views/task/index'),
+        children: [
+           
+            {
+                path:'/task/maintask',
+                name:'maintask',
+                meta:{
+                    title:'涓讳换鍔�',
+                    icon:'',
+                    roles: []
+                },
+                component: () => import('@/views/task/maintask/index'),
+                
+            },
+            {
+                path: '/task/forklifttasks',
+                name:'forklifttasks',
+                meta:{
+                    title:'鍙夎溅浠诲姟',
+                    icon:'',
+                    roles: [],
+                },
+                component:()=>import('@/views/task/forklifttasks/index')
+              
+          },
+            {
+                path: '/task/taskrecord',
+                name:'taskrecord',
+                meta:{
+                    title:'浠诲姟璁板綍',
+                    icon:'',
+                    roles: [],
+                },
+                component:()=>import('@/views/task/taskrecord/index')
+                
+            },
+            {
+                path: '/task/taskdocuments',
+                name:'taskdocuments',
+                meta:{
+                    title:'浠诲姟鍗曟嵁',
+                    icon:'',
+                    roles: [],
+                },
+                component:()=>import('@/views/task/taskdocuments/index')
+                
+            },
+        ]
+    },
+    {
+        path:'/storage',
+        name:'storage',
+        meta:{
+            title:'浠撳偍',
+            icon:'storage',
+            roles:[]
+        },
+        component: () => import('@/views/storage/index'),
+        children: [
+            {
+                path:'/storage/setting',
+                name:'user',
+                meta:{
+                    title:'鍩虹璁剧疆',
+                    icon:'',
+                    roles:[]
+                },
+                component: () => import('@/views/storage/setting/index'),
+                children: [
+                
+                    {
+                        path:'/storage/setting/position',
+                        name:'position',
+                        meta:{
+                            title:'搴撲綅绠$悊',
+                            icon:'',
+                            roles:[]
+                        },
+                        component: () => import('@/views/storage/setting/position/index'),
+                    },
+                    {
+                        path:'/storage/setting/palte',
+                        name:'palte',
+                        meta:{
+                            title:'鍣ㄥ叿绠$悊',
+                            icon:'',
+                            roles:[]
+                        },
+                        component: () => import('@/views/storage/setting/palte/index'),
+                    },
+                    // {
+                    //     path:'/storage/setting/storage-area',
+                    //     name:'storage-area',
+                    //     meta:{
+                    //         title:'搴撳尯绠$悊',
+                    //         icon:'',
+                    //         roles:[]
+                    //     },
+                    //     component: () => import('@/views/storage/setting/storage-area/index'),
+                    // },
+                    {
+                        path:'/storage/setting/choose',
+                        name:'choose',
+                        meta:{
+                            title:'闆朵欢绠$悊',
+                            icon:'',
+                            roles:[]
+                        },
+                        component: () => import('@/views/storage/setting/choose/index'),
+                    },
+                    {
+                        path:'/storage/setting/cass-line',
+                        name:'cass-line',
+                        meta:{
+                            title:'鐝嚎绠$悊',
+                            icon:'',
+                            roles:[]
+                        },
+                        component: () => import('@/views/storage/setting/cass-line/index'),
+                    },
+                    {
+                        path:'/storage/setting/forklift',
+                        name:'forklift',
+                        meta:{
+                            title:'鍙夎溅绠$悊',
+                            icon:'',
+                            roles:[]
+                        },
+                        component: () => import('@/views/storage/setting/forklift/index'),
+                    },
+                ]
+            },
+            {
+                path:'/storage/base',
+                name:'base',
+                meta:{
+                    title:'搴撳瓨鐘跺喌',
+                    icon:'',
+                    roles:[]
+                },
+                component: () => import('@/views/storage/base/index'),
+                children: [
+                    {
+                        path:'/storage/base/inventory',
+                        name:'inventory',
+                        meta:{
+                            title:'搴撳瓨绠$悊',
+                            icon:'',
+                            roles:[]
+                        },
+                        component: () => import('@/views/storage/base/inventory/index'),
+                    }
+                ]
+            }
+        ]
+    },
+    {
+        path: '/basicInfo',
+        name: 'basicInfo',
+        meta: {
+            title: "璁惧",
+            icon:'storage',
+            roles:[]
+        },
+        component: () => import('@/views/basicInfo/index'),
+        children: [
+            {
+                path: '/basicInfo/base',
+                name: 'base',
+                meta: {
+                    title: '璁惧绠$悊',
+                    roles:[]
+                },
+                component: () => import('@/views/basicInfo/base/index'),
+                children: [
+                    {
+                        path: '/basicInfo/base/stacker',
+                        name: 'stacker',
+                        meta: {
+                            title: '璁惧',
+                            roles:[]
+                        },
+                        component: () => import('@/views/basicInfo/base/stacker/index')
+                        
+                    },
+                    {
+                        path: '/basicInfo/base/warning',
+                        name: 'warning',
+                        meta: {
+                            title: '鎶ヨ淇℃伅',
+                            roles:[]
+                        },
+                        component: () => import('@/views/basicInfo/base/warning/index')
+                        
+                    }
+                ]
+            }
+        ]
+    },
+    {
+        path:'/System',
+        name:'System',
+        meta:{
+            title:'绯荤粺',
+            icon:'sys',
+            roles:[]
+        },
+        component: () => import('@/views/system/index'),
+        children: [
+            {
+                path:'/System/user',
+                name:'user',
+                meta:{
+                    title:'鐢ㄦ埛鍙婃潈闄�',
+                    icon:'',
+                    roles:[]
+                },
+                component: () => import('@/views/system/user/index'),
+                children: [
+                    {
+                        path:'/System/user/manage',
+                        name:'manage',
+                        meta:{
+                            title:'鐢ㄦ埛绠$悊',
+                            icon:'',
+                            roles:[]
+                        },
+                        component: () => import('@/views/system/user/manage/index'),
+                    },
+                    {
+                        path:'/System/user/dept',
+                        name:'dept',
+                        meta:{
+                            title:'閮ㄩ棬绠$悊',
+                            icon:'',
+                            roles:[]
+                        },
+                        component: () => import('@/views/system/user/dept/index'),
+                    },
+                    {
+                        path:'/System/user/role',
+                        name:'role',
+                        meta:{
+                            title:'瑙掕壊绠$悊',
+                            icon:'',
+                            roles:[]
+                        },
+                        component: () => import('@/views/system/user/role/index'),
+                    },
+                    {
+                        path:'/System/user/roleAuth',
+                        name:'roleAuth',
+                        meta:{
+                            title:'瑙掕壊鏉冮檺璁剧疆',
+                            icon:'',
+                            roles:[]
+                        },
+                        component: () => import('@/views/system/user/roleAuth/index'),
+                    },
+                ]
+            }
+        ]
+       
+    },
+   
+
+
+]
+export default baseRoute
\ No newline at end of file
diff --git a/qqjf-Web/src/settings.js b/qqjf-Web/src/settings.js
new file mode 100644
index 0000000..c28c298
--- /dev/null
+++ b/qqjf-Web/src/settings.js
@@ -0,0 +1,43 @@
+/*
+ * @Author       : gy
+ * @Date         : 2020-06-27 20:27:39
+ * @LastEditors  : gy
+ * @LastEditTime : 2020-06-27 20:49:59
+ * @FilePath     : /code/src/settings.js
+ * @Description  : 椤甸潰鎻忚堪
+ */
+module.exports = {
+  title: '鏅鸿兘鍖栫珛浣撳簱绠$悊绯荤粺',
+
+  /**
+   * @type {boolean} true | false
+   * @description Whether show the settings right-panel
+   */
+  showSettings: false,
+
+  /**
+   * @type {boolean} true | false
+   * @description Whether need tagsView
+   */
+  tagsView: false,
+
+  /**
+   * @type {boolean} true | false
+   * @description Whether fix the header
+   */
+  fixedHeader: false,
+
+  /**
+   * @type {boolean} true | false
+   * @description Whether show the logo in sidebar
+   */
+  sidebarLogo: false,
+
+  /**
+   * @type {string | array} 'production' | ['production', 'development']
+   * @description Need show err logs component.
+   * The default is only used in the production env
+   * If you want to also use it in dev, you can pass ['production', 'development']
+   */
+  errorLog: 'production'
+}
diff --git a/qqjf-Web/src/store/getters.js b/qqjf-Web/src/store/getters.js
new file mode 100644
index 0000000..08784aa
--- /dev/null
+++ b/qqjf-Web/src/store/getters.js
@@ -0,0 +1,7 @@
+const getters = {
+    token: state => state.user.token,
+    sidebar: state => state.setting.opened,
+    visitedViews: state => state.tagsView.visitedViews,
+    cachedViews: state => state.tagsView.cachedViews,
+}
+export default getters
\ No newline at end of file
diff --git a/qqjf-Web/src/store/index.js b/qqjf-Web/src/store/index.js
new file mode 100644
index 0000000..a479886
--- /dev/null
+++ b/qqjf-Web/src/store/index.js
@@ -0,0 +1,26 @@
+import Vue from "vue";
+import Vuex from "vuex";
+import getters from './getters'
+
+Vue.use(Vuex);
+
+// https://webpack.js.org/guides/dependency-management/#requirecontext
+const modulesFiles = require.context('./modules', true, /\.js$/)
+
+// you do not need `import app from './modules/app'`
+// it will auto require all vuex module from modules file
+const modules = modulesFiles.keys().reduce((modules, modulePath) => {
+  // set './app.js' => 'app'
+  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
+  const value = modulesFiles(modulePath)
+  modules[moduleName] = value.default
+  return modules
+}, {})
+
+
+const store = new Vuex.Store({
+  modules,
+  getters
+})
+
+export default store
diff --git a/qqjf-Web/src/store/modules/permission.js b/qqjf-Web/src/store/modules/permission.js
new file mode 100644
index 0000000..0e31414
--- /dev/null
+++ b/qqjf-Web/src/store/modules/permission.js
@@ -0,0 +1,53 @@
+import { asyncRoutes, baseRoute } from '@/router'
+import { getCache,setCache } from '@/utils/sessionStorage';
+function hasPermission(roles, route) {
+  if (route.meta && route.meta.roles) {
+    return roles.some(role => route.meta.roles.includes(role))
+  } else {
+    return true
+  }
+}
+
+export function filterAsyncRoutes(routes, roles) {
+  const res = []
+
+  routes.forEach(route => {
+    const tmp = { ...route }
+    if (hasPermission(roles, tmp)) {
+      if (tmp.children) {
+        tmp.children = filterAsyncRoutes(tmp.children, roles)
+      }
+      res.push(tmp)
+    }
+  })
+
+  return res
+}
+
+const state = {
+  routes: [],
+  addRoutes: []
+}
+
+const mutations = {
+  SET_ROUTES: (state, routes) => {
+    state.addRoutes = routes
+    state.routes = baseRoute.concat(routes)
+  }
+}
+
+const actions = {
+  generateRoutes({ commit }, roles) {
+    
+
+      commit('SET_ROUTES', roles)
+
+  }
+}
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions
+}
diff --git a/qqjf-Web/src/store/modules/setting.js b/qqjf-Web/src/store/modules/setting.js
new file mode 100644
index 0000000..41c5bc2
--- /dev/null
+++ b/qqjf-Web/src/store/modules/setting.js
@@ -0,0 +1,22 @@
+import {getCache,setCache} from '@/utils/sessionStorage'
+const state ={
+    opened:getCache('SIDEBAR_OPENED')?JSON.parse(getCache('SIDEBAR_OPENED')):false
+}
+const mutations={
+    TOGGLE_SIDEBAR:state=>{
+        state.opened =!state.opened
+        setCache('SIDEBAR_OPENED',state.opened)
+    }
+}
+const actions={
+    togglesidebar({ commit }) {
+   
+        commit('TOGGLE_SIDEBAR')
+    }
+}
+export default{
+    namespaced: true,
+    state,
+    mutations,
+    actions
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/store/modules/tagsView.js b/qqjf-Web/src/store/modules/tagsView.js
new file mode 100644
index 0000000..2f5a5c7
--- /dev/null
+++ b/qqjf-Web/src/store/modules/tagsView.js
@@ -0,0 +1,195 @@
+const state = {
+  visitedViews: [],
+  cachedViews: []
+};
+
+const mutations = {
+  ADD_VISITED_VIEW: (state, view) => {
+    if (state.visitedViews.some(v => v.path === view.path)) return;
+    state.visitedViews.push(
+      Object.assign({}, view, {
+        title: view.meta.title || 'no-name'
+      })
+    );
+  },
+  ADD_CACHED_VIEW: (state, view) => {
+    if (state.cachedViews.includes(view.name)) return;
+    if (!view.meta.noCache) {
+      state.cachedViews.push(view.name);
+    }
+  },
+
+  DEL_VISITED_VIEW: (state, view) => {
+    for (const [i, v] of state.visitedViews.entries()) {
+      if (v.path === view.path) {
+        state.visitedViews.splice(i, 1);
+        break;
+      }
+    }
+  },
+  DEL_CACHED_VIEW: (state, view) => {
+    const index = state.cachedViews.indexOf(view.name);
+    index > -1 && state.cachedViews.splice(index, 1);
+  },
+
+  DEL_OTHERS_VISITED_VIEWS: (state, view) => {
+    state.visitedViews = state.visitedViews.filter(v => {
+      return v.meta.affix || v.path === view.path;
+    });
+  },
+  DEL_OTHERS_CACHED_VIEWS: (state, view) => {
+    const index = state.cachedViews.indexOf(view.name);
+    if (index > -1) {
+      state.cachedViews = state.cachedViews.slice(index, index + 1);
+    } else {
+      // if index = -1, there is no cached tags
+      state.cachedViews = [];
+    }
+  },
+
+  DEL_ALL_VISITED_VIEWS: state => {
+    // keep affix tags
+    const affixTags = state.visitedViews.filter(tag => tag.meta.affix);
+    state.visitedViews = affixTags;
+  },
+  DEL_ALL_CACHED_VIEWS: state => {
+    state.cachedViews = [];
+  },
+
+  UPDATE_VISITED_VIEW: (state, view) => {
+    for (let v of state.visitedViews) {
+      if (v.path === view.path) {
+        v = Object.assign(v, view);
+        break;
+      }
+    }
+  }
+};
+
+const actions = {
+  addView({
+    dispatch
+  }, view) {
+    dispatch('addVisitedView', view);
+    dispatch('addCachedView', view);
+  },
+  addVisitedView({
+    commit
+  }, view) {
+    commit('ADD_VISITED_VIEW', view);
+  },
+  addCachedView({
+    commit
+  }, view) {
+    commit('ADD_CACHED_VIEW', view);
+  },
+
+  delView({
+    dispatch,
+    state
+  }, view) {
+    return new Promise(resolve => {
+      dispatch('delVisitedView', view);
+      dispatch('delCachedView', view);
+      resolve({
+        visitedViews: [...state.visitedViews],
+        cachedViews: [...state.cachedViews]
+      });
+    });
+  },
+  delVisitedView({
+    commit,
+    state
+  }, view) {
+    return new Promise(resolve => {
+      commit('DEL_VISITED_VIEW', view);
+      resolve([...state.visitedViews]);
+    });
+  },
+  delCachedView({
+    commit,
+    state
+  }, view) {
+    return new Promise(resolve => {
+      commit('DEL_CACHED_VIEW', view);
+      resolve([...state.cachedViews]);
+    });
+  },
+
+  delOthersViews({
+    dispatch,
+    state
+  }, view) {
+    return new Promise(resolve => {
+      dispatch('delOthersVisitedViews', view);
+      dispatch('delOthersCachedViews', view);
+      resolve({
+        visitedViews: [...state.visitedViews],
+        cachedViews: [...state.cachedViews]
+      });
+    });
+  },
+  delOthersVisitedViews({
+    commit,
+    state
+  }, view) {
+    return new Promise(resolve => {
+      commit('DEL_OTHERS_VISITED_VIEWS', view);
+      resolve([...state.visitedViews]);
+    });
+  },
+  delOthersCachedViews({
+    commit,
+    state
+  }, view) {
+    return new Promise(resolve => {
+      commit('DEL_OTHERS_CACHED_VIEWS', view);
+      resolve([...state.cachedViews]);
+    });
+  },
+
+  delAllViews({
+    dispatch,
+    state
+  }, view) {
+    return new Promise(resolve => {
+      dispatch('delAllVisitedViews', view);
+      dispatch('delAllCachedViews', view);
+      resolve({
+        visitedViews: [...state.visitedViews],
+        cachedViews: [...state.cachedViews]
+      });
+    });
+  },
+  delAllVisitedViews({
+    commit,
+    state
+  }) {
+    return new Promise(resolve => {
+      commit('DEL_ALL_VISITED_VIEWS');
+      resolve([...state.visitedViews]);
+    });
+  },
+  delAllCachedViews({
+    commit,
+    state
+  }) {
+    return new Promise(resolve => {
+      commit('DEL_ALL_CACHED_VIEWS');
+      resolve([...state.cachedViews]);
+    });
+  },
+
+  updateVisitedView({
+    commit
+  }, view) {
+    commit('UPDATE_VISITED_VIEW', view);
+  }
+};
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions
+};
\ No newline at end of file
diff --git a/qqjf-Web/src/store/modules/user.js b/qqjf-Web/src/store/modules/user.js
new file mode 100644
index 0000000..5eb0430
--- /dev/null
+++ b/qqjf-Web/src/store/modules/user.js
@@ -0,0 +1,46 @@
+import { login } from '@/api/register'
+import {resetRouter } from '@/router';
+import { getCache, setCache, removeAll } from '@/utils/sessionStorage'
+// import { reject, resolve } from 'core-js/fn/promise'
+import baserouter from '@/router/modules/base'
+
+const state = {
+    token: getCache(),
+    name: '',
+    avatar: '',
+    introduction: '',
+    roles: []
+}
+
+const mutations={
+    SET_TOKEN: (state, token) => {
+        state.token = token
+    },
+}
+
+const actions={
+    login({},userInfo){
+        const {username,password}=userInfo
+        return new Promise((resolve, reject) => {
+            login({ userName: username, password: password }).then(res=>{
+                
+                // setCache('baserouter',baserouter)
+                resolve(res)
+            })
+            
+        })
+    },
+    logout(){
+        return new Promise((resolve,reject)=>{
+            removeAll()
+            resetRouter();
+            resolve()
+        })
+    }
+}
+export default {
+    namespaced: true,
+    state,
+    mutations,
+    actions
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/styles/elemen-ui.scss b/qqjf-Web/src/styles/elemen-ui.scss
new file mode 100644
index 0000000..cd378a3
--- /dev/null
+++ b/qqjf-Web/src/styles/elemen-ui.scss
@@ -0,0 +1,4 @@
+.el-menu {
+    // background-color: unset !important;
+    border-right: unset !important;
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/styles/index.scss b/qqjf-Web/src/styles/index.scss
new file mode 100644
index 0000000..93a18af
--- /dev/null
+++ b/qqjf-Web/src/styles/index.scss
@@ -0,0 +1,705 @@
+@import './variables.scss';
+@import './sidebar.scss';
+@import './elemen-ui.scss';
+@import './transition.scss';
+@import './innner-circles.scss';
+
+body {
+  height: 100%;
+  margin: 0;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  text-rendering: optimizeLegibility;
+  font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
+  overflow: hidden;
+}
+
+html {
+  height: 100%;
+  box-sizing: border-box;
+}
+
+#app {
+  height: 100%;
+}
+
+@font-face {
+  font-family: time_new_Roma;
+  src: url(../assets//css/TimesNewRomanPSMT24163565.ttf);
+}
+
+p {
+  margin: 0;
+  padding: 0;
+}
+
+.height {
+  height: 100%;
+}
+
+.height80px {
+  height: 90px;
+}
+
+.height97 {
+  height: 97%
+}
+
+.height99 {
+  height: 99%;
+}
+
+.height94 {
+  height: 94%;
+}
+
+.height92 {
+  height: 92%;
+}
+
+.height82 {
+  height: 82%;
+}
+
+.height74 {
+  height: 74%;
+}
+
+.height57 {
+  height: 57%;
+}
+
+.height65 {
+  height: 65%;
+}
+
+.height30 {
+  height: 30%;
+}
+
+.height45 {
+  height: 45%;
+}
+
+.height48 {
+  height: 48%;
+}
+
+.height250 {
+  height: 250px;
+}
+
+.height-calc {
+  height: calc(100% - 65px);
+}
+
+.height-calc55 {
+  height: calc(100% - 55px);
+}
+
+.height-calc40 {
+  height: calc(100% - 40px);
+}
+
+.applyheight {
+  height: calc(100% - 120px);
+}
+
+.height-calc90 {
+  height: calc(100% - 100px);
+}
+
+.height-calc190 {
+  height: calc(100% - 190px);
+}
+
+.height-calc280 {
+  height: calc(100% - 280px);
+}
+
+.height-calc300 {
+  height: calc(100% - 300px);
+
+}
+
+.heightclacimport {
+  height: calc(100% - 27px) !important;
+}
+
+.minheight {
+  min-height: 1rem;
+}
+
+.width {
+  width: 100%;
+}
+
+.width120 {
+  width: 120px;
+}
+
+.width60 {
+  width: 60px;
+}
+
+.width7rem {
+  width: 7rem;
+}
+
+.width20 {
+  width: 20%;
+}
+
+.width80 {
+  width: 80%;
+}
+
+.width85 {
+  width: 85%;
+}
+
+.widthimportant {
+  width: 100% !important;
+}
+
+.width98 {
+  width: 98%;
+}
+
+.width99 {
+  width: 99%;
+}
+
+.width96 {
+  width: 96%;
+}
+
+.width94 {
+  width: 94%;
+}
+
+.width90 {
+  width: 90%;
+}
+
+.width25 {
+  width: 25%;
+}
+
+.width24 {
+  width: 24%;
+}
+
+.width20 {
+  width: 20%;
+}
+
+.width10 {
+  width: 10%;
+}
+
+.width12 {
+  width: 12%;
+}
+
+.width15 {
+  width: 15%;
+}
+
+.width30 {
+  width: 30%;
+}
+
+.width35 {
+  width: 35%;
+}
+
+.width45 {
+  width: 45%;
+}
+
+.width40 {
+  width: 40%;
+}
+
+.width50 {
+  width: 50%;
+}
+
+.width55 {
+  width: 55%;
+}
+
+.width65 {
+  width: 65%;
+}
+
+.width60 {
+  width: 60%;
+}
+
+.width70 {
+  width: 70%;
+}
+
+.width78 {
+  width: 78%;
+}
+
+.inportantwidth70 {
+  width: 70% !important;
+}
+
+.relative {
+  position: relative;
+}
+
+.absolute {
+  position: absolute;
+}
+
+.transformtopleft {
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+}
+
+.transformtopleft12 {
+  top: 12%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+}
+
+.fixed {
+  position: fixed;
+}
+
+.flex {
+  display: flex;
+}
+
+.flex-sub {
+  flex: 1;
+}
+
+.flex-auto {
+  flex: auto;
+}
+
+.flex-direction {
+  flex-direction: column;
+}
+
+.flex-column-reverse {
+  flex-direction: column-reverse;
+}
+
+.flex-wrap {
+  flex-wrap: wrap;
+}
+
+.align-start {
+  align-items: flex-start;
+}
+
+.align-baseline {
+  align-items: baseline;
+}
+
+.align-end {
+  align-items: flex-end;
+}
+
+.align-center {
+  align-items: center;
+}
+
+.justify-start {
+  justify-content: flex-start;
+}
+
+.justify-end {
+  justify-content: flex-end;
+}
+
+.justify-center {
+  justify-content: center;
+}
+
+.justify-between {
+  justify-content: space-between;
+}
+
+.justify-around {
+  justify-content: space-around;
+}
+
+.margin-auto {
+  margin: auto;
+}
+
+.margin4auto {
+  margin: 4px auto;
+}
+
+.margin50 {
+  margin: 0 25px 0 50px;
+}
+
+.margin-top10px {
+  margin-top: 10px;
+}
+
+.margin-top2 {
+  margin-top: 2%;
+}
+
+.margin-top4 {
+  margin-top: 4%;
+}
+
+.margin-top15 {
+  margin-top: 15%;
+}
+
+.margin-bottom {
+  margin-bottom: 2%;
+}
+
+.margin-left {
+  margin-left: 10px;
+}
+
+.margin-right5px {
+  margin-right: 5px;
+}
+
+.margin-right {
+  margin-right: 10px;
+}
+
+.margin-right15 {
+  margin-right: 15px;
+}
+
+.margin-right40 {
+  margin-right: 40px;
+}
+
+.margintopbot {
+  margin: 10px auto;
+}
+
+.margin2 {
+  margin: 2% auto;
+}
+
+.padding10 {
+  padding: 10px;
+}
+
+.paddingtopbottom {
+  padding: 10px 0;
+}
+
+.padding1016 {
+  padding: 10px 16px;
+}
+
+.padding1020 {
+  padding: 10px 20px;
+}
+
+.padding2010 {
+  padding: 20px 10px;
+}
+
+.padding-top2 {
+  padding-top: 2px;
+}
+
+.padding-top10 {
+  padding-top: 10px;
+}
+
+.paddingbottom {
+  padding-bottom: 6px;
+}
+
+.padding-right {
+  padding-right: 10px;
+}
+
+.padding-left {
+  padding-left: 10px;
+}
+
+.paddingleft1rem {
+  padding-left: 1rem;
+}
+
+.overflow {
+  overflow: hidden;
+}
+
+.overflowauto {
+  overflow: auto;
+}
+
+.overflowy-auto {
+  overflow: hidden;
+  overflow-y: auto;
+}
+
+.relative {
+  position: relative;
+}
+
+.absolute {
+  position: absolute;
+}
+
+.fixed {
+  position: fixed;
+}
+
+// 鍒嗛〉
+.elpagin {
+  text-align: left;
+  margin-top: 5px;
+}
+
+.boxshadow {
+  box-shadow: 0px 5px 10px #eaedef;
+}
+
+.boxshadow4 {
+  box-shadow: 0px 0px 4px #c2cbd4
+}
+
+.boxshadow69b0f7 {
+  box-shadow: 0px 0px 4px #3b5371
+}
+
+.borderbottom {
+  border-bottom: 1px solid #ebedef;
+}
+
+.borderbottom345 {
+  border-bottom: 1px solid #c2cbd4;
+}
+
+.border {
+  border: 1px solid #ebedef;
+}
+
+.border2 {
+  border: 1px solid #91a2b3;
+}
+
+.borderdashed {
+  border: 1px dashed #64a2e0;
+}
+
+.borderradius {
+  border-radius: 4px;
+}
+
+.background-fff {
+  background: #fff;
+}
+
+.backgroundF2F2F2 {
+  background: #F2F2F2;
+}
+
+.backgroundrgb {
+  background: rgb(7, 37, 73);
+}
+
+.backgroundecf5ff {
+  background-color: #ecf5ff;
+}
+
+.color-973BA5 {
+  color: #973BA5;
+}
+
+.colorF56C6C {
+  color: #F56C6C;
+}
+
+.colorfff {
+  color: #fff;
+}
+
+.color409EFF {
+  color: #409EFF;
+}
+
+.color636972 {
+  color: #636972;
+}
+
+.color909399 {
+  color: #909399;
+}
+
+.fontweight400 {
+  font-weight: 400;
+}
+
+.fontweight600 {
+  font-weight: 600;
+}
+
+.fontsize1_2rem {
+  font-size: 1.2rem;
+}
+
+.fontsize14 {
+  font-size: 14px;
+}
+
+.fontsize2rem {
+  font-size: 2rem;
+}
+
+.fontsize4rem {
+  font-size: 4rem;
+}
+
+.fontsize6rem {
+  font-size: 6rem;
+}
+
+.fontsiez1rem {
+  font-size: 1rem;
+}
+
+.fontsizeinitial {
+  font-size: initial;
+}
+
+.text-center {
+  text-align: center;
+}
+
+.text-right {
+  text-align: right;
+}
+
+.textalign {
+  text-align: right;
+}
+
+.textindex2 {
+  text-indent: 2rem;
+}
+
+.global-content {
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+}
+
+.text-overflow {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap
+}
+
+.hover {
+  &:hover {
+    background-color: #ecf5ff;
+  }
+
+}
+
+.bottom7 {
+  bottom: 7px;
+}
+
+.right {
+  right: 10px
+}
+
+.zindex {
+  z-index: 10;
+}
+
+.pointer {
+  cursor: pointer;
+}
+
+.search-bar{
+	display: flex;
+	.form-view{
+		flex-grow: 1;
+	}
+	.btn-view{
+		flex-shrink: 0;
+	}
+}
+
+.default-form-width{
+	width: 220px;
+}
+
+.subpage-style{
+	box-sizing: border-box;
+	padding: 8px;
+	height: 100%;
+	display: flex;
+	flex-direction: column;
+	background-color: #ffffff;
+	.top-bar,.bottom-box{
+		flex-shrink: 0;
+	}
+	.subpage-containter{
+		flex-grow: 1;
+		overflow: hidden;
+	}
+}
+.pagination-box {
+	display: flex;
+	justify-content: flex-end;
+	padding-top: 4px;
+}
+.table-top-action-row,.table-top-action-sides-row{
+	padding-bottom: 4px;
+}
+.table-top-action-sides-row{
+	display: flex;
+	justify-content: space-between;
+}
+.project-table-list-box{
+	display: flex;
+	flex-direction: column;
+	&>.table-top-action-row,&>.table-top-action-sides-row,&>.table-bottom-pagination{
+		flex-shrink: 0;
+	}
+	&>.table-content{
+		flex-grow: 1;
+		overflow: hidden;
+	}
+}
+
+.project-modal {
+	.el-dialog__header,.el-dialog__footer{
+		padding: 10px;
+	}
+	.el-dialog__headerbtn{
+		top: 12px;
+		right: 10px;
+	}
+	.el-dialog__header{
+		border-bottom: 1px solid #efefef;
+	}
+	.el-dialog__footer {
+		border-top: 1px solid #efefef;
+	}
+	.el-dialog__body{
+		padding: 0;
+	}
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/styles/innner-circles.scss b/qqjf-Web/src/styles/innner-circles.scss
new file mode 100644
index 0000000..e5e350a
--- /dev/null
+++ b/qqjf-Web/src/styles/innner-circles.scss
@@ -0,0 +1,51 @@
+.inner-circles-loader:not(:required) {
+    position: relative;
+    display: inline-block;
+    width: 50px;
+    height: 50px;
+    margin-bottom: 10px;
+    overflow: hidden;
+    text-indent: -9999px;
+    background: rgba(25, 165, 152, 0.5);
+    border-radius: 50%;
+    transform: translate3d(0, 0, 0);
+  }
+  
+  .inner-circles-loader:not(:required)::before,
+  .inner-circles-loader:not(:required)::after {
+    position: absolute;
+    top: 0;
+    display: inline-block;
+    width: 50px;
+    height: 50px;
+    content: "";
+    border-radius: 50%;
+  }
+  
+  .inner-circles-loader:not(:required)::before {
+    left: 0;
+    background: #c7efcf;
+    transform-origin: 0 50%;
+    animation: inner-circles-loader 3s infinite;
+  }
+  
+  .inner-circles-loader:not(:required)::after {
+    right: 0;
+    background: #eef5db;
+    transform-origin: 100% 50%;
+    animation: inner-circles-loader 3s 0.2s reverse infinite;
+  }
+  
+  @keyframes inner-circles-loader {
+    0% {
+      transform: rotate(0deg);
+    }
+  
+    50% {
+      transform: rotate(360deg);
+    }
+  
+    100% {
+      transform: rotate(0deg);
+    }
+  }
\ No newline at end of file
diff --git a/qqjf-Web/src/styles/sidebar.scss b/qqjf-Web/src/styles/sidebar.scss
new file mode 100644
index 0000000..6dc98cb
--- /dev/null
+++ b/qqjf-Web/src/styles/sidebar.scss
@@ -0,0 +1,84 @@
+@import './variables.scss';
+#app {
+    .main-container {
+        height: 100%;
+        transition: margin-left .28s;
+        margin-left: $sideBarWidth;
+        position: relative;
+    }
+
+    .sidebar-container {
+        position: fixed;
+        height: 100%;
+        width: $sideBarWidth !important;
+        left: 0;
+        top: 0;
+        right: 0;
+        bottom: 0;
+        overflow: hidden;
+        background: $menuBg;
+        transition: all .28s;
+
+        .scrollbar-wrapper {
+            overflow-x: hidden !important;
+        }
+
+        .el-scrollbar {
+            height: 100%;
+        }
+
+        .svg-icon {
+            margin-right: 16px;
+        }
+    }
+
+    .hidcontainer {
+        .sidebar-container {
+            width: 54px !important;
+            transition: all .28s;
+        }
+
+        .main-container {
+            margin-left: 54px;
+        }
+
+        .svg-icon {
+            margin-right: 20px;
+        }
+    }
+    ::-webkit-scrollbar {
+        width:5px;
+        height:10px;
+        
+      }
+      
+      /*澶栧眰杞ㄩ亾銆傚彲浠ョ敤display:none璁╁叾涓嶆樉绀猴紝涔熷彲浠ユ坊鍔犺儗鏅浘鐗囷紝棰滆壊鏀瑰彉鏄剧ず鏁堟灉*/
+      ::-webkit-scrollbar-track {
+        width: 6px;
+        background-color:#eee;
+        -webkit-border-radius: 2em;
+        -moz-border-radius: 2em;
+        border-radius:2em;
+        
+      }
+      
+      /*婊氬姩鏉$殑璁剧疆*/
+      
+      ::-webkit-scrollbar-thumb {
+        background-color:#cccccc;
+        background-clip:padding-box;
+        min-height:28px;
+        -webkit-border-radius: 2em;
+        -moz-border-radius: 2em;
+        border-radius:2em;
+       
+      }
+      /*婊氬姩鏉$Щ涓婂幓鐨勮儗鏅�*/
+      
+      ::-webkit-scrollbar-thumb:hover {
+          background-color:#c5cfe4;
+         
+      }
+
+
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/styles/transition.scss b/qqjf-Web/src/styles/transition.scss
new file mode 100644
index 0000000..be3f883
--- /dev/null
+++ b/qqjf-Web/src/styles/transition.scss
@@ -0,0 +1,31 @@
+/* fade-transform */
+.fade-transform-leave-active,
+.fade-transform-enter-active {
+  transition: all .5s;
+}
+
+.fade-transform-enter {
+  opacity: 0;
+  transform: translateX(-30px);
+}
+
+.fade-transform-leave-to {
+  opacity: 0;
+  transform: translateX(30px);
+}
+
+/* modal */
+.modal-leave-active,
+.modal-enter-active {
+  transition: all .5s;
+}
+
+.modal-enter {
+  opacity: 0;
+  transform: translateY(-100%);
+}
+
+.modal-leave-to {
+  opacity: 0;
+  transform: translateY(100%);
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/styles/variables.scss b/qqjf-Web/src/styles/variables.scss
new file mode 100644
index 0000000..5ae7a91
--- /dev/null
+++ b/qqjf-Web/src/styles/variables.scss
@@ -0,0 +1,35 @@
+// base color
+$blue:#324157;
+$light-blue:#3A71A8;
+$red:#C03639;
+$pink: #E65D6E;
+$green: #30B08F;
+$tiffany: #4AB7BD;
+$yellow:#FEC171;
+$panGreen: #30B08F;
+
+// sidebar
+$menuText:#bfcbd9;
+$menuActiveText:#409EFF;
+$subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951
+
+$menuBg:#3a405a;
+$menuHover:#263445;
+
+$subMenuBg:#1f2d3d;
+$subMenuHover:#001528;
+
+$sideBarWidth: 180px;
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+    menuText: $menuText;
+    menuActiveText: $menuActiveText;
+    subMenuActiveText: $subMenuActiveText;
+    menuBg: $menuBg;
+    menuHover: $menuHover;
+    subMenuBg: $subMenuBg;
+    subMenuHover: $subMenuHover;
+    sideBarWidth: $sideBarWidth;
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/utils/auth.js b/qqjf-Web/src/utils/auth.js
new file mode 100644
index 0000000..08a43d6
--- /dev/null
+++ b/qqjf-Web/src/utils/auth.js
@@ -0,0 +1,15 @@
+import Cookies from 'js-cookie'
+
+const TokenKey = 'Admin-Token'
+
+export function getToken() {
+  return Cookies.get(TokenKey)
+}
+
+export function setToken(token) {
+  return Cookies.set(TokenKey, token)
+}
+
+export function removeToken() {
+  return Cookies.remove(TokenKey)
+}
diff --git a/qqjf-Web/src/utils/axios.js b/qqjf-Web/src/utils/axios.js
new file mode 100644
index 0000000..e1893d1
--- /dev/null
+++ b/qqjf-Web/src/utils/axios.js
@@ -0,0 +1,61 @@
+import request from './request'
+import qs from 'qs';
+let axios={}
+/**
+ * get鏂规硶锛屽搴攇et璇锋眰
+ * @param {String} url [璇锋眰鐨剈rl鍦板潃]
+ * @param {Object} params [璇锋眰鏃舵惡甯︾殑鍙傛暟]
+ */
+axios.get = function (url, params = null) {
+  return new Promise((resolve, reject) => {
+    request
+      .get(url, { params })
+      .then(res => {
+        resolve(res.data);
+      })
+      .catch(e => {
+        reject(e);
+      });
+  });
+}
+
+/**
+ * post鏂规硶锛屽搴攑ost璇锋眰
+ * @param {String} url [璇锋眰鐨剈rl鍦板潃]
+ * @param {Object} params [璇锋眰鏃舵惡甯︾殑鍙傛暟]
+ */
+
+axios.post = function (url, params) {
+  return new Promise((resolve, reject) => {
+    request
+      .post(url, params)
+      .then(res => {
+        resolve(res.data);
+      })
+      .catch(e => {
+        reject(e);
+      });
+  });
+};
+
+/**
+ * put鏂规硶
+ * @param {*} url 
+ * @param {*} params 
+ * @returns 
+ */
+
+axios.put = function (url, params) {
+  return new Promise((resolve, reject) => {
+    request
+      .put(url, params)
+      .then(res => {
+        resolve(res.data);
+      })
+      .catch(e => {
+        reject(e);
+      });
+  });
+};
+
+export default axios
\ No newline at end of file
diff --git a/qqjf-Web/src/utils/date.js b/qqjf-Web/src/utils/date.js
new file mode 100644
index 0000000..3f4fc02
--- /dev/null
+++ b/qqjf-Web/src/utils/date.js
@@ -0,0 +1,156 @@
+import dayjs from 'dayjs'
+/**
+ *  @description 鑾峰彇骞存湀鏃�  鏃跺垎绉�
+ *  @returns {string}  yyyy-MM-dd hh:mm:ss
+ */
+export function getDate(option) {
+  const date = new Date();
+  let str = date.getFullYear() + '-' + addZero(date.getMonth() + 1) + '-' + addZero(date.getDate());
+
+  if (option && option.full) {
+    str += ' ' + addZero(date.getHours()) + ':' + addZero(date.getMinutes()) + ':' + addZero(date.getSeconds());
+  }
+  return str;
+}
+/**
+ *  @description 鑾峰彇骞存湀鏃�  鏃跺垎绉�
+ *  @returns {string}  yyyy-MM-dd hh:mm:ss
+ */
+export function getymdhms(option) {
+  const date = new Date();
+  let str =
+    date.getFullYear() +
+    '-' +
+    addZero(date.getMonth() + 1) +
+    '-' +
+    addZero(date.getDate()) +
+    ' ' +
+    addZero(date.getHours()) +
+    ':' +
+    addZero(date.getMinutes()) +
+    ':' +
+    addZero(date.getSeconds());
+  return str;
+}
+/**
+ * @description  鏍规嵁鏃堕棿鎴宠幏鍙栧勾鏈堟棩
+ * @param {*} date
+ * @param {*} num
+ * @returns
+ */
+export function getimestampDate(option) {
+	let res = 'Invalid Date'
+	try{
+		res = dayjs(option).format('YYYY-MM-DD HH:mm:ss')
+	}catch(e){
+		//TODO handle the exception
+	}
+  return res;
+}
+
+/**
+ *  @description  鑾峰彇鎸囧畾鏃ユ湡鐩搁殧num澶�
+ *  @param {String} date
+ *  @param {String} num
+ *  @returns {string}  yyyy-MM-dd
+ */
+export function getAroundDay(date, num) {
+  var time = date ? new Date(date) : new Date();
+  time.setDate(time.getDate() + num);
+  return time.getFullYear() + '-' + addZero(time.getMonth() + 1) + '-' + addZero(time.getDate());
+}
+
+/**
+ *  @description  鑾峰彇涓婁釜鏈�1鍙�
+ *  @param {String} date
+ *  @param {String} num
+ *  @returns {string}  yyyy-MM-dd
+ */
+export function getLastMonth(date, num) {
+  const time = new Date();
+  time.setTime(new Date(new Date().getFullYear(), new Date().getMonth() - 1, 1));
+  return time.getFullYear() + '-' + addZero(time.getMonth() + 1) + '-' + addZero(time.getDate());
+}
+/**
+ * @description 鑾峰彇 浠婂ぉ宸﹀彸鍑犲ぉ鐨勬椂闂�
+ * @param {*} AddDayCount
+ * @returns  {string}  yyyy-MM-dd
+ */
+
+//
+export function GetDateStr(AddDayCount) {
+  var dd = new Date();
+  dd.setDate(dd.getDate() + AddDayCount); //鑾峰彇AddDayCount澶╁悗鐨勬棩鏈�
+  var y = dd.getFullYear();
+  var m = dd.getMonth() + 1; //鑾峰彇褰撳墠鏈堜唤鐨勬棩鏈�
+  if (m < 10) {
+    m = '0' + m;
+  }
+  var d = dd.getDate();
+  if (d < 10) {
+    d = '0' + d;
+  }
+  return y + '-' + m + '-' + d;
+}
+/**
+ *  @description 鑾峰彇 浠婂ぉ宸﹀彸鍑犲ぉ鐨勫皬鏃跺垎閽熺
+ * @param {*} AddDayCount
+ * @returns
+ */
+export function GetTimeStr(AddDayCount) {
+  var dd = new Date();
+  dd.setDate(dd.getDate() + AddDayCount); //鑾峰彇AddDayCount澶╁悗鐨勬棩鏈�
+  let hours = dd.getHours();
+  if (hours < 10) {
+    hours = '0' + hours;
+  }
+  let min = dd.getMinutes();
+  if (min < 10) {
+    min = '0' + min;
+  }
+  let soc = dd.getSeconds();
+  if (soc < 10) {
+    soc = '0' + soc;
+  }
+  return hours + ':' + min + ':' + soc;
+}
+
+export function CoutDown(StartTime, EndTime) {
+  let lefttime = parseInt((EndTime - StartTime) / 1000);
+  let d = parseInt(lefttime / (24 * 60 * 60));
+  let h = parseInt((lefttime / (60 * 60)) % 24);
+  let m = parseInt((lefttime / 60) % 60);
+  let s = parseInt(lefttime % 60);
+  d = addZero(d);
+  h = addZero(h);
+  m = addZero(m);
+  s = addZero(s);
+  return {
+    day: d,
+    hours: h,
+    minute: m,
+    second: s
+  };
+}
+export function coumdata(dataTime) {
+  // let lefttime = parseInt((EndTime - StartTime) / 1000);
+
+  let d = parseInt(dataTime / (24 * 60 * 60));
+  let h = parseInt((dataTime / (60 * 60)) % 24);
+  let m = parseInt((dataTime / 60) % 60);
+  let s = parseInt(dataTime % 60);
+  d = addZero(d);
+  h = addZero(h);
+  m = addZero(m);
+  s = addZero(s);
+  return {
+    day: d,
+    hours: h,
+    minute: m,
+    second: s
+  };
+}
+
+const addZero = function (date) {
+  return date > 9 ? date : '0' + date;
+};
\ No newline at end of file
diff --git a/qqjf-Web/src/utils/debounce.js b/qqjf-Web/src/utils/debounce.js
new file mode 100644
index 0000000..cd2f5e8
--- /dev/null
+++ b/qqjf-Web/src/utils/debounce.js
@@ -0,0 +1,23 @@
+/**
+ * 鍑芥暟闃叉姈
+ * @param {Function} func
+ * @param {number} delay
+ * @param {boolean} immediate
+ * @return {*}
+ */
+
+ export function debounce(func, delay, immediate = false) {
+  let timer,
+    context = this;
+  return (...args) => {
+    if (immediate) {
+      func.apply(context, args);
+      immediate = false;
+      return;
+    }
+    clearTimeout(timer);
+    timer = setTimeout(() => {
+      func.apply(context, args);
+    }, delay);
+  };
+}
diff --git a/qqjf-Web/src/utils/excel.js b/qqjf-Web/src/utils/excel.js
new file mode 100644
index 0000000..b317665
--- /dev/null
+++ b/qqjf-Web/src/utils/excel.js
@@ -0,0 +1,16 @@
+
+
+export function exportTableList(tHeader, filterVal, list, name) {
+    const data = formatJson(filterVal, list);
+    exportExecel(tHeader, data, name);
+  }
+ function exportExecel(header, data, name) {
+    require.ensure([], () => {
+      const { export_json_to_excel } = require('@/vendor/Export2Excel');
+
+      export_json_to_excel(header, data, name + '鍒楄〃excel');
+    });
+  }
+   function formatJson(filterVal, jsonData) {
+    return jsonData.map(v => filterVal.map(j => v[j]));
+  }
\ No newline at end of file
diff --git a/qqjf-Web/src/utils/getPageTitle.js b/qqjf-Web/src/utils/getPageTitle.js
new file mode 100644
index 0000000..6c59f10
--- /dev/null
+++ b/qqjf-Web/src/utils/getPageTitle.js
@@ -0,0 +1,7 @@
+export default function getPageTitle(pageTitle) {
+  debugger;
+  if (pageTitle) {
+    return `${pageTitle}-${title}`;
+  }
+  return title;
+}
diff --git a/qqjf-Web/src/utils/index.js b/qqjf-Web/src/utils/index.js
new file mode 100644
index 0000000..3225d3c
--- /dev/null
+++ b/qqjf-Web/src/utils/index.js
@@ -0,0 +1,357 @@
+/**
+ * Created by PanJiaChen on 16/11/18.
+ */
+
+/**
+ * Parse the time to string
+ * @param {(Object|string|number)} time
+ * @param {string} cFormat
+ * @returns {string | null}
+ */
+export function parseTime(time, cFormat) {
+  if (arguments.length === 0 || !time) {
+    return null
+  }
+  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
+  let date
+  if (typeof time === 'object') {
+    date = time
+  } else {
+    if ((typeof time === 'string')) {
+      if ((/^[0-9]+$/.test(time))) {
+        // support "1548221490638"
+        time = parseInt(time)
+      } else {
+        // support safari
+        // https://stackoverflow.com/questions/4310953/invalid-date-in-safari
+        time = time.replace(new RegExp(/-/gm), '/')
+      }
+    }
+
+    if ((typeof time === 'number') && (time.toString().length === 10)) {
+      time = time * 1000
+    }
+    date = new Date(time)
+  }
+  const formatObj = {
+    y: date.getFullYear(),
+    m: date.getMonth() + 1,
+    d: date.getDate(),
+    h: date.getHours(),
+    i: date.getMinutes(),
+    s: date.getSeconds(),
+    a: date.getDay()
+  }
+  const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
+    const value = formatObj[key]
+    // Note: getDay() returns 0 on Sunday
+    if (key === 'a') { return ['鏃�', '涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�'][value ] }
+    return value.toString().padStart(2, '0')
+  })
+  return time_str
+}
+
+/**
+ * @param {number} time
+ * @param {string} option
+ * @returns {string}
+ */
+export function formatTime(time, option) {
+  if (('' + time).length === 10) {
+    time = parseInt(time) * 1000
+  } else {
+    time = +time
+  }
+  const d = new Date(time)
+  const now = Date.now()
+
+  const diff = (now - d) / 1000
+
+  if (diff < 30) {
+    return '鍒氬垰'
+  } else if (diff < 3600) {
+    // less 1 hour
+    return Math.ceil(diff / 60) + '鍒嗛挓鍓�'
+  } else if (diff < 3600 * 24) {
+    return Math.ceil(diff / 3600) + '灏忔椂鍓�'
+  } else if (diff < 3600 * 24 * 2) {
+    return '1澶╁墠'
+  }
+  if (option) {
+    return parseTime(time, option)
+  } else {
+    return (
+      d.getMonth() +
+      1 +
+      '鏈�' +
+      d.getDate() +
+      '鏃�' +
+      d.getHours() +
+      '鏃�' +
+      d.getMinutes() +
+      '鍒�'
+    )
+  }
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function getQueryObject(url) {
+  url = url == null ? window.location.href : url
+  const search = url.substring(url.lastIndexOf('?') + 1)
+  const obj = {}
+  const reg = /([^?&=]+)=([^?&=]*)/g
+  search.replace(reg, (rs, $1, $2) => {
+    const name = decodeURIComponent($1)
+    let val = decodeURIComponent($2)
+    val = String(val)
+    obj[name] = val
+    return rs
+  })
+  return obj
+}
+
+/**
+ * @param {string} input value
+ * @returns {number} output value
+ */
+export function byteLength(str) {
+  // returns the byte length of an utf8 string
+  let s = str.length
+  for (var i = str.length - 1; i >= 0; i--) {
+    const code = str.charCodeAt(i)
+    if (code > 0x7f && code <= 0x7ff) s++
+    else if (code > 0x7ff && code <= 0xffff) s += 2
+    if (code >= 0xDC00 && code <= 0xDFFF) i--
+  }
+  return s
+}
+
+/**
+ * @param {Array} actual
+ * @returns {Array}
+ */
+export function cleanArray(actual) {
+  const newArray = []
+  for (let i = 0; i < actual.length; i++) {
+    if (actual[i]) {
+      newArray.push(actual[i])
+    }
+  }
+  return newArray
+}
+
+/**
+ * @param {Object} json
+ * @returns {Array}
+ */
+export function param(json) {
+  if (!json) return ''
+  return cleanArray(
+    Object.keys(json).map(key => {
+      if (json[key] === undefined) return ''
+      return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
+    })
+  ).join('&')
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function param2Obj(url) {
+  const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
+  if (!search) {
+    return {}
+  }
+  const obj = {}
+  const searchArr = search.split('&')
+  searchArr.forEach(v => {
+    const index = v.indexOf('=')
+    if (index !== -1) {
+      const name = v.substring(0, index)
+      const val = v.substring(index + 1, v.length)
+      obj[name] = val
+    }
+  })
+  return obj
+}
+
+/**
+ * @param {string} val
+ * @returns {string}
+ */
+export function html2Text(val) {
+  const div = document.createElement('div')
+  div.innerHTML = val
+  return div.textContent || div.innerText
+}
+
+/**
+ * Merges two objects, giving the last one precedence
+ * @param {Object} target
+ * @param {(Object|Array)} source
+ * @returns {Object}
+ */
+export function objectMerge(target, source) {
+  if (typeof target !== 'object') {
+    target = {}
+  }
+  if (Array.isArray(source)) {
+    return source.slice()
+  }
+  Object.keys(source).forEach(property => {
+    const sourceProperty = source[property]
+    if (typeof sourceProperty === 'object') {
+      target[property] = objectMerge(target[property], sourceProperty)
+    } else {
+      target[property] = sourceProperty
+    }
+  })
+  return target
+}
+
+/**
+ * @param {HTMLElement} element
+ * @param {string} className
+ */
+export function toggleClass(element, className) {
+  if (!element || !className) {
+    return
+  }
+  let classString = element.className
+  const nameIndex = classString.indexOf(className)
+  if (nameIndex === -1) {
+    classString += '' + className
+  } else {
+    classString =
+      classString.substr(0, nameIndex) +
+      classString.substr(nameIndex + className.length)
+  }
+  element.className = classString
+}
+
+/**
+ * @param {string} type
+ * @returns {Date}
+ */
+export function getTime(type) {
+  if (type === 'start') {
+    return new Date().getTime() - 3600 * 1000 * 24 * 90
+  } else {
+    return new Date(new Date().toDateString())
+  }
+}
+
+/**
+ * @param {Function} func
+ * @param {number} wait
+ * @param {boolean} immediate
+ * @return {*}
+ */
+export function debounce(func, wait, immediate) {
+  let timeout, args, context, timestamp, result
+
+  const later = function() {
+    // 鎹笂涓�娆¤Е鍙戞椂闂撮棿闅�
+    const last = +new Date() - timestamp
+
+    // 涓婃琚寘瑁呭嚱鏁拌璋冪敤鏃堕棿闂撮殧 last 灏忎簬璁惧畾鏃堕棿闂撮殧 wait
+    if (last < wait && last > 0) {
+      timeout = setTimeout(later, wait - last)
+    } else {
+      timeout = null
+      // 濡傛灉璁惧畾涓篿mmediate===true锛屽洜涓哄紑濮嬭竟鐣屽凡缁忚皟鐢ㄨ繃浜嗘澶勬棤闇�璋冪敤
+      if (!immediate) {
+        result = func.apply(context, args)
+        if (!timeout) context = args = null
+      }
+    }
+  }
+
+  return function(...args) {
+    context = this
+    timestamp = +new Date()
+    const callNow = immediate && !timeout
+    // 濡傛灉寤舵椂涓嶅瓨鍦紝閲嶆柊璁惧畾寤舵椂
+    if (!timeout) timeout = setTimeout(later, wait)
+    if (callNow) {
+      result = func.apply(context, args)
+      context = args = null
+    }
+
+    return result
+  }
+}
+
+/**
+ * This is just a simple version of deep copy
+ * Has a lot of edge cases bug
+ * If you want to use a perfect deep copy, use lodash's _.cloneDeep
+ * @param {Object} source
+ * @returns {Object}
+ */
+export function deepClone(source) {
+  if (!source && typeof source !== 'object') {
+    throw new Error('error arguments', 'deepClone')
+  }
+  const targetObj = source.constructor === Array ? [] : {}
+  Object.keys(source).forEach(keys => {
+    if (source[keys] && typeof source[keys] === 'object') {
+      targetObj[keys] = deepClone(source[keys])
+    } else {
+      targetObj[keys] = source[keys]
+    }
+  })
+  return targetObj
+}
+
+/**
+ * @param {Array} arr
+ * @returns {Array}
+ */
+export function uniqueArr(arr) {
+  return Array.from(new Set(arr))
+}
+
+/**
+ * @returns {string}
+ */
+export function createUniqueString() {
+  const timestamp = +new Date() + ''
+  const randomNum = parseInt((1 + Math.random()) * 65536) + ''
+  return (+(randomNum + timestamp)).toString(32)
+}
+
+/**
+ * Check if an element has a class
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ * @returns {boolean}
+ */
+export function hasClass(ele, cls) {
+  return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
+}
+
+/**
+ * Add class to element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function addClass(ele, cls) {
+  if (!hasClass(ele, cls)) ele.className += ' ' + cls
+}
+
+/**
+ * Remove class from element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function removeClass(ele, cls) {
+  if (hasClass(ele, cls)) {
+    const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
+    ele.className = ele.className.replace(reg, ' ')
+  }
+}
diff --git a/qqjf-Web/src/utils/input.js b/qqjf-Web/src/utils/input.js
new file mode 100644
index 0000000..1d29696
--- /dev/null
+++ b/qqjf-Web/src/utils/input.js
@@ -0,0 +1,42 @@
+const MoneyTest = /((^[1-9]\d*)|^0)(\.\d{0,2}){0,1}$/;
+// 閲戦娣诲姞鍗冨垎浣�
+const comdify = function (n) {
+  if(!n) return n;
+  let str = n.split('.');
+  let re = /\d{1,3}(?=(\d{3})+$)/g;
+  let n1 = str[0].replace(re, "$&,");
+  return str.length > 1 && str[1] ? `${n1}.${str[1]}` : `${n1}.00`;
+};
+//鍘婚櫎鍗冨垎浣嶄腑鐨勨�橈紝'
+const delcommafy = function (num){
+  if(!num) return num;
+  num = num.toString();
+  num = num.replace(/,/gi, '');
+  return num;
+};
+const valdateFn = function (rule,val,cb) {
+  setTimeout(() => {
+    if(val) {
+      let inputVal = delcommafy(val);
+      if (rule.test(inputVal)) {
+        cb()
+      } else {
+        cb('鍙兘鏄暟瀛楅噾棰�,鏈�澶氫袱浣嶅皬鏁�')
+      }
+    }
+    cb()
+  })
+}
+// 楠岃瘉閲戦鏁板瓧鍙互涓鸿礋鏁�
+const moneyValid = function (rule,val,cb) {
+  valdateFn(/((^-?[1-9]\d*)|^-?0)(\.\d{0,2}){0,1}$/,val,cb);
+};
+// 楠岃瘉閲戦鏁板瓧涓嶅彲浠ヤ负璐熸暟
+const moneyNValid = function (rule,val,cb) {
+  valdateFn(MoneyTest,val,cb);
+};
+// 鑾峰彇杈撳叆妗嗙殑鍊�
+export function getInputValue (el) {
+  let inputVal = el || '';
+  return comdify(delcommafy(inputVal));
+};
\ No newline at end of file
diff --git a/qqjf-Web/src/utils/request.js b/qqjf-Web/src/utils/request.js
new file mode 100644
index 0000000..aacb9b5
--- /dev/null
+++ b/qqjf-Web/src/utils/request.js
@@ -0,0 +1,96 @@
+import axios from 'axios';
+import Vue from 'vue';
+import {
+  MessageBox,
+  Message
+} from 'element-ui';
+import Loading from './vab';
+import store from '@/store';
+import qs from 'qs';
+import {
+  getStorage,
+  setStorage
+} from '@/utils/sessionStorage';
+
+const service = axios.create({
+  baseURL: process.env.VUE_APP_BASE_API, // api 鐨� base_url process.env.VUE_APP_BASE_API
+  timeout: 50000 // 璇锋眰瓒呮椂鏃堕棿
+});
+//璇锋眰
+service.interceptors.request.use(config => {
+  return config;
+
+  error => {
+    console.log(error);
+    return Promise.reject(error);
+  };
+});
+
+// //鍝嶅簲
+service.interceptors.response.use(
+  response => {
+    const res = response.data;
+
+    if (response.status === 200) {
+      return Promise.resolve(response);
+    } else {
+      Message.error('鎺ュ彛璇锋眰閿欒');
+
+      return Promise.reject(response);
+    }
+  },
+  error => {
+    if (error.response) {
+      switch (error.response.status) {
+        case 401:
+          MessageBox.confirm('鐧诲綍鐘舵�佸凡杩囨湡锛屾偍鍙互缁х画鐣欏湪璇ラ〉闈紝鎴栬�呴噸鏂扮櫥褰�', '绯荤粺鎻愮ず', {
+              confirmButtonText: '閲嶆柊鐧诲綍',
+              cancelButtonText: '鍙栨秷',
+              type: 'warning'
+            })
+            .then(() => {
+              store.dispatch('user/logout').then(() => {
+                window.location.href = '/';
+              });
+            })
+            .catch(() => {
+              if (!getStorage('accessToken')) {
+                store.dispatch('user/logout').then(() => {
+                  window.location.href = '/';
+                });
+              }
+            });
+          break;
+        case 404:
+          Message({
+            message: '寰堟姳姝夛紝璧勬簮鏈壘鍒�!',
+            type: 'error'
+          });
+          break;
+        case 500:
+          Message({
+            message: '缃戠粶閿欒锛岃绋嶅悗鍐嶈瘯!',
+            type: 'error'
+          });
+          break;
+        case 503:
+          Message({
+            message: '绯荤粺閿欒锛岃绋嶅悗鍐嶈瘯!',
+            type: 'error'
+          });
+          break;
+        case 504:
+          Message({
+            message: '缃戠粶瓒呮椂锛岃绋嶅悗鍐嶈瘯!',
+            type: 'error'
+          });
+          break;
+      }
+
+      Vue.prototype.$Loading();
+      return Promise.reject(error);
+    }
+  }
+);
+
+export default service;
\ No newline at end of file
diff --git a/qqjf-Web/src/utils/sessionStorage.js b/qqjf-Web/src/utils/sessionStorage.js
new file mode 100644
index 0000000..7f737c9
--- /dev/null
+++ b/qqjf-Web/src/utils/sessionStorage.js
@@ -0,0 +1,39 @@
+/**
+ * 璁剧疆sessionStorage
+ * @param {string} key
+ * @param {any} value
+ */
+ export function setCache(key, value) {
+  if (value == undefined || value == null) {
+    window.sessionStorage.setItem(key, value);
+  } else {
+    window.sessionStorage.setItem(key, JSON.stringify(value));
+  }
+}
+
+/**
+ * 鑾峰彇sessionStorage
+ * @param {string} key
+ * @returns {any}
+ */
+export function getCache(key) {
+  if (window.sessionStorage.getItem(key) == 'undefined' || window.sessionStorage.getItem(key) == null) {
+    return undefined;
+  }
+  return JSON.parse(window.sessionStorage.getItem(key));
+}
+
+/**
+ * 娓呴櫎鎸囧畾sessionStorage
+ * @param {string} key
+ */
+export function removeCache(key) {
+  return window.sessionStorage.removeItem(key);
+}
+
+/**
+ * 娓呴櫎鎵�鏈塻essionStorage
+ */
+export function removeAll(key) {
+  return window.sessionStorage.clear();
+}
diff --git a/qqjf-Web/src/utils/throttle.js b/qqjf-Web/src/utils/throttle.js
new file mode 100644
index 0000000..f1e1f34
--- /dev/null
+++ b/qqjf-Web/src/utils/throttle.js
@@ -0,0 +1,18 @@
+export function throttle(fun, delay) {
+  let last, deferTimer;
+  return function (args) {
+    let that = this;
+    let _args = arguments;
+    let now = +new Date();
+    if (last && now < last + delay) {
+      clearTimeout(deferTimer);
+      deferTimer = setTimeout(() => {
+        last = now;
+        fun.apply(that, _args);
+      }, delay);
+    } else {
+      last = now;
+      fun.apply(that, _args);
+    }
+  };
+}
\ No newline at end of file
diff --git a/qqjf-Web/src/utils/vab.js b/qqjf-Web/src/utils/vab.js
new file mode 100644
index 0000000..8ddb379
--- /dev/null
+++ b/qqjf-Web/src/utils/vab.js
@@ -0,0 +1,23 @@
+import { Loading } from "element-ui";
+const install =(Vue,opts={})=>{
+    Vue.prototype.$Loading=(lodi=false)=>{
+        let loading= Loading.service({
+            lock: true,
+            text: '姝e湪鍔犺浇',
+            spinner: "inner-circles-loader",
+            background: "rgba(0,0,0,0.4)",
+        });
+        if (lodi==true) {
+            Loading.service({
+                lock: true,
+                text: '姝e湪鍔犺浇',
+                spinner: "inner-circles-loader",
+                background: "rgba(0,0,0,0.4)",
+            });
+        }else{
+            loading.close()
+        } 
+        
+    }
+}
+export default install
\ No newline at end of file
diff --git a/qqjf-Web/src/utils/validate.js b/qqjf-Web/src/utils/validate.js
new file mode 100644
index 0000000..6b3ac41
--- /dev/null
+++ b/qqjf-Web/src/utils/validate.js
@@ -0,0 +1,87 @@
+/**
+ * Created by PanJiaChen on 16/11/18.
+ */
+
+/**
+ * @param {string} path
+ * @returns {Boolean}
+ */
+export function isExternal(path) {
+  return /^(https?:|mailto:|tel:)/.test(path)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUsername(str) {
+  const valid_map = ['admin', 'editor']
+  return valid_map.indexOf(str.trim()) >= 0
+}
+
+/**
+ * @param {string} url
+ * @returns {Boolean}
+ */
+export function validURL(url) {
+  const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
+  return reg.test(url)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validLowerCase(str) {
+  const reg = /^[a-z]+$/
+  return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUpperCase(str) {
+  const reg = /^[A-Z]+$/
+  return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validAlphabets(str) {
+  const reg = /^[A-Za-z]+$/
+  return reg.test(str)
+}
+
+/**
+ * @param {string} email
+ * @returns {Boolean}
+ */
+export function validEmail(email) {
+  const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
+  return reg.test(email)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function isString(str) {
+  if (typeof str === 'string' || str instanceof String) {
+    return true
+  }
+  return false
+}
+
+/**
+ * @param {Array} arg
+ * @returns {Boolean}
+ */
+export function isArray(arg) {
+  if (typeof Array.isArray === 'undefined') {
+    return Object.prototype.toString.call(arg) === '[object Array]'
+  }
+  return Array.isArray(arg)
+}
diff --git a/qqjf-Web/src/vendor/Blob.js b/qqjf-Web/src/vendor/Blob.js
new file mode 100644
index 0000000..a288f1c
--- /dev/null
+++ b/qqjf-Web/src/vendor/Blob.js
@@ -0,0 +1,162 @@
+(function (view) {
+  "use strict";
+
+  view.URL = view.URL || view.webkitURL;
+
+  if (view.Blob && view.URL) {
+    try {
+      new Blob;
+      return;
+    } catch (e) {}
+  }
+
+  // Internally we use a BlobBuilder implementation to base Blob off of
+  // in order to support older browsers that only have BlobBuilder
+  var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) {
+    var
+      get_class = function(object) {
+        return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
+      }
+      , FakeBlobBuilder = function BlobBuilder() {
+        this.data = [];
+      }
+      , FakeBlob = function Blob(data, type, encoding) {
+        this.data = data;
+        this.size = data.length;
+        this.type = type;
+        this.encoding = encoding;
+      }
+      , FBB_proto = FakeBlobBuilder.prototype
+      , FB_proto = FakeBlob.prototype
+      , FileReaderSync = view.FileReaderSync
+      , FileException = function(type) {
+        this.code = this[this.name = type];
+      }
+      , file_ex_codes = (
+        "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "
+        + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"
+      ).split(" ")
+      , file_ex_code = file_ex_codes.length
+      , real_URL = view.URL || view.webkitURL || view
+      , real_create_object_URL = real_URL.createObjectURL
+      , real_revoke_object_URL = real_URL.revokeObjectURL
+      , URL = real_URL
+      , btoa = view.btoa
+      , atob = view.atob
+
+      , ArrayBuffer = view.ArrayBuffer
+      , Uint8Array = view.Uint8Array
+    ;
+    FakeBlob.fake = FB_proto.fake = true;
+    while (file_ex_code--) {
+      FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;
+    }
+    if (!real_URL.createObjectURL) {
+      URL = view.URL = {};
+    }
+    URL.createObjectURL = function(blob) {
+      var
+        type = blob.type
+        , data_URI_header
+      ;
+      if (type === null) {
+        type = "application/octet-stream";
+      }
+      if (blob instanceof FakeBlob) {
+        data_URI_header = "data:" + type;
+        if (blob.encoding === "base64") {
+          return data_URI_header + ";base64," + blob.data;
+        } else if (blob.encoding === "URI") {
+          return data_URI_header + "," + decodeURIComponent(blob.data);
+        } if (btoa) {
+          return data_URI_header + ";base64," + btoa(blob.data);
+        } else {
+          return data_URI_header + "," + encodeURIComponent(blob.data);
+        }
+      } else if (real_create_object_URL) {
+        return real_create_object_URL.call(real_URL, blob);
+      }
+    };
+    URL.revokeObjectURL = function(object_URL) {
+      if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) {
+        real_revoke_object_URL.call(real_URL, object_URL);
+      }
+    };
+    FBB_proto.append = function(data/*, endings*/) {
+      var bb = this.data;
+      // decode data to a binary string
+      if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {
+        var
+          str = ""
+          , buf = new Uint8Array(data)
+          , i = 0
+          , buf_len = buf.length
+        ;
+        for (; i < buf_len; i++) {
+          str += String.fromCharCode(buf[i]);
+        }
+        bb.push(str);
+      } else if (get_class(data) === "Blob" || get_class(data) === "File") {
+        if (FileReaderSync) {
+          var fr = new FileReaderSync;
+          bb.push(fr.readAsBinaryString(data));
+        } else {
+          // async FileReader won't work as BlobBuilder is sync
+          throw new FileException("NOT_READABLE_ERR");
+        }
+      } else if (data instanceof FakeBlob) {
+        if (data.encoding === "base64" && atob) {
+          bb.push(atob(data.data));
+        } else if (data.encoding === "URI") {
+          bb.push(decodeURIComponent(data.data));
+        } else if (data.encoding === "raw") {
+          bb.push(data.data);
+        }
+      } else {
+        if (typeof data !== "string") {
+          data += ""; // convert unsupported types to strings
+        }
+        // decode UTF-16 to binary string
+        bb.push(unescape(encodeURIComponent(data)));
+      }
+    };
+    FBB_proto.getBlob = function(type) {
+      if (!arguments.length) {
+        type = null;
+      }
+      return new FakeBlob(this.data.join(""), type, "raw");
+    };
+    FBB_proto.toString = function() {
+      return "[object BlobBuilder]";
+    };
+    FB_proto.slice = function(start, end, type) {
+      var args = arguments.length;
+      if (args < 3) {
+        type = null;
+      }
+      return new FakeBlob(
+        this.data.slice(start, args > 1 ? end : this.data.length)
+        , type
+        , this.encoding
+      );
+    };
+    FB_proto.toString = function() {
+      return "[object Blob]";
+    };
+    FB_proto.close = function() {
+      this.size = this.data.length = 0;
+    };
+    return FakeBlobBuilder;
+  }(view));
+
+  view.Blob = function Blob(blobParts, options) {
+    var type = options ? (options.type || "") : "";
+    var builder = new BlobBuilder();
+    if (blobParts) {
+      for (var i = 0, len = blobParts.length; i < len; i++) {
+        builder.append(blobParts[i]);
+      }
+    }
+    return builder.getBlob(type);
+  };
+}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this));
diff --git a/qqjf-Web/src/vendor/Export2Excel.js b/qqjf-Web/src/vendor/Export2Excel.js
new file mode 100644
index 0000000..b5fbbf0
--- /dev/null
+++ b/qqjf-Web/src/vendor/Export2Excel.js
@@ -0,0 +1,139 @@
+/* eslint-disable */
+require('script-loader!file-saver');
+require('./Blob.js');
+require('script-loader!xlsx/dist/xlsx.core.min');
+function generateArray(table) {
+  var out = [];
+  var rows = table.querySelectorAll('tr');
+  var ranges = [];
+  for (var R = 0; R < rows.length; ++R) {
+    var outRow = [];
+    var row = rows[R];
+    var columns = row.querySelectorAll('td');
+    for (var C = 0; C < columns.length; ++C) {
+      var cell = columns[C];
+      var colspan = cell.getAttribute('colspan');
+      var rowspan = cell.getAttribute('rowspan');
+      var cellValue = cell.innerText;
+      if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
+
+      //Skip ranges
+      ranges.forEach(function (range) {
+        if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
+          for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
+        }
+      });
+
+      //Handle Row Span
+      if (rowspan || colspan) {
+        rowspan = rowspan || 1;
+        colspan = colspan || 1;
+        ranges.push({s: {r: R, c: outRow.length}, e: {r: R + rowspan - 1, c: outRow.length + colspan - 1}});
+      }
+      ;
+
+      //Handle Value
+      outRow.push(cellValue !== "" ? cellValue : null);
+
+      //Handle Colspan
+      if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
+    }
+    out.push(outRow);
+  }
+  return [out, ranges];
+};
+
+function datenum(v, date1904) {
+  if (date1904) v += 1462;
+  var epoch = Date.parse(v);
+  return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
+}
+
+function sheet_from_array_of_arrays(data, opts) {
+  var ws = {};
+  var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}};
+  for (var R = 0; R != data.length; ++R) {
+    for (var C = 0; C != data[R].length; ++C) {
+      if (range.s.r > R) range.s.r = R;
+      if (range.s.c > C) range.s.c = C;
+      if (range.e.r < R) range.e.r = R;
+      if (range.e.c < C) range.e.c = C;
+      var cell = {v: data[R][C]};
+      if (cell.v == null) continue;
+      var cell_ref = XLSX.utils.encode_cell({c: C, r: R});
+
+      if (typeof cell.v === 'number') cell.t = 'n';
+      else if (typeof cell.v === 'boolean') cell.t = 'b';
+      else if (cell.v instanceof Date) {
+        cell.t = 'n';
+        cell.z = XLSX.SSF._table[14];
+        cell.v = datenum(cell.v);
+      }
+      else cell.t = 's';
+
+      ws[cell_ref] = cell;
+    }
+  }
+  if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
+  return ws;
+}
+
+function Workbook() {
+  if (!(this instanceof Workbook)) return new Workbook();
+  this.SheetNames = [];
+  this.Sheets = {};
+}
+
+function s2ab(s) {
+  var buf = new ArrayBuffer(s.length);
+  var view = new Uint8Array(buf);
+  for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
+  return buf;
+}
+
+export function export_table_to_excel(id) {
+  var theTable = document.getElementById(id);
+  var oo = generateArray(theTable);
+  var ranges = oo[1];
+
+  /* original data */
+  var data = oo[0];
+  var ws_name = "SheetJS";
+
+  var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
+
+  /* add ranges to worksheet */
+  // ws['!cols'] = ['apple', 'banan'];
+  ws['!merges'] = ranges;
+
+  /* add worksheet to workbook */
+  wb.SheetNames.push(ws_name);
+  wb.Sheets[ws_name] = ws;
+
+  var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
+
+  saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx")
+}
+
+function formatJson(jsonData) {
+  // console.log(jsonData)
+}
+export function export_json_to_excel(th, jsonData, defaultTitle) {
+
+  /* original data */
+
+  var data = jsonData;
+  data.unshift(th);
+  var ws_name = "SheetJS";
+
+  var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
+
+
+  /* add worksheet to workbook */
+  wb.SheetNames.push(ws_name);
+  wb.Sheets[ws_name] = ws;
+
+  var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
+  var title = defaultTitle || '鍒楄〃'
+  saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx")
+}
diff --git a/qqjf-Web/src/views/Didproject/components/classify.vue b/qqjf-Web/src/views/Didproject/components/classify.vue
new file mode 100644
index 0000000..20cdeb3
--- /dev/null
+++ b/qqjf-Web/src/views/Didproject/components/classify.vue
@@ -0,0 +1,107 @@
+<template>
+  <div class="width99 padding-top2 margintopbot flex justify-between align-center">
+    <div
+      class="didproject-title flex justify-around align-center border borderradius overflow pointer"
+      v-for="(item, index) in titlelist"
+      :key="index"
+    >
+      <div class="height width35 flex align-center justify-center overflow padding10">
+        <svg-icon class="fontsize4rem text-center" :style="'color:' + item.color" :icon-class="item.icon" />
+      </div>
+      <div class="heigth width55 padding10 overflow">
+        <p class="fontsiez1rem">{{ item.titel }}</p>
+
+        <p class="text-center fontsize2rem fontweight600 color409EFF margin-top15">
+          <countTo :startVal="startVal" :endVal="item.mun" :duration="3000"></countTo>
+        </p>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import countTo from 'vue-count-to';
+import { GetStorageOverviewData } from '@/api/Didproject';
+export default {
+  data() {
+    return {
+      startVal: 0,
+      titlelist: [
+        {
+          icon: 'documentation',
+          titel: '搴撲綅鎬绘暟',
+          mun: 0,
+          color: '#40C9C6'
+        },
+        {
+          icon: 'storage',
+          titel: '鏈夎揣搴撲綅',
+          mun: 0,
+          color: '#F4516C'
+        },
+        {
+          icon: 'him',
+          titel: '甯︿欢鍣ㄥ叿',
+          mun: 0,
+          color: '#36A3F7'
+        },
+        {
+          icon: 'clipboard',
+          titel: '绌哄櫒鍏锋暟',
+          mun: 0,
+          color: '#34BFA3'
+        },
+        {
+          icon: 'table',
+          titel: '鍒朵欢鎬绘暟',
+          mun: 1,
+          color: '#ffc637'
+        }
+      ],
+      cleartime: null
+    };
+  },
+  components: { countTo },
+  mounted() {
+    this.GetStorageOverviewData();
+    this.cleartime = setInterval(() => {
+      this.GetStorageOverviewData();
+    }, 60000);
+  },
+  methods: {
+    //绔嬪簱鎬昏鍜屽埗浠舵�昏
+    GetStorageOverviewData() {
+      // no 缂栧彿锛泃itle 鏍囬锛泇alue 鏁伴噺
+      GetStorageOverviewData().then(res => {
+        let data = res.data || [];
+        this.titlelist.forEach(item => {
+          data.forEach(element => {
+            if (item.titel == element.titel) {
+              item.mun = element.value;
+            }
+          });
+        });
+      });
+    }
+  },
+  beforeDestroy() {
+    if (this.cleartime) {
+      clearInterval(this.cleartime);
+      this.cleartime = null;
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.didproject-title {
+  width: 18%;
+  padding: 0 0;
+  box-shadow: 0 0 4px #c1c9d0;
+  background: #f0f2f5;
+  transition: all 0.3s;
+  &:hover {
+    box-shadow: 0 0 4px #99b7e2;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/Didproject/components/didinquer.vue b/qqjf-Web/src/views/Didproject/components/didinquer.vue
new file mode 100644
index 0000000..c2a23a2
--- /dev/null
+++ b/qqjf-Web/src/views/Didproject/components/didinquer.vue
@@ -0,0 +1,33 @@
+<template>
+  <div class="flex align-center justify-end">
+    <div id="topinquer" class="flex align-center">
+      <div class="flex align-center margin-right15">
+        <label>鎵�灞炰粨搴擄細</label>
+        <el-select v-model="iqnuer.enable" size="mini" clearable placeholder="璇烽�夋嫨">
+          <el-option v-for="item in enableList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
+        </el-select>
+      </div>
+      <el-button type="primary" size="mini">鏌ヨ</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      iqnuer: {},
+      enableList: []
+    };
+  },
+  props: {}
+};
+</script>
+
+<style lang="scss" scoped>
+#topinquer {
+  ::v-deep .el-select {
+    // width: 100px;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/Didproject/components/didnav.vue b/qqjf-Web/src/views/Didproject/components/didnav.vue
new file mode 100644
index 0000000..e1bdf56
--- /dev/null
+++ b/qqjf-Web/src/views/Didproject/components/didnav.vue
@@ -0,0 +1,111 @@
+<template>
+  <div class="width99 padding-top2 margintopbot flex justify-between align-center">
+    <div
+      class="didproject-title flex justify-around align-center border borderradius overflow pointer"
+      v-for="(item, index) in titlelist"
+      :key="index"
+    >
+      <div class="height width35 flex align-center justify-center overflow padding10">
+        <svg-icon class="fontsize4rem text-center" :style="'color:' + item.color" :icon-class="item.icon" />
+      </div>
+      <div class="heigth width55 padding10 overflow">
+        <p class="fontsiez1rem">{{ item.titel }}</p>
+
+        <p class="text-center fontsize2rem fontweight600 color409EFF margin-top15">
+          <countTo :startVal="startVal" :endVal="item.mun" :duration="3000"></countTo>
+        </p>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import countTo from 'vue-count-to';
+import { GetHomeNumData, GetHomeBarItemData } from '@/api/Didproject';
+export default {
+  data() {
+    return {
+      startVal: 0,
+      titlelist: [
+        {
+          icon: 'in-storage',
+          titel: '浠婃棩鍏ュ簱闆朵欢鏁�',
+          mun: 0,
+          color: '#40C9C6'
+        },
+        {
+          icon: 'skill',
+          titel: '浠婃棩鍑哄簱闆朵欢鏁�',
+          mun: 0,
+          color: '#F4516C'
+        },
+        {
+          icon: 'example',
+          titel: '浠婃棩鍏ュ簱鍣ㄥ叿鏁�',
+          mun: 0,
+          color: '#36A3F7'
+        },
+        {
+          icon: 'trade',
+          titel: '浠婃棩鍑哄簱鍣ㄥ叿鏁�',
+          mun: 0,
+          color: '#34BFA3'
+        },
+        {
+          icon: 'record-chart',
+          titel: '瓒呮湡闆朵欢鏁伴噺',
+          mun: 1,
+          color: '#ffc637'
+        }
+      ],
+      cleartime: null
+    };
+  },
+  components: { countTo },
+  mounted() {
+    this.GetHomeNumData();
+    this.cleartime = setInterval(() => {
+      this.GetHomeNumData();
+    }, 60000);
+  },
+  methods: {
+    //浠婃棩鍑哄叆搴撴暟鎹�
+    GetHomeNumData() {
+      if (this.cleartime) {
+        clearInterval(this.cleartime);
+        this.cleartime = null;
+      }
+      // no 缂栧彿锛泃itle 鏍囬锛泇alue 鏁伴噺
+      GetHomeNumData().then(res => {
+        let data = res.data || [];
+        this.titlelist.forEach(item => {
+          data.forEach(element => {
+            if (item.titel == element.titel) {
+              item.mun = element.value;
+            }
+          });
+        });
+      });
+    }
+  },
+  beforeDestroy() {
+    if (this.cleartime) {
+      clearInterval(this.cleartime);
+      this.cleartime = null;
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.didproject-title {
+  width: 18%;
+  padding: 0px 0;
+  box-shadow: 0 0 4px #c1c9d0;
+  background: #f0f2f5;
+  transition: all 0.3s;
+  &:hover {
+    box-shadow: 0 0 4px #99b7e2;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/Didproject/components/lineEcharts.vue b/qqjf-Web/src/views/Didproject/components/lineEcharts.vue
new file mode 100644
index 0000000..46fd1f5
--- /dev/null
+++ b/qqjf-Web/src/views/Didproject/components/lineEcharts.vue
@@ -0,0 +1,215 @@
+<template>
+  <div class="chart-wrapper" ref="didline"></div>
+</template>
+
+<script>
+import resize from '@/mixins/resize';
+const echarts = require('echarts');
+export default {
+  name: 'placePie',
+  props: {
+    titleechart: {
+      type: String,
+      default: ''
+    },
+    linelist: {
+      type: Object,
+      default: () => {}
+    },
+    colorList: {
+      type: Array,
+      default: () => []
+    }
+  },
+  mixins: [resize],
+  data() {
+    return {};
+  },
+  mounted() {
+    this.initEchart();
+  },
+  methods: {
+    initEchart() {
+      const colorList = ['#ffc637', '#fc7293', '#8477e9', '#2599f0', '#31c3ea', '#17d8b9', '#e8bdf3'];
+      let _this = this;
+      let serieslist = [];
+
+      let data = this.linelist.data;
+      if (data) {
+        data.forEach((item, index) => {
+          serieslist.push({
+            name: item.name,
+            type: 'bar',
+            data: item.xdata,
+            barWidth: 15,
+            barGap: 1, //鏌遍棿璺濈
+            label: {
+              //鍥惧舰涓婄殑鏂囨湰鏍囩
+              normal: {
+                show: true,
+                position: 'top',
+                textStyle: {
+                  color: '#a8aab0',
+                  fontStyle: 'normal',
+                  fontFamily: '寰蒋闆呴粦',
+                  fontSize: 14
+                }
+              }
+            },
+            itemStyle: {
+              normal: {
+                show: true,
+                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                  {
+                    offset: 0,
+                    color: this.colorList[index]
+                  },
+                  {
+                    offset: 1,
+                    color: this.colorList[index]
+                  }
+                ]),
+                barBorderRadius: 50,
+                borderWidth: 0
+              }
+            }
+          });
+        });
+      }
+
+      this.myChart = echarts.init(this.$refs.didline);
+      this.myChart.setOption(
+        {
+          title: {
+            text: this.linelist && this.linelist.data ? this.titleechart : '鏆傛棤鏁版嵁',
+            textStyle: {
+              fontSize: 22
+            },
+            subtextStyle: {
+              fontSize: 22,
+              fontWeight: 'bold'
+            },
+            left: '45%',
+            x: 'center',
+            y: 0,
+            itemGap: 10
+          },
+          tooltip: {
+            //鎻愮ず妗嗙粍浠�
+            trigger: 'axis',
+            // formatter: '{b}<br />{a0}: {c0}<br />{a1}: {c1}',
+            axisPointer: {
+              type: 'shadow',
+              label: {
+                backgroundColor: '#6a7985'
+              }
+            },
+            textStyle: {
+              // color: '#fff',
+              fontStyle: 'normal',
+              fontFamily: '寰蒋闆呴粦',
+              fontSize: 12
+            }
+          },
+          grid: {
+            left: '1%',
+            right: '1%',
+            bottom: '1%',
+            top: '15%',
+            //	padding:'0 0 10 0',
+            containLabel: true
+          },
+          legend: {
+            //鍥句緥缁勪欢锛岄鑹插拰鍚嶅瓧
+            right: '1%',
+            top: '0%',
+            itemGap: 16,
+            itemWidth: 18,
+            itemHeight: 10,
+            data: this.linelist.legend,
+            textStyle: {
+              color: '#a8aab0',
+              fontStyle: 'normal',
+              fontFamily: '寰蒋闆呴粦',
+              fontSize: 12
+            }
+          },
+          xAxis: [
+            {
+              type: 'category',
+              //	boundaryGap: true,//鍧愭爣杞翠袱杈圭暀鐧�
+              data: this.linelist.xdata,
+              // data: Axdata,
+              axisLabel: {
+                interval: 0, //璁剧疆涓� 1锛岃〃绀恒�庨殧涓�涓爣绛炬樉绀轰竴涓爣绛俱��
+                margin: 10,
+                textStyle: {
+                  fontSize: 12
+                }
+              },
+              axisLine: { show: true, lineStyle: { color: '#636972', width: 2 } },
+              splitLine: {
+                show: false,
+                lineStyle: { color: '#2b3442', width: 1 }
+              },
+              axisTick: {
+                show: false
+              }
+            }
+          ],
+          yAxis: [
+            {
+              type: 'value',
+              splitNumber: 5,
+              axisLabel: {
+                textStyle: {
+                  fontSize: 12
+                }
+              },
+              axisLine: {
+                lineStyle: {
+                  color: '#636972',
+                  width: 1
+                }
+              },
+              axisTick: {
+                show: false
+              },
+              splitLine: {
+                show: true,
+                lineStyle: {
+                  color: '#636972'
+                }
+              }
+            }
+          ],
+          dataZoom: [
+            {
+              type: 'inside',
+              startValue: 0,
+              endValue: 10
+            }
+          ],
+          series: serieslist
+        },
+        true
+      );
+
+      // this.myChart.getZr().on('click', function (res) {
+      //   const { href } = _this.$router.resolve({
+      //     path: '/output'
+      //   });
+      //   window.open(href, '_blank');
+      // });
+    }
+  },
+  watch: {
+    linelist: {
+      handler() {
+        this.initEchart();
+      },
+      deep: true
+    }
+  }
+};
+</script>
diff --git a/qqjf-Web/src/views/Didproject/components/notice.vue b/qqjf-Web/src/views/Didproject/components/notice.vue
new file mode 100644
index 0000000..b5133b7
--- /dev/null
+++ b/qqjf-Web/src/views/Didproject/components/notice.vue
@@ -0,0 +1,83 @@
+<template>
+  <div class="main-home-notice el-alert--warning is-light" v-if="visible" @click.stop="onClose">
+    <div class="left-icon"><i class="el-icon-warning"></i></div>
+    <div class="notice-view">
+      <auto-scroll :step-speed="4000" dir="horizontal">
+        <div class="notice-item" v-for="(item, index) in notices" :key="'notice-item-' + index">
+          {{ index + 1 }}銆侀浂浠跺彿锛歿{item.itemName}}锛岄浂浠跺悕绉帮細{{item.itemDes}}锛岃秴闄愩�傜洰鍓嶅簱瀛�<span class="blue-f">{{item.itemNum}}</span>浠讹紝涓嬮檺<span class="red-f">{{item.minStorage}}</span>浠讹紝涓婇檺<span class="red-f">{{item.maxStorage}}</span>浠躲��
+        </div>
+      </auto-scroll>
+    </div>
+  </div>
+</template>
+
+<script>
+import AutoScroll from '@/components/autoscroll/index.vue';
+export default {
+  name: 'mainHomeNotice',
+  components: { AutoScroll },
+  props: {
+    notices: {
+      type: Array,
+      default: function () {
+        return [];
+      }
+    },
+    visible: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    onClose() {
+      this.$emit('update:visible', false);
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.main-home-notice {
+  $leftWidth: 36px;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  box-sizing: border-box;
+  z-index: 20;
+	font-size: 20px;
+  height: 40px;
+  padding-left: $leftWidth;
+  cursor: default;
+  .left-icon {
+    position: absolute;
+    top: 0;
+    left: 0;
+    height: 100%;
+    width: $leftWidth;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+  .notice-view {
+    height: 100%;
+    display: flex;
+    align-items: center;
+  }
+  .notice-item {
+    height: 100%;
+    display: flex;
+    align-items: center;
+    margin-right: 20px;
+    &:last-child {
+      margin-right: 0;
+    }
+		.blue-f{
+			color:#409eff;
+		}
+		.red-f{
+			color:#ff0000;
+		}
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/Didproject/components/pieEcharts.vue b/qqjf-Web/src/views/Didproject/components/pieEcharts.vue
new file mode 100644
index 0000000..c26d84a
--- /dev/null
+++ b/qqjf-Web/src/views/Didproject/components/pieEcharts.vue
@@ -0,0 +1,130 @@
+<template>
+  <div class="chart-wrapper" ref="placePie"></div>
+</template>
+
+<script>
+import resize from '@/mixins/resize';
+const echarts = require('echarts');
+export default {
+  name: 'placePie',
+  props: {
+    chartData: {
+      type: Object
+    }
+  },
+  mixins: [resize],
+  data() {
+    return {};
+  },
+  mounted() {
+    this.initEchart();
+  },
+  methods: {
+    initEchart() {
+      let _this = this;
+      const colorList = ['#8477e9', '#ffc637', '#fc7293', '#2599f0', '#31c3ea', '#17d8b9', '#e8bdf3'];
+      this.myChart = echarts.init(this.$refs.placePie);
+      this.myChart.setOption(
+        {
+          color: colorList,
+          title: {
+            text: '搴撲綅绫诲瀷锛�' + this.chartData.titel,
+            top: '0%',
+            left: '10%',
+            textAlign: 'left',
+            textStyle: {
+              fontSize: 14,
+              fontWeight: '400'
+            }
+          },
+          tooltip: {
+            trigger: 'item',
+            formatter: '{a} <br/>{b} : {c}<br/>',
+            // + '鍗犳瘮锛�' + '{d}' + '%'
+
+            position: function (pos, params, dom, rect, size) {
+              var obj = { bottom: '10%' };
+              obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 5;
+              return obj;
+            }
+          },
+
+          legend: {
+            show: this.chartData.list.length > 0,
+            bottom: '10%', //寤禮杞村眳涓�
+            right: '0',
+            type: 'scroll',
+            align: 'right',
+            orient: 'vertival',
+            itemHeight: 11,
+            itemWidth: 11,
+            pageTextStyle: {
+              color: '#556677'
+            },
+            pageIconColor: '#556677',
+
+            color: '#556677',
+            fontSize: 14,
+            data: this.chartData.list.map(item => item.name)
+          },
+          series: [
+            {
+              name: this.chartData.titel,
+              type: 'pie',
+              radius: ['65%', '80%'],
+              center: ['50%', '50%'],
+              data: this.chartData.list,
+              // roseType: 'radius', //area
+              label: {
+                show: true,
+                position: 'center',
+
+                fontSize: 14,
+                color: '#556677',
+
+                formatter: function (params) {
+                  let sum = _this.chartData.list[0].value + _this.chartData.list[1].value;
+                  let val_1 = _this.chartData.list[0].value / sum;
+                  val_1 = JSON.stringify(val_1) != 'null' ? JSON.stringify(val_1 * 100).slice(0, 5) : 0;
+                  let val_2 = _this.chartData.list[1].value / sum;
+                  val_2 = JSON.stringify(val_2) != 'null' ? JSON.stringify(val_2 * 100).slice(0, 5) : 0;
+                  return (
+                    _this.chartData.list[0].name +
+                    ':' +
+                    _this.chartData.list[0].value +
+                    // val_1 +
+                    // '%' +
+                    '\n\n' +
+                    _this.chartData.list[1].name +
+                    ':' +
+                    _this.chartData.list[1].value +
+                    // val_2 +
+                    // '%' +
+                    '\n\n浣跨敤鐜�:' +
+                    _this.chartData.placeRate
+                  );
+                }
+              },
+              labelLine: {
+                show: false,
+                length: 10,
+                length2: 5,
+                smooth: false
+              }
+            }
+          ]
+        },
+        true
+      );
+    }
+  },
+  watch: {
+    chartData: {
+      handler() {
+        this.initEchart();
+      },
+      deep: true
+    }
+  }
+};
+</script>
diff --git a/qqjf-Web/src/views/Didproject/index.vue b/qqjf-Web/src/views/Didproject/index.vue
new file mode 100644
index 0000000..dfed4b9
--- /dev/null
+++ b/qqjf-Web/src/views/Didproject/index.vue
@@ -0,0 +1,263 @@
+<template>
+  <div id="Didproject" class="global-content">
+    <div class="width height overflowy-auto">
+      <div class="height250 overflow">
+        <div class="flex justify-end align-centent">
+          <el-date-picker
+            v-model="daterange"
+            size="mini"
+            type="daterange"
+            value-format="yyyy-MM-dd"
+            range-separator="鑷�"
+            :clearable="false"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+          >
+          </el-date-picker>
+          <el-button class="margin-left margin-right" type="primary" size="mini" @click="derive">瀵煎嚭</el-button>
+        </div>
+        <did-nav />
+        <classify />
+      </div>
+      <!-- height-calc280  -->
+      <div class="width margin-top10px overflowy-auto">
+        <div class="margintopbot paddingtopbottom width overflow">
+          <p class="fontsize2rem text-center">璐т綅浣跨敤瀹炴椂鍥�</p>
+          <div class="flex flex-wrap">
+            <div
+              class="did-echarts margin-top10px margin-right width30"
+              v-for="(item, index) in chartData"
+              :key="index + 'pieechart'"
+            >
+              <pie-echarts class="width height" :chartData="item" />
+            </div>
+          </div>
+        </div>
+        <div class="margintopbot width overflow">
+          <p class="fontsize2rem text-center">闆朵欢鍑哄叆搴撶粺璁�</p>
+          <div class="width margintopbot flex justify-end">
+            <el-date-picker
+              v-model="datatime"
+              size="mini"
+              type="datetimerange"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              range-separator="鑷�"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+            >
+            </el-date-picker>
+            <el-button class="margin-left margin-right" type="primary" size="mini" @click="goodsinquer">鏌ヨ</el-button>
+            <el-button class="margin-left margin-right" type="primary" size="mini" @click="linkTo">璺宠浆</el-button>
+          </div>
+          <div class="width98 margintopbot echart-height">
+            <line-echart
+              titleechart="闆朵欢鏁伴噺缁熻"
+              :linelist="BarItemlinelist"
+              :colorList="barcolorList"
+              class="width height"
+            />
+          </div>
+          <div class="width98 margintopbot echart-height">
+            <line-echart
+              titleechart="鍣ㄥ叿鍑哄叆搴撶粺璁�"
+              :linelist="Containerlinelist"
+              :colorList="concolorList"
+              class="width height"
+            />
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <top-notice :visible.sync="noticeVisible" :notices="noticeData"></top-notice>
+  </div>
+</template>
+
+<script>
+import DidInquer from './components/didinquer';
+import DidNav from './components/didnav';
+import Classify from './components/classify.vue';
+import PieEcharts from './components/pieEcharts';
+import LineEchart from './components/lineEcharts';
+import {
+  GetHomePieData,
+  GetHomeBarItemData,
+  GetHomeBarContainerData,
+  GetHomeNumDataByDate,
+  GetWarnings
+} from '@/api/Didproject';
+import { getDate, GetDateStr, GetTimeStr, getimestampDate, getymdhms } from '@/utils/date';
+const { Didproject } = require('@/components/tableContainer/tableHead');
+import { exportTableList } from '@/utils/excel';
+import TopNotice from './components/notice.vue';
+// import { SearchPermission, AddOrUpdateRoleVsPermission, GetUserRoleAllPermission } from '@/api/role-auth';
+export default {
+  components: { DidInquer, DidNav, PieEcharts, LineEchart, Classify, TopNotice },
+  data() {
+    return {
+      daterange: [GetDateStr(0), GetDateStr(0)],
+      datatime: [GetDateStr(-15) + ' 00:00:00', getDate() + ' ' + GetTimeStr(0)],
+      chartData: [],
+      BarItemlinelist: {}, //闆朵欢鍑哄叆鏁伴噺
+      Containerlinelist: {}, //鍑哄叆搴撴暟閲�
+      clearIntervaltime: null,
+      BarItemlineshow: false,
+      Containerline: false,
+      barcolorList: ['#ffc637', '#fc7293', '#8477e9', '#2599f0', '#31c3ea', '#17d8b9', '#e8bdf3'],
+      concolorList: ['#31c3ea', '#17d8b9', '#2599f0', '#e8bdf3', '#ffc637', '#fc7293', '#8477e9'],
+      noticeVisible: false,
+      noticeData: []
+    };
+  },
+  mounted() {
+    this.getWarnings(() => {
+      this.GetHomePieData();
+      this.GetHomeBarItemData();
+      this.GetHomeBarContainerData();
+      this.clearIntervaltime = setInterval(() => {
+        this.GetHomePieData();
+      }, 60000);
+    });
+  },
+  methods: {
+    //鏃堕棿鏌ヨ
+    goodsinquer() {
+      this.GetHomeBarItemData();
+      this.GetHomeBarContainerData();
+    },
+    //鍚勭被鍨嬪簱浣嶄娇鐢ㄧ粺璁�
+    GetHomePieData() {
+      //placeType 搴撲綅绫诲瀷锛沺laceTotalNum 鎬诲簱浣嶆暟锛沺laceFullNum 宸茬敤搴撲綅鏁帮紱placeRate 浣跨敤鐜囷紱
+      GetHomePieData().then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          let pielist = [];
+          data.forEach((element, index) => {
+            pielist.push({ titel: '', placeRate: '', list: [] });
+
+            for (let i in element) {
+              if (i == 'placeVal' || i == 'placeOtherVal') {
+                pielist[index].list.push({
+                  name:
+                    i == 'placeOtherVal'
+                      ? '鏈敤搴撲綅鏁�'
+                      : i == 'placeVal'
+                      ? '宸茬敤搴撲綅鏁�'
+                      : i == 'placeRate'
+                      ? '浣跨敤鐜�'
+                      : i,
+                  value: element[i]
+                });
+              } else if (i == 'placeType') {
+                pielist[index].titel = element[i];
+              } else if (i == 'placeRate') {
+                pielist[index].placeRate = element[i];
+              }
+            }
+          });
+          this.chartData = pielist;
+          console.log(this.chartData);
+        }
+      });
+    },
+    //鑾峰彇闆朵欢鐨勫嚭鍏ュ簱鏁伴噺
+    GetHomeBarItemData() {
+      let time = {
+        startTime: this.datatime ? this.datatime[0] : '',
+        endTime: this.datatime ? this.datatime[1] : ''
+      };
+      this.BarItemlineshow = false;
+      GetHomeBarItemData(time).then(res => {
+        this.BarItemlinelist = res.data;
+        this.BarItemlineshow = true;
+      });
+    },
+    //鑾峰彇鍣ㄥ叿鐨勫嚭鍏ュ簱鏁伴噺
+    GetHomeBarContainerData() {
+      let time = {
+        startTime: this.datatime ? this.datatime[0] : '',
+        endTime: this.datatime ? this.datatime[1] : ''
+      };
+      this.$Loading(true);
+      this.Containerline = false;
+      GetHomeBarContainerData(time).then(res => {
+        this.Containerlinelist = res.data;
+        this.Containerline = true;
+        this.$Loading();
+      });
+    },
+    //璺宠浆澶у睆
+    linkTo() {
+      const { href } = this.$router.resolve({
+        path: '/output'
+      });
+      window.open(href, '_blank');
+    },
+    //瀵煎嚭
+    derive() {
+      let tabledata = [];
+      let tHeader = [];
+      let filterVal = [];
+      Didproject.forEach(item => {
+        tHeader.push(item.columnDescription);
+        filterVal.push(item.columnName);
+      });
+      this.$Loading(true);
+      GetHomeNumDataByDate({ stDate: this.daterange[0], edDate: this.daterange[1] }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach((element, index) => {
+            tabledata.push({
+              time: getimestampDate(element.time)
+            });
+            element.homeNumDataEntityList.forEach(item => {
+              Didproject.forEach(vl => {
+                if (item.titel == vl.columnDescription) {
+                  tabledata[index][vl.columnName] = item.value;
+                }
+              });
+            });
+          });
+          exportTableList(tHeader, filterVal, tabledata, '搴撳瓨鏁版嵁' + getymdhms());
+          this.$Loading(false);
+        }
+      });
+    },
+    getWarnings(callback) {
+      GetWarnings()
+        .then(d => {
+          if (d.code === 0) {
+            this.noticeData = d.data || [];
+            this.noticeVisible = true;
+            callback(true);
+          } else {
+            callback(false);
+          }
+          console.log('kklkljj', d);
+        })
+        .catch(() => {
+          callback(false);
+        });
+    }
+  },
+  beforeDestroy() {
+    if (this.clearIntervaltime) {
+      clearInterval(this.clearIntervaltime);
+      this.clearIntervaltime = null;
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+#Didproject {
+  position: relative;
+  .did-echarts {
+    height: 200px;
+  }
+  .echart-height {
+    height: 300px;
+    margin: 1% auto 2%;
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/Home/components/lefttop.vue b/qqjf-Web/src/views/Home/components/lefttop.vue
new file mode 100644
index 0000000..4039fde
--- /dev/null
+++ b/qqjf-Web/src/views/Home/components/lefttop.vue
@@ -0,0 +1,65 @@
+<template>
+  <div class="width">
+    <p class="colorfff fontsiez1rem padding10">{{ navobj.titel }}</p>
+    <div class="width flex justify-around">
+      <div
+        class="colorfff borderdashed borderradius padding1016"
+        v-for="(item, index) in navobj.list"
+        :key="index + 'navobj'"
+      >
+        <p class="margin4auto">{{ item.titel }}</p>
+        <count-to :startVal="0" :endVal="item.value" :duration="3000"></count-to>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import countTo from 'vue-count-to';
+import { GetStorageOverviewData } from '@/api/Didproject';
+export default {
+  data() {
+    return {
+      startVal: 0,
+      cleartime: null
+    };
+  },
+  props: {
+    navobj: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  components: { countTo },
+  mounted() {
+    this.GetStorageOverviewData();
+    this.cleartime = setInterval(() => {
+      this.GetStorageOverviewData();
+    }, 60000);
+  },
+  methods: {
+    //绔嬪簱鎬昏鍜屽埗浠舵�昏
+    GetStorageOverviewData() {
+      // no 缂栧彿锛泃itle 鏍囬锛泇alue 鏁伴噺
+      GetStorageOverviewData().then(res => {
+        let data = res.data || [];
+        this.navobj.list.forEach(item => {
+          data.forEach(element => {
+            if (item.titel == element.titel) {
+              item.value = element.value;
+            }
+          });
+        });
+      });
+    }
+  },
+  beforeDestroy() {
+    if (this.cleartime) {
+      clearInterval(this.cleartime);
+      this.cleartime = null;
+    }
+  }
+};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/Home/components/meterEchart.vue b/qqjf-Web/src/views/Home/components/meterEchart.vue
new file mode 100644
index 0000000..c472f1f
--- /dev/null
+++ b/qqjf-Web/src/views/Home/components/meterEchart.vue
@@ -0,0 +1,273 @@
+<template>
+  <div class="chart-wrapper" ref="sourmeterLine"></div>
+</template>
+
+<script>
+import resize from '@/mixins/resize';
+const echarts = require('echarts');
+export default {
+  name: 'sourmeterLine',
+  props: {
+    chartData: {
+      type: Object,
+      default: () => {}
+    },
+    colorList: {
+      type: Array,
+      default: () => []
+    },
+    colors: {
+      type: String,
+      default: '#636972'
+    },
+		yTotals:{
+			type:Number,
+			default:-1
+		}
+  },
+  mixins: [resize],
+  data() {
+    return {};
+  },
+  mounted() {
+    this.initEchart();
+  },
+  methods: {
+    initEchart() {
+      // 鍩轰簬鍑嗗濂界殑dom锛屽垵濮嬪寲echarts瀹炰緥
+      let serieslist = [];
+      let data = this.chartData.data;
+      if (data) {
+        data.forEach((element, index) => {
+					let nObj = {
+            name: element.name,
+            type: index == 0 ? 'line' : 'bar',
+            smooth: true,
+            yAxisIndex: index,
+            // symbol: index == 1 ? 'circle' : '',
+            symbolSize: 12,
+            // 淇敼鐨勬槸绾跨殑棰滆壊
+            lineStyle: {
+              color: {
+                type: 'linear',
+                x: 0,
+                y: 1,
+                x2: 0,
+                y2: 0,
+                // 0% 澶勭殑棰滆壊                           // 100% 澶勭殑棰滆壊
+                colorStops: [
+                  { offset: 0, color: '#66d4fa' },
+                  { offset: 0.25, color: '#66d4fa' },
+                  { offset: 0.75, color: '#66d4fa' },
+                  { offset: 1, color: '#66d4fa' }
+                ],
+                global: false // 缂虹渷涓� false
+              },
+              width: 10
+            },
+            //淇敼鏌辩姸鍥鹃鑹�
+            itemStyle: {
+              normal: {
+                // barBorderRadius: 5,
+                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                  { offset: 0, color: '#00CA69' },
+                  { offset: 1, color: '#3EACE5' }
+                ])
+              }
+            },
+            areaStyle: {
+              normal: {
+                color: new echarts.graphic.LinearGradient(
+                  0,
+                  0,
+                  0,
+                  1,
+                  [
+                    {
+                      offset: 0,
+                      color: 'rgba(236, 99, 123, 0)'
+                    },
+                    {
+                      offset: 1,
+                      color: 'rgba(102, 212, 250,.0)'
+                    }
+                  ],
+                  false
+                ),
+                shadowColor: '#636972',
+                shadowBlur: 1
+              }
+            },
+            data: element.xdata
+          }
+					console.log('nObj',nObj)
+          serieslist.push(nObj);
+        });
+      }
+      this.myChart = echarts.init(this.$refs.sourmeterLine);
+      let splitNumber = 5; // 鍒嗗壊娈�
+
+			let thisOpt = {
+				title: {
+					show: true,
+					text: '浠诲姟鑺傛媿鍒嗘瀽',
+					x: 'center',
+					y: '0%',
+					textAlign: null, //姘村钩瀵归綈鏂瑰紡锛岄粯璁ゆ牴鎹畑璁剧疆鑷姩璋冩暣锛屽彲閫変负锛� left' | 'right' | 'center
+					textStyle: {
+						//涓绘爣棰樻枃鏈牱寮弡"fontSize": 18,"fontWeight": "bolder",}
+						color: this.colors,
+						fontWeight: 'normal',
+						fontSize: 50,
+						fontFamily: 'time_new_Roma'
+					}
+				},
+
+				color: this.colorList,
+				legend: {
+					right: '0%',
+					top: '0%',
+					textStyle: {
+						color: this.colors,
+						fontSize: 36
+					}
+				},
+				tooltip: {
+					trigger: 'axis',
+					textStyle: {
+						fontSize: 36
+					},
+					axisPointer: {
+						type: 'shadow'
+					},
+					formatter: '{b}<br />{a0}: {c0}%<br />{a1}: {c1}'
+				},
+				grid: {
+					left: '1%',
+					right: '1%',
+					bottom: '1%',
+					top: '15%',
+					//	padding:'0 0 10 0',
+					containLabel: true
+				},
+				xAxis: [
+					{
+						type: 'category',
+						axisLabel: {
+							interval: 0, //璁剧疆涓� 1锛岃〃绀恒�庨殧涓�涓爣绛炬樉绀轰竴涓爣绛俱��
+							textStyle: {
+								fontSize: 36
+							},
+							width:100,
+							overflow:'truncate'
+						},
+						axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
+						splitLine: {show: false},
+						data: this.chartData.xdata
+					}
+				],
+				yAxis: [
+					{
+						type: 'value',
+						splitNumber: splitNumber,
+						position: 'left',
+						// min: function (value) {
+						//   return value.min - 10;
+						// },
+						axisLabel: {
+							textStyle: {
+								fontSize: 36
+							},
+							formatter: '{value}%'
+						},
+						axisLine: {
+							lineStyle: {
+								color: this.colors,
+								width: 10
+							}
+						},
+						axisTick: {
+							show: false
+						},
+						splitLine: {
+							show: false,
+							lineStyle: {
+								color: this.colors,
+								width: 10
+							}
+						}
+					},
+					{
+						type: 'value',
+						splitNumber: splitNumber,
+						position: 'right',
+
+						min: function (value) {
+							let max = value.max;
+							let min = value.min;
+
+							let minimum = max - ((max - min) * 3) / 2;
+							if (minimum > 0) {
+								return minimum;
+							} else {
+								return 0;
+							}
+						},
+						axisLabel: {
+							textStyle: {
+								fontSize: 36
+							},
+							formatter: '{value}'
+						},
+						axisLine: {
+							lineStyle: {
+								color: this.colors,
+								width: 10
+							}
+						},
+						axisTick: {
+							show: false
+						},
+						splitLine: {
+							show: true,
+							lineStyle: {
+								color: this.colors,
+								width: 10
+							}
+						}
+					}
+				],
+				dataZoom: [
+					{
+						type: 'inside',
+						startValue: 0,
+						endValue: 7
+					}
+				],
+				series: serieslist
+			}
+			console.log('serieslist',serieslist)
+			thisOpt.dataZoom[0].endValue = thisOpt.xAxis[0].data.length - 1;
+			thisOpt.yAxis[0].max = 100
+			if (this.yTotals>0) {
+				thisOpt.yAxis[1].max = this.yTotals			
+			}
+			console.log(thisOpt)
+
+
+      this.myChart.setOption(
+        thisOpt,
+        true
+      );
+    }
+  },
+  watch: {
+    chartData: {
+      handler() {
+        this.initEchart();
+      },
+      deep: true
+    }
+  }
+};
+</script>
diff --git a/qqjf-Web/src/views/Home/components/movablerateechart.vue b/qqjf-Web/src/views/Home/components/movablerateechart.vue
new file mode 100644
index 0000000..56cc5d3
--- /dev/null
+++ b/qqjf-Web/src/views/Home/components/movablerateechart.vue
@@ -0,0 +1,206 @@
+<template>
+  <div class="chart-wrapper" ref="movablerateLine"></div>
+</template>
+
+<script>
+import resize from '@/mixins/resize';
+const echarts = require('echarts');
+export default {
+  name: 'movablerateLine',
+  props: {
+    echarttitle: {
+      type: String,
+      default: ''
+    },
+    chartData: {
+      type: Object,
+      default: () => {}
+    },
+    colorList: {
+      type: Array,
+      default: () => []
+    },
+    colors: {
+      type: String,
+      default: '#636972'
+    }
+  },
+  mixins: [resize],
+  data() {
+    return {};
+  },
+  mounted() {
+    this.initEchart();
+  },
+  methods: {
+    initEchart() {
+      // 鍩轰簬鍑嗗濂界殑dom锛屽垵濮嬪寲echarts瀹炰緥
+      let serieslist = [];
+      let data = this.chartData.data;
+      if (data) {
+        data.forEach((element, index) => {
+          serieslist.push({
+            name: element.name,
+            type: 'line',
+            smooth: false, //true:鍦嗘粦锛宖alse:鎶樼幇
+            barMaxWidth: 30,
+            // 淇敼鐨勬槸绾跨殑棰滆壊
+            lineStyle: {
+              width: 10,
+              color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
+                {
+                  offset: 0,
+                  color: this.colorList[index]
+                },
+                {
+                  offset: 1,
+                  color: this.colorList[index]
+                }
+              ])
+              // shadowColor: 'rgba(0,0,0, 0.3)',
+              // shadowBlur: 10,
+              // shadowOffsetY: 20
+            },
+
+            data: element.xdata
+            // label: {
+            //   show: true,
+            //   position: 'top',
+            //   distance: 10,
+            //   fontSize: 18,
+            //   color: this.colors
+            // }
+          });
+        });
+      }
+      this.myChart = echarts.init(this.$refs.movablerateLine);
+      this.myChart.setOption(
+        {
+          title: {
+            show: true,
+            text: this.echarttitle,
+            x: 'center',
+            y: '0%',
+            textAlign: null, //姘村钩瀵归綈鏂瑰紡锛岄粯璁ゆ牴鎹畑璁剧疆鑷姩璋冩暣锛屽彲閫変负锛� left' | 'right' | 'center
+            textStyle: {
+              //涓绘爣棰樻枃鏈牱寮弡"fontSize": 18,"fontWeight": "bolder",}
+              color: this.colors,
+              fontWeight: 'normal',
+              fontSize: 50
+            }
+          },
+
+          color: this.colorList,
+          legend: {
+            right: 10,
+            top: '15%',
+            textStyle: {
+              color: this.colors,
+              fontSize: 24
+            }
+          },
+          tooltip: {
+            trigger: 'axis',
+            position: function (pos, params, dom, rect, size) {
+              var obj = { bottom: '5%' };
+              obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 5;
+              return obj;
+            },
+            axisPointer: {
+              type: 'shadow'
+            },
+            textStyle: {
+              fontSize: 36
+            }
+          },
+          grid: {
+            left: '1%',
+            right: '4%',
+            bottom: '1%',
+            top: '30%',
+            //	padding:'0 0 10 0',
+            containLabel: true
+          },
+          xAxis: [
+            {
+              type: 'category',
+              axisLabel: {
+                interval: 0, //璁剧疆涓� 1锛岃〃绀恒�庨殧涓�涓爣绛炬樉绀轰竴涓爣绛俱��
+                margin: 10,
+                textStyle: {
+                  fontSize: 36
+                }
+              },
+              axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
+              splitLine: {
+                show: false,
+                lineStyle: { color: this.colors, width: 1 }
+              },
+              axisTick: {
+                show: false
+              },
+              data: this.chartData.xdata
+            }
+          ],
+          yAxis: [
+            {
+              type: 'value',
+              splitNumber: 5,
+              min: function (value) {
+                let max = value.max;
+                let min = value.min;
+                let minimum = max - ((max - min) * 3) / 2;
+
+                if (minimum > 0) {
+                  return minimum;
+                } else {
+                  return 0;
+                }
+              },
+              axisLabel: {
+                textStyle: {
+                  fontSize: 36
+                },
+                formatter: '{value} %'
+              },
+              axisLine: {
+                lineStyle: {
+                  color: this.colors,
+                  width: 10
+                }
+              },
+              axisTick: {
+                show: false
+              },
+              splitLine: {
+                show: true,
+                lineStyle: {
+                  color: this.colors,
+                  width: 10
+                }
+              }
+            }
+          ],
+          dataZoom: [
+            {
+              type: 'inside',
+              startValue: 10,
+              endValue: 20
+            }
+          ],
+          series: serieslist
+        },
+        true
+      );
+    }
+  },
+  watch: {
+    chartData: {
+      handler() {
+        this.initEchart();
+      },
+      deep: true
+    }
+  }
+};
+</script>
diff --git a/qqjf-Web/src/views/Home/components/product.vue b/qqjf-Web/src/views/Home/components/product.vue
new file mode 100644
index 0000000..f913f2f
--- /dev/null
+++ b/qqjf-Web/src/views/Home/components/product.vue
@@ -0,0 +1,202 @@
+<template>
+  <div class="chart-wrapper" ref="product"></div>
+</template>
+
+<script>
+import resize from '@/mixins/resize';
+const echarts = require('echarts');
+export default {
+  name: 'product',
+  props: {
+    echarttitle: {
+      type: String,
+      default: ''
+    },
+    chartData: {
+      type: Object,
+      default: () => {}
+    },
+    colors: {
+      type: String,
+      default: '#636972'
+    },
+    colorList: {
+      type: Array,
+      default: () => []
+    }
+  },
+  mixins: [resize],
+  data() {
+    return {};
+  },
+  mounted() {
+    this.initEchart();
+  },
+  methods: {
+    initEchart() {
+      // 鍩轰簬鍑嗗濂界殑dom锛屽垵濮嬪寲echarts瀹炰緥
+      let serieslist = [];
+      let data = this.chartData.data;
+      if (data) {
+        data.forEach((element, index) => {
+          serieslist.push({
+            name: element.name,
+            type: 'line',
+            smooth: true,
+            barMaxWidth: 30,
+            // 淇敼鐨勬槸绾跨殑棰滆壊
+            lineStyle: {
+              width: 10,
+              color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
+                {
+                  offset: 0,
+                  color: this.colorList[index]
+                },
+                {
+                  offset: 1,
+                  color: this.colorList[index]
+                }
+              ])
+              // shadowColor: 'rgba(0,0,0, 0.3)',
+              // shadowBlur: 10,
+              // shadowOffsetY: 20
+            },
+
+            data: element.xdata
+            // label: {
+            //   show: true,
+            //   position: 'top',
+            //   distance: 10,
+            //   fontSize: 18,
+            //   color: this.colors
+            // }
+          });
+        });
+      }
+      this.myChart = echarts.init(this.$refs.product);
+      this.myChart.setOption(
+        {
+          title: {
+            show: true,
+            text: '鍦ㄥ埗鍝佽祫閲戝垎鏋�',
+            x: 'center',
+            y: '0%',
+            textAlign: null, //姘村钩瀵归綈鏂瑰紡锛岄粯璁ゆ牴鎹畑璁剧疆鑷姩璋冩暣锛屽彲閫変负锛� left' | 'right' | 'center
+            textStyle: {
+              //涓绘爣棰樻枃鏈牱寮弡"fontSize": 18,"fontWeight": "bolder",}
+              color: this.colors,
+              fontWeight: 'normal',
+              fontSize: 50
+            }
+          },
+
+          color: this.colorList,
+          legend: {
+            right: '1%',
+            top: '10%',
+            textStyle: {
+              fontSize: 36,
+              color: this.colors
+            }
+          },
+          tooltip: {
+            trigger: 'axis',
+
+            axisPointer: {
+              type: 'shadow'
+            },
+            textStyle: {
+              fontSize: 36
+            }
+          },
+          grid: {
+            left: '2%',
+            right: '1%',
+            bottom: '2%',
+            top: '20%',
+            //	padding:'0 0 10 0',
+            containLabel: true
+          },
+          xAxis: [
+            {
+              type: 'category',
+              axisLabel: {
+                interval: 0, //璁剧疆涓� 1锛岃〃绀恒�庨殧涓�涓爣绛炬樉绀轰竴涓爣绛俱��
+                margin: 10,
+                textStyle: {
+                  fontSize: 36
+                }
+              },
+              axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
+              splitLine: {
+                show: false,
+                lineStyle: { color: this.colors, width: 1 }
+              },
+              axisTick: {
+                show: false
+              },
+              data: this.chartData.xdata
+            }
+          ],
+          yAxis: [
+            {
+              name: '閲戦锛堢櫨涓囧厓锛�',
+              nameTextStyle: { fontSize: 36 },
+              type: 'value',
+              splitNumber: 5,
+              min: function (value) {
+                let max = value.max;
+                let min = value.min;
+                let minimum = max - ((max - min) * 3) / 2;
+                if (minimum > 0) {
+                  return minimum;
+                } else {
+                  return 0;
+                }
+              },
+              axisLabel: {
+                textStyle: {
+                  fontSize: 36
+                }
+              },
+              axisLine: {
+                lineStyle: {
+                  color: this.colors,
+                  width: 10
+                }
+              },
+              axisTick: {
+                show: false
+              },
+              splitLine: {
+                show: true,
+                lineStyle: {
+                  color: this.colors,
+                  width: 10
+                }
+              }
+            }
+          ],
+          dataZoom: [
+            {
+              type: 'inside',
+              startValue: 10,
+              endValue: 20
+            }
+          ],
+          series: serieslist
+        },
+        true
+      );
+    }
+  },
+  watch: {
+    chartData: {
+      handler() {
+        this.initEchart();
+      },
+      deep: true
+    }
+  }
+};
+</script>
diff --git a/qqjf-Web/src/views/Home/components/rateequipment.vue b/qqjf-Web/src/views/Home/components/rateequipment.vue
new file mode 100644
index 0000000..cb8385f
--- /dev/null
+++ b/qqjf-Web/src/views/Home/components/rateequipment.vue
@@ -0,0 +1,204 @@
+<template>
+  <div class="chart-wrapper" ref="movablerateLine"></div>
+</template>
+
+<script>
+import resize from '@/mixins/resize';
+const echarts = require('echarts');
+export default {
+  name: 'movablerateLine',
+  props: {
+    echarttitle: {
+      type: String,
+      default: ''
+    },
+    chartData: {
+      type: Object,
+      default: () => {}
+    },
+    colors: {
+      type: String,
+      default: '#636972'
+    },
+    colorList: {
+      type: Array,
+      default: () => []
+    }
+  },
+  mixins: [resize],
+  data() {
+    return {};
+  },
+  mounted() {
+    this.initEchart();
+  },
+  methods: {
+    initEchart() {
+      // 鍩轰簬鍑嗗濂界殑dom锛屽垵濮嬪寲echarts瀹炰緥
+      let serieslist = [];
+      let data = this.chartData.data;
+      if (data) {
+        data.forEach((element, index) => {
+          serieslist.push({
+            name: element.name,
+            type: 'line',
+            smooth: false,
+            barMaxWidth: 30,
+            // 淇敼鐨勬槸绾跨殑棰滆壊
+            lineStyle: {
+              width: 10,
+              color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
+                {
+                  offset: 0,
+                  color: this.colorList[index]
+                },
+                {
+                  offset: 1,
+                  color: this.colorList[index]
+                }
+              ])
+              // shadowColor: 'rgba(0,0,0, 0.3)',
+              // shadowBlur: 10,
+              // shadowOffsetY: 20
+            },
+            data: element.xdata
+            // label: {
+            //   show: true,
+            //   position: 'top',
+            //   distance: 10,
+            //   fontSize: 18,
+            //   color: this.colors
+            // }
+          });
+        });
+      }
+      this.myChart = echarts.init(this.$refs.movablerateLine);
+      this.myChart.setOption(
+        {
+          title: {
+            show: true,
+            text: this.echarttitle,
+            x: 'center',
+            y: '0%',
+            textAlign: null, //姘村钩瀵归綈鏂瑰紡锛岄粯璁ゆ牴鎹畑璁剧疆鑷姩璋冩暣锛屽彲閫変负锛� left' | 'right' | 'center
+            textStyle: {
+              //涓绘爣棰樻枃鏈牱寮弡"fontSize": 18,"fontWeight": "bolder",}
+              color: this.colors,
+              fontWeight: 'normal',
+              fontSize: 50
+            }
+          },
+
+          color: this.colorList,
+          legend: {
+            right: 10,
+            top: '15%',
+            textStyle: {
+              color: this.colors,
+              fontSize: 36
+            }
+          },
+          tooltip: {
+            trigger: 'axis',
+            position: function (pos, params, dom, rect, size) {
+              var obj = { bottom: '5%' };
+              obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 5;
+              return obj;
+            },
+            axisPointer: {
+              type: 'shadow'
+            },
+            textStyle: {
+              fontSize: 36
+            }
+          },
+          grid: {
+            left: '1%',
+            right: '4%',
+            bottom: '1%',
+            top: '30%',
+            //	padding:'0 0 10 0',
+            containLabel: true
+          },
+          xAxis: [
+            {
+              type: 'category',
+              axisLabel: {
+                interval: 0, //璁剧疆涓� 1锛岃〃绀恒�庨殧涓�涓爣绛炬樉绀轰竴涓爣绛俱��
+                margin: 10,
+                textStyle: {
+                  fontSize: 36
+                }
+              },
+              axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
+              splitLine: {
+                show: false,
+                lineStyle: { color: this.colors, width: 10 }
+              },
+              axisTick: {
+                show: false
+              },
+              data: this.chartData.xdata
+            }
+          ],
+          yAxis: [
+            {
+              type: 'value',
+              splitNumber: 5,
+              min: function (value) {
+                let max = value.max;
+                let min = value.min;
+                let minimum = max - ((max - min) * 3) / 2;
+                if (minimum > 0) {
+                  return minimum;
+                } else {
+                  return 0;
+                }
+              },
+              axisLabel: {
+                textStyle: {
+                  fontSize: 36
+                },
+                formatter: '{value} %'
+              },
+              axisLine: {
+                lineStyle: {
+                  color: this.colors,
+                  width: 10
+                }
+              },
+              axisTick: {
+                show: false
+              },
+              splitLine: {
+                show: true,
+                lineStyle: {
+                  color: this.colors,
+                  width: 10
+                }
+              }
+            }
+          ],
+          dataZoom: [
+            {
+              type: 'inside',
+              startValue: 1,
+              endValue: 20
+            }
+          ],
+          series: serieslist
+        },
+        true
+      );
+    }
+  },
+  watch: {
+    chartData: {
+      handler() {
+        this.initEchart();
+      },
+      deep: true
+    }
+  }
+};
+</script>
diff --git a/qqjf-Web/src/views/Home/components/sourceEchart.vue b/qqjf-Web/src/views/Home/components/sourceEchart.vue
new file mode 100644
index 0000000..316a142
--- /dev/null
+++ b/qqjf-Web/src/views/Home/components/sourceEchart.vue
@@ -0,0 +1,121 @@
+<template>
+  <div class="chart-wrapper" ref="sourcePie"></div>
+</template>
+
+<script>
+import resize from '@/mixins/resize';
+const echarts = require('echarts');
+export default {
+  name: 'sourcePie',
+  props: {
+    chartData: {
+      type: Object
+    },
+    titleechart: {
+      type: String,
+      default: ''
+    },
+    colors: {
+      type: String,
+      default: '#636972'
+    }
+  },
+  mixins: [resize],
+  data() {
+    return {};
+  },
+  mounted() {
+    this.initEchart();
+  },
+  methods: {
+    initEchart() {
+      var colorList = ['#569ada', '#f47b2a', '#a1a1a1', '#ffc61f', '#3a6cc6', '#6cae3f', '#1e5c94'];
+      // 鍩轰簬鍑嗗濂界殑dom锛屽垵濮嬪寲echarts瀹炰緥
+      let seriesData = [];
+      if (this.chartData.data) {
+        this.chartData.data.forEach(element => {
+          seriesData.push({
+            name: element.name,
+            value: element.data
+          });
+        });
+      }
+      this.myChart = echarts.init(this.$refs.sourcePie);
+      this.myChart.setOption(
+        {
+          title: {
+            show: true, //鏄剧ず绛栫暐锛岄粯璁ゅ�紅rue,鍙�変负锛歵rue锛堟樉绀猴級 | false锛堥殣钘忥級
+            text: this.titleechart, //涓绘爣棰樻枃鏈紝'\n'鎸囧畾鎹㈣
+            x: 'center', //姘村钩瀹夋斁浣嶇疆锛岄粯璁や负'left'锛屽彲閫変负锛�'center' | 'left' | 'right' | {number}锛坸鍧愭爣锛屽崟浣峱x锛�
+            y: '2%', //鍨傜洿瀹夋斁浣嶇疆锛岄粯璁や负top锛屽彲閫変负锛�'top' | 'bottom' | 'center' | {number}锛坹鍧愭爣锛屽崟浣峱x锛�
+            textAlign: null, //姘村钩瀵归綈鏂瑰紡锛岄粯璁ゆ牴鎹畑璁剧疆鑷姩璋冩暣锛屽彲閫変负锛� left' | 'right' | 'center
+            textStyle: {
+              //涓绘爣棰樻枃鏈牱寮弡"fontSize": 18,"fontWeight": "bolder",}
+              color: this.colors,
+              fontWeight: 'normal',
+              fontSize: 50
+            }
+          },
+
+          tooltip: {
+            trigger: 'item',
+            borderWidth: 1,
+            padding: 5,
+            formatter: function (parms) {
+              var str = parms.marker + '' + parms.data.name + '</br>' + '鍗犳瘮锛�' + parms.percent + '%';
+              return str;
+            }
+          },
+          legend: [
+            {
+              type: 'plain',
+              bottom: '12%',
+              itemGap: 20,
+              textStyle: {
+                fontSize: 24,
+                color: this.colors
+              },
+              data: this.chartData.legend
+            }
+          ],
+          series: [
+            {
+              type: 'pie',
+              center: ['50%', '40%'],
+              radius: ['35%', '50%'],
+              label: {
+                show: true,
+                position: 'outside',
+                textStyle: {
+                  fontSize: 28,
+                  color: this.colors
+                }
+              },
+              labelLine: {
+                show: true,
+                normal: {
+                  length: 20,
+                  length2: 30,
+                  lineStyle: {
+                    width: 1
+                  }
+                }
+              },
+              data: seriesData
+            }
+          ]
+        },
+        true
+      );
+    }
+  },
+  watch: {
+    chartData: {
+      handler() {
+        this.initEchart();
+      },
+      deep: true
+    }
+  }
+};
+</script>
diff --git a/qqjf-Web/src/views/Home/components/tasktimeecharts.vue b/qqjf-Web/src/views/Home/components/tasktimeecharts.vue
new file mode 100644
index 0000000..8c84304
--- /dev/null
+++ b/qqjf-Web/src/views/Home/components/tasktimeecharts.vue
@@ -0,0 +1,210 @@
+<template>
+  <div class="chart-wrapper" ref="tasktimeecharts"></div>
+</template>
+
+<script>
+import resize from '@/mixins/resize';
+const echarts = require('echarts');
+export default {
+  name: 'tasktimeecharts',
+  props: {
+    chartData: {
+      type: Object,
+      default: () => {}
+    },
+    colorList: {
+      type: Array,
+      default: () => []
+    },
+    colors: {
+      type: String,
+      default: '#636972'
+    }
+  },
+  mixins: [resize],
+  data() {
+    return {};
+  },
+  mounted() {
+    this.initEchart();
+  },
+  methods: {
+    initEchart() {
+      // 鍩轰簬鍑嗗濂界殑dom锛屽垵濮嬪寲echarts瀹炰緥
+      let serieslist = [];
+      let data = this.chartData.data;
+      if (data) {
+        data.forEach((element, index) => {
+          serieslist.push({
+            name: element.name,
+            type: 'line',
+            smooth: true,
+            // 淇敼鐨勬槸绾跨殑棰滆壊
+            lineStyle: {
+              width: 10
+            },
+            // areaStyle: {
+            //   normal: {
+            //     barBorderRadius: [5, 5, 0, 0],
+            //     color: new echarts.graphic.LinearGradient(
+            //       0,
+            //       0,
+            //       0,
+            //       1,
+            //       [
+            //         {
+            //           offset: 0,
+            //           color: this.colorList[index]
+            //           // color: 'rgba(236, 99, 123, .5)'
+            //         },
+
+            //         {
+            //           offset: 1,
+            //           color: 'rgba(102, 212, 250,0)'
+            //         }
+            //       ],
+            //       false
+            //     ),
+
+            //     shadowColor: '#636972',
+            //     shadowBlur: 1
+            //   }
+            // },
+            data: element.xdata
+            // label: {
+            //   show: true,
+            //   position: 'top',
+            //   distance: 10,
+            //   fontSize: 18,
+            //   color: this.colors
+            // }
+          });
+        });
+      }
+      this.myChart = echarts.init(this.$refs.tasktimeecharts);
+      this.myChart.setOption(
+        {
+          title: {
+            show: true,
+            text: '鍑哄叆搴撲换鍔″钩鍧囨椂闀�(鍒嗛挓)',
+            x: 'center',
+            y: '2%',
+            textAlign: null, //姘村钩瀵归綈鏂瑰紡锛岄粯璁ゆ牴鎹畑璁剧疆鑷姩璋冩暣锛屽彲閫変负锛� left' | 'right' | 'center
+            textStyle: {
+              //涓绘爣棰樻枃鏈牱寮弡"fontSize": 18,"fontWeight": "bolder",}
+              color: this.colors,
+              fontWeight: 'normal',
+              fontSize: 50
+            }
+          },
+
+          // color: this.colorList,
+          legend: {
+            right: '1%',
+            top: '10%',
+            textStyle: {
+              color: this.colors,
+              fontSize: 36
+            }
+          },
+          tooltip: {
+            trigger: 'axis',
+            // formatter: '{b0}: {c0}<br />{b1}: {c1}<br />{b2}: {c2}',
+            axisPointer: {
+              type: 'shadow'
+            },
+            textStyle: {
+              fontSize: 36
+            }
+          },
+          grid: {
+            left: '2%',
+            right: '1%',
+            bottom: '1%',
+            top: '20%',
+            //	padding:'0 0 10 0',
+            containLabel: true
+          },
+          xAxis: [
+            {
+              type: 'category',
+              axisLabel: {
+                interval: 0, //璁剧疆涓� 1锛岃〃绀恒�庨殧涓�涓爣绛炬樉绀轰竴涓爣绛俱��
+                margin: 10,
+                textStyle: {
+                  fontSize: 36
+                }
+              },
+              axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
+              splitLine: {
+                show: false,
+                lineStyle: { color: this.colors, width: 1 }
+              },
+              axisTick: {
+                show: false
+              },
+              data: this.chartData.xdata
+            }
+          ],
+          yAxis: [
+            {
+              name: '鏃堕棿锛堝垎閽燂級',
+              nameTextStyle: { fontSize: 24 },
+              type: 'value',
+              splitNumber: 5,
+              min: function (value) {
+                let max = value.max;
+                let min = value.min;
+                let minimum = max - ((max - min) * 3) / 2;
+                if (minimum > 0) {
+                  return minimum;
+                } else {
+                  return 0;
+                }
+              },
+              axisLabel: {
+                textStyle: {
+                  fontSize: 36
+                }
+              },
+              axisLine: {
+                lineStyle: {
+                  color: this.colors,
+                  width: 10
+                }
+              },
+              axisTick: {
+                show: false
+              },
+              splitLine: {
+                show: true,
+                lineStyle: {
+                  color: this.colors,
+                  width: 10
+                }
+              }
+            }
+          ],
+          dataZoom: [
+            {
+              type: 'inside',
+              startValue: 10,
+              endValue: 20
+            }
+          ],
+          series: serieslist
+        },
+        true
+      );
+    }
+  },
+  watch: {
+    chartData: {
+      handler() {
+        this.initEchart();
+      },
+      deep: true
+    }
+  }
+};
+</script>
diff --git a/qqjf-Web/src/views/Home/components/turnoverEchart.vue b/qqjf-Web/src/views/Home/components/turnoverEchart.vue
new file mode 100644
index 0000000..f2e0a51
--- /dev/null
+++ b/qqjf-Web/src/views/Home/components/turnoverEchart.vue
@@ -0,0 +1,207 @@
+<template>
+  <div class="chart-wrapper" ref="turnoverLine"></div>
+</template>
+
+<script>
+import resize from '@/mixins/resize';
+const echarts = require('echarts');
+export default {
+  name: 'turnoverLine',
+  props: {
+    chartData: {
+      type: Object,
+      default: () => {}
+    },
+    colorList: {
+      type: Array,
+      default: () => []
+    },
+    colors: {
+      type: String,
+      default: '#636972'
+    }
+  },
+  mixins: [resize],
+  data() {
+    return {};
+  },
+  mounted() {
+    this.initEchart();
+  },
+  methods: {
+    initEchart() {
+      // 鍩轰簬鍑嗗濂界殑dom锛屽垵濮嬪寲echarts瀹炰緥
+      let serieslist = [];
+      let data = this.chartData.data;
+      if (data) {
+        data.forEach((element, index) => {
+          serieslist.push({
+            name: element.name,
+            type: 'bar',
+            showBackground: false,
+            barBorderRadius: 30,
+            yAxisIndex: 0,
+            barMaxWidth: 30,
+            itemStyle: {
+              normal: {
+                color: new echarts.graphic.LinearGradient(
+                  0,
+                  1,
+                  1,
+                  0,
+                  [
+                    {
+                      offset: 0,
+                      color: this.colorList[index]
+                    },
+
+                    {
+                      offset: 1,
+                      color: this.colorList[index]
+                    }
+                  ],
+                  false
+                ),
+                barBorderRadius: 10
+              },
+              barBorderRadius: 4
+            },
+
+            data: element.xdata,
+            label: {
+              show: true,
+              position: 'top',
+              distance: 10,
+              fontSize: 36,
+              color: this.colors
+            }
+          });
+        });
+      }
+      this.myChart = echarts.init(this.$refs.turnoverLine);
+      this.myChart.setOption(
+        {
+          title: {
+            show: true,
+            text: data ? '鍒朵欢鍛ㄨ浆鏃堕棿' : '鏆傛棤鏁版嵁',
+            x: 'center',
+            y: data ? '2%' : 'center',
+            textAlign: null, //姘村钩瀵归綈鏂瑰紡锛岄粯璁ゆ牴鎹畑璁剧疆鑷姩璋冩暣锛屽彲閫変负锛� left' | 'right' | 'center
+            textStyle: {
+              //涓绘爣棰樻枃鏈牱寮弡"fontSize": 18,"fontWeight": "bolder",}
+              color: this.colors,
+              fontWeight: 'normal',
+              fontSize: 50
+            }
+          },
+
+          color: this.colorList,
+          legend: {
+            right: '1%',
+            top: '10%',
+            textStyle: {
+              color: this.colors,
+              fontSize: 36
+            }
+          },
+          tooltip: {
+            trigger: 'axis',
+
+            axisPointer: {
+              type: 'shadow'
+            },
+            textStyle: {
+              fontSize: 36
+            }
+          },
+          grid: {
+            left: '5%',
+            right: '1%',
+            bottom: '1%',
+            top: '20%',
+            //	padding:'0 0 10 0',
+            containLabel: true
+          },
+          xAxis: [
+            {
+              type: 'category',
+              axisLabel: {
+                interval: 0, //璁剧疆涓� 1锛岃〃绀恒�庨殧涓�涓爣绛炬樉绀轰竴涓爣绛俱��
+                margin: 10,
+                textStyle: {
+                  fontSize: 16
+                }
+              },
+              axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
+              splitLine: {
+                show: false,
+                lineStyle: { color: this.colors, width: 10 }
+              },
+              axisTick: {
+                show: false
+              },
+              data: this.chartData.xdata
+            }
+          ],
+          yAxis: [
+            {
+              name: '鍛ㄨ浆澶╂暟(澶�)',
+              nameTextStyle: { fontSize: 28 },
+              type: 'value',
+              splitNumber: 5,
+              min: function (value) {
+                let max = value.max;
+                let min = value.min;
+                let minimum = max - ((max - min) * 3) / 2;
+                if (minimum > 0) {
+                  return minimum;
+                } else {
+                  return 0;
+                }
+              },
+              axisLabel: {
+                textStyle: {
+                  fontSize: 36
+                }
+              },
+              axisLine: {
+                lineStyle: {
+                  color: this.colors,
+                  width: 10
+                }
+              },
+              axisTick: {
+                show: false
+              },
+              splitLine: {
+                show: true,
+                lineStyle: {
+                  color: this.colors,
+                  width: 10
+                }
+              }
+            }
+          ],
+          dataZoom: [
+            {
+              type: 'inside',
+              startValue: 10,
+              endValue: 20
+            }
+          ],
+          series: serieslist
+        },
+        true
+      );
+    }
+  },
+  watch: {
+    chartData: {
+      handler() {
+        this.initEchart();
+      },
+      deep: true
+    }
+  }
+};
+</script>
diff --git a/qqjf-Web/src/views/Home/components/warehouseechart.vue b/qqjf-Web/src/views/Home/components/warehouseechart.vue
new file mode 100644
index 0000000..d4f492a
--- /dev/null
+++ b/qqjf-Web/src/views/Home/components/warehouseechart.vue
@@ -0,0 +1,235 @@
+<template>
+  <div class="chart-wrapper" ref="warehouseLine"></div>
+</template>
+
+<script>
+import resize from '@/mixins/resize';
+const echarts = require('echarts');
+export default {
+  name: 'warehouseLine',
+  props: {
+    chartData: {
+      type: Object,
+      default: () => {}
+    },
+    colorList: {
+      type: Array,
+      default: () => []
+    },
+    colors: {
+      type: String,
+      default: '#636972'
+    }
+  },
+  mixins: [resize],
+  data() {
+    return {};
+  },
+  mounted() {
+    this.initEchart();
+  },
+  methods: {
+    initEchart() {
+      // 鍩轰簬鍑嗗濂界殑dom锛屽垵濮嬪寲echarts瀹炰緥
+      let serieslist = [];
+      let data = this.chartData.data;
+      if (data) {
+        // data.forEach(element => {
+        serieslist.push(
+          {
+            name: data[0].name,
+            type: 'bar',
+            showBackground: false,
+            barBorderRadius: 30,
+            yAxisIndex: 0,
+            barMaxWidth: 30,
+            itemStyle: {
+              normal: {
+                color: new echarts.graphic.LinearGradient(
+                  0,
+                  1,
+                  1,
+                  0,
+                  [
+                    {
+                      offset: 0,
+                      color: '#A71A2B'
+                    },
+
+                    {
+                      offset: 1,
+                      color: '#A71A2B'
+                    }
+                  ],
+                  false
+                ),
+                barBorderRadius: 10
+              },
+              // color: '#A71A2B',
+              barBorderRadius: 4
+            },
+
+            data: data[0].xdata,
+            label: {
+              show: true,
+              position: 'top',
+              distance: 10,
+              fontSize: 18,
+              color: this.colors
+            }
+          }
+          // {
+          //   name: data[1].name,
+          //   type: 'line',
+          //   smooth: true,
+          //   barMaxWidth: 30,
+          //   // 淇敼鐨勬槸绾跨殑棰滆壊
+          //   lineStyle: {
+          //     color: {
+          //       type: 'linear',
+          //       x: 0,
+          //       y: 1,
+          //       x2: 0,
+          //       y2: 0,
+          //       // 0% 澶勭殑棰滆壊                           // 100% 澶勭殑棰滆壊
+          //       colorStops: [
+          //         { offset: 0, color: '#f8d470' },
+          //         { offset: 0.25, color: '#f8d470' },
+          //         { offset: 0.75, color: '#f8d470' },
+          //         { offset: 1, color: '#f8d470' }
+          //       ],
+          //       global: false // 缂虹渷涓� false
+          //     },
+          //     width: 10
+          //   },
+
+          //   data: data[1].xdata
+          // }
+        );
+      }
+      this.myChart = echarts.init(this.$refs.warehouseLine);
+      this.myChart.setOption(
+        {
+          title: {
+            show: true,
+            text: '璐ф牸鍒╃敤鐜�',
+            x: 'center',
+            y: '2%',
+            textAlign: null, //姘村钩瀵归綈鏂瑰紡锛岄粯璁ゆ牴鎹畑璁剧疆鑷姩璋冩暣锛屽彲閫変负锛� left' | 'right' | 'center
+            textStyle: {
+              //涓绘爣棰樻枃鏈牱寮弡"fontSize": 18,"fontWeight": "bolder",}
+              color: this.colors,
+              fontWeight: 'normal',
+              fontSize: 50
+            }
+          },
+
+          color: this.colorList,
+          legend: {
+            right: '1%',
+            top: '10%',
+            textStyle: {
+              color: this.colors,
+              fontSize: 36
+            }
+          },
+          tooltip: {
+            trigger: 'axis',
+
+            axisPointer: {
+              type: 'shadow'
+            },
+            textStyle: {
+              fontSize: 36
+            }
+          },
+          grid: {
+            left: '1%',
+            right: '1%',
+            bottom: '1%',
+            top: '20%',
+            //	padding:'0 0 10 0',
+            containLabel: true
+          },
+          xAxis: [
+            {
+              type: 'category',
+              axisLabel: {
+                interval: 0, //璁剧疆涓� 1锛岃〃绀恒�庨殧涓�涓爣绛炬樉绀轰竴涓爣绛俱��
+                margin: 10,
+                textStyle: {
+                  fontSize: 36
+                }
+              },
+              axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
+              splitLine: {
+                show: false,
+                lineStyle: { color: this.colors, width: 10 }
+              },
+              axisTick: {
+                show: false
+              },
+              data: this.chartData.xdata
+            }
+          ],
+          yAxis: [
+            {
+              type: 'value',
+              splitNumber: 5,
+              min: function (value) {
+                let max = value.max;
+                let min = value.min;
+                let minimum = max - ((max - min) * 3) / 2;
+                if (minimum > 0) {
+                  return minimum;
+                } else {
+                  return 0;
+                }
+              },
+              axisLabel: {
+                textStyle: {
+                  fontSize: 36
+                },
+                formatter: '{value} %'
+              },
+              axisLine: {
+                lineStyle: {
+                  color: this.colors,
+                  width: 10
+                }
+              },
+              axisTick: {
+                show: false
+              },
+              splitLine: {
+                show: true,
+                lineStyle: {
+                  color: this.colors,
+                  wdith: 10
+                }
+              }
+            }
+          ],
+          dataZoom: [
+            {
+              type: 'inside',
+              startValue: 10,
+              endValue: 20
+            }
+          ],
+          series: serieslist
+        },
+        true
+      );
+    }
+  },
+  watch: {
+    chartData: {
+      handler() {
+        this.initEchart();
+      },
+      deep: true
+    }
+  }
+};
+</script>
diff --git a/qqjf-Web/src/views/Home/index.vue b/qqjf-Web/src/views/Home/index.vue
new file mode 100644
index 0000000..73c46f1
--- /dev/null
+++ b/qqjf-Web/src/views/Home/index.vue
@@ -0,0 +1,296 @@
+<template>
+  <div id="Homes" class="global-content">
+    <div class="box-top flex justify-between overflow">
+      <div class="top-left">
+        <left-top :navobj="topleftobj" />
+        <div class="width flex align-center applyheight margin2">
+          <class-echart titleechart="闆朵欢鏉ユ簮鍒嗗竷" colors="#fff" :chartData="chartData" class="width height" />
+          <class-echart titleechart="鍣ㄥ叿鏉ユ簮鍒嗗竷" colors="#fff" :chartData="applianceData" class="width height" />
+        </div>
+      </div>
+      <div class="top-centent">
+        <p class="colorfff padding10 fontsize2rem text-center pointer" @click="clickFullscreen">
+          鏅鸿兘鍖栧啿鍘嬬珛浣撳簱鏁版嵁涓績
+        </p>
+      </div>
+      <div class="top-right">
+        <div class="width height48 overflow margin-top10px">
+          <movablerate-echart
+            colors="#fff"
+            class="width height"
+            echarttitle="鍫嗗灈鏈�"
+            :chartData="movalData"
+            :colorList="colorList"
+          />
+        </div>
+        <div class="width height48 overflow margin-top10px">
+          <movablerate-echart
+            colors="#fff"
+            class="width height"
+            echarttitle="RGV"
+            :chartData="rgvdata"
+            :colorList="colorList"
+          />
+        </div>
+      </div>
+    </div>
+    <div class="box-bottom flex justify-between overflow">
+      <div class="height width25">
+        <tasktime-echart class="width height" colors="#fff" :chartData="tasktimeData" :colorList="colorList" />
+      </div>
+      <div class="height width25">
+        <task-echart class="width height" colors="#fff" :chartData="taskData" :colorList="taskcolorList" />
+      </div>
+      <div class="height width25">
+        <warehouse-echart class="width height" colors="#fff" :chartData="wareData" :colorList="taskcolorList" />
+      </div>
+      <div class="height width25">
+        <turnover-echart class="width height" colors="#fff" :chartData="turnoverData" :colorList="taskcolorList" />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import screenfull from 'screenfull';
+import { GetDateStr } from '@/utils/date';
+import LeftTop from './components/lefttop.vue';
+import ClassEchart from './components/sourceEchart.vue'; //鍒朵欢鍒嗙被
+import TaskEchart from './components/meterEchart.vue'; //浠诲姟鑺傛媿鍒嗘瀽
+import MovablerateEchart from './components/movablerateechart.vue'; //璁惧鍙姩
+import TasktimeEchart from './components/tasktimeecharts.vue'; //骞冲潎鏃堕暱
+import WarehouseEchart from './components/warehouseechart.vue'; //璐ф牸鍒╃敤鐜�
+import TurnoverEchart from './components/turnoverEchart.vue'; //鍒朵欢鍛ㄨ浆
+import {
+  GetStockClassificationData,
+  GetInOutAverageTime,
+  GetTaskBeatAnalysis,
+  GetPartTurnover,
+  GetStorageVailability,
+  GetDevMovable
+} from '@/api/reportforms';
+
+export default {
+  data() {
+    return {
+      topleftobj: {
+        titel: '绔嬪簱鎬昏',
+        list: [
+          {
+            titel: '搴撲綅鎬绘暟',
+            value: 0
+          },
+          {
+            titel: '鏈夎揣搴撲綅',
+            value: 0
+          },
+          {
+            titel: '甯︿欢鍣ㄥ叿',
+            value: 0
+          },
+          {
+            titel: '绌哄櫒鍏锋暟',
+            value: 0
+          },
+          {
+            titel: '鍒朵欢鎬绘暟',
+            value: 0
+          }
+        ]
+      },
+      toprightobj: {
+        titel: '鍒朵欢鎬昏',
+        list: [
+          {
+            titel: '鍒朵欢鎬绘暟',
+            value: 100
+          },
+          {
+            titel: '鍒朵欢绉嶇被',
+            value: 100
+          },
+          {
+            titel: '浠婃棩鍏ュ簱',
+            value: 100
+          },
+          {
+            titel: '浠婃棩鍑哄簱',
+            value: 100
+          }
+        ]
+      },
+      pickertime: [GetDateStr(-15), GetDateStr(0)],
+      chartData: {},
+      applianceData: {},
+      tasktimeData: {},
+      taskData: {},
+      turnoverData: {},
+      wareData: {},
+      movalData: {},
+      rgvdata: {},
+      taskcolorList: ['#0090FF', '#36CE9E', '#FFC005', '#FF515A', '#8B5CFF', '#00CA69'],
+      colorList: [
+        '#0090FF',
+        '#36CE9E',
+        '#FFC005',
+        '#FF515A',
+        '#8B5CFF',
+        '#00CA69',
+        '#F3A43B',
+        '#D7504B',
+        '#C6E579',
+        '#F0805A',
+        '#26C0C0',
+        '#660077',
+        '#FFCCCC',
+        '#550088',
+        '#FFFFBB',
+        '#99FFFF',
+        '#CC00CC',
+        '#CC00CC',
+        '#C63300',
+        '#9955FF',
+        '#66FF66',
+        '#B5C334',
+        '#FCCE10',
+        '#27727B',
+        '#FE8463',
+        '#FAD860',
+        '#F3A43B',
+        '#D7504B',
+        '#C6E579',
+        '#F0805A',
+        '#26C0C0',
+        '#660077',
+        '#FFCCCC',
+        '#550088',
+        '#FFAA33',
+        '#CC00CC',
+        '#FF77FF',
+        '#C63300',
+        '#F4E001',
+        '#66FF66'
+      ]
+    };
+  },
+  components: { LeftTop, ClassEchart, MovablerateEchart, TasktimeEchart, TaskEchart, TurnoverEchart, WarehouseEchart },
+  mounted() {
+    this.$nextTick(() => {
+      this.clickFullscreen();
+    });
+    this.GetStockClassificationData();
+    this.applianceDataficationData();
+    this.GetInOutAverageTime();
+    this.GetTaskBeatAnalysis();
+    this.GetPartTurnover();
+    this.GetStorageVailability();
+    this.GetDevMovable();
+    this.GetRGVDevMovable();
+  },
+  methods: {
+    clickFullscreen() {
+      screenfull.toggle();
+    },
+    //闆朵欢鏉ユ簮
+    GetStockClassificationData() {
+      GetStockClassificationData({ type: 1 }).then(res => {
+        this.chartData = res;
+      });
+    },
+    //鍣ㄥ叿鏉ユ簮
+    applianceDataficationData() {
+      GetStockClassificationData({ type: 2 }).then(res => {
+        this.applianceData = res;
+      });
+    },
+    //骞冲潎鏃堕暱
+    GetInOutAverageTime() {
+      let startTime = this.pickertime ? this.pickertime[0] : '';
+      let endTime = this.pickertime ? this.pickertime[1] : '';
+      GetInOutAverageTime({ startTime: startTime, endTime: endTime }).then(res => {
+        this.tasktimeData = res;
+      });
+    },
+    //浠诲姟鑺傛媿
+    GetTaskBeatAnalysis() {
+      GetTaskBeatAnalysis({ startTime: this.pickertime }).then(res => {
+        this.taskData = res;
+      });
+    },
+    //璐ф牸鍒╃敤鐜�
+    GetStorageVailability() {
+      let objtimes = {
+        startTime: this.pickertime ? this.pickertime[0] : '',
+        endTime: this.pickertime ? this.pickertime[1] : ''
+      };
+      GetStorageVailability(objtimes).then(res => {
+        this.wareData = res;
+      });
+    },
+    //鍒朵欢鍛ㄨ浆路1
+    GetPartTurnover() {
+      let intimers = {
+        year: '',
+        month: '',
+        stWeek: '',
+        edWeek: ''
+      };
+      GetPartTurnover(intimers).then(res => {
+        this.turnoverData = res;
+      });
+    },
+    //鍫嗗灈鏈�
+    GetDevMovable() {
+      let objtimes = {
+        startTime: this.pickertime ? this.pickertime[0] : '',
+        endTime: this.pickertime ? this.pickertime[1] : '',
+        type: 1
+      };
+      GetDevMovable(objtimes).then(res => {
+        this.movalData = res;
+      });
+    },
+    //RGV
+    GetRGVDevMovable() {
+      let objtimes = {
+        startTime: this.pickertime ? this.pickertime[0] : '',
+        endTime: this.pickertime ? this.pickertime[1] : '',
+        type: 2
+      };
+      GetDevMovable(objtimes).then(res => {
+        this.rgvdata = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#Homes {
+  background-color: #1c456b;
+  // background: url('../../assets/home/homebg1.jpg') no-repeat;
+  // background-size: 100% 100%;
+  overflow: hidden;
+  .box-top {
+    width: 100%;
+    height: 64%;
+    .top-left {
+      width: 28%;
+      height: 100%;
+    }
+    .top-centent {
+      width: 42%;
+      height: 100%;
+    }
+    .top-right {
+      width: 28%;
+      height: 100%;
+    }
+  }
+  .box-bottom {
+    width: 100%;
+    height: 34%;
+    margin-top: 10px;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/basicInfo/base/index.vue b/qqjf-Web/src/views/basicInfo/base/index.vue
new file mode 100644
index 0000000..1cb60c6
--- /dev/null
+++ b/qqjf-Web/src/views/basicInfo/base/index.vue
@@ -0,0 +1,9 @@
+<template>
+  <router-view />
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/basicInfo/base/stacker/index.vue b/qqjf-Web/src/views/basicInfo/base/stacker/index.vue
new file mode 100644
index 0000000..3c3e93b
--- /dev/null
+++ b/qqjf-Web/src/views/basicInfo/base/stacker/index.vue
@@ -0,0 +1,159 @@
+<template>
+  <!-- 璁惧绠$悊 -->
+  <div id="stacker" class="global-content">
+    <!-- 绛涢�� -->
+    <base-inquer :dele="false" byfilter="璁惧鍚�" :filterList="filterList" @addmodal="addmodal" @inquer="inquer" />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="false"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        @edit="edit"
+        @del="del"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+      />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow" :modabg="true" @cancel="addmodalShow = false">
+        <p slot="title">璁惧绠$悊-{{ title }}</p>
+        <div class="height" slot="centent">
+          <stacker-edit @cancel="addmodalShow = false" :rowitem="rowitem" @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import baseInquer from '../../components/baseinquer';
+import stackerEdit from '../../components/stackerEdit';
+const { stacker } = require('@/components/tableContainer/tableHead');
+import { DeviceSearch, UserDelete } from '@/api/stacker';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: [],
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '璁惧鍚�',
+          label: '璁惧鍚�'
+        },
+        {
+          value: '璁惧绫诲瀷',
+          label: '璁惧绫诲瀷'
+        }
+      ],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20
+    };
+  },
+  components: { TableContainer, baseInquer, Modal, stackerEdit },
+  computed: {
+    tableHead() {
+      return stacker;
+    }
+  },
+  mounted() {
+    this.DeviceSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.inuqerobg = e;
+      this.DeviceSearch();
+    },
+    //鎼滅储鐢ㄦ埛
+    DeviceSearch() {
+      this.$Loading(true);
+      const { 璁惧鍚�: deviceName, 璁惧绫诲瀷: deviceType } = this.inuqerobg;
+      DeviceSearch(this.page + '&onePageNum=' + this.pageSize, { deviceName, deviceType }).then(res => {
+        if (res.code == 0) {
+          this.tableData = res.data;
+          this.totle = res.num;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.DeviceSearch();
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.DeviceSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { USERNAME } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          // UserDelete({ userName: USERNAME }).then(res => {
+          //   this.$message({
+          //     type: 'success',
+          //     message: '鍒犻櫎鎴愬姛!'
+          //   });
+          //   this.DeviceSearch();
+          // });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.DeviceSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#stacker {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/basicInfo/base/warning/index.vue b/qqjf-Web/src/views/basicInfo/base/warning/index.vue
new file mode 100644
index 0000000..285a973
--- /dev/null
+++ b/qqjf-Web/src/views/basicInfo/base/warning/index.vue
@@ -0,0 +1,204 @@
+<template>
+  <!-- 鎶ヨ淇℃伅 -->
+  <div id="warning" class="global-content">
+    <!-- 绛涢�� -->
+    <base-inquer
+      :add="false"
+      :dele="false"
+      :allderive="true"
+      byfilter="鏁呴殰鍚嶇О"
+      :filterList="filterList"
+      @addmodal="addmodal"
+      @inquer="inquer"
+      @allderive="allderive"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        @edit="edit"
+        @del="del"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+      />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow" :modabg="true" @cancel="addmodalShow = false">
+        <p slot="title">璁惧鎶ヨ淇℃伅-{{ title }}</p>
+        <div class="height" slot="centent">
+          <warning-edit @cancel="addmodalShow = false" :rowitem="rowitem" @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import baseInquer from '../../components/baseinquer';
+import warningEdit from '../../components/warningEdit';
+const { warning } = require('@/components/tableContainer/tableHead');
+import { getimestampDate, getymdhms } from '@/utils/date';
+import { AlertSearch, AlertDelete, GetAllAlarmInfo } from '@/api/warning';
+import { exportTableList } from '@/utils/excel';
+import XLSX from 'xlsx';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: [],
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '鏁呴殰鍚嶇О',
+          label: '鏁呴殰鍚嶇О'
+        },
+        {
+          value: '鏁呴殰鎻忚堪',
+          label: '鏁呴殰鎻忚堪'
+        },
+        {
+          value: '鏁呴殰璁惧',
+          label: '鏁呴殰璁惧'
+        },
+        {
+          value: '鏁呴殰缂栧彿',
+          label: '鏁呴殰缂栧彿'
+        }
+      ],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20
+    };
+  },
+  components: { TableContainer, baseInquer, Modal, warningEdit },
+  computed: {
+    tableHead() {
+      return warning;
+    }
+  },
+  mounted() {
+    this.AlertSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.inuqerobg = e;
+      this.AlertSearch();
+    },
+
+    //鎼滅储鎶ヨ淇℃伅
+    AlertSearch() {
+      this.$Loading(true);
+      const { 鏁呴殰鍚嶇О: alertName, 鏁呴殰鎻忚堪: alertDes, 鏁呴殰璁惧: deviceName, 鏁呴殰缂栧彿: alertCode } = this.inuqerobg;
+      AlertSearch(this.page + '&onePageNum=' + this.pageSize, { alertName, alertDes, deviceName, alertCode }).then(
+        res => {
+          if (res.code == 0) {
+            let data = res.data;
+            data.forEach(item => {
+              item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
+
+              item.createTime = item.createTime ? getimestampDate(item.createTime) : '';
+            });
+            console.log(data);
+            this.tableData = data;
+            this.totle = res.num;
+          }
+          this.$Loading();
+        }
+      );
+    },
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.AlertSearch();
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.AlertSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { USERNAME } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          // AlertDelete({ userName: USERNAME }).then(res => {
+          //   this.$message({
+          //     type: 'success',
+          //     message: '鍒犻櫎鎴愬姛!'
+          //   });
+          //   this.AlertSearch();
+          // });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.AlertSearch();
+    },
+    //鍏ㄩ儴瀵煎嚭
+    allderive() {
+      const { 鏁呴殰鍚嶇О: alertName, 鏁呴殰鎻忚堪: alertDes, 鏁呴殰璁惧: deviceName, 鏁呴殰缂栧彿: alertCode } = this.inuqerobg;
+      this.$Loading(true);
+      GetAllAlarmInfo({ alertName, alertDes, deviceName, alertCode }).then(res => {
+        let tHeader = [];
+        let filterVal = [];
+        this.tableHead.forEach(item => {
+          tHeader.push(item.columnDescription);
+          filterVal.push(item.columnName);
+        });
+        exportTableList(tHeader, filterVal, res, '鎶ヨ淇℃伅' + getymdhms());
+        this.$Loading();
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#warning {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/basicInfo/components/baseinquer.vue b/qqjf-Web/src/views/basicInfo/components/baseinquer.vue
new file mode 100644
index 0000000..b1c5835
--- /dev/null
+++ b/qqjf-Web/src/views/basicInfo/components/baseinquer.vue
@@ -0,0 +1,172 @@
+<template>
+  <div id="base" class="flex align-center justify-between">
+    <div class="">
+      <el-button-group>
+        <el-button v-if="add" type="primary" size="mini" icon="el-icon-plus" @click="$emit('addmodal')">鏂板缓</el-button>
+        <el-button v-if="dele" type="primary" size="mini" icon="el-icon-delete">鍒犻櫎</el-button>
+        <el-button
+          v-if="derive"
+          style="margin-left: 10px"
+          type="primary"
+          size="mini"
+          icon="el-icon-download"
+          @click="$emit('derive')"
+          >瀵煎嚭</el-button
+        >
+        <el-button
+          v-if="allderive"
+          style="margin-left: 10px"
+          type="primary"
+          size="mini"
+          icon="el-icon-download"
+          @click="$emit('allderive')"
+          >鍏ㄩ儴瀵煎嚭</el-button
+        >
+      </el-button-group>
+    </div>
+    <div class="width80 flex align-center justify-end">
+      <div class="flex width align-center justify-end margin-right">
+        <div v-if="basetimeshow" id="basetimeer" class="flex align-center margin-right width35">
+          <label style="width: 6rem" class="textalign color909399 fontsizeinitial">璧锋鏃堕棿锛�</label>
+          <el-date-picker
+            size="mini"
+            v-model="timepick"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            type="datetimerange"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+          >
+          </el-date-picker>
+        </div>
+        <div v-if="taskshow" id="basetimeer" class="flex align-center margin-right width35">
+          <label style="width: 6rem" class="textalign color909399 fontsizeinitial">浠诲姟绫诲瀷锛�</label>
+          <el-select v-model="inquers.taskType" slot="prepend">
+            <el-option
+              v-for="(item, index) in taskList"
+              :label="item.label"
+              :value="item.value"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </div>
+        <el-input id="baseinquer" size="mini" clearable v-model="inquers[filter]" class="width30">
+          <el-select @change="selchange" v-model="filter" slot="prepend">
+            <el-option
+              v-for="(item, index) in filterList"
+              :label="item.label"
+              :value="item.value"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </el-input>
+      </div>
+      <el-button type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      inquers: { timepick: null, taskType: '鍏ㄩ儴' },
+      timepick: null,
+      applytime: [],
+      taskList: [
+        {
+          label: '鍏ㄩ儴',
+          value: '鍏ㄩ儴'
+        },
+        {
+          label: '绉诲簱',
+          value: '绉诲簱'
+        }
+      ],
+      filter: '',
+      visible: false,
+      value1: ''
+    };
+  },
+  props: {
+    advanced: {
+      type: Boolean,
+      default: false
+    },
+    basetimeshow: {
+      type: Boolean,
+      default: false
+    },
+    add: {
+      type: Boolean,
+      default: true
+    },
+    dele: {
+      type: Boolean,
+      default: false
+    },
+    derive: {
+      type: Boolean,
+      default: false
+    },
+    allderive: {
+      type: Boolean,
+      default: false
+    },
+    byfilter: {
+      type: String,
+      default: ''
+    },
+    filterList: {
+      type: Array,
+      default: () => []
+    },
+    taskshow: {
+      type: Boolean,
+      default: false
+    }
+  },
+  mounted() {
+    this.filter = this.byfilter;
+  },
+  methods: {
+    inquer() {
+      this.inquers.timepick = this.timepick;
+      this.$emit('inquer', this.inquers);
+    },
+    selchange() {
+      this.inquers = { timepick: null, taskType: '鍏ㄩ儴' };
+    }
+  },
+  watch: {
+    byfilter: {
+      handler(nvl, ovl) {
+        this.filter = nvl;
+      }
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#base {
+  ::v-deep .el-input-group__append,
+  ::v-deep .el-input-group__prepend {
+    width: 60px;
+  }
+  ::v-deep .el-date-editor--datetimerange.el-input,
+  .el-date-editor--datetimerange.el-input__inner {
+    width: 74%;
+  }
+}
+#baseinquer {
+  ::v-deep .el-select {
+    width: 100px;
+  }
+}
+#basetimeer {
+  ::v-deep .el-range-editor.el-input__inner {
+    padding: 3px;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/basicInfo/components/stackerEdit.vue b/qqjf-Web/src/views/basicInfo/components/stackerEdit.vue
new file mode 100644
index 0000000..a4d25e2
--- /dev/null
+++ b/qqjf-Web/src/views/basicInfo/components/stackerEdit.vue
@@ -0,0 +1,113 @@
+<template>
+  <div class="storageEdit height overflow">
+    <div class="centent-form overflowy-auto">
+      <el-form
+        class="margin-auto width90"
+        ref="registerForm"
+        :model="registerForm"
+        size="mini"
+        :rules="rules"
+        label-position="left"
+        label-width="120px"
+      >
+        <el-form-item label="璁惧鍚�:" prop="deviceName">
+          <el-input v-model="registerForm.deviceName" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="璁惧绫诲瀷:" prop="placeType">
+          <el-input v-model="registerForm.deviceType" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="璁惧鍙�:" prop="isFull">
+          <el-input v-model="registerForm.deviceId" clearable></el-input>
+        </el-form-item>
+        <!-- <el-form-item label="閿佸畾:" prop="isLock">
+          <el-input v-model="registerForm.isLock" clearable></el-input>
+        </el-form-item> -->
+      </el-form>
+    </div>
+    <div class="palteEdit-button text-right margin-right15 margin-top2">
+      <el-button type="primary" size="mini" class="form-buttom" @click="submitForm('registerForm')">鎻愪氦</el-button>
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { DeviceAddOrUpdate } from '@/api/stacker';
+export default {
+  data() {
+    return {
+      registerForm: {},
+      usernameList: [],
+      rules: {
+        deviceName: { required: true, message: '璇疯緭璁惧鍚�', trigger: 'change' },
+        deptDes: { required: true, message: '璇疯緭鍏ラ儴闂ㄦ弿杩�', trigger: 'change' },
+        enable: { required: true, message: '璇烽�夋嫨鏄惁鍚敤', trigger: 'change' }
+      }
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: {}
+    }
+  },
+  mounted() {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.registerForm = this.rowitem;
+    }
+  },
+  methods: {
+    submitForm(registerForm) {
+      this.$refs[registerForm].validate(valid => {
+        if (valid) {
+          DeviceAddOrUpdate(this.registerForm).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.$emit('addsubmit');
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触'
+              });
+            }
+          });
+        } else {
+        }
+      });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.storageEdit {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .storageEdit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/basicInfo/components/warningEdit.vue b/qqjf-Web/src/views/basicInfo/components/warningEdit.vue
new file mode 100644
index 0000000..26821a5
--- /dev/null
+++ b/qqjf-Web/src/views/basicInfo/components/warningEdit.vue
@@ -0,0 +1,144 @@
+<template>
+  <div class="warningEdit height overflow">
+    <div class="centent-form overflowy-auto">
+      <el-form
+        class="margin-auto width90"
+        ref="registerForm"
+        :model="registerForm"
+        size="mini"
+        label-position="left"
+        label-width="120px"
+      >
+        <el-form-item label="鏁呴殰缂栧彿:" prop="alertCode">
+          <el-input disabled v-model="registerForm.alertCode" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鏁呴殰璁惧:" prop="placeType">
+          <!-- <el-input v-model="registerForm.deviceName" clearable></el-input> -->
+          <el-select size="mini" clearable v-model="registerForm.deviceName" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="(item, index) in deviceNameList"
+              :key="'deviceName' + index"
+              :label="item.deviceName"
+              :value="item.deviceName"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鏁呴殰鍚嶇О:" prop="isFull">
+          <el-input v-model="registerForm.alertName" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鏁呴殰鎻忚堪:" prop="isFull">
+          <el-input
+            type="textarea"
+            :autosize="{ minRows: 2, maxRows: 6 }"
+            v-model="registerForm.alertDes"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <!-- <el-form-item label="閿佸畾:" prop="isLock">
+          <el-input v-model="registerForm.isLock" clearable></el-input>
+        </el-form-item> -->
+      </el-form>
+    </div>
+    <div class="palteEdit-button text-right margin-right15 margin-top2">
+      <el-button type="primary" size="mini" class="form-buttom" @click="submitForm('registerForm')">鎻愪氦</el-button>
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { CarAddOrUpdate, AlertGetCode } from '@/api/warning';
+import { DeviceSearch } from '@/api/stacker';
+export default {
+  data() {
+    return {
+      registerForm: {
+        alertCode: ''
+      },
+      deviceNameList: []
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: {}
+    }
+  },
+  mounted() {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.registerForm = this.rowitem;
+    } else {
+      this.AlertGetCode();
+    }
+    this.DeviceSearch();
+  },
+  methods: {
+    //鑾峰彇缂栧彿
+    AlertGetCode() {
+      AlertGetCode().then(res => {
+        this.registerForm.alertCode = res;
+      });
+    },
+    //鑾峰彇璁惧
+    DeviceSearch() {
+      DeviceSearch('1&onePageNum=999').then(res => {
+        if (res.code == 0) {
+          this.deviceNameList = res.data || [];
+        }
+      });
+    },
+    submitForm(registerForm) {
+      this.$refs[registerForm].validate(valid => {
+        if (valid) {
+          CarAddOrUpdate(this.registerForm).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.$emit('addsubmit');
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触'
+              });
+            }
+          });
+        } else {
+        }
+      });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.warningEdit {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .warningEdit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/basicInfo/equipmenttask/avroRecord/index.vue b/qqjf-Web/src/views/basicInfo/equipmenttask/avroRecord/index.vue
new file mode 100644
index 0000000..0ade30c
--- /dev/null
+++ b/qqjf-Web/src/views/basicInfo/equipmenttask/avroRecord/index.vue
@@ -0,0 +1,202 @@
+<template>
+  <!-- 鍫嗗灈鏈轰换鍔� -->
+  <div id="piler" class="global-content">
+    <!-- 绛涢�� -->
+    <base-inquer
+      :add="false"
+      :dele="false"
+      :derive="true"
+      :taskshow="true"
+      :basetimeshow="true"
+      byfilter="闆朵欢鍙�"
+      :filterList="filterList"
+      @addmodal="addmodal"
+      @inquer="inquer"
+      @derive="derive"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :operation="false"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        @edit="edit"
+        @del="del"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer } from '@/components/index';
+import baseInquer from '../../components/baseinquer';
+const { avroRecord } = require('@/components/tableContainer/tableHead');
+import { getimestampDate, getymdhms } from '@/utils/date';
+import { SrmTaskSearch, SearchAll } from '@/api/avroRecord';
+import { exportTableList } from '@/utils/excel';
+
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: [],
+      inuqerobg: { taskType: '鍏ㄩ儴' },
+      filterList: [
+        {
+          value: '闆朵欢鍙�',
+          label: '闆朵欢鍙�'
+        }
+      ],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20
+    };
+  },
+  components: { TableContainer, baseInquer },
+  computed: {
+    tableHead() {
+      return avroRecord;
+    }
+  },
+  mounted() {
+    this.SrmTaskSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.inuqerobg = e;
+      this.page = 1;
+      this.SrmTaskSearch();
+    },
+    //瀵煎嚭
+    derive() {
+      let tHeader = [];
+      let filterVal = [];
+      this.tableHead.forEach(item => {
+        tHeader.push(item.columnDescription);
+        filterVal.push(item.columnName);
+      });
+      this.$Loading(true);
+      const { 闆朵欢鍙�: itemName, taskType } = this.inuqerobg;
+      SearchAll({
+        itemName,
+        taskType,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.isReleased = item.isReleased == 1 ? '鏄�' : item.isReleased == 0 ? '鍚�' : item.isReleased;
+            item.hasFinished = item.hasFinished == 1 ? '鏄�' : item.hasFinished == 0 ? '鍚�' : item.hasFinished;
+            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
+            item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
+          });
+          exportTableList(tHeader, filterVal, data, '鍫嗗灈鏈轰换鍔�' + getymdhms());
+        }
+        this.$Loading();
+      });
+    },
+    //鎼滅储鎶ヨ淇℃伅
+    SrmTaskSearch() {
+      this.$Loading(true);
+      const { 闆朵欢鍙�: itemName, taskType } = this.inuqerobg;
+      SrmTaskSearch(this.page + '&onePageNum=' + this.pageSize, {
+        itemName,
+        taskType,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.isReleased = item.isReleased == 1 ? '鏄�' : item.isReleased == 0 ? '鍚�' : item.isReleased;
+            item.hasFinished = item.hasFinished == 1 ? '鏄�' : item.hasFinished == 0 ? '鍚�' : item.hasFinished;
+            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
+            item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
+          });
+          this.tableData = res.data;
+          this.totle = res.num;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.SrmTaskSearch();
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.SrmTaskSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { USERNAME } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          // AlertDelete({ userName: USERNAME }).then(res => {
+          //   this.$message({
+          //     type: 'success',
+          //     message: '鍒犻櫎鎴愬姛!'
+          //   });
+          //   this.SrmTaskSearch();
+          // });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.SrmTaskSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#piler {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/basicInfo/equipmenttask/index.vue b/qqjf-Web/src/views/basicInfo/equipmenttask/index.vue
new file mode 100644
index 0000000..1cb60c6
--- /dev/null
+++ b/qqjf-Web/src/views/basicInfo/equipmenttask/index.vue
@@ -0,0 +1,9 @@
+<template>
+  <router-view />
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/basicInfo/equipmenttask/piler/index.vue b/qqjf-Web/src/views/basicInfo/equipmenttask/piler/index.vue
new file mode 100644
index 0000000..38e0e81
--- /dev/null
+++ b/qqjf-Web/src/views/basicInfo/equipmenttask/piler/index.vue
@@ -0,0 +1,236 @@
+<template>
+  <!-- 鍫嗗灈鏈轰换鍔� -->
+  <div id="piler" class="global-content">
+    <!-- 绛涢�� -->
+    <base-inquer
+      :add="false"
+      :dele="false"
+      :derive="true"
+      :basetimeshow="true"
+      byfilter="璁惧鍚嶇О"
+      :filterList="filterList"
+      @addmodal="addmodal"
+      @inquer="inquer"
+      @derive="derive"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :operation="false"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        @edit="edit"
+        @del="del"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer } from '@/components/index';
+import baseInquer from '../../components/baseinquer';
+const { piler } = require('@/components/tableContainer/tableHead');
+import { getimestampDate, getymdhms } from '@/utils/date';
+import { SrmTaskSearch } from '@/api/equipmenttask';
+import { exportTableList } from '@/utils/excel';
+
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: [],
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '璁惧鍚嶇О',
+          label: '璁惧鍚嶇О'
+        },
+        {
+          value: '浠诲姟绫诲瀷',
+          label: '浠诲姟绫诲瀷'
+        },
+        {
+          value: '鍣ㄥ叿瑙勬牸绫诲瀷',
+          label: '鍣ㄥ叿瑙勬牸绫诲瀷'
+        },
+        {
+          value: '鐩爣浣嶇疆',
+          label: '鐩爣浣嶇疆'
+        },
+        {
+          value: '璧峰浣嶇疆',
+          label: '璧峰浣嶇疆'
+        }
+      ],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20
+    };
+  },
+  components: { TableContainer, baseInquer },
+  computed: {
+    tableHead() {
+      return piler;
+    }
+  },
+  mounted() {
+    this.SrmTaskSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      console.log(e);
+      this.inuqerobg = e;
+      this.page = 1;
+      this.SrmTaskSearch();
+    },
+    //瀵煎嚭
+    derive() {
+      let tHeader = [];
+      let filterVal = [];
+      this.tableHead.forEach(item => {
+        tHeader.push(item.columnDescription);
+        filterVal.push(item.columnName);
+      });
+      this.$Loading(true);
+      const {
+        璁惧鍚嶇О: devName,
+        浠诲姟绫诲瀷: taskType,
+        鍣ㄥ叿瑙勬牸绫诲瀷: palletType,
+        鐩爣浣嶇疆: toPlace,
+        璧峰浣嶇疆: sourcePlace
+      } = this.inuqerobg;
+      SrmTaskSearch('1&onePageNum=99999999', {
+        devName,
+        taskType,
+        palletType,
+        toPlace,
+        sourcePlace,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.isReleased = item.isReleased == 1 ? '鏄�' : item.isReleased == 0 ? '鍚�' : item.isReleased;
+            item.hasFinished = item.hasFinished == 1 ? '鏄�' : item.hasFinished == 0 ? '鍚�' : item.hasFinished;
+            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
+            item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
+          });
+          exportTableList(tHeader, filterVal, data, '鍫嗗灈鏈轰换鍔�' + getymdhms());
+        }
+        this.$Loading();
+      });
+    },
+    //鎼滅储鎶ヨ淇℃伅
+    SrmTaskSearch() {
+      this.$Loading(true);
+      const {
+        璁惧鍚嶇О: devName,
+        浠诲姟绫诲瀷: taskType,
+        鍣ㄥ叿瑙勬牸绫诲瀷: palletType,
+        鐩爣浣嶇疆: toPlace,
+        璧峰浣嶇疆: sourcePlace
+      } = this.inuqerobg;
+      SrmTaskSearch(this.page + '&onePageNum=' + this.pageSize, {
+        devName,
+        taskType,
+        palletType,
+        toPlace,
+        sourcePlace,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.isReleased = item.isReleased == 1 ? '鏄�' : item.isReleased == 0 ? '鍚�' : item.isReleased;
+            item.hasFinished = item.hasFinished == 1 ? '鏄�' : item.hasFinished == 0 ? '鍚�' : item.hasFinished;
+            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
+            item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
+          });
+          this.tableData = res.data;
+          this.totle = res.num;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.SrmTaskSearch();
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.SrmTaskSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { USERNAME } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          // AlertDelete({ userName: USERNAME }).then(res => {
+          //   this.$message({
+          //     type: 'success',
+          //     message: '鍒犻櫎鎴愬姛!'
+          //   });
+          //   this.SrmTaskSearch();
+          // });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.SrmTaskSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#piler {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/basicInfo/equipmenttask/rgvtask/index.vue b/qqjf-Web/src/views/basicInfo/equipmenttask/rgvtask/index.vue
new file mode 100644
index 0000000..929e938
--- /dev/null
+++ b/qqjf-Web/src/views/basicInfo/equipmenttask/rgvtask/index.vue
@@ -0,0 +1,217 @@
+<template>
+  <!-- RGV浠诲姟 -->
+  <div id="rgvtask" class="global-content">
+    <!-- 绛涢�� -->
+    <base-inquer
+      :add="false"
+      :dele="false"
+      :derive="true"
+      :basetimeshow="true"
+      byfilter="璁惧鍚嶇О"
+      :filterList="filterList"
+      @addmodal="addmodal"
+      @inquer="inquer"
+      @derive="derive"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :operation="false"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        @edit="edit"
+        @del="del"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer } from '@/components/index';
+import baseInquer from '../../components/baseinquer';
+const { rgvtask } = require('@/components/tableContainer/tableHead');
+import { getimestampDate, getymdhms } from '@/utils/date';
+import { RgvTaskSearch } from '@/api/equipmenttask';
+import { exportTableList } from '@/utils/excel';
+
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: [],
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '璁惧鍚嶇О',
+          label: '璁惧鍚嶇О'
+        },
+        {
+          value: '鐩爣浣嶇疆',
+          label: '鐩爣浣嶇疆'
+        },
+        {
+          value: '璧峰浣嶇疆',
+          label: '璧峰浣嶇疆'
+        },
+        {
+          value: '浠诲姟绫诲瀷',
+          label: '浠诲姟绫诲瀷'
+        }
+      ],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20
+    };
+  },
+  components: { TableContainer, baseInquer },
+  computed: {
+    tableHead() {
+      return rgvtask;
+    }
+  },
+  mounted() {
+    this.RgvTaskSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.page = 1;
+      this.inuqerobg = e;
+      this.RgvTaskSearch();
+    },
+    //瀵煎嚭
+    derive() {
+      let tHeader = [];
+      let filterVal = [];
+      this.tableHead.forEach(item => {
+        tHeader.push(item.columnDescription);
+        filterVal.push(item.columnName);
+      });
+      this.$Loading(true);
+      const { 璁惧鍚嶇О: devName, 鐩爣浣嶇疆: toPlace, 璧峰浣嶇疆: sourcePlace, 浠诲姟绫诲瀷: taskType } = this.inuqerobg;
+      RgvTaskSearch('1&onePageNum=99999999', {
+        devName,
+        toPlace,
+        sourcePlace,
+        taskType,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.isReleased = item.isReleased == 1 ? '鏄�' : item.isReleased == 0 ? '鍚�' : item.isReleased;
+            item.hasFinished = item.hasFinished == 1 ? '鏄�' : item.hasFinished == 0 ? '鍚�' : item.hasFinished;
+            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
+            item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
+          });
+          exportTableList(tHeader, filterVal, data, 'RGV浠诲姟' + getymdhms());
+        }
+        this.$Loading();
+      });
+    },
+    //鎼滅储鎶ヨ淇℃伅
+    RgvTaskSearch() {
+      this.$Loading(true);
+      const { 璁惧鍚嶇О: devName, 鐩爣浣嶇疆: toPlace, 璧峰浣嶇疆: sourcePlace, 浠诲姟绫诲瀷: taskType } = this.inuqerobg;
+      RgvTaskSearch(this.page + '&onePageNum=' + this.pageSize, {
+        devName,
+        toPlace,
+        sourcePlace,
+        taskType,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.isReleased = item.isReleased == 1 ? '鏄�' : item.isReleased == 0 ? '鍚�' : item.isReleased;
+            item.hasFinished = item.hasFinished == 1 ? '鏄�' : item.hasFinished == 0 ? '鍚�' : item.hasFinished;
+            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
+            item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
+          });
+          this.tableData = res.data;
+          this.totle = res.num;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.RgvTaskSearch();
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.RgvTaskSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { USERNAME } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          // AlertDelete({ userName: USERNAME }).then(res => {
+          //   this.$message({
+          //     type: 'success',
+          //     message: '鍒犻櫎鎴愬姛!'
+          //   });
+          //   this.RgvTaskSearch();
+          // });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.RgvTaskSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#rgvtask {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/basicInfo/index.vue b/qqjf-Web/src/views/basicInfo/index.vue
new file mode 100644
index 0000000..1ca3ac4
--- /dev/null
+++ b/qqjf-Web/src/views/basicInfo/index.vue
@@ -0,0 +1,11 @@
+<template>
+  <keep-alive>
+    <router-view />
+  </keep-alive>
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/dataview/classified.vue b/qqjf-Web/src/views/dataview/classified.vue
new file mode 100644
index 0000000..18a7880
--- /dev/null
+++ b/qqjf-Web/src/views/dataview/classified.vue
@@ -0,0 +1,48 @@
+<template>
+  <!-- 鍒嗙被缁熻 -->
+  <div id="classified" class="global-content backgroundrgb">
+    <div class="width80 height margin-auto overflow flex">
+      <div class="width50 height overflow">
+        <classified-echart titleechart="闆朵欢鏉ユ簮鍒嗗竷" colors="#fff" :chartData="chartData" class="width height" />
+      </div>
+      <div class="width50 height overflow">
+        <classified-echart titleechart="鍣ㄥ叿鏉ユ簮鍒嗗竷" colors="#fff" :chartData="applianceData" class="width height" />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetStockClassificationData } from '@/api/reportforms';
+import classifiedEchart from '@/views/Home/components/sourceEchart.vue';
+export default {
+  data() {
+    return {
+      chartData: {},
+      applianceData: {}
+    };
+  },
+  components: { classifiedEchart },
+  computed: {},
+  mounted() {
+    this.GetStockClassificationData();
+    this.applianceDataficationData();
+  },
+  methods: {
+    //闆朵欢鏉ユ簮
+    GetStockClassificationData() {
+      GetStockClassificationData({ type: 1 }).then(res => {
+        this.chartData = res;
+      });
+    },
+    //鍣ㄥ叿鏉ユ簮
+    applianceDataficationData() {
+      GetStockClassificationData({ type: 2 }).then(res => {
+        this.applianceData = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/qqjf-Web/src/views/dataview/components/lineEcharts.vue b/qqjf-Web/src/views/dataview/components/lineEcharts.vue
new file mode 100644
index 0000000..7ae6f4c
--- /dev/null
+++ b/qqjf-Web/src/views/dataview/components/lineEcharts.vue
@@ -0,0 +1,179 @@
+<template>
+  <div class="chart-wrapper" ref="outputline"></div>
+</template>
+
+<script>
+import resize from '@/mixins/resize';
+const echarts = require('echarts');
+export default {
+  name: 'placePie',
+  props: {
+    titleechart: {
+      type: String,
+      default: ''
+    },
+    linelist: {
+      type: Object,
+      default: () => {}
+    },
+    colorList: {
+      type: Array,
+      default: () => []
+    },
+    colors: {
+      type: String,
+      default: '#636972'
+    }
+  },
+  mixins: [resize],
+  data() {
+    return {};
+  },
+  mounted() {
+    this.initEchart();
+  },
+  methods: {
+    initEchart() {
+      let serieslist = [];
+
+      let data = this.linelist.data;
+      if (data) {
+        data.forEach((item, index) => {
+          serieslist.push({
+            name: item.name,
+            type: 'bar',
+            smooth: true,
+            data: item.xdata,
+            // 淇敼鐨勬槸绾跨殑棰滆壊
+            lineStyle: {
+              width: 10
+            }
+          });
+        });
+      }
+
+      this.myChart = echarts.init(this.$refs.outputline);
+      this.myChart.setOption(
+        {
+          title: {
+            text: this.linelist && this.linelist.data ? this.titleechart : '鏆傛棤鏁版嵁',
+
+            textStyle: {
+              color: this.colors,
+              fontWeight: 'normal',
+              fontSize: 50
+            },
+
+            left: '45%',
+            x: 'center',
+            y: 0,
+            itemGap: 10
+          },
+
+          tooltip: {
+            //鎻愮ず妗嗙粍浠�
+            trigger: 'axis',
+            // formatter: '{b0}: {c0}<br />{b1}: {c1}',
+            axisPointer: {
+              type: 'shadow'
+            },
+            textStyle: {
+              fontSize: 36
+            }
+          },
+          grid: {
+            left: '1%',
+            right: '1%',
+            bottom: '1%',
+            top: '27%',
+            //	padding:'0 0 10 0',
+            containLabel: true
+          },
+          legend: {
+            //鍥句緥缁勪欢锛岄鑹插拰鍚嶅瓧
+            right: '1%',
+            top: '15%',
+            itemGap: 16,
+            itemWidth: 18,
+            itemHeight: 10,
+            data: this.linelist.legend,
+            textStyle: {
+              fontStyle: 'normal',
+              fontFamily: '寰蒋闆呴粦',
+              color: this.colors,
+              fontSize: 28
+            }
+          },
+          xAxis: [
+            {
+              type: 'category',
+              //	boundaryGap: true,//鍧愭爣杞翠袱杈圭暀鐧�
+              data: this.linelist.xdata,
+              // data: Axdata,
+              axisLabel: {
+                interval: 0, //璁剧疆涓� 1锛岃〃绀恒�庨殧涓�涓爣绛炬樉绀轰竴涓爣绛俱��
+                margin: 10,
+                textStyle: {
+                  fontSize: 28
+                }
+              },
+              axisLine: { show: true, lineStyle: { color: this.colors, width: 10 } },
+              splitLine: {
+                show: false,
+                lineStyle: { color: this.colors, width: 10 }
+              },
+              axisTick: {
+                show: false
+              }
+            }
+          ],
+          yAxis: [
+            {
+              type: 'value',
+              splitNumber: 5,
+              axisLabel: {
+                textStyle: {
+                  fontSize: 36
+                }
+              },
+              axisLine: {
+                lineStyle: {
+                  color: this.colors,
+                  width: 10
+                }
+              },
+              axisTick: {
+                show: false
+              },
+              splitLine: {
+                show: true,
+                lineStyle: {
+                  color: this.colors,
+                  width: 10
+                }
+              }
+            }
+          ],
+          dataZoom: [
+            {
+              type: 'inside',
+              startValue: 10,
+              endValue: 15
+            }
+          ],
+          series: serieslist
+        },
+        true
+      );
+    }
+  },
+  watch: {
+    linelist: {
+      handler() {
+        this.initEchart();
+      },
+      deep: true
+    }
+  }
+};
+</script>
diff --git a/qqjf-Web/src/views/dataview/movablerate.vue b/qqjf-Web/src/views/dataview/movablerate.vue
new file mode 100644
index 0000000..90f64b7
--- /dev/null
+++ b/qqjf-Web/src/views/dataview/movablerate.vue
@@ -0,0 +1,135 @@
+<template>
+  <!-- 璁惧鍙姩鐜� -->
+  <div id="movablerate" class="global-content backgroundrgb">
+    <div class="width80 height margin-auto overflow">
+      <div class="width margintopbot flex align-center justify-end">
+        <label class="color909399 fontsiez1rem">鏌ヨ鏃ユ湡锛�</label>
+        <el-date-picker
+          class="margin-right"
+          v-model="pickertime"
+          size="mini"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+        >
+        </el-date-picker>
+        <el-button class="margin-right" type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      </div>
+      <div class="height-calc overflowy-auto">
+        <div class="width height48 overflow margin-top10px">
+          <movablerate-echart
+            class="width height"
+            colors="#fff"
+            echarttitle="鍫嗗灈鏈�-璁惧鍙姩鐜�"
+            :chartData="chartData"
+            :colorList="colorList"
+          />
+        </div>
+        <div class="width height48 overflow margin-top10px">
+          <movablerate-echart
+            class="width height"
+            colors="#fff"
+            echarttitle="RGV-璁惧鍙姩鐜�"
+            :chartData="rgvdata"
+            :colorList="colorList"
+          />
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetDevMovable } from '@/api/reportforms';
+import { GetDateStr } from '@/utils/date';
+import MovablerateEchart from '@/views/Home/components/movablerateechart.vue';
+export default {
+  data() {
+    return {
+      pickertime: [GetDateStr(-15), GetDateStr(0)],
+      chartData: {},
+      rgvdata: {},
+      colorList: [
+        '#0090FF',
+        '#36CE9E',
+        '#FFC005',
+        '#FF515A',
+        '#8B5CFF',
+        '#00CA69',
+        '#F3A43B',
+        '#D7504B',
+        '#C6E579',
+        '#F0805A',
+        '#26C0C0',
+        '#660077',
+        '#FFCCCC',
+        '#550088',
+        '#FFFFBB',
+        '#99FFFF',
+        '#CC00CC',
+        '#CC00CC',
+        '#C63300',
+        '#9955FF',
+        '#66FF66',
+        '#B5C334',
+        '#FCCE10',
+        '#27727B',
+        '#FE8463',
+        '#FAD860',
+        '#F3A43B',
+        '#D7504B',
+        '#C6E579',
+        '#F0805A',
+        '#26C0C0',
+        '#660077',
+        '#FFCCCC',
+        '#550088',
+        '#FFAA33',
+        '#CC00CC',
+        '#FF77FF',
+        '#C63300',
+        '#F4E001',
+        '#66FF66'
+      ]
+    };
+  },
+  components: { MovablerateEchart },
+  computed: {},
+  mounted() {
+    this.GetDevMovable();
+    this.GetRGVDevMovable();
+  },
+  methods: {
+    inquer() {
+      this.GetDevMovable();
+      this.GetRGVDevMovable();
+    },
+    //鍫嗗灈鏈�
+    GetDevMovable() {
+      let objtimes = {
+        startTime: this.pickertime ? this.pickertime[0] : '',
+        endTime: this.pickertime ? this.pickertime[1] : '',
+        type: 1
+      };
+      GetDevMovable(objtimes).then(res => {
+        this.chartData = res;
+      });
+    },
+    //RGV
+    GetRGVDevMovable() {
+      let objtimes = {
+        startTime: this.pickertime ? this.pickertime[0] : '',
+        endTime: this.pickertime ? this.pickertime[1] : '',
+        type: 2
+      };
+      GetDevMovable(objtimes).then(res => {
+        this.rgvdata = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/qqjf-Web/src/views/dataview/output.vue b/qqjf-Web/src/views/dataview/output.vue
new file mode 100644
index 0000000..72d5142
--- /dev/null
+++ b/qqjf-Web/src/views/dataview/output.vue
@@ -0,0 +1,129 @@
+<template>
+  <!-- 鍒嗙被缁熻 -->
+  <div id="Ouptput" class="global-content backgroundrgb">
+    <div class="width80 height margin-auto overflow">
+      <div class="margintopbot height width overflow">
+        <!-- <p class="fontsize2rem text-center">闆朵欢鍑哄叆搴撶粺璁�</p> -->
+        <div class="width margintopbot flex justify-end">
+          <el-date-picker
+            v-model="datatime"
+            size="mini"
+            type="datetimerange"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+          >
+          </el-date-picker>
+          <!-- <el-date-picker
+            size="mini"
+            v-model="datatime"
+            type="date"
+            :clearable="false"
+            value-format="yyyy-MM-dd"
+            placeholder="閫夋嫨鏃ユ湡"
+          >
+          </el-date-picker> -->
+          <el-button class="margin-left margin-right" type="primary" size="mini" @click="goodsinquer">鏌ヨ</el-button>
+        </div>
+        <!-- <div class="width98 height82 margintopbot echart-height">
+          <line-echart
+            titleechart="鍑哄叆搴撲换鍔�"
+            :linelist="BarItemlinelist"
+            :colorList="barcolorList"
+            class="width height"
+            colors="#fff"
+          />
+        </div> -->
+        <div class="width98 height45 margintopbot echart-height">
+          <line-echart
+            titleechart="闆朵欢鏁伴噺缁熻"
+            :linelist="BarItemlinelist"
+            :colorList="barcolorList"
+            colors="#fff"
+            class="width height"
+          />
+        </div>
+        <div class="width98 height45 margintopbot echart-height">
+          <line-echart
+            titleechart="鍣ㄥ叿鍑哄叆搴撶粺璁�"
+            :linelist="Containerlinelist"
+            :colorList="concolorList"
+            colors="#fff"
+            class="width height"
+          />
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetInOutCountByHour } from '@/api/output';
+import { GetHomeBarItemData, GetHomeBarContainerData } from '@/api/Didproject';
+import LineEchart from './components/lineEcharts.vue';
+import { getDate, GetDateStr, GetTimeStr } from '@/utils/date';
+export default {
+  data() {
+    return {
+      datatime: [GetDateStr(-15) + ' 00:00:00', getDate() + ' ' + GetTimeStr(0)],
+      BarItemlinelist: {}, //闆朵欢鍑哄叆鏁伴噺
+      Containerlinelist: {}, //鍑哄叆搴撴暟閲�
+      barcolorList: ['#ffc637', '#fc7293', '#8477e9', '#2599f0', '#31c3ea', '#17d8b9', '#e8bdf3'],
+      concolorList: ['#31c3ea', '#17d8b9', '#2599f0', '#e8bdf3', '#ffc637', '#fc7293', '#8477e9']
+    };
+  },
+  components: { LineEchart },
+  computed: {},
+  mounted() {
+    this.GetHomeBarItemData();
+    this.GetHomeBarContainerData();
+  },
+  methods: {
+    //鏃堕棿鏌ヨ
+    goodsinquer() {
+      this.GetHomeBarItemData();
+      this.GetHomeBarContainerData();
+    },
+    //鑾峰彇闆朵欢鐨勫嚭鍏ュ簱鏁伴噺
+    GetHomeBarItemData() {
+      let time = {
+        startTime: this.datatime ? this.datatime[0] : '',
+        endTime: this.datatime ? this.datatime[1] : ''
+      };
+      this.BarItemlineshow = false;
+      GetHomeBarItemData(time).then(res => {
+        this.BarItemlinelist = res.data;
+        this.BarItemlineshow = true;
+      });
+    },
+    //鑾峰彇鍣ㄥ叿鐨勫嚭鍏ュ簱鏁伴噺
+    GetHomeBarContainerData() {
+      let time = {
+        startTime: this.datatime ? this.datatime[0] : '',
+        endTime: this.datatime ? this.datatime[1] : ''
+      };
+      this.$Loading(true);
+      this.Containerline = false;
+      GetHomeBarContainerData(time).then(res => {
+        this.Containerlinelist = res.data;
+        this.Containerline = true;
+        this.$Loading();
+      });
+    }
+    //鑾峰彇闆朵欢鐨勫嚭鍏ュ簱鏁伴噺
+    // GetInOutCountByHour() {
+    //   let time = {
+    //     startTime: this.datatime + ' 00:00:00',
+    //     endTime: this.datatime + ' 23:59:59'
+    //   };
+
+    //   GetInOutCountByHour(time).then(res => {
+    //     // this.BarItemlinelist = res.data;
+    //   });
+    // }
+  }
+};
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/qqjf-Web/src/views/dataview/product.vue b/qqjf-Web/src/views/dataview/product.vue
new file mode 100644
index 0000000..0e79fdd
--- /dev/null
+++ b/qqjf-Web/src/views/dataview/product.vue
@@ -0,0 +1,66 @@
+<template>
+  <!-- 鍦ㄥ埗鍝佽祫閲戝垎鏋� -->
+  <div id="product" class="global-content backgroundrgb">
+    <div class="width80 height margin-auto overflow">
+      <div class="width margintopbot flex align-center justify-end">
+        <label class="color909399 fontsiez1rem">鏌ヨ鏃ユ湡锛�</label>
+        <el-date-picker
+          class="margin-right"
+          v-model="pickertime"
+          size="mini"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+        >
+        </el-date-picker>
+        <el-button class="margin-right" type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      </div>
+      <div class="width height-calc90 overflow margin-top2">
+        <product-echart class="width height" colors="#fff" :chartData="chartData" :colorList="colorList" />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetStorageCapitalAnalysis } from '@/api/reportforms';
+import { GetDateStr } from '@/utils/date';
+import resize from '@/mixins/resize';
+import ProductEchart from '@/views/Home/components/product.vue';
+const echarts = require('echarts');
+export default {
+  data() {
+    return {
+      pickertime: [GetDateStr(-15), GetDateStr(0)],
+      chartData: {},
+      rgvdata: {},
+      colorList: ['#9effff', '#9E87FF', '#73DD39', '#73DDFF', '#fe9a', '#fe9a8b', '#F3A43B']
+    };
+  },
+  mixins: [resize],
+  components: { ProductEchart },
+  computed: {},
+  mounted() {
+    this.GetStorageCapitalAnalysis();
+  },
+  methods: {
+    inquer() {
+      this.GetStorageCapitalAnalysis();
+    },
+    //鍫嗗灈鏈�
+    GetStorageCapitalAnalysis() {
+      let objtimes = {
+        startTime: this.pickertime ? this.pickertime[0] : '',
+        endTime: this.pickertime ? this.pickertime[1] : ''
+      };
+      GetStorageCapitalAnalysis(objtimes).then(res => {
+        this.chartData = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/qqjf-Web/src/views/dataview/rateequipment.vue b/qqjf-Web/src/views/dataview/rateequipment.vue
new file mode 100644
index 0000000..3f83c83
--- /dev/null
+++ b/qqjf-Web/src/views/dataview/rateequipment.vue
@@ -0,0 +1,141 @@
+<template>
+  <!-- 璁惧鍒╃敤鐜� -->
+  <div id="rateequipment" class="global-content backgroundrgb">
+    <div class="width90 height margin-auto overflow">
+      <div class="width margintopbot flex align-center justify-end">
+        <label class="color909399 fontsiez1rem">鏌ヨ鏃ユ湡锛�</label>
+        <el-date-picker
+          class="margin-right"
+          v-model="pickertime"
+          size="mini"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+        >
+        </el-date-picker>
+        <el-button class="margin-right" type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      </div>
+      <div class="height-calc overflowy-auto">
+        <div class="width height48 overflow margin-top10px">
+          <rateequipment-echart
+            class="width height"
+            colors="#fff"
+            echarttitle="鍫嗗灈鏈�-璁惧鍒╃敤鐜�"
+            :chartData="chartData"
+            :colorList="colorList"
+          />
+        </div>
+        <div class="width height48 overflow margin-top10px">
+          <rateequipment-echart
+            class="width height"
+            colors="#fff"
+            echarttitle="RGV-璁惧鍒╃敤鐜�"
+            :chartData="rgvdata"
+            :colorList="colorList"
+          />
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetDevAvailability } from '@/api/reportforms';
+import { GetDateStr } from '@/utils/date';
+import resize from '@/mixins/resize';
+import RateequipmentEchart from '@/views/Home/components/rateequipment.vue';
+
+export default {
+  data() {
+    return {
+      pickertime: [GetDateStr(-15), GetDateStr(0)],
+      chartData: {},
+      rgvdata: {},
+      colorList: [
+        '#0090FF',
+        '#36CE9E',
+        '#FFC005',
+        '#FF515A',
+        '#8B5CFF',
+        '#00CA69',
+        '#F3A43B',
+        '#D7504B',
+        '#C6E579',
+        '#F0805A',
+        '#26C0C0',
+        '#660077',
+        '#FFCCCC',
+        '#550088',
+        '#FFFFBB',
+        '#99FFFF',
+        '#CC00CC',
+        '#CC00CC',
+        '#C63300',
+        '#9955FF',
+        '#66FF66',
+        '#B5C334',
+        '#FCCE10',
+        '#27727B',
+        '#FE8463',
+        '#FAD860',
+        '#F3A43B',
+        '#D7504B',
+        '#C6E579',
+        '#F0805A',
+        '#26C0C0',
+        '#660077',
+        '#FFCCCC',
+        '#550088',
+        '#FFAA33',
+        '#CC00CC',
+        '#FF77FF',
+        '#C63300',
+        '#F4E001',
+        '#66FF66'
+      ]
+    };
+  },
+  mixins: [resize],
+  components: { RateequipmentEchart },
+  computed: {},
+  mounted() {
+    this.GetDevAvailability();
+    this.GetRGVDevMovable();
+  },
+  methods: {
+    inquer() {
+      this.GetDevAvailability();
+      this.GetRGVDevMovable();
+    },
+    //鍫嗗灈鏈�
+    GetDevAvailability() {
+      let objtimes = {
+        startTime: this.pickertime ? this.pickertime[0] : '',
+        endTime: this.pickertime ? this.pickertime[1] : '',
+        type: 1
+      };
+      GetDevAvailability(objtimes).then(res => {
+        this.chartData = res;
+      });
+    },
+    //RGV
+    GetRGVDevMovable() {
+      let objtimes = {
+        startTime: this.pickertime ? this.pickertime[0] : '',
+        endTime: this.pickertime ? this.pickertime[1] : '',
+        type: 2
+      };
+      GetDevAvailability(objtimes).then(res => {
+        this.rgvdata = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#rateequipment {
+}
+</style>
diff --git a/qqjf-Web/src/views/dataview/statelibrary.vue b/qqjf-Web/src/views/dataview/statelibrary.vue
new file mode 100644
index 0000000..cb43036
--- /dev/null
+++ b/qqjf-Web/src/views/dataview/statelibrary.vue
@@ -0,0 +1,117 @@
+<template>
+  <!-- 绔嬪簱鎬昏 -->
+  <div id="statelibrary" class="global-content backgroundrgb">
+    <h3 class="text-center colorfff fontsize2rem absolute transformtopleft12" style="font-size: 80px">绔嬪簱鎬昏</h3>
+    <div
+      class="
+        width80
+        padding10
+        borderradius
+        margintopbot
+        absolute
+        transformtopleft
+        flex flex-wrap
+        justify-around
+        align-center
+      "
+    >
+      <div
+        class="didproject-title width45 flex justify-around align-center borderdashed borderradius overflow pointer"
+        v-for="(item, index) in titlelist"
+        :style="'margin-top:' + item.margin"
+        :key="index"
+      >
+        <div class="heigth padding10 overflow">
+          <p class="text-center fontweight600 colorfff margin-top15" style="font-size: 50px">
+            <countTo :startVal="startVal" :endVal="item.mun" :duration="3000"></countTo>
+          </p>
+          <p class="color409EFF" style="font-size: 50px">{{ item.titel }}</p>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import countTo from 'vue-count-to';
+import { GetStorageOverviewData } from '@/api/Didproject';
+export default {
+  data() {
+    return {
+      startVal: 0,
+      titlelist: [
+        {
+          titel: '搴撲綅鎬绘暟',
+          mun: 0,
+          color: '#40C9C6'
+        },
+        {
+          titel: '鏈夎揣搴撲綅',
+          mun: 0,
+          color: '#F4516C'
+        },
+        {
+          titel: '甯︿欢鍣ㄥ叿',
+          mun: 0,
+          color: '#36A3F7',
+          margin: '1%'
+        },
+        {
+          titel: '绌哄櫒鍏锋暟',
+          mun: 0,
+          color: '#34BFA3',
+          margin: '1%'
+        }
+        // {
+        //   titel: '鍒朵欢鎬绘暟',
+        //   mun: 1,
+        //   color: '#ffc637'
+        // }
+      ],
+      cleartime: null
+    };
+  },
+  components: { countTo },
+  computed: {},
+  mounted() {
+    this.GetStorageOverviewData();
+    this.cleartime = setInterval(() => {
+      this.GetStorageOverviewData();
+    }, 60000);
+  },
+  methods: {
+    //璺宠浆
+    linkto() {
+      const { href } = this.$router.resolve({
+        path: '/statelibrary'
+      });
+      window.open(href, '_blank');
+    },
+    //绔嬪簱鎬昏鍜屽埗浠舵�昏
+    GetStorageOverviewData() {
+      // no 缂栧彿锛泃itle 鏍囬锛泇alue 鏁伴噺
+      GetStorageOverviewData().then(res => {
+        let data = res.data || [];
+        this.titlelist.forEach(item => {
+          data.forEach(element => {
+            if (item.titel == element.titel) {
+              item.mun = element.value;
+            }
+          });
+        });
+      });
+    }
+  },
+  beforeDestroy() {
+    if (this.cleartime) {
+      clearInterval(this.cleartime);
+      this.cleartime = null;
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#statelibrary {
+}
+</style>
diff --git a/qqjf-Web/src/views/dataview/taskbeat.vue b/qqjf-Web/src/views/dataview/taskbeat.vue
new file mode 100644
index 0000000..c7e09ee
--- /dev/null
+++ b/qqjf-Web/src/views/dataview/taskbeat.vue
@@ -0,0 +1,69 @@
+<template>
+  <!-- 浠诲姟鑺傛媿 -->
+  <div id="Taskbeat" class="global-content backgroundrgb">
+    <div class="width80 height margin-auto overflow">
+      <div class="width margintopbot flex align-center justify-end">
+        <label class="colorfff fontsiez1rem">鏌ヨ鏃ユ湡锛�</label>
+        <el-date-picker
+          class="margin-right"
+          size="mini"
+          value-format="yyyy-MM-dd"
+          v-model="pickertime"
+          type="date"
+          placeholder="閫夋嫨鏃ユ湡"
+        >
+        </el-date-picker>
+        <el-button class="margin-right" type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      </div>
+      <div class="width height-calc90 overflow margin-top2">
+        <task-echart class="width height" colors="#fff" :chartData="chartData" :colorList="colorList" :yTotals="yMax" />
+        <!-- <div class="width height" ref="taskbeatEcharts"></div> -->
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetTaskBeatAnalysis } from '@/api/reportforms';
+import { GetDateStr } from '@/utils/date';
+import TaskEchart from '@/views/Home/components/meterEchart.vue';
+export default {
+  data() {
+    return {
+      pickertime: GetDateStr(-1),
+      chartData: {},
+			yMax:-1,
+      colorList: ['#0090FF', '#36CE9E', '#FFC005', '#FF515A', '#8B5CFF', '#00CA69']
+    };
+  },
+  components: { TaskEchart },
+  computed: {},
+  mounted() {
+    this.GetTaskBeatAnalysis();
+  },
+  methods: {
+    inquer() {
+      this.GetTaskBeatAnalysis();
+    },
+
+    GetTaskBeatAnalysis() {
+      GetTaskBeatAnalysis({ startTime: this.pickertime }).then(res => {
+				this.yMax = res.maxNum
+				let stepTotal = 0;
+				res.data[1].xdata = res.data[1].xdata.map((mapObj,mapIndex)=>{
+					stepTotal = stepTotal + Number(mapObj);
+					let rateVal = (this.yMax>0?Number((stepTotal/this.yMax*100).toFixed(2)):0)
+					res.data[0].xdata[mapIndex] = rateVal
+					return mapObj
+				})
+        this.chartData = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#Taskbeat {
+}
+</style>
diff --git a/qqjf-Web/src/views/dataview/tasktime.vue b/qqjf-Web/src/views/dataview/tasktime.vue
new file mode 100644
index 0000000..33fb3a6
--- /dev/null
+++ b/qqjf-Web/src/views/dataview/tasktime.vue
@@ -0,0 +1,104 @@
+<template>
+  <!-- 浠诲姟骞冲潎鏃堕暱-->
+  <div id="tasktime" class="global-content backgroundrgb">
+    <div class="width80 height margin-auto overflow">
+      <div class="width margintopbot flex align-center justify-end">
+        <label class="colorfff fontsiez1rem">鏌ヨ鏃ユ湡锛�</label>
+        <el-date-picker
+          class="margin-right"
+          v-model="pickertime"
+          size="mini"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+        >
+        </el-date-picker>
+        <el-button class="margin-right" type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      </div>
+      <div class="width height-calc90 overflow margin-top2">
+        <tasktime-echart class="width height" colors="#fff" :chartData="chartData" :colorList="colorList" />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetInOutAverageTime } from '@/api/reportforms';
+import { GetDateStr } from '@/utils/date';
+import TasktimeEchart from '@/views/Home/components/tasktimeecharts.vue';
+export default {
+  data() {
+    return {
+      pickertime: [GetDateStr(-15), GetDateStr(0)],
+      chartData: {},
+      colorList: [
+        '#0090FF',
+        '#36CE9E',
+        '#FFC005',
+        '#FF515A',
+        '#8B5CFF',
+        '#00CA69',
+        '#F3A43B',
+        '#D7504B',
+        '#C6E579',
+        '#F0805A',
+        '#26C0C0',
+        '#660077',
+        '#FFCCCC',
+        '#550088',
+        '#FFFFBB',
+        '#99FFFF',
+        '#CC00CC',
+        '#CC00CC',
+        '#C63300',
+        '#9955FF',
+        '#66FF66',
+        '#B5C334',
+        '#FCCE10',
+        '#27727B',
+        '#FE8463',
+        '#FAD860',
+        '#F3A43B',
+        '#D7504B',
+        '#C6E579',
+        '#F0805A',
+        '#26C0C0',
+        '#660077',
+        '#FFCCCC',
+        '#550088',
+        '#FFAA33',
+        '#CC00CC',
+        '#FF77FF',
+        '#C63300',
+        '#F4E001',
+        '#66FF66'
+      ]
+    };
+  },
+  components: { TasktimeEchart },
+  computed: {},
+  mounted() {
+    this.GetInOutAverageTime();
+  },
+  methods: {
+    inquer() {
+      this.GetInOutAverageTime();
+    },
+    GetInOutAverageTime() {
+      console.log(this.pickertime);
+      let startTime = this.pickertime ? this.pickertime[0] : '';
+      let endTime = this.pickertime ? this.pickertime[1] : '';
+      GetInOutAverageTime({ startTime: startTime, endTime: endTime }).then(res => {
+        this.chartData = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#tasktime {
+}
+</style>
diff --git a/qqjf-Web/src/views/dataview/turnover.vue b/qqjf-Web/src/views/dataview/turnover.vue
new file mode 100644
index 0000000..6f5e93a
--- /dev/null
+++ b/qqjf-Web/src/views/dataview/turnover.vue
@@ -0,0 +1,138 @@
+<template>
+  <!-- 鍒朵欢鍛ㄨ浆 -->
+  <div id="turnover" class="global-content backgroundrgb">
+    <div class="width80 height margin-auto overflow">
+      <div class="width margintopbot flex align-center justify-end">
+        <div class="flex width12 align-center margin-right15 justify-end">
+          <label class="colorfff fontsiez1rem">骞达細</label>
+          <el-date-picker v-model="intimers.year" size="mini" value-format="yyyy" type="year" placeholder="閫夋嫨骞�">
+          </el-date-picker>
+        </div>
+        <div class="flex width20 margin-right15 align-center justify-end">
+          <label class="colorfff fontsiez1rem">鏈堬細</label>
+          <el-date-picker
+            v-model="intimers.month"
+            type="monthrange"
+            size="mini"
+            value-format="MM"
+            format="MM"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫湀浠�"
+            end-placeholder="缁撴潫鏈堜唤"
+          >
+          </el-date-picker>
+        </div>
+        <div class="flex width15 align-center margin-right15 justify-end">
+          <label class="colorfff width40 fontsiez1rem">寮�濮嬪懆锛�</label>
+          <el-select style="width: 55%" v-model="intimers.stWeek" size="mini" clearable placeholder="璇烽�夋嫨鍛�">
+            <el-option
+              v-for="(item, index) in startweeklist"
+              :key="index + 'startweek'"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </div>
+        <div class="flex width15 align-center margin-right15 justify-end">
+          <label class="colorfff width40 fontsiez1rem">缁撴潫鍛細</label>
+          <el-select style="width: 55%" v-model="intimers.edWeek" size="mini" clearable placeholder="璇烽�夋嫨鍛�">
+            <el-option
+              v-for="(item, index) in endweeklist"
+              :key="index + 'endtweek'"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </div>
+        <el-button class="margin-right" type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      </div>
+      <div class="width height-calc90 overflow margin-top2">
+        <turnover-echart class="width height" colors="#fff" :chartData="chartData" :colorList="colorList" />
+        <!-- <div class="width height" ref="taskbeatEcharts"></div> -->
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetPartTurnover } from '@/api/reportforms';
+import TurnoverEchart from '@/views/Home/components/turnoverEchart.vue';
+export default {
+  data() {
+    return {
+      intimers: {
+        year: '',
+        month: null,
+        stWeek: '',
+        edWeek: ''
+      },
+      startweeklist: [
+        {
+          label: '绗竴鍛�',
+          value: 1
+        },
+        {
+          label: '绗簩鍛�',
+          value: 2
+        },
+        {
+          label: '绗笁鍛�',
+          value: 3
+        },
+        {
+          label: '绗洓鍛�',
+          value: 4
+        }
+      ],
+      endweeklist: [
+        {
+          label: '绗竴鍛�',
+          value: 1
+        },
+        {
+          label: '绗簩鍛�',
+          value: 2
+        },
+        {
+          label: '绗笁鍛�',
+          value: 3
+        },
+        {
+          label: '绗洓鍛�',
+          value: 4
+        }
+      ],
+      chartData: {},
+      colorList: ['#0090FF', '#36CE9E', '#FFC005', '#FF515A', '#8B5CFF', '#00CA69']
+    };
+  },
+  components: { TurnoverEchart },
+  computed: {},
+  mounted() {
+    this.GetPartTurnover();
+  },
+  methods: {
+    inquer() {
+      this.GetPartTurnover();
+    },
+    GetPartTurnover() {
+      const { year, stWeek, edWeek } = this.intimers;
+      let stMonth = this.intimers.month ? this.intimers.month[0] : '';
+      let edMonth = this.intimers.month ? this.intimers.month[1] : '';
+      GetPartTurnover({ year, stWeek, edWeek, stMonth: stMonth, edMonth: edMonth }).then(res => {
+        this.chartData = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#turnover {
+  ::v-deep .el-input__inner {
+    // width: 80%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/dataview/warehouse.vue b/qqjf-Web/src/views/dataview/warehouse.vue
new file mode 100644
index 0000000..0f5b0d4
--- /dev/null
+++ b/qqjf-Web/src/views/dataview/warehouse.vue
@@ -0,0 +1,70 @@
+<template>
+  <!-- 璐ф牸鍒╃敤鐜� -->
+  <div id="warehouse" class="global-content backgroundrgb">
+    <div class="width80 height margin-auto overflow">
+      <div class="width margintopbot flex align-center justify-end">
+        <label class="colorfff fontsiez1rem">鏌ヨ鏃ユ湡锛�</label>
+        <el-date-picker
+          class="margin-right"
+          v-model="pickertime"
+          size="mini"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+        >
+        </el-date-picker>
+        <el-button class="margin-right" type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      </div>
+      <div class="width height-calc90 overflow margin-top2">
+        <warehouse-echart class="width height" colors="#fff" :chartData="chartData" :colorList="colorList" />
+        <!-- <div class="width height" ref="taskbeatEcharts"></div> -->
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetStorageVailability } from '@/api/reportforms';
+import { GetDateStr } from '@/utils/date';
+import WarehouseEchart from '@/views/Home/components/warehouseechart.vue';
+
+export default {
+  data() {
+    return {
+      pickertime: [GetDateStr(-15), GetDateStr(0)],
+      chartData: {},
+      colorList: ['#0090FF', '#36CE9E', '#FFC005', '#FF515A', '#8B5CFF', '#00CA69']
+    };
+  },
+  components: { WarehouseEchart },
+  computed: {},
+  mounted() {
+    this.GetStorageVailability();
+  },
+  methods: {
+    inquer() {
+      this.GetStorageVailability();
+    },
+    GetStorageVailability() {
+      let objtimes = {
+        startTime: this.pickertime ? this.pickertime[0] : '',
+        endTime: this.pickertime ? this.pickertime[1] : ''
+      };
+      GetStorageVailability(objtimes).then(res => {
+        this.chartData = res;
+      });
+    },
+    //echarts
+    init(res) {
+      // this.myChart = echarts.init(this.$refs.taskbeatEcharts);
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#warehouse {
+}
+</style>
diff --git a/qqjf-Web/src/views/dataview/workpiece.vue b/qqjf-Web/src/views/dataview/workpiece.vue
new file mode 100644
index 0000000..f69bd68
--- /dev/null
+++ b/qqjf-Web/src/views/dataview/workpiece.vue
@@ -0,0 +1,142 @@
+<template>
+  <!-- 鍒朵欢鎬昏 -->
+  <div id="workpiece" class="global-content backgroundrgb">
+    <h3 class="text-center fontsize2rem colorfff absolute transformtopleft12" style="font-size: 80px">鍒朵欢鎬昏</h3>
+    <div
+      class="
+        width80
+        padding10
+        borderradius
+        margintopbot
+        absolute
+        transformtopleft
+        flex
+        justify-around
+        flex-wrap
+        align-center
+      "
+    >
+      <div
+        class="didproject-title width45 flex justify-around align-center borderdashed borderradius overflow pointer"
+        v-for="(item, index) in titlelist"
+        :key="index"
+        :style="'margin-top:' + item.margin"
+      >
+        <div class="heigth padding10 overflow">
+          <p class="text-center fontsize2rem colorfff fontweight600 margin-top15" style="font-size: 50px">
+            <countTo :startVal="startVal" :endVal="item.mun" :duration="3000"></countTo>
+          </p>
+          <p class="fontsize1_2rem color409EFF" style="font-size: 50px">{{ item.titel }}</p>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import countTo from 'vue-count-to';
+import { GetHomeNumData } from '@/api/Didproject';
+import { GetStorageOverviewData } from '@/api/Didproject';
+import { ItemStorage } from '@/api/materials';
+export default {
+  data() {
+    return {
+      startVal: 0,
+      titlelist: [
+        {
+          titel: '鍒朵欢鎬绘暟',
+          name: '鍒朵欢鎬绘暟',
+          mun: 0,
+          color: '#ffc637'
+        },
+        {
+          titel: '鍒朵欢绉嶇被',
+          name: '鍒朵欢绉嶇被',
+          mun: 0,
+          color: '#40C9C6'
+        },
+        {
+          titel: '浠婃棩鍏ュ簱',
+          name: '浠婃棩鍏ュ簱闆朵欢鏁�',
+          mun: 0,
+          color: '#F4516C',
+          margin: '1%'
+        },
+        {
+          titel: '浠婃棩鍑哄簱',
+          name: '浠婃棩鍑哄簱闆朵欢鏁�',
+          mun: 0,
+          color: '#36A3F7',
+          margin: '1%'
+        }
+      ],
+      cleartime: null,
+      list: []
+    };
+  },
+  components: { countTo },
+  computed: {},
+  mounted() {
+    this.GetHomeNumData();
+    this.cleartime = setInterval(() => {
+      this.GetHomeNumData();
+    }, 60000);
+  },
+  methods: {
+    //璺宠浆
+    linkto() {
+      const { href } = this.$router.resolve({
+        path: '/workpiece'
+      });
+      window.open(href, '_blank');
+    },
+    //浠婃棩鍑哄叆搴撴暟鎹�
+    GetHomeNumData() {
+      // no 缂栧彿锛泃itle 鏍囬锛泇alue 鏁伴噺
+      GetHomeNumData().then(res => {
+        let data = res.data || [];
+        this.list = data;
+        this.GetStorageOverviewData(data);
+      });
+    },
+    GetStorageOverviewData() {
+      GetStorageOverviewData().then(res => {
+        let data = res.data || [];
+        this.list = this.list.concat(data);
+        console.log(this.list);
+        this.ItemStorage();
+      });
+    },
+    ItemStorage() {
+      ItemStorage('1&onePageNum=1').then(res => {
+        if (res.code == 0) {
+          this.list.push({
+            titel: '鍒朵欢绉嶇被',
+            name: '鍒朵欢绉嶇被',
+            value: res.num
+          });
+          this.titlelist.forEach(item => {
+            this.list.forEach(element => {
+              if (item.name == element.titel) {
+                item.mun = element.value;
+              }
+            });
+          });
+        }
+        console.log(this.list);
+      });
+    }
+  },
+  beforeDestroy() {
+    if (this.cleartime) {
+      clearInterval(this.cleartime);
+      this.cleartime = null;
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#workpiece {
+}
+</style>
diff --git a/qqjf-Web/src/views/inbound/components/enterEdit.vue b/qqjf-Web/src/views/inbound/components/enterEdit.vue
new file mode 100644
index 0000000..8c99537
--- /dev/null
+++ b/qqjf-Web/src/views/inbound/components/enterEdit.vue
@@ -0,0 +1,544 @@
+<template>
+  <div class="enterEdit height overflow">
+    <div class="width overflow height92">
+      <div class="width edter-height">
+        <div class="flex margintopbot justify-between">
+          <div class="width45 flex align-center">
+            <label class="width40 textalign">缁勭洏鍗曞彿锛�</label>
+            <el-input size="mini" disabled clearable v-model="iqnuer.cviCode" class="width60"> </el-input>
+          </div>
+          <div class="width45 flex align-center">
+            <label class="width40 textalign">鍏ュ簱绫诲瀷锛�</label>
+
+            <el-select class="width60" size="mini" filterable clearable v-model="iqnuer.inType" placeholder="璇烽�夋嫨">
+              <el-option
+                v-for="(item, index) in inTypeList"
+                :key="'inType' + index"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </div>
+        </div>
+        <div class="flex margintopbot justify-between">
+          <div class="width45 flex align-center">
+            <label class="width40 textalign">鍒朵欢鐘舵�侊細</label>
+
+            <el-select
+              class="width60"
+              size="mini"
+              clearable
+              v-model="iqnuer.isBad"
+              placeholder="璇烽�夋嫨"
+              @change="isbadchange"
+            >
+              <el-option
+                v-for="(item, index) in isBadList"
+                :key="'isbad' + index"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </div>
+          <div class="width45 flex align-center">
+            <label class="width40 textalign">鍣ㄥ叿缂栧彿锛�</label>
+            <!-- <el-input size="mini" clearable v-model="iqnuer.containerName" class="width60"> </el-input> -->
+
+            <el-select
+              class="width60"
+              size="mini"
+              filterable
+              remote
+              reserve-keyword
+              :remote-method="remoteMethod"
+              :loading="remoloading"
+              clearable
+              @change="containerNamechange"
+              v-model="iqnuer.containerName"
+              placeholder="璇疯緭鍏ュ叧閿瘝"
+            >
+              <el-option
+                v-for="(item, index) in containerNamelist"
+                :key="'badByFactory' + index"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </div>
+        </div>
+        <div class="flex margintopbot justify-between">
+          <div class="width45 flex align-center">
+            <label class="width40 textalign">杩斾慨绫诲瀷锛�</label>
+
+            <el-select class="width60" size="mini" clearable v-model="iqnuer.badByFactory" placeholder="璇烽�夋嫨">
+              <el-option
+                v-for="(item, index) in badByFactorylist"
+                :key="'badByFactory' + index"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </div>
+          <div class="width45 flex align-center">
+            <label class="width40 textalign">鍣ㄥ叿绫诲瀷锛�</label>
+            <el-input size="mini" disabled clearable v-model="iqnuer.containerType" class="width60"> </el-input>
+          </div>
+        </div>
+        <div class="flex margintopbot justify-between">
+          <div class="width45 flex align-center">
+            <label class="width40 textalign">鍚堣鏁伴噺锛�</label>
+            <el-input size="mini" disabled v-model="iqnuer.itemNum" class="width60"> </el-input>
+          </div>
+          <div class="width45 flex align-center">
+            <label class="width40 textalign">鍚堣閲嶉噺锛�</label>
+            <el-input size="mini" disabled v-model="iqnuer.totalWeight" class="width60"> </el-input>
+          </div>
+        </div>
+        <div class="flex margintopbot justify-between">
+          <div class="width45 flex align-center">
+            <label class="width40 textalign">鍔ㄦ�佺О閲嶏細</label>
+            <el-input size="mini" disabled v-model="iqnuer.getWeight" class="width60"> </el-input>
+          </div>
+        </div>
+
+        <el-button-group>
+          <el-button type="primary" size="mini" icon="el-icon-plus" @click="$emit('partclick')">娣诲姞闆朵欢</el-button>
+          <el-button type="primary" size="mini" icon="el-icon-delete" @click="deltable">鍒犻櫎</el-button>
+        </el-button-group>
+      </div>
+      <div class="width enter-tebleheight overflow">
+        <table-container
+          height="88%"
+          :wipelist="wipelist"
+          :tableHead="tableHead"
+          :tableData="tableData"
+          :inOrderCodeList="inOrderCodeList"
+          :setshow="false"
+          :operation="true"
+          :editShow="true"
+          :naxnumShow="true"
+          :selectionShow="true"
+          :inputshow="true"
+          :roweditshow="roweditshow"
+          :currentPage="page"
+          :pageSize="pageSize"
+          :totle="totle"
+          :operationwidth="80"
+          @handleSelectionChange="handleSelectionChange"
+          @CurrentChange="CurrentChange"
+          @itemchange="itemchange"
+        />
+      </div>
+    </div>
+    <div class="enterEdit-button text-right margin-right15 margin-top2">
+      <el-button type="primary" size="mini" class="form-buttom" :loading="savloading" @click="submitForm"
+        >淇濆瓨</el-button
+      >
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import { getCache, setCache } from '@/utils/sessionStorage';
+import { GetDateStr, GetTimeStr, getDate } from '@/utils/date';
+const { enterEdit } = require('@/components/tableContainer/tableHead');
+import { ContainerSearch } from '@/api/palte';
+import { itemSearch } from '@/api/enterchoose';
+import { InOrderSearch } from '@/api/quotation';
+import {
+  ContainerVsItemSearch,
+  ContainerVsItemAdd,
+  ContainerVsItemUpdate,
+  ContainerVsItemAddAll,
+  GetCode
+} from '@/api/enter';
+import { ProductionLineSearch } from '@/api/cass-line';
+export default {
+  data() {
+    return {
+      userinfo: getCache('userInfo'),
+      iqnuer: {
+        cviCode: null,
+        // itemName: null,
+        isFinish: 0,
+        containerName: null,
+        itemNum: null,
+        isBad: null,
+        badByFactory: null,
+        createLine: null,
+        inType: null,
+        itemList: null
+      },
+      remoloading: false,
+      itemList: [],
+      inTypeList: [
+        {
+          label: '鍗冲ⅷ鍏ュ簱',
+          value: '鍗冲ⅷ鍏ュ簱'
+        },
+        {
+          label: '鏉庢钵鍏ュ簱',
+          value: '鏉庢钵鍏ュ簱'
+        },
+        {
+          label: '浣欐枡鍥炲簱',
+          value: '浣欐枡鍥炲簱'
+        },
+        {
+          label: 'EU绠卞叆绔嬩綋搴�',
+          value: 'EU绠卞叆绔嬩綋搴�'
+        }
+      ],
+      isBadList: [
+        {
+          label: '杩斾慨',
+          value: '1'
+        },
+        {
+          label: '涓嶈繑淇�',
+          value: '0'
+        }
+      ],
+      inOrderCodeList: [], //璁″垝鍗曞彿
+      createLineList: [],
+      containerNamelist: [], //鍣ㄥ叿缂栧彿
+      badByFactorylist: [],
+      wipelist: [],
+      tableData: [],
+      page: 1,
+      totle: 0,
+      pageSize: 20,
+      Selection: [], //鍕鹃�夋暟鎹�
+      storagelist: [], //瀛樻暟鎹�
+      roweditshow: false,
+      savloading: false
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: () => {}
+    },
+    chooselist: {
+      type: Array,
+      default: () => []
+    }
+  },
+  components: { TableContainer },
+  computed: {
+    tableHead() {
+      return enterEdit;
+    }
+  },
+  mounted() {
+    console.log(this.userinfo.userName);
+    if (JSON.stringify(this.rowitem) != '{}') {
+      console.log(this.rowitem);
+      this.iqnuer = this.rowitem;
+      this.iqnuer.isBad = this.iqnuer.isBad == 1 ? '杩斾慨' : this.iqnuer.isBad == 0 ? '涓嶈繑淇�' : this.iqnuer.isBad;
+      this.ContainerVsItemSearch();
+    } else {
+      this.GetCode();
+    }
+    this.containerNamelist = [];
+    this.ContainerSearch({ containerName: '' });
+    // this.ProductionLineSearch();
+  },
+  methods: {
+    //缁勭洏缂栧彿
+    GetCode() {
+      GetCode().then(res => {
+        this.iqnuer.cviCode = res;
+      });
+    },
+    //鐢熶骇璁″垝鍗曞彿
+    InOrderSearch(row) {
+      const { itemName } = row;
+      InOrderSearch('1&onePageNum=999', { itemName }).then(res => {
+        if (res.code == 0) {
+          this.inOrderCodeList = res.data;
+        }
+      });
+    },
+    remoteMethod(query) {
+      if (query !== '') {
+        this.remoloading = true;
+        setTimeout(() => {
+          this.remoloading = false;
+          this.ContainerSearch({ containerName: query });
+        }, 200);
+      }
+    },
+    //鐝嚎
+    // ProductionLineSearch() {
+    //   ProductionLineSearch('1&onePageNum=999', { isDestination: 0 }).then(res => {
+    //     if (res.code == 0) {
+    //       this.createLineList = res.data.filter(item => {
+    //         if (item.productionName.indexOf('鍑哄彛') == -1) {
+    //           return item;
+    //         }
+    //       });
+    //     }
+    //   });
+    // },
+    //鍣ㄥ叿缂栧彿
+    ContainerSearch(query) {
+      const { containerName } = query;
+      this.containerNamelist = [];
+      ContainerSearch('1&onePageNum=999', { containerName }).then(res => {
+        if (res.code == 0) {
+          let data = res.data || [];
+          data.forEach(element => {
+            this.containerNamelist.push({
+              label: element.containerName,
+              value: element.containerName,
+              containerType: element.containerType
+            });
+          });
+        }
+      });
+    },
+    //鍣ㄥ叿绫诲瀷
+    containerNamechange(e) {
+      this.containerNamelist.forEach(element => {
+        if (e == element.value) {
+          this.iqnuer.containerType = element.containerType;
+        }
+      });
+    },
+    //缂栬緫鏃惰幏鍙栭浂浠跺垪琛ㄦ暟鎹�
+    ContainerVsItemSearch() {
+      ContainerVsItemSearch(this.page, { containerName: this.rowitem.containerName }).then(res => {
+        if (res.code == 0) {
+          this.storgage(res.data);
+          this.totle = res.num;
+        }
+      });
+    },
+    //鍒嗛〉
+    CurrentChange(e) {
+      this.page = e;
+      this.ContainerVsItemSearch();
+    },
+    submitForm() {
+      console.log(this.iqnuer);
+      if (this.roweditshow) {
+        this.$message({
+          type: 'warning',
+          message: '璇峰厛淇濆瓨'
+        });
+      } else {
+        if (this.storagelist.length == 0) {
+          this.$message({
+            type: 'warning',
+            message: '璇锋坊鍔犻浂浠�'
+          });
+        } else {
+          this.iqnuer.isBad = this.iqnuer.isBad == '杩斾慨' ? 1 : this.iqnuer.isBad == '涓嶈繑淇�' ? 0 : this.iqnuer.isBad;
+          this.iqnuer.itemList = JSON.stringify(this.itemList);
+          const { cviCode, inType, itemList, containerName, isBad, badByFactory } = this.iqnuer;
+
+          if (this.iqnuer.isBad != null && this.iqnuer.inType != null && this.iqnuer.itemList != null) {
+            this.savloading = true;
+            //  createUser:this.userinfo.userName
+            ContainerVsItemAddAll({
+              cviCode,
+              inType,
+              itemList,
+              containerName,
+              isBad,
+              badByFactory,
+              createUser: this.userinfo.userName
+            }).then(res => {
+              if (res.code == 0) {
+                this.$message({
+                  type: 'success',
+                  message: '娣诲姞鎴愬姛'
+                });
+                this.$emit('cancel');
+              } else {
+                this.$message({
+                  type: 'warning',
+                  message: res.msg
+                });
+              }
+              this.savloading = false;
+            });
+          }
+        }
+      }
+    },
+    //杩斾慨绫诲瀷
+    isbadchange(e) {
+      console.log(e);
+      this.iqnuer.badByFactory = '';
+      if (e == 1) {
+        this.badByFactorylist = [
+          {
+            label: '鐒婅杩斾慨',
+            value: '鐒婅杩斾慨'
+          },
+          {
+            label: '鍐插帇杩斾慨',
+            value: '鍐插帇杩斾慨'
+          }
+        ];
+      } else {
+        this.badByFactorylist = [];
+      }
+    },
+    //杩囨护瀛樺偍
+    storgage(lists) {
+      let list = [...lists];
+      list.forEach(element => {
+        this.storagelist.push(element);
+        // this.storagelist = lists;
+        // this.iqnuer.itemName = this.storagelist[0].itemName;
+        // if (JSON.stringify(this.rowitem) == '{}') {
+        //   this.iqnuer.itemNum = 0;
+        // }
+      });
+      this.itemList = [];
+      this.filtration();
+    },
+    filtration(lists) {
+      let list = [...this.storagelist];
+      let weight = '';
+      let getWeight = '';
+      list.forEach(element => {
+        element.edit = false;
+        if (element.weight) {
+          weight = element.weight;
+        }
+        if (JSON.stringify(this.rowitem) == '{}') {
+          if (element.maxNum) {
+            this.iqnuer.itemNum += parseInt(element.maxNum);
+          }
+          element.itemNum = element.maxNum;
+        } else {
+          element.maxNum = this.iqnuer.itemNum;
+        }
+        this.itemList.push({
+          itemName: element.itemName,
+          inOrderCode: element.inOrderCode,
+          itemNum: element.maxNum
+        });
+      });
+      if (weight && this.iqnuer.itemNum) {
+        getWeight += weight * parseInt(this.iqnuer.itemNum);
+      }
+      this.iqnuer.totalWeight = getWeight;
+      this.tableData = list;
+    },
+
+    //鍕鹃�塼able
+    handleSelectionChange(e) {
+      console.log(e);
+      this.Selection = e;
+    },
+
+    //鏁伴噺
+    itemchange(e, item) {
+      this.itemList = [];
+      this.InOrderSearch(item);
+      this.roweditshow = !this.roweditshow;
+      this.iqnuer.itemNum = 0;
+      let weight = '';
+      let getWeight = '';
+      e.forEach(element => {
+        // element.edit = false;
+        this.itemList.push({
+          itemName: element.itemName,
+          inOrderCode: element.inOrderCode,
+          itemNum: element.maxNum
+        });
+        if (element.weight) {
+          weight = element.weight;
+        }
+        if (element.maxNum) {
+          this.iqnuer.itemNum += parseInt(element.maxNum);
+        }
+        element.itemNum = element.maxNum;
+      });
+      if (weight && this.iqnuer.itemNum) {
+        getWeight += weight * parseInt(this.iqnuer.itemNum);
+      }
+      this.iqnuer.totalWeight = getWeight;
+      this.storagelist = e;
+      console.log(this.tableData);
+      // this.chooselist.forEach(item => {
+      //   if (item.itemName == e.itemName) {
+      //     item.maxNum = e.itemNum;
+      //   }
+      // });
+    },
+    //鍒犻櫎琛ㄦ牸鏁版嵁
+    deltable() {
+      this.Selection.forEach(element => {
+        let index = this.tableData.findIndex(item => item.itemName == element.itemName);
+        let storgindex = this.storagelist.findIndex(item => item.itemName == element.itemName);
+        this.tableData.splice(index, 1);
+        this.storagelist.splice(storgindex, 1);
+      });
+      this.itemList = [];
+      this.storagelist.forEach(element => {
+        this.itemList.push({
+          itemName: element.itemName,
+          inOrderCode: element.inOrderCode,
+          itemNum: element.maxNum
+        });
+      });
+      // this.storgage(this.storagelist);
+    }
+  },
+  watch: {
+    chooselist: {
+      handler(nvl, ovl) {
+        this.storgage(nvl);
+      },
+      deep: true
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.enterEdit {
+  width: 98%;
+  padding: 1%;
+  .edter-height {
+    height: 220px;
+  }
+  .enter-tebleheight {
+    height: calc(100% - 240px);
+  }
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .enterEdit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    // width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/inbound/components/enterchoose.vue b/qqjf-Web/src/views/inbound/components/enterchoose.vue
new file mode 100644
index 0000000..c6a2329
--- /dev/null
+++ b/qqjf-Web/src/views/inbound/components/enterchoose.vue
@@ -0,0 +1,149 @@
+<template>
+  <div class="quotationEdit height overflow">
+    <div class="width overflow height92">
+      <div>
+        <div class="flex margintopbot justify-between">
+          <div class="width50 flex align-center">
+            <label class="width40 textalign">闆朵欢缂栧彿锛�</label>
+            <el-input size="mini" clearable v-model="iqnuer.itemName" class="width60"> </el-input>
+          </div>
+          <div class="width50 flex align-center">
+            <label class="width40 textalign">闆朵欢鍚嶇О锛�</label>
+            <el-input size="mini" clearable v-model="iqnuer.itemDes" class="width60"> </el-input>
+          </div>
+        </div>
+        <div class="flex width justify-between">
+          <div class="width50 flex align-center">
+            <label class="width40 textalign">璁″垝鍗曞彿锛�</label>
+            <el-select class="width60" size="mini" clearable v-model="iqnuer.inOrderCode" placeholder="璇烽�夋嫨">
+              <el-option
+                v-for="(item, index) in inOrderCodelist"
+                :key="'inOrderCode' + index"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </div>
+          <div>
+            <el-button type="primary" size="mini" @click="$emit('partclick')">鏌ヨ</el-button>
+            <el-button type="primary" size="mini" @click="$emit('addchoose')">鏂板</el-button>
+          </div>
+        </div>
+      </div>
+      <div class="width height82 overflow">
+        <table-container
+          height="91%"
+          :wipelist="wipelist"
+          :tableHead="tableHead"
+          :tableData="tableData"
+          :operation="false"
+          :selectionShow="true"
+          :totle="totle"
+          @handleSelectionChange="handleSelectionChange"
+        />
+      </div>
+    </div>
+    <div class="quotationEdit-button text-right margin-right15 margin-top2">
+      <el-button type="primary" size="mini" class="form-buttom" @click="submitForm">纭閫夋嫨</el-button>
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import { itemSearch } from '@/api/enterchoose';
+const { edterchoose } = require('@/components/tableContainer/tableHead');
+export default {
+  data() {
+    return {
+      iqnuer: {},
+      inOrderCodelist: [
+        {
+          label: '鏃�',
+          value: ''
+        }
+      ],
+      wipelist: [],
+      tableData: [],
+      handlelist: [], //鍕鹃�夋暟鎹�
+      totle: 0,
+      page: 1
+    };
+  },
+  props: {},
+  components: { TableContainer },
+  computed: {
+    tableHead() {
+      return edterchoose;
+    }
+  },
+  mounted() {
+    this.itemSearch();
+  },
+  methods: {
+    //鏌ヨ
+    itemSearch() {
+      this.$Loading(true);
+      itemSearch(this.page).then(res => {
+        if (res.code == 0) {
+          this.tableData = res.data;
+          this.totle = res.num;
+        }
+        this.$Loading();
+      });
+    },
+    //鍕鹃��
+    handleSelectionChange(e) {
+      console.log(e);
+      this.handlelist = e;
+    },
+    submitForm() {
+      if (this.handlelist.length == 1) {
+        this.$emit('chooseClick', this.handlelist, this.iqnuer.inOrderCode);
+      } else if (this.handlelist.length == 0) {
+        this.$message({
+          type: 'warning',
+          message: '璇峰嬀閫変竴鏉℃暟鎹�'
+        });
+      } else if (this.handlelist.length > 1) {
+        this.$message({
+          type: 'warning',
+          message: '鍙兘鍕鹃�変竴鏉℃暟鎹�'
+        });
+      }
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.quotationEdit {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .quotationEdit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    // width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/inbound/components/inboundinuqer.vue b/qqjf-Web/src/views/inbound/components/inboundinuqer.vue
new file mode 100644
index 0000000..45eef6a
--- /dev/null
+++ b/qqjf-Web/src/views/inbound/components/inboundinuqer.vue
@@ -0,0 +1,240 @@
+<template>
+  <div class="flex align-center justify-between">
+    <div class="">
+      <el-button-group>
+        <el-button type="primary"
+                   size="mini"
+                   v-if="add"
+                   icon="el-icon-plus"
+                   @click="$emit('addmodal')">鏂板缓</el-button>
+        <el-button v-if="dele"
+                   type="primary"
+                   size="mini"
+                   icon="el-icon-delete"
+                   @click="$emit('deladd')">鍒犻櫎</el-button>
+      </el-button-group>
+      <el-button-group class="margin-left">
+        <div class="flex">
+          <el-upload class="upload-demo"
+                     ref="upload"
+                     action=""
+                     accept=".xls,.xlsx"
+                     :show-file-list="false"
+                     :http-request="httprequest">
+            <el-button v-if="imexcel"
+                       style="margin-left: 10px"
+                       icon="el-icon-upload2"
+                       size="mini"
+                       type="success">瀵煎叆</el-button>
+          </el-upload>
+          <el-button v-if="derive"
+                     style="margin-left: 10px"
+                     type="primary"
+                     size="mini"
+                     icon="el-icon-download"
+                     @click="$emit('derive')">瀵煎嚭</el-button>
+        </div>
+      </el-button-group>
+      <el-button class="margin-left"
+                 v-if="refresh"
+                 :loading="loading"
+                 size="mini"
+                 icon="el-icon-refresh"
+                 @click="$emit('refresh')">鍒锋柊</el-button>
+    </div>
+    <div id="topinquer"
+         class="flex align-center justify-end">
+      <div v-if="queryOrderStatusShow"
+           class="flex align-center margin-right ">
+        <label class="color909399 fontsizeinitial width7rem">璁㈠崟鐘舵�侊細</label>
+        <el-select v-model="iqnuer.OrderStatusId"
+                   size="mini"
+                   clearable>
+          <el-option v-for="(item, index) in orderStatusList"
+                     :label="item.label"
+                     :value="item.value"
+                     :key="index"></el-option>
+        </el-select>
+      </div>
+      <div class="flex align-center margin-right ">
+        <label class="color909399 fontsizeinitial width7rem">鐢熶骇绫诲瀷锛�</label>
+        <el-select v-model="iqnuer.orderType"
+                   size="mini"
+                   clearable>
+          <el-option v-for="(item, index) in orderTypelist"
+                     :label="item.label"
+                     :value="item.value"
+                     :key="index"></el-option>
+        </el-select>
+      </div>
+      <div id="maindatetimeer"
+           v-if="datetimeshow"
+           class="flex align-center margin-right">
+        <label class="textalign color909399 width7rem fontsizeinitial">璧锋鏃堕棿锛�</label>
+        <el-date-picker size="mini"
+                        v-model="iqnuer.timepick"
+                        value-format="yyyy-MM-dd HH:mm:ss"
+                        type="datetimerange"
+                        range-separator="鑷�"
+                        start-placeholder="寮�濮嬫棩鏈�"
+                        end-placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </div>
+      <div class="flex align-center margin-right">
+        <el-input size="mini"
+                  clearable
+                  v-model="iqnuer[filter]"
+                  class="input-with-select">
+          <el-select @change="selchange"
+                     v-model="filter"
+                     slot="prepend">
+            <el-option v-for="(item, index) in filterList"
+                       :label="item.label"
+                       :value="item.value"
+                       :key="index"></el-option>
+          </el-select>
+        </el-input>
+      </div>
+      <el-button type="primary"
+                 size="mini"
+                 @click="inquer">鏌ヨ</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      orderTypelist: [
+        {
+          label: '鍗冲ⅷ鍏ュ簱',
+          value: '鍗冲ⅷ鍏ュ簱'
+        },
+        {
+          label: '鏉庢钵鍏ュ簱',
+          value: '鏉庢钵鍏ュ簱'
+        }
+      ],
+      orderStatusList: [
+        {
+          label: '鏂板缓',
+          value: 0
+        },
+        {
+          label: '鐒婅瀹℃牳涓�',
+          value: 1
+        },
+        {
+          label: '椹冲洖',
+          value: 3
+        },
+        {
+          label: '瀹屽伐',
+          value: 4
+        }
+      ],
+      iqnuer: {
+        OrderStatusId: ''
+      },
+      filter: '',
+      applytime: [],
+      fileList: [],
+      visible: false
+    };
+  },
+  props: {
+    queryOrderStatusShow: {
+      type: Boolean,
+      default: true
+    },
+    advanced: {
+      type: Boolean,
+      default: false
+    },
+    add: {
+      type: Boolean,
+      default: true
+    },
+    dele: {
+      type: Boolean,
+      default: false
+    },
+    refresh: {
+      type: Boolean,
+      default: true
+    },
+    tolead: {
+      type: Boolean,
+      default: false
+    },
+    derive: {
+      type: Boolean,
+      default: false
+    },
+    imexcel: {
+      type: Boolean,
+      default: false
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    byfilter: {
+      type: String,
+      default: ''
+    },
+    filterList: {
+      type: Array,
+      default: () => []
+    },
+    datetimeshow: {
+      type: Boolean,
+      default: false
+    }
+  },
+  mounted () {
+    this.filter = this.byfilter;
+  },
+  methods: {
+    inquer () {
+      //console.log(this.iqnuer.orderStatus)
+      this.$emit('inquer', this.iqnuer);
+    },
+    selchange () {
+      this.iqnuer = {};
+    },
+    httprequest (file) {
+      console.log(file);
+      this.$emit('importfile', file);
+    },
+    inrefclear () {
+      this.iqnuer = {};
+    }
+  },
+  watch: {
+    byfilter: {
+      handler (nvl, ovl) {
+        this.filter = nvl;
+      }
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#topinquer {
+  ::v-deep .el-select {
+    width: 100px;
+  }
+  #maindatetimeer {
+    ::v-deep .el-range-editor.el-input__inner {
+      padding: 3px;
+    }
+    ::v-deep .el-date-editor--datetimerange.el-input,
+    .el-date-editor--datetimerange.el-input__inner {
+      width: 74%;
+    }
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/inbound/components/partschoose.vue b/qqjf-Web/src/views/inbound/components/partschoose.vue
new file mode 100644
index 0000000..5b23b83
--- /dev/null
+++ b/qqjf-Web/src/views/inbound/components/partschoose.vue
@@ -0,0 +1,104 @@
+<template>
+  <div class="quotationEdit height overflow">
+    <div class="width overflow height92">
+      <div>
+        <div class="flex justify-between">
+          <div class="width40 flex align-center">
+            <label class="width40 textalign">闆朵欢缂栧彿锛�</label>
+            <el-input size="mini" clearable v-model="iqnuer.center" class="width60"> </el-input>
+          </div>
+          <div class="width40 flex align-center">
+            <label class="width40 textalign">闆朵欢鍚嶇О锛�</label>
+            <el-input size="mini" clearable v-model="iqnuer.center" class="width60"> </el-input>
+          </div>
+          <el-button type="primary" size="mini" @click="$emit('partclick')">鏌ヨ</el-button>
+        </div>
+      </div>
+      <div class="width height94 overflow">
+        <table-container
+          height="91%"
+          :wipelist="wipelist"
+          :tableHead="tableHead"
+          :tableData="tableData"
+          :selectionShow="true"
+          :operation="false"
+          :totle="totle"
+        />
+      </div>
+    </div>
+    <div class="quotationEdit-button text-right margin-right15 margin-top2">
+      <el-button type="primary" size="mini" class="form-buttom" @click="submitForm">纭閫夋嫨</el-button>
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+const { partschoose } = require('@/components/tableContainer/tableHead');
+export default {
+  data() {
+    return {
+      iqnuer: {},
+
+      wipelist: [],
+      tableData: [
+        {
+          deviceName1: '寮犱笁'
+        }
+      ],
+      totle: 0
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: {}
+    }
+  },
+  components: { TableContainer },
+  computed: {
+    tableHead() {
+      return partschoose;
+    }
+  },
+  mounted() {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.registerForm = this.rowitem;
+    }
+  },
+  methods: {
+    submitForm(registerForm) {}
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.quotationEdit {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .quotationEdit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    // width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/inbound/components/quotaionEdit.vue b/qqjf-Web/src/views/inbound/components/quotaionEdit.vue
new file mode 100644
index 0000000..d7b8a1b
--- /dev/null
+++ b/qqjf-Web/src/views/inbound/components/quotaionEdit.vue
@@ -0,0 +1,345 @@
+<template>
+  <div class="quotationEdit height overflow">
+    <div class="width overflow height92">
+      <div class="quotationEdit-height">
+        <div class="flex justify-between">
+          <div class="width55 flex align-center">
+            <label class="width40 textalign">鐢熶骇璁″垝鍗曞彿锛�</label>
+            <el-input size="mini"
+                      disabled
+                      v-model="iqnuer.inOrderCode"
+                      class="width60"> </el-input>
+          </div>
+          <div class="width40 flex align-center">
+            <label class="width40 textalign">鐢熶骇绫诲瀷锛�</label>
+            <el-select class="width60"
+                       size="mini"
+                       clearable
+                       :disabled="isReadOnly"
+                       v-model="iqnuer.orderType"
+                       placeholder="璇烽�夋嫨"
+                       required="true">
+              <el-option v-for="item in orderTypelist"
+                         :key="item.value"
+                         :label="item.label"
+                         :value="item.value">
+              </el-option>
+            </el-select>
+          </div>
+        </div>
+        <div class="flex justify-between margintopbot">
+          <div class="width55 flex align-center">
+            <label class="width40 textalign">澶囨敞锛�</label>
+            <el-input class="width60"
+                      type="textarea"
+                      clearable
+                      :disabled="isReadOnly"
+                      size="mini"
+                      resize="none"
+                      :autosize="{ minRows: 1, maxRows: 1 }"
+                      placeholder="璇疯緭鍏ュ唴瀹�"
+                      v-model="iqnuer.textarea1">
+            </el-input>
+          </div>
+          <div class="width40 flex align-center">
+            <label class="width40 textalign">璁″垝鏁伴噺锛�</label>
+            <el-input clearable
+                      size="mini"
+                      disabled
+                      v-model="iqnuer.totalNum"
+                      class="width60"> </el-input>
+          </div>
+        </div>
+        <el-button-group>
+          <el-button type="primary"
+                     size="mini"
+                     :disabled="isReadOnly"
+                     icon="el-icon-plus"
+                     @click="$emit('partclick')">鏂板缓</el-button>
+          <el-button type="primary"
+                     size="mini"
+                     :disabled="isReadOnly"
+                     icon="el-icon-delete"
+                     @click="delclick">鍒犻櫎</el-button>
+        </el-button-group>
+      </div>
+      <div class="width quotationEdit-tebleheight overflow">
+        <table-container ref="tablecontainer"
+                         height="91%"
+                         :tableHead="tableHead"
+                         :tableData="tableData"
+                         :operation="true"
+                         :editShow="true"
+                         :setshow="false"
+                         :naxnumShow="true"
+                         :selectionShow="true"
+                         :roweditshow="roweditshow"
+                         :currentPage="page"
+                         :pageSize="pageSize"
+                         :totle="totle"
+                         :inputshow="true"
+                         @edit="edit"
+                         @handleSelectionChange="handleSelectionChange"
+                         @itemchange="itemchange"
+                         @CurrentChange="CurrentChange" />
+      </div>
+    </div>
+    <div class="quotationEdit-button text-right margin-right15 margin-top2">
+      <el-button type="primary"
+                 size="mini"
+                 class="form-buttom"
+                 :loading="savloading"
+                 :disabled="isReadOnly"
+                 @click="submitForm">淇濆瓨</el-button>
+      <el-button type="primary"
+                 size="mini"
+                 class="form-buttom"
+                 @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import { getCache, setCache, removeToken } from '@/utils/sessionStorage';
+const { quotationedit } = require('@/components/tableContainer/tableHead');
+import { InOrderGetCode } from '@/api/quotation';
+import { getDate, GetTimeStr } from '@/utils/date';
+import { itemSearch } from '@/api/enterchoose';
+import { InOrderAddOrUpdate } from '@/api/quotation';
+export default {
+  data () {
+    return {
+      iqnuer: {
+        inOrderCode: '', //璁″垝鍗曞彿
+        orderType: '', //璁″垝绫诲瀷
+        totalNum: '', //闆朵欢鎬绘暟
+        doneNum: '', //宸蹭笅绾挎暟 鏂板浼�0锛岀紪杈戯紝鍘熸暟鎹繑鍥�
+        userName: getCache('userInfo').userName, //鍒涘缓浜虹紪鍙� 褰撳墠鐧婚檰浜虹姸鎬�
+        productionLineCode: '', //锛堥鐣欙級浼犵┖
+        doTime: '', //鎵ц鏃堕棿
+        itemName: '', //闆朵欢缂栧彿浼狅紝鍏跺畠闆朵欢淇℃伅鍙笉浼�
+        productionLineName: '' //鏆傛椂浼犵┖
+      },
+      orderTypelist: [
+        {
+          label: '鍗冲ⅷ鍏ュ簱',
+          value: '鍗冲ⅷ鍏ュ簱'
+        },
+        {
+          label: '鏉庢钵鍏ュ簱',
+          value: '鏉庢钵鍏ュ簱'
+        }
+      ],
+      tableData: [],
+      savloading: false,
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      roweditshow: false
+    };
+  },
+  props: {
+    //鏄惁鍙
+    isReadOnly: {
+      type: Boolean,
+      default: false
+    },
+    rowitem: {
+      type: Object,
+      default: () => { }
+    },
+    chooselist: {
+      type: Array,
+      default: () => []
+    }
+  },
+  components: { TableContainer },
+  computed: {
+    tableHead () {
+      return quotationedit;
+    }
+  },
+  mounted () {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.iqnuer = this.rowitem;
+      this.itemSearch();
+    } else {
+      this.iqnuer.doneNum = 0;
+      this.InOrderGetCode();
+    }
+  },
+  methods: {
+    //鑷姩鐢熸垚鍗曞彿
+    InOrderGetCode () {
+      InOrderGetCode().then(res => {
+        this.iqnuer.inOrderCode = res;
+      });
+    },
+    //缂栬緫鏃惰幏鍙栭浂浠跺垪琛ㄦ暟鎹�
+    itemSearch () {
+      itemSearch(this.page, { itemName: this.rowitem.itemName }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.image = process.env.IMAGE_URL + item.image;
+          });
+          this.storgage(data);
+          this.totle = res.num;
+        }
+      });
+    },
+    //缂栬緫
+    edit (row) { },
+    CurrentChange (e) {
+      this.page = e;
+      this.itemSearch();
+    },
+    submitForm () {
+      if (this.roweditshow) {
+        this.$message({
+          type: 'warning',
+          message: '璇峰厛淇濆瓨'
+        });
+      } else {
+        if (this.iqnuer.orderType == '') {
+          this.$message({
+            type: 'warning',
+            message: '璇烽�夋嫨鐢熶骇绫诲瀷'
+          });
+        } else {
+          this.savloading = true;
+          this.iqnuer.creatorId = getCache('userInfo').id;
+          InOrderAddOrUpdate(this.iqnuer).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '娣诲姞鎴愬姛'
+              });
+              this.$emit('cancel');
+            } else {
+              this.$message({
+                type: 'warning',
+                message: res.msg
+              });
+            }
+            this.savloading = false;
+          });
+        }
+      }
+    },
+    //杩囨护瀛樺偍
+    storgage (lists) {
+      let list = [...lists];
+      // list.forEach(element => {
+      //   this.storagelist.push(element);
+      this.storagelist = lists;
+      // });
+      this.filtration();
+    },
+    filtration (lists) {
+      let list = [...this.storagelist];
+      let getWeight = '';
+      list.forEach(element => {
+        element.edit = false;
+        if (JSON.stringify(this.rowitem) != '{}') {
+          element.doTime = this.rowitem.doTime;
+          element.maxNum = this.rowitem.totalNum;
+        } else {
+          element.doTime = getDate() + ' ' + GetTimeStr(0);
+          if (element.maxNum) {
+            // this.iqnuer.totalNum += parseInt(element.maxNum);
+            this.iqnuer.totalNum = element.maxNum;
+          } else {
+            this.iqnuer.totalNum = 0;
+          }
+        }
+
+        // element.itemNum = element.maxNum;
+      });
+      const { doTime, itemName } = list[0];
+      this.iqnuer.doTime = doTime;
+      this.iqnuer.itemName = itemName;
+      this.tableData = list;
+    },
+    //鏁伴噺
+    itemchange (e) {
+      console.log(e);
+      this.roweditshow = !this.roweditshow;
+      const { maxNum, doTime } = e[0];
+      this.iqnuer.totalNum = maxNum;
+      this.iqnuer.doTime = doTime;
+      // this.storgage(e);
+      // this.iqnuer.itemNum = 0;
+      // e.forEach(element => {
+      //   element.edit = false;
+      //   if (element.weight) {
+      //     weight = element.weight;
+      //   }
+      //   if (element.maxNum) {
+      //     this.iqnuer.itemNum += parseInt(element.maxNum);
+      //   }
+      //   element.itemNum = element.maxNum;
+      // });
+    },
+    //鍕鹃�塼able
+    handleSelectionChange (e) {
+      console.log(e);
+      this.Selection = e;
+    },
+    //鍒犻櫎
+    delclick () {
+      this.Selection.forEach(element => {
+        let index = this.tableData.findIndex(item => item.itemName == element.itemName);
+        let storgindex = this.storagelist.findIndex(item => item.itemName == element.itemName);
+        this.tableData.splice(index, 1);
+        this.storagelist.splice(storgindex, 1);
+      });
+      this.iqnuer.totalNum = 0;
+    }
+  },
+  watch: {
+    chooselist: {
+      handler (nvl, ovl) {
+        this.storgage(nvl);
+      },
+      deep: true
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.quotationEdit {
+  width: 98%;
+  padding: 1%;
+  .quotationEdit-height {
+    height: 120px;
+  }
+  .quotationEdit-tebleheight {
+    height: calc(100% - 125px);
+  }
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .quotationEdit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    // width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/inbound/components/quotaion_relevanceEdit.vue b/qqjf-Web/src/views/inbound/components/quotaion_relevanceEdit.vue
new file mode 100644
index 0000000..552116f
--- /dev/null
+++ b/qqjf-Web/src/views/inbound/components/quotaion_relevanceEdit.vue
@@ -0,0 +1,381 @@
+<template>
+  <div class="quotaion_relevanceEdit height overflow">
+    <div class="width overflow height92">
+      <div class="quotaion_relevanceEdit-height">
+        <div class="flex justify-between">
+          <div class="width55 flex align-center">
+            <label class="width40 textalign">鐢熶骇璁″垝鍗曞彿锛�</label>
+            <el-input size="mini"
+                      disabled
+                      v-model="iqnuer.inOrderCode"
+                      class="width60"> </el-input>
+          </div>
+          <div class="width40 flex align-center">
+            <label class="width40 textalign">鐢熶骇绫诲瀷锛�</label>
+            <el-select class="width60"
+                       size="mini"
+                       clearable
+                       disabled
+                       v-model="iqnuer.orderType"
+                       placeholder="璇烽�夋嫨"
+                       required="true">
+              <el-option v-for="item in orderTypelist"
+                         :key="item.value"
+                         :label="item.label"
+                         :value="item.value">
+              </el-option>
+            </el-select>
+          </div>
+        </div>
+        <div class="flex justify-between margintopbot">
+          <div class="width55 flex align-center">
+            <label class="width40 textalign">闆朵欢缂栧彿锛�</label>
+            <el-input class="width60"
+                      clearable
+                      size="mini"
+                      disabled
+                      placeholder="璇疯緭鍏ュ唴瀹�"
+                      v-model="iqnuer.itemName">
+            </el-input>
+          </div>
+          <div class="width40 flex align-center">
+            <label class="width40 textalign">闆朵欢鍚嶇О锛�</label>
+            <el-input clearable
+                      size="mini"
+                      disabled
+                      v-model="iqnuer.itemDes"
+                      class="width60"> </el-input>
+          </div>
+        </div>
+        <div class="flex justify-between margintopbot">
+          <div class="width55 flex align-center">
+            <label class="width40 textalign">澶囨敞锛�</label>
+            <el-input class="width60"
+                      type="textarea"
+                      clearable
+                      size="mini"
+                      disabled
+                      resize="none"
+                      :autosize="{ minRows: 1, maxRows: 1 }"
+                      placeholder="璇疯緭鍏ュ唴瀹�"
+                      v-model="iqnuer.textarea1">
+            </el-input>
+          </div>
+          <div class="width40 flex align-center">
+            <label class="width40 textalign">鍚堣鏁伴噺锛�</label>
+            <el-input clearable
+                      size="mini"
+                      disabled
+                      v-model="iqnuer.totalNum"
+                      class="width60"> </el-input>
+          </div>
+        </div>
+        <el-button-group>
+          <el-button type="primary"
+                     size="mini"
+                     icon="el-icon-plus"
+                     :disabled="isReadOnly"
+                     @click="$emit('partclick')">鏂板缓</el-button>
+          <el-button type="primary"
+                     size="mini"
+                     icon="el-icon-delete"
+                     :disabled="isReadOnly"
+                     @click="delclick">鍒犻櫎</el-button>
+        </el-button-group>
+      </div>
+      <div class="width quotaion_relevanceEdit-tebleheight overflow">
+        <table-container ref="tablecontainer"
+                         height="91%"
+                         :tableHead="tableHead"
+                         :tableData="tableData"
+                         :operation="true"
+                         :editShow="true"
+                         :setshow="false"
+                         :naxnumShow="true"
+                         :selectionShow="true"
+                         :roweditshow="roweditshow"
+                         :currentPage="page"
+                         :pageSize="pageSize"
+                         :totle="totle"
+                         :inputshow="true"
+                         :showSummary="true"
+                         @edit="edit"
+                         @handleSelectionChange="handleSelectionChange"
+                         @itemchange="itemchange"
+                         @CurrentChange="CurrentChange" />
+      </div>
+    </div>
+    <div class="quotaion_relevanceEdit-button text-right margin-right15 margin-top2">
+      <el-button type="primary"
+                 size="mini"
+                 class="form-buttom"
+                 :disabled="isReadOnly"
+                 :loading="savloading"
+                 @click="submitForm">淇濆瓨</el-button>
+      <el-button type="primary"
+                 size="mini"
+                 class="form-buttom"
+                 @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import { getCache, setCache, removeToken } from '@/utils/sessionStorage';
+const { quotaion_relevanceEdit } = require('@/components/tableContainer/tableHead');
+import { InOrderGetCode } from '@/api/quotation';
+import { getDate, GetTimeStr } from '@/utils/date';
+import { itemSearch } from '@/api/enterchoose';
+import { ContainerVsItemSearch, BindCviCode } from '@/api/enter';
+import { InOrderAddOrUpdate } from '@/api/quotation';
+export default {
+  data () {
+    return {
+      iqnuer: {
+        inOrderCode: '', //璁″垝鍗曞彿
+        orderType: '', //璁″垝绫诲瀷
+        totalNum: '', //闆朵欢鎬绘暟
+        doneNum: '', //宸蹭笅绾挎暟 鏂板浼�0锛岀紪杈戯紝鍘熸暟鎹繑鍥�
+        userName: getCache('userInfo').userName, //鍒涘缓浜虹紪鍙� 褰撳墠鐧婚檰浜虹姸鎬�
+        productionLineCode: '', //锛堥鐣欙級浼犵┖
+        doTime: '', //鎵ц鏃堕棿
+        itemName: '', //闆朵欢缂栧彿浼狅紝鍏跺畠闆朵欢淇℃伅鍙笉浼�
+        productionLineName: '' //鏆傛椂浼犵┖
+      },
+      orderTypelist: [
+        {
+          label: '鍗冲ⅷ鍏ュ簱',
+          value: '鍗冲ⅷ鍏ュ簱'
+        },
+        {
+          label: '鏉庢钵鍏ュ簱',
+          value: '鏉庢钵鍏ュ簱'
+        }
+      ],
+      tableData: [],//鍒楄〃鏁版嵁
+      savloading: false,
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      roweditshow: false
+    };
+  },
+  props: {
+    //鏄惁鍙
+    isReadOnly: {
+      type: Boolean,
+      default: false
+    },
+    rowitem: {
+      type: Object,
+      default: () => { }
+    },
+    tableList: {
+      type: Array,
+      default: () => []
+    }
+  },
+  components: { TableContainer },
+  computed: {
+    tableHead () {
+      return quotaion_relevanceEdit;
+    }
+  },
+  mounted () {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.iqnuer = this.rowitem;
+      this.itemSearch();
+    } else {
+      this.iqnuer.doneNum = 0;
+      this.InOrderGetCode();
+    }
+  },
+  methods: {
+    //鑷姩鐢熸垚鍗曞彿
+    InOrderGetCode () {
+      InOrderGetCode().then(res => {
+        this.iqnuer.inOrderCode = res;
+      });
+    },
+    //缂栬緫鏃惰幏鍙栭浂浠跺垪琛ㄦ暟鎹�
+    itemSearch () {
+      ContainerVsItemSearch(this.page, {
+        itemName: this.rowitem.itemName,
+        cviCode: this.rowitem.inOrderCode  //浼犻�� 鍐插帇璁″垝鍗曞彿 銆怑ditby shaocx,2022-11-1銆�
+      }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.image = process.env.IMAGE_URL + item.image;
+          });
+          this.storgage(data);
+          this.totle = res.num;
+        }
+      });
+    },
+    //缂栬緫
+    edit (row) { },
+    CurrentChange (e) {
+      this.page = e;
+      this.itemSearch();
+    },
+    submitForm () {
+      if (this.roweditshow) {
+        this.$message({
+          type: 'warning',
+          message: '璇峰厛淇濆瓨'
+        });
+      } else {
+        if (this.iqnuer.orderType == '') {
+          this.$message({
+            type: 'warning',
+            message: '璇烽�夋嫨鐢熶骇绫诲瀷'
+          });
+        } else {
+          this.savloading = true;
+          let _cviIds = this.tableData.map(item => {
+            return item.id
+          });
+          var postData = {
+            cviCode: this.iqnuer.inOrderCode,
+            creatorId: getCache('userInfo').id,
+            creatorName: getCache('userInfo').userName,
+            cviIds: [..._cviIds]
+          }
+          //this.iqnuer.creatorId = getCache('userInfo').id;
+          //this.iqnuer.creatorName = getCache('userInfo').userName;
+          BindCviCode(postData).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '淇濆瓨鎴愬姛'
+              });
+              this.$emit('cancel');
+            } else {
+              this.$message({
+                type: 'warning',
+                message: res.msg
+              });
+            }
+            this.savloading = false;
+          });
+        }
+      }
+    },
+    //杩囨护瀛樺偍
+    storgage (lists) {
+      let list = [...lists];
+      // list.forEach(element => {
+      //   this.storagelist.push(element);
+      this.storagelist = lists;
+      // });
+      this.filtration();
+    },
+    filtration (lists) {
+      let list = [...this.storagelist];
+      let getWeight = '';
+      list.forEach(element => {
+        element.edit = false;
+        /*
+        if (JSON.stringify(this.rowitem) != '{}') {
+          element.doTime = this.rowitem.doTime;
+          element.maxNum = this.rowitem.totalNum;
+        } else {
+          element.doTime = getDate() + ' ' + GetTimeStr(0);
+          if (element.maxNum) {
+            // this.iqnuer.totalNum += parseInt(element.maxNum);
+            this.iqnuer.totalNum = element.maxNum;
+          } else {
+            this.iqnuer.totalNum = 0;
+          }
+        }
+        //*/
+        // element.itemNum = element.maxNum;
+      });
+      //const { doTime, itemName } = list[0];
+      //this.iqnuer.doTime = doTime;
+      //this.iqnuer.itemName = itemName;
+      this.tableData = list;
+    },
+    //鏁伴噺
+    itemchange (e) {
+      console.log(e);
+      this.roweditshow = !this.roweditshow;
+      const { maxNum, doTime } = e[0];
+      this.iqnuer.totalNum = maxNum;
+      this.iqnuer.doTime = doTime;
+      // this.storgage(e);
+      // this.iqnuer.itemNum = 0;
+      // e.forEach(element => {
+      //   element.edit = false;
+      //   if (element.weight) {
+      //     weight = element.weight;
+      //   }
+      //   if (element.maxNum) {
+      //     this.iqnuer.itemNum += parseInt(element.maxNum);
+      //   }
+      //   element.itemNum = element.maxNum;
+      // });
+    },
+    //鍕鹃�塼able
+    handleSelectionChange (e) {
+      console.log(e);
+      this.Selection = e;
+    },
+    //鍒犻櫎
+    delclick () {
+      this.Selection.forEach(element => {
+        let index = this.tableData.findIndex(item => item.itemName == element.itemName);
+        let storgindex = this.storagelist.findIndex(item => item.itemName == element.itemName);
+        this.tableData.splice(index, 1);
+        this.storagelist.splice(storgindex, 1);
+      });
+      this.iqnuer.totalNum = 0;
+    }
+  },
+  watch: {
+    tableList: {
+      handler (nvl, ovl) {
+        this.storgage(nvl);
+      },
+      deep: true
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.quotaion_relevanceEdit {
+  width: 98%;
+  padding: 1%;
+  .quotaion_relevanceEdit-height {
+    height: 180px;
+  }
+  .quotaion_relevanceEdit-tebleheight {
+    height: calc(100% - 180px);
+  }
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .quotaion_relevanceEdit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    // width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/inbound/index.vue b/qqjf-Web/src/views/inbound/index.vue
new file mode 100644
index 0000000..1ca3ac4
--- /dev/null
+++ b/qqjf-Web/src/views/inbound/index.vue
@@ -0,0 +1,11 @@
+<template>
+  <keep-alive>
+    <router-view />
+  </keep-alive>
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/inbound/purchase/confirm_welding/index.vue b/qqjf-Web/src/views/inbound/purchase/confirm_welding/index.vue
new file mode 100644
index 0000000..068a01e
--- /dev/null
+++ b/qqjf-Web/src/views/inbound/purchase/confirm_welding/index.vue
@@ -0,0 +1,734 @@
+<!-- 椤甸潰锛氱剨瑁呯‘璁� -->
+<template>
+  <!-- 浠撳簱淇℃伅 -->
+  <div id="confirm_welding"
+       class="global-content">
+    <!-- 绛涢�� -->
+    <inbound-inuqer ref="inref"
+                    byfilter="璁″垝鍗曞彿"
+                    :filterList="filterList"
+                    :add="false"
+                    :tolead="true"
+                    :derive="true"
+                    :imexcel="false"
+                    :datetimeshow="true"
+                    :queryOrderStatusShow="false"
+                    @refresh="refresh"
+                    @addmodal="addmodal"
+                    @inquer="inquer"
+                    @derive="derive"
+                    @importfile="importfile" />
+    <!-- <input type="file" accept=".xls,.xlsx" @change="readExcel($event)" /> -->
+
+    <!-- table -->
+    <div class="table">
+      <table-container :tableHead="tableHead"
+                       :tableData="tableData"
+                       :editShow="false"
+                       :viewShow="false"
+                       :weldingAuditShow="false"
+                       :unlineCommitShow="false"
+                       :passShow="true"
+                       :rejectShow="true"
+                       :relevanceShow="true"
+                       :pageSize="pageSize"
+                       :totle="totle"
+                       @edit="edit"
+                       @view="view"
+                       @relevance="relevance"
+                       @weldingAudit="weldingAudit"
+                       @passCommit="passCommit"
+                       @rejectCommit="rejectCommit"
+                       @SizeChange="SizeChange"
+                       @CurrentChange="CurrentChange" />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow"
+             :modabg="true"
+             @cancel="addmodalShow = false">
+        <p slot="title">鍐插帇鐢熶骇璁″垝鍗�-{{ title }}</p>
+        <div class="height"
+             slot="centent">
+          <quotaion-edit @partclick="partShow = true"
+                         :isReadOnly="partShow_readOnly"
+                         @cancel="
+              addmodalShow = false;
+              refresh();
+            "
+                         :chooselist="chooselist"
+                         :rowitem="rowitem"
+                         @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+    <transition name="modal">
+      <modal v-if="relevanceModalShow"
+             :modabg="true"
+             @cancel="relevanceModalShow = false">
+        <p slot="title">鍏宠仈瀹屽伐鍏ュ簱闆朵欢-{{ relevanceModalShow_title }}</p>
+        <div class="height"
+             slot="centent">
+          <quotaion_relevanceEdit ref="quotaion_relevanceEditMethod"
+                                  @partclick="clickAddForRelevanceFinishedPart"
+                                  @cancel="
+              relevanceModalShow = false;
+              refresh();
+            "
+                                  :tableList="relevanceFinishedPartList"
+                                  :chooseClick="chooseClick"
+                                  :rowitem="rowitem"
+                                  :isReadOnly="true"
+                                  @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+    <transition name="modal">
+      <modal v-if="partShow"
+             :modabg="true"
+             @cancel="partShow = false">
+        <p slot="title">闆朵欢閫夋嫨</p>
+        <div class="height"
+             slot="centent">
+          <choose ref="partChoose"
+                  :wipelist="wipelist"
+                  @chooseClick="chooseClick"
+                  @cancel="partShow = false"
+                  @addchoose="addchooseShow = true" />
+        </div>
+      </modal>
+    </transition>
+    <transition name="modal">
+      <modal v-if="relevanceFinishedPartShow"
+             :modabg="true"
+             @cancel="relevanceFinishedPartShow = false">
+        <p slot="title">閫夋嫨鍏宠仈瀹屽伐鍏ュ簱闆朵欢</p>
+        <div class="height"
+             slot="centent">
+          <chooseRelevanceFinishedPart ref="relevanceFinishedPartMethod"
+                                       :wipelist="wipelist"
+                                       :pItemName="pItemName"
+                                       :pItemDes="pItemDes"
+                                       @submitForm="submitRelevanceFinishedPart"
+                                       @cancel="relevanceFinishedPartShow = false"
+                                       @addchoose="addchooseShow = true" />
+        </div>
+      </modal>
+    </transition>
+    <el-dialog title="瀹℃壒椹冲洖"
+               width="30%"
+               :visible.sync="rejectModalShow">
+      <el-form :model="rejectForm"
+               label-width="100px">
+        <el-form-item label="鐢熶骇璁″垝鍗曞彿">
+          <el-input disabled
+                    v-model="rejectForm.inOrderCode"></el-input>
+        </el-form-item>
+        <el-form-item label="璇存槑">
+          <el-input v-model="rejectForm.Remark"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer"
+           class="dialog-footer">
+        <el-button @click="rejectModalShow = false">鍙� 娑�</el-button>
+        <el-button type="primary"
+                   @click="do_rejectCommit">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal, Choose, AddChoose, chooseRelevanceFinishedPart } from '@/components/index';//杩欓噷寮曠敤鐨勬槸 vue鏂囦欢鐨勫悕瀛�
+import inboundInuqer from '../../components/inboundinuqer';
+import quotaionEdit from '../../components/quotaionEdit';
+import quotaion_relevanceEdit from '../../components/quotaion_relevanceEdit';
+import { getimestampDate, getymdhms } from '@/utils/date';
+import { exportTableList } from '@/utils/excel';
+//const { quotation } = require('@/components/tableContainer/tableHead');
+import { getCache, setCache, removeToken } from '@/utils/sessionStorage';
+import { InOrderSearch, InOrderDelete, ImportInOrder, InOrderSend, UpdateUnlineNum, InOrderCheck, InOrderReject } from '@/api/quotation';
+import XLSX from 'xlsx';
+import { Collapse } from 'element-ui';
+//鍒楄〃鏄剧ず鍒楀唴瀹�
+const my_tableHead = [{
+  columnDescription: '鐢熶骇璁″垝鍗曞彿',
+  columnName: 'inOrderCode',
+  sortable: true,
+  wipe: true,
+  width: 200
+},
+{
+  columnDescription: '鐢熶骇绫诲瀷',
+  columnName: 'orderType',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+
+{
+  columnDescription: '璁㈠崟鐘舵��',
+  columnName: 'orderStatus',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '闆朵欢缂栧彿',
+  columnName: 'itemName',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+{
+  columnDescription: '闆朵欢鍚嶇О',
+  columnName: 'itemDes',
+  sortable: true,
+  wipe: true,
+  width: 200
+},
+{
+  columnDescription: '璁″垝鐢熶骇鏁伴噺',
+  columnName: 'totalNum',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鎬诲畬宸ユ暟',
+  columnName: 'allFinishedNum',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '鍏ュ簱鏁伴噺',
+  columnName: 'DoneNum',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '绾夸笅浜や粯鏁伴噺',
+  columnName: 'unLineNum',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鎻愪氦浜�',
+  columnName: 'senderName',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鎻愪氦鏃堕棿',
+  columnName: 'SendTime',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '瀹℃牳浜�',
+  columnName: 'checkerName',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '瀹℃牳缁撴灉',
+  columnName: 'CheckResult',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '瀹℃牳鏃堕棿',
+  columnName: 'CheckTime',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '瀹℃牳璇存槑',
+  columnName: 'CheckRemark',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '澶囨敞',
+  columnName: 'deviceName5',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍒涘缓浜�',
+  columnName: 'createName',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍒涘缓鏃堕棿',
+  columnName: 'createTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+}, {
+  columnDescription: '淇敼浜�',
+  columnName: 'updateName',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '淇敼鏃堕棿',
+  columnName: 'updateTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+}
+];
+export default {
+  name: 'confirm_welding',
+  data () {
+    return {
+      partShow_readOnly: false,
+      rejectForm: {
+        inOrderCode: '',
+        Remark: ''
+      },
+      rejectModalShow: false,
+      pItemName: '',
+      pItemDes: '',
+      relevanceModalShow_title: '',
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      relevanceModalShow: false,
+      relevanceFinishedPartShow: false,
+      partShow: false,
+      addchooseShow: false,
+
+      chooselist: [],
+      relevanceFinishedPartList: [],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      wipelist: ['inOrderCode'],
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '璁″垝鍗曞彿',
+          label: '璁″垝鍗曞彿'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, inboundInuqer, Modal, quotaionEdit, Choose, AddChoose, quotaion_relevanceEdit, chooseRelevanceFinishedPart },
+  computed: {
+    tableHead () {
+      return my_tableHead;
+    }
+  },
+  created () { },
+  mounted () {
+    this.InOrderSearch();
+    console.log(getymdhms());
+  },
+  methods: {
+    clickAddForRelevanceFinishedPart () {
+      //鑾峰彇涓婁竴涓獥浣撶殑鍐呭
+      let itemName = this.$refs.quotaion_relevanceEditMethod.iqnuer.itemName;
+      let itemDes = this.$refs.quotaion_relevanceEditMethod.iqnuer.itemDes;
+      this.pItemName = itemName;
+      this.pItemDes = itemDes;
+      this.relevanceFinishedPartShow = true
+      // setTimeout(() => {
+      //   //console.log('relevanceFinishedPartMethod:' + this.$refs.relevanceFinishedPartMethod)
+
+      //   this.$refs.relevanceFinishedPartMethod.iqnuer.itemName = itemName;
+      //   this.$refs.relevanceFinishedPartMethod.iqnuer.itemDes = itemDes;
+      // }, 0)
+    },
+    //鍒锋柊
+    refresh () {
+      this.inuqerobg = {};
+      this.$refs.inref.inrefclear();
+      this.InOrderSearch();
+    },
+    //鏌ヨ
+    inquer (e) {
+      this.page = 1;
+      this.inuqerobg = e;
+      this.InOrderSearch();
+    },
+    //瀵煎嚭
+    derive () {
+      let tHeader = [];
+      let filterVal = [];
+      this.tableHead.forEach(item => {
+        tHeader.push(item.columnDescription);
+        filterVal.push(item.columnName);
+      });
+      this.$Loading(true);
+      const { 璁″垝鍗曞彿: inOrderCode } = this.inuqerobg;
+      //OrderStatusId: '1' 琛ㄧず鐘舵�佹槸 鐒婅瀹℃牳涓�
+      const orderType = this.inuqerobg.orderType;
+      InOrderSearch('1&onePageNum=99999999', {
+        inOrderCode, orderType, OrderStatusId: '1', CHECKERID: getCache('userInfo').id,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
+            item.updateTime = item.updateTime ? getimestampDate(item.updateTime) : '';
+          });
+          exportTableList(tHeader, filterVal, data, '鍐插帇璁″垝' + getymdhms());
+        }
+        this.$Loading(false);
+      });
+    },
+    //瀵煎叆
+    importfile (e) {
+      this.readExcel(e);
+    },
+
+    //鑾峰彇鐢熶骇璁″垝鍒楄〃
+    InOrderSearch () {
+      this.$Loading(true);
+      const { 璁″垝鍗曞彿: inOrderCode } = this.inuqerobg;
+      //OrderStatusId: '1' 琛ㄧず鐘舵�佹槸 鐒婅瀹℃牳涓�
+      const orderType = this.inuqerobg.orderType;
+      InOrderSearch(this.page + '&onePageNum=' + this.pageSize, {
+        inOrderCode, orderType, OrderStatusId: '1', CHECKERID: getCache('userInfo').id,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          this.tableData = res.data.filter(item => (item.doTime = getimestampDate(item.doTime)));
+          this.totle = res.num;
+        }
+        this.$Loading();
+      });
+    },
+    //鍒嗛〉
+    CurrentChange (e) {
+      console.log(e);
+      this.page = e;
+      this.InOrderSearch();
+    },
+    //椤垫暟
+    SizeChange (e) {
+      this.pageSize = e;
+      this.InOrderSearch();
+    },
+    //缂栬緫
+    edit (row) {
+      this.title = '缂栬緫';
+      this.partShow_readOnly = false;
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+    },
+    //鏌ョ湅
+    view (row) {
+      this.title = '鏌ョ湅';
+      this.partShow_readOnly = true;
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+    },
+    //鍏宠仈
+    relevance (row) {
+      this.relevanceModalShow_title = '鍏宠仈';
+      this.relevanceModalShow = true;
+      this.rowitem = { ...row };
+    },
+    //鍙戦�佺剨瑁呭鏍�
+    weldingAudit (row) {
+      const { inOrderCode } = { ...row };
+      //console.log(inOrderCode)
+      this.$confirm('纭畾灏嗚鍒掑崟鍙�"' + inOrderCode + '"鎻愪氦鐒婅瀹℃牳鍚�?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          InOrderSend({
+            InOrderCode: inOrderCode,
+            Remark: ''
+          }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.InOrderSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触:' + res.msg
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑�'
+          });
+        });
+    },
+    //閫氳繃
+    passCommit (row) {
+      const { inOrderCode } = { ...row };
+      //console.log(inOrderCode)
+      this.$confirm('纭畾灏嗚鍒掑崟鍙�"' + inOrderCode + '"瀹℃牳閫氳繃鍚�?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          InOrderCheck({
+            InOrderCode: inOrderCode,
+            Remark: ''
+          }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.InOrderSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触:' + res.msg
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑�'
+          });
+        });
+    },
+    //寮瑰嚭 鎷掔粷
+    rejectCommit (row) {
+      this.rejectForm.inOrderCode = row.inOrderCode;
+      this.rejectForm.Remark = '';
+      this.rejectModalShow = true
+    },
+    //鎷掔粷鎻愪氦
+    do_rejectCommit () {
+      this.$confirm('纭畾灏嗚鍒掑崟鍙�"' + this.rejectForm.inOrderCode + '"椹冲洖鍚�?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          InOrderReject({
+            InOrderCode: this.rejectForm.inOrderCode,
+            Remark: this.rejectForm.Remark
+          }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.rejectModalShow = false;
+              this.InOrderSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触:' + res.msg
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑�'
+          });
+        });
+    },
+    //鍒犻櫎
+    del (row) {
+      console.log(row);
+      const { inOrderCode } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ョ敓浜ц鍒掍俊鎭�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          InOrderDelete({ inOrderCode }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛'
+              });
+              this.InOrderSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鍒犻櫎澶辫触'
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal () {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit () {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.UserSearch();
+    },
+    //闆朵欢鍕鹃�夋暟鎹�
+    chooseClick (e) {
+      //alert(e)
+      if (e.length > 0) {
+        this.chooselist = [...e];
+        this.partShow = false;
+      } else {
+        this.$message({
+          type: 'info',
+          message: '璇峰嬀閫�'
+        });
+      }
+    },
+    //瀹屽伐闆朵欢鍕鹃�夋暟鎹�
+    submitRelevanceFinishedPart (e) {
+      //alert(e)
+      //debugger
+      //alert(this.$refs.quotaion_relevanceEditMethod.tableData.length);
+      var oldDataList = this.$refs.quotaion_relevanceEditMethod.tableData;
+      if (e.length > 0) {
+        //澶勭悊锛岀浉鍚岀殑灏变笉鍐嶇户缁坊鍔狅紝娌℃湁鐨勫氨娣诲姞
+        var checkList = [...e];
+        for (let i in checkList) {
+          debugger
+          //alert(checkList[i].id);
+          var result = oldDataList.find(x => x.id == checkList[i].id);
+          //alert(result)
+          if (result == undefined) {
+            //alert('濉叆')
+            //alert(this.relevanceFinishedPartList.length);
+            oldDataList.push(checkList[i]);
+            //console.log(checkList[i])
+            //alert('濉叆11')
+          }
+        }
+        this.relevanceFinishedPartList = [...oldDataList];
+        //alert(this.relevanceFinishedPartList.length);
+        this.relevanceFinishedPartShow = false;
+      } else {
+        this.$message({
+          type: 'info',
+          message: '璇峰嬀閫�'
+        });
+      }
+    },
+    //鏂板闆朵欢鍚�
+    addchooseclick () {
+      this.addchooseShow = false;
+      this.$refs.partChoose.itemSearch();
+    },
+    readExcel (e) {
+      // 璇诲彇琛ㄦ牸鏂囦欢
+      let _this = this;
+      const files = e.file;
+      // debugger;
+      if (files.length <= 0) {
+        return false;
+      } else if (!/\.(xls|xlsx)$/.test(files.name.toLowerCase())) {
+        this.$message({
+          message: '涓婁紶鏍煎紡涓嶆纭紝璇蜂笂浼爔ls鎴栬�厁lsx鏍煎紡',
+          type: 'warning'
+        });
+        return false;
+      } else {
+        // 鏇存柊鑾峰彇鏂囦欢鍚�
+        console.log(files);
+      }
+
+      const fileReader = new FileReader();
+      fileReader.onload = ev => {
+        try {
+          const data = ev.target.result;
+          const workbook = XLSX.read(data, {
+            type: 'binary'
+          });
+          const wsname = workbook.SheetNames[0]; //鍙栫涓�寮犺〃
+          const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]); //鐢熸垚json琛ㄦ牸鍐呭
+          console.log(ws);
+          let list = [];
+
+          ws.forEach(item => {
+            list.push({
+              itemCode: item['闆朵欢缂栧彿'],
+              inType: item['鐢熶骇绫诲瀷'],
+              Desc: item['鐢熶骇鐝嚎'],
+              createTime: item['鐢熶骇鏃ユ湡'],
+              itemNum: item['鐢熶骇鏁伴噺']
+            });
+          });
+          _this.ImportInOrder(JSON.stringify(list));
+        } catch (e) {
+          return false;
+        }
+      };
+      fileReader.readAsBinaryString(files);
+    },
+    //瀵煎叆鎺ュ彛
+    ImportInOrder (list) {
+      ImportInOrder({ userName: getCache('userInfo').userName, items: list }).then(res => {
+        if (res.code == 0) {
+          this.$message({
+            type: 'success',
+            message: '瀵煎叆鎴愬姛'
+          });
+        } else {
+          this.$message({
+            type: 'warning',
+            message: '瀵煎叆澶辫触锛佽鎸夌収妯℃澘濉叆鍐呭'
+          });
+        }
+      });
+      this.InOrderSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+//璧嬪�糹d涓篿nput_finished_product鐨勬牱寮�
+#confirm_welding {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/inbound/purchase/enter/index.vue b/qqjf-Web/src/views/inbound/purchase/enter/index.vue
new file mode 100644
index 0000000..88f292c
--- /dev/null
+++ b/qqjf-Web/src/views/inbound/purchase/enter/index.vue
@@ -0,0 +1,290 @@
+<template>
+  <!-- 浠撳簱淇℃伅 -->
+  <div id="enter"
+       class="global-content">
+    <!-- 绛涢�� -->
+    <inbound-inuqer ref="inref"
+                    byfilter="闆朵欢缂栧彿"
+                    :filterList="filterList"
+                    :loading="loading"
+                    :tolead="false"
+                    :derive="false"
+                    :imexcel="false"
+                    :datetimeshow="true"
+                    @refresh="refresh"
+                    @addmodal="addmodal"
+                    @inquer="inquer" />
+    <!-- table -->
+    <div class="table">
+      <table-container :wipelist="wipelist"
+                       :tableHead="tableHead"
+                       :tableData="tableData"
+                       :editShow="true"
+                       :delShow="true"
+                       :currentPage="page"
+                       :pageSize="pageSize"
+                       :totle="totle"
+                       @edit="edit"
+                       @del="del"
+                       @CurrentChange="CurrentChange"
+                       @SizeChange="SizeChange"
+                       @handleSelectionChange="handleSelectionChange" />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow"
+             :modabg="true"
+             @cancel="addmodalShow = false">
+        <p slot="title">缁勭洏-{{ title }}</p>
+        <div class="height"
+             slot="centent">
+          <enter-edit @partclick="partShow = true"
+                      @cancel="
+              addmodalShow = false;
+              refresh();
+            "
+                      :rowitem="rowitem"
+                      :chooselist="chooselist"
+                      @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+    <transition name="modal">
+      <modal v-if="partShow"
+             :modabg="true"
+             @cancel="partShow = false">
+        <p slot="title">闆朵欢鍒楄〃</p>
+        <div class="height"
+             slot="centent">
+          <choose ref="enterChoose"
+                  :choice="false"
+                  @chooseClick="chooseClick"
+                  @cancel="partShow = false"
+                  @addchoose="addchooseShow = true" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal, Choose, AddChoose } from '@/components/index';
+import inboundInuqer from '../../components/inboundinuqer';
+import enterEdit from '../../components/enterEdit';
+// import enterChoose from '../../components/choose';
+// import AddChoose from '../../components/addchoose';
+const { enter } = require('@/components/tableContainer/tableHead');
+import { ContainerVsItemSearch, ContainerVsItemDelete } from '@/api/enter';
+export default {
+  data () {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      partShow: false,
+      addchooseShow: false,
+      loading: false,
+      chooselist: [], //闆朵欢鏁版嵁
+      wipelist: [],
+      handleSeleclist: [], //鍕鹃�夋暟鎹�
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '缁勭洏缂栧彿',
+          label: '缁勭洏缂栧彿'
+        },
+        {
+          value: '闆朵欢缂栧彿',
+          label: '闆朵欢缂栧彿'
+        },
+        {
+          value: '闆朵欢鍚嶇О',
+          label: '闆朵欢鍚嶇О'
+        },
+        {
+          value: '鍣ㄥ叿缂栧彿',
+          label: '鍣ㄥ叿缂栧彿'
+        },
+        {
+          value: '鍣ㄥ叿绫诲瀷',
+          label: '鍣ㄥ叿绫诲瀷'
+        },
+        {
+          value: '鍏ュ簱璁″垝',
+          label: '鍏ュ簱璁″垝'
+        },
+        {
+          value: '鍑哄簱璁″垝',
+          label: '鍑哄簱璁″垝'
+        },
+        {
+          value: '杩斾慨杞﹂棿',
+          label: '杩斾慨杞﹂棿'
+        },
+        {
+          value: '鐢熶骇鐝嚎',
+          label: '鐢熶骇鐝嚎'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, inboundInuqer, Modal, enterEdit, Choose, AddChoose },
+  computed: {
+    tableHead () {
+      return enter;
+    }
+  },
+  mounted () {
+    this.ContainerVsItemSearch();
+  },
+  methods: {
+    //鍒锋柊
+    refresh () {
+      this.loading = true;
+      this.inuqerobg = {};
+      this.$refs.inref.inrefclear();
+      this.ContainerVsItemSearch();
+    },
+    //鏌ヨ
+    inquer (e) {
+      this.inuqerobg = e;
+      this.page = 1;
+      this.ContainerVsItemSearch();
+    },
+    //鎼滅储鐢ㄦ埛
+    ContainerVsItemSearch () {
+      const {
+        缁勭洏缂栧彿: cviCode,
+        闆朵欢缂栧彿: itemName,
+        闆朵欢鍚嶇О: itemDes,
+        鍣ㄥ叿缂栧彿: containerName,
+        鍣ㄥ叿绫诲瀷: containerType,
+        鍏ュ簱璁″垝: inOrderCode,
+        鍑哄簱璁″垝: outOrderCode,
+        杩斾慨杞﹂棿: badByFactory,
+        鐢熶骇鐝嚎: createLine
+      } = this.inuqerobg;
+      this.$Loading(true);
+      ContainerVsItemSearch(this.page + '&onePageNum=' + this.pageSize, {
+        itemName,
+        itemDes,
+        containerName,
+        containerType,
+        inOrderCode,
+        outOrderCode,
+        badByFactory,
+        createLine,
+        cviCode,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        this.loading = false;
+        if (res.code == 0) {
+          this.tableData = res.data;
+          this.totle = res.num;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange (e) {
+      console.log(e);
+      this.page = e;
+      this.ContainerVsItemSearch();
+    },
+    //椤垫暟
+    SizeChange (e) {
+      this.pageSize = e;
+      this.ContainerVsItemSearch();
+    },
+    //缂栬緫
+    edit (row) {
+      this.rowitem = { ...row };
+      this.chooselist = []; //闆朵欢鏁版嵁
+      this.addmodalShow = true;
+      this.title = '缂栬緫';
+    },
+    //鍕鹃��
+    handleSelectionChange (e) {
+      this.handleSeleclist = e;
+    },
+    //鍒犻櫎
+    del (row) {
+      console.log(row);
+      const { id } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ョ粍鐩樹俊鎭�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          ContainerVsItemDelete({ id }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛'
+              });
+              this.ContainerVsItemSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鍒犻櫎澶辫触'
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal () {
+      this.rowitem = {};
+      this.chooselist = [];
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit () {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.ContainerVsItemSearch();
+    },
+    //闆朵欢鍕鹃�夋暟鎹�
+    chooseClick (e) {
+      if (e.length > 0) {
+        this.chooselist = [...e];
+        this.partShow = false;
+      } else {
+        this.$message({
+          type: 'info',
+          message: '璇峰嬀閫�'
+        });
+      }
+    },
+    //鏂板闆朵欢鍚�
+    addchooseclick () {
+      this.addchooseShow = false;
+      this.$refs.enterChoose.itemSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#enter {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/inbound/purchase/index.vue b/qqjf-Web/src/views/inbound/purchase/index.vue
new file mode 100644
index 0000000..1cb60c6
--- /dev/null
+++ b/qqjf-Web/src/views/inbound/purchase/index.vue
@@ -0,0 +1,9 @@
+<template>
+  <router-view />
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/inbound/purchase/input_finished_product/index.vue b/qqjf-Web/src/views/inbound/purchase/input_finished_product/index.vue
new file mode 100644
index 0000000..62d742d
--- /dev/null
+++ b/qqjf-Web/src/views/inbound/purchase/input_finished_product/index.vue
@@ -0,0 +1,736 @@
+<template>
+  <!-- 浠撳簱淇℃伅 -->
+  <div id="input_finished_product"
+       class="global-content">
+    <!-- 绛涢�� -->
+    <inbound-inuqer ref="inref"
+                    byfilter="璁″垝鍗曞彿"
+                    :filterList="filterList"
+                    :add="false"
+                    :tolead="true"
+                    :derive="true"
+                    :imexcel="false"
+                    :datetimeshow="true"
+                    @refresh="refresh"
+                    @addmodal="addmodal"
+                    @inquer="inquer"
+                    @derive="derive"
+                    @importfile="importfile" />
+    <!-- <input type="file" accept=".xls,.xlsx" @change="readExcel($event)" /> -->
+
+    <!-- table -->
+    <div class="table">
+      <table-container :tableHead="tableHead"
+                       :tableData="tableData"
+                       :editShow="false"
+                       :viewShow="true"
+                       :weldingAuditShow="true"
+                       :unlineCommitShow="true"
+                       :relevanceShow="true"
+                       :pageSize="pageSize"
+                       :totle="totle"
+                       :cellStyle="cellStyle"
+                       @edit="edit"
+                       @del="del"
+                       @view="view"
+                       @relevance="relevance"
+                       @weldingAudit="weldingAudit"
+                       @unlineCommit="unlineCommit"
+                       @SizeChange="SizeChange"
+                       @CurrentChange="CurrentChange" />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow"
+             :modabg="true"
+             @cancel="addmodalShow = false">
+        <p slot="title">鍐插帇鐢熶骇璁″垝鍗�-{{ title }}</p>
+        <div class="height"
+             slot="centent">
+          <quotaion-edit @partclick="partShow = true"
+                         :isReadOnly="partShow_readOnly"
+                         @cancel="
+              addmodalShow = false;
+              refresh();
+            "
+                         :chooselist="chooselist"
+                         :rowitem="rowitem"
+                         @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+    <transition name="modal">
+      <modal v-if="relevanceModalShow"
+             :modabg="true"
+             @cancel="relevanceModalShow = false">
+        <p slot="title">鍏宠仈瀹屽伐鍏ュ簱闆朵欢-{{ relevanceModalShow_title }}</p>
+        <div class="height"
+             slot="centent">
+          <quotaion_relevanceEdit ref="quotaion_relevanceEditMethod"
+                                  @partclick="clickAddForRelevanceFinishedPart"
+                                  @cancel="
+              relevanceModalShow = false;
+              refresh();
+            "
+                                  :tableList="relevanceFinishedPartList"
+                                  :chooseClick="chooseClick"
+                                  :rowitem="rowitem"
+                                  @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+    <transition name="modal">
+      <modal v-if="partShow"
+             :modabg="true"
+             @cancel="partShow = false">
+        <p slot="title">闆朵欢閫夋嫨</p>
+        <div class="height"
+             slot="centent">
+          <choose ref="partChoose"
+                  :wipelist="wipelist"
+                  @chooseClick="chooseClick"
+                  @cancel="partShow = false"
+                  @addchoose="addchooseShow = true" />
+        </div>
+      </modal>
+    </transition>
+    <transition name="modal">
+      <modal v-if="aduitUserShow"
+             :modabg="true"
+             @cancel="aduitUserShow = false">
+        <p slot="title">閫夋嫨瀹℃牳浜�</p>
+        <div class="height"
+             slot="centent">
+          <chooseUser ref="userChoose"
+                      :wipelist="wipelist"
+                      @submitForm="do_weldingAudit"
+                      @cancel="aduitUserShow = false"
+                      @addchoose="addchooseShow = true" />
+        </div>
+      </modal>
+    </transition>
+    <transition name="modal">
+      <modal v-if="relevanceFinishedPartShow"
+             :modabg="true"
+             @cancel="relevanceFinishedPartShow = false">
+        <p slot="title">閫夋嫨鍏宠仈瀹屽伐鍏ュ簱闆朵欢</p>
+        <div class="height"
+             slot="centent">
+          <chooseRelevanceFinishedPart ref="relevanceFinishedPartMethod"
+                                       :wipelist="wipelist"
+                                       :pItemName="pItemName"
+                                       :pItemDes="pItemDes"
+                                       @submitForm="submitRelevanceFinishedPart"
+                                       @cancel="relevanceFinishedPartShow = false"
+                                       @addchoose="addchooseShow = true" />
+        </div>
+      </modal>
+    </transition>
+    <el-dialog title="绾夸笅浜や粯"
+               width="30%"
+               :visible.sync="unlineCommitModalShow">
+      <el-form :model="unlineCommitForm"
+               label-width="100px">
+        <el-form-item label="鐢熶骇璁″垝鍗曞彿">
+          <el-input disabled
+                    v-model="unlineCommitForm.inOrderCode"></el-input>
+        </el-form-item>
+        <el-form-item label="绾夸笅浜や粯鏁伴噺">
+          <el-input-number v-model="unlineCommitForm.qty"
+                           :min="0"></el-input-number>
+        </el-form-item>
+      </el-form>
+      <div slot="footer"
+           class="dialog-footer">
+        <el-button @click="unlineCommitModalShow = false">鍙� 娑�</el-button>
+        <el-button type="primary"
+                   @click="onSubmitUnlineCommitForm">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal, Choose, AddChoose, chooseRelevanceFinishedPart, chooseUser } from '@/components/index';//杩欓噷寮曠敤鐨勬槸 vue鏂囦欢鐨勫悕瀛�
+import inboundInuqer from '../../components/inboundinuqer';
+import quotaionEdit from '../../components/quotaionEdit';
+import quotaion_relevanceEdit from '../../components/quotaion_relevanceEdit';
+import { getimestampDate, getymdhms } from '@/utils/date';
+import { exportTableList } from '@/utils/excel';
+//const { quotation } = require('@/components/tableContainer/tableHead');
+import { getCache, setCache, removeToken } from '@/utils/sessionStorage';
+import { InOrderSearch, InOrderDelete, ImportInOrder, InOrderSend, UpdateUnlineNum } from '@/api/quotation';
+import XLSX from 'xlsx';
+import { Collapse } from 'element-ui';
+//鍒楄〃鏄剧ず鍒楀唴瀹�
+const my_tableHead = [{
+  columnDescription: '鐢熶骇璁″垝鍗曞彿',
+  columnName: 'inOrderCode',
+  sortable: true,
+  wipe: true,
+  width: 200
+},
+{
+  columnDescription: '鐢熶骇绫诲瀷',
+  columnName: 'orderType',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+
+{
+  columnDescription: '璁㈠崟鐘舵��',
+  columnName: 'orderStatus',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '闆朵欢缂栧彿',
+  columnName: 'itemName',
+  sortable: true,
+  wipe: true,
+  width: 150
+},
+{
+  columnDescription: '闆朵欢鍚嶇О',
+  columnName: 'itemDes',
+  sortable: true,
+  wipe: true,
+  width: 200
+},
+{
+  columnDescription: '璁″垝鐢熶骇鏁伴噺',
+  columnName: 'totalNum',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鎬诲畬宸ユ暟',
+  columnName: 'allFinishedNum',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '鍏ュ簱鏁伴噺',
+  columnName: 'DoneNum',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '绾夸笅浜や粯鏁伴噺',
+  columnName: 'unLineNum',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鎻愪氦浜�',
+  columnName: 'senderName',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鎻愪氦鏃堕棿',
+  columnName: 'SendTime',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '瀹℃牳浜�',
+  columnName: 'checkerName',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '瀹℃牳缁撴灉',
+  columnName: 'CheckResult',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '瀹℃牳鏃堕棿',
+  columnName: 'CheckTime',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '瀹℃牳璇存槑',
+  columnName: 'CheckRemark',
+  sortable: true,
+  wipe: true,
+  width: 120
+},
+{
+  columnDescription: '澶囨敞',
+  columnName: 'deviceName5',
+  sortable: true,
+  wipe: true
+},
+{
+  columnDescription: '鍒涘缓浜�',
+  columnName: 'createName',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '鍒涘缓鏃堕棿',
+  columnName: 'createTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+}, {
+  columnDescription: '淇敼浜�',
+  columnName: 'updateName',
+  sortable: true,
+  wipe: true,
+  width: 100
+},
+{
+  columnDescription: '淇敼鏃堕棿',
+  columnName: 'updateTime',
+  sortable: true,
+  wipe: true,
+  width: 150
+}
+];
+export default {
+  name: 'input_finished_product',
+  data () {
+    return {
+      curSelectInOrderCode: '',//褰撳墠閫夋嫨鐨勮鍒掑崟鍙�
+      aduitUserShow: false,
+      partShow_readOnly: false,
+      unlineCommitForm: {
+        inOrderCode: '',
+        qty: 0
+      },
+      unlineCommitModalShow: false,
+      pItemName: '',
+      pItemDes: '',
+      relevanceModalShow_title: '',
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      relevanceModalShow: false,
+      relevanceFinishedPartShow: false,
+      partShow: false,
+      addchooseShow: false,
+
+      chooselist: [],
+      relevanceFinishedPartList: [],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      wipelist: ['inOrderCode'],
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '璁″垝鍗曞彿',
+          label: '璁″垝鍗曞彿'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, inboundInuqer, Modal, quotaionEdit, Choose, AddChoose, quotaion_relevanceEdit, chooseRelevanceFinishedPart, chooseUser },
+  computed: {
+    tableHead () {
+      return my_tableHead;
+    }
+  },
+  created () { },
+  mounted () {
+    this.InOrderSearch();
+    console.log(getymdhms());
+  },
+  methods: {
+    cellStyle ({ row, rowIndex }) {
+      if (row.OrderStatusId === 3) {//3鏄� 椹冲洖
+        return 'background: #aa7798;color:white'
+      }
+      return ''
+    },
+    clickAddForRelevanceFinishedPart () {
+      //鑾峰彇涓婁竴涓獥浣撶殑鍐呭
+      let itemName = this.$refs.quotaion_relevanceEditMethod.iqnuer.itemName;
+      let itemDes = this.$refs.quotaion_relevanceEditMethod.iqnuer.itemDes;
+      this.pItemName = itemName;
+      this.pItemDes = itemDes;
+      this.relevanceFinishedPartShow = true
+      // setTimeout(() => {
+      //   //console.log('relevanceFinishedPartMethod:' + this.$refs.relevanceFinishedPartMethod)
+
+      //   this.$refs.relevanceFinishedPartMethod.iqnuer.itemName = itemName;
+      //   this.$refs.relevanceFinishedPartMethod.iqnuer.itemDes = itemDes;
+      // }, 0)
+    },
+    //鍒锋柊
+    refresh () {
+      this.inuqerobg = {};
+      this.$refs.inref.inrefclear();
+      this.InOrderSearch();
+    },
+    //鏌ヨ
+    inquer (e) {
+      this.page = 1;
+      this.inuqerobg = e;
+      this.InOrderSearch();
+    },
+    //瀵煎嚭
+    derive () {
+      let tHeader = [];
+      let filterVal = [];
+      this.tableHead.forEach(item => {
+        tHeader.push(item.columnDescription);
+        filterVal.push(item.columnName);
+      });
+      this.$Loading(true);
+      const { 璁″垝鍗曞彿: inOrderCode } = this.inuqerobg;
+      const OrderStatusId = this.inuqerobg.OrderStatusId;
+      const orderType = this.inuqerobg.orderType;
+      InOrderSearch('1&onePageNum=99999999', {
+        inOrderCode, orderType, OrderStatusId, InOrderPageType: '瀹屽伐鍝佽緭鍏ラ〉闈�', createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
+            item.updateTime = item.updateTime ? getimestampDate(item.updateTime) : '';
+          });
+          exportTableList(tHeader, filterVal, data, '鍐插帇璁″垝' + getymdhms());
+        }
+        this.$Loading(false);
+      });
+    },
+    //瀵煎叆
+    importfile (e) {
+      this.readExcel(e);
+    },
+
+    //鑾峰彇鐢熶骇璁″垝鍒楄〃
+    InOrderSearch () {
+      this.$Loading(true);
+      const { 璁″垝鍗曞彿: inOrderCode } = this.inuqerobg;
+      const OrderStatusId = this.inuqerobg.OrderStatusId;
+      const orderType = this.inuqerobg.orderType;
+      InOrderSearch(this.page + '&onePageNum=' + this.pageSize, {
+        inOrderCode, orderType, OrderStatusId, InOrderPageType: '瀹屽伐鍝佽緭鍏ラ〉闈�',
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          this.tableData = res.data.filter(item => (item.doTime = getimestampDate(item.doTime)));
+          this.totle = res.num;
+        }
+        this.$Loading();
+      });
+    },
+    //鍒嗛〉
+    CurrentChange (e) {
+      console.log(e);
+      this.page = e;
+      this.InOrderSearch();
+    },
+    //椤垫暟
+    SizeChange (e) {
+      this.pageSize = e;
+      this.InOrderSearch();
+    },
+    //缂栬緫
+    edit (row) {
+      this.title = '缂栬緫';
+      this.partShow_readOnly = false;
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+    },
+    //鏌ョ湅
+    view (row) {
+      this.title = '鏌ョ湅';
+      this.partShow_readOnly = true;
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+    },
+    //鍏宠仈
+    relevance (row) {
+      this.relevanceModalShow_title = '鍏宠仈';
+      this.relevanceModalShow = true;
+      this.rowitem = { ...row };
+    },
+    //鎻愬嚭 鐒婅瀹℃牳浜�
+    weldingAudit (row) {
+      const { inOrderCode } = { ...row };
+      this.curSelectInOrderCode = inOrderCode;
+      this.aduitUserShow = true;
+    },
+    //鍙戦�佺剨瑁呭鏍�
+    do_weldingAudit (e) {
+      let userId = 0;
+      if (e.length > 0) {
+        var checkList = [...e];
+        userId = checkList[0].id;
+      } else {
+        this.$message({
+          type: 'info',
+          message: '璇峰嬀閫�'
+        });
+      }
+      //console.log(userId + ' ' + this.curSelectInOrderCode)
+      this.$confirm('纭畾灏嗚鍒掑崟鍙�"' + this.curSelectInOrderCode + '"鎻愪氦鐒婅瀹℃牳鍚�?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          InOrderSend({
+            InOrderCode: this.curSelectInOrderCode,
+            SendUserId: getCache('userInfo').id,//鎻愪氦瀹℃牳浜�
+            AuditUserId: userId,//瀹℃牳浜�
+            Remark: ''
+          }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.aduitUserShow = false;
+              this.InOrderSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触:' + res.msg
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑�'
+          });
+        });
+    },
+    //寮瑰嚭 绾夸笅浜や粯
+    unlineCommit (row) {
+      this.unlineCommitForm.inOrderCode = row.inOrderCode;
+      this.unlineCommitForm.qty = row.unLineNum;
+      this.unlineCommitModalShow = true
+    },
+    //绾夸笅浜や粯
+    onSubmitUnlineCommitForm () {
+      this.$confirm('纭畾灏嗚鍒掑崟鍙�"' + this.unlineCommitForm.inOrderCode + '"鎻愪氦绾夸笅浜や粯鏁伴噺鍚�?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          UpdateUnlineNum({
+            InOrderCode: this.unlineCommitForm.inOrderCode,
+            Qty: this.unlineCommitForm.qty
+          }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.unlineCommitModalShow = false;
+              this.InOrderSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触:' + res.msg
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑�'
+          });
+        });
+    },
+    //鍒犻櫎
+    del (row) {
+      console.log(row);
+      const { inOrderCode } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ョ敓浜ц鍒掍俊鎭�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          InOrderDelete({ inOrderCode }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛'
+              });
+              this.InOrderSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鍒犻櫎澶辫触'
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal () {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit () {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.UserSearch();
+    },
+    //闆朵欢鍕鹃�夋暟鎹�
+    chooseClick (e) {
+      //alert(e)
+      if (e.length > 0) {
+        this.chooselist = [...e];
+        this.partShow = false;
+      } else {
+        this.$message({
+          type: 'info',
+          message: '璇峰嬀閫�'
+        });
+      }
+    },
+    //瀹屽伐闆朵欢鍕鹃�夋暟鎹�
+    submitRelevanceFinishedPart (e) {
+      //alert(e)
+      //debugger
+      //alert(this.$refs.quotaion_relevanceEditMethod.tableData.length);
+      var oldDataList = this.$refs.quotaion_relevanceEditMethod.tableData;
+      if (e.length > 0) {
+        //澶勭悊锛岀浉鍚岀殑灏变笉鍐嶇户缁坊鍔狅紝娌℃湁鐨勫氨娣诲姞
+        var checkList = [...e];
+        for (let i in checkList) {
+          debugger
+          //alert(checkList[i].id);
+          var result = oldDataList.find(x => x.id == checkList[i].id);
+          //alert(result)
+          if (result == undefined) {
+            //alert('濉叆')
+            //alert(this.relevanceFinishedPartList.length);
+            oldDataList.push(checkList[i]);
+            //console.log(checkList[i])
+            //alert('濉叆11')
+          }
+        }
+        this.relevanceFinishedPartList = [...oldDataList];
+        //alert(this.relevanceFinishedPartList.length);
+        this.relevanceFinishedPartShow = false;
+      } else {
+        this.$message({
+          type: 'info',
+          message: '璇峰嬀閫�'
+        });
+      }
+    },
+    //鏂板闆朵欢鍚�
+    addchooseclick () {
+      this.addchooseShow = false;
+      this.$refs.partChoose.itemSearch();
+    },
+    readExcel (e) {
+      // 璇诲彇琛ㄦ牸鏂囦欢
+      let _this = this;
+      const files = e.file;
+      // debugger;
+      if (files.length <= 0) {
+        return false;
+      } else if (!/\.(xls|xlsx)$/.test(files.name.toLowerCase())) {
+        this.$message({
+          message: '涓婁紶鏍煎紡涓嶆纭紝璇蜂笂浼爔ls鎴栬�厁lsx鏍煎紡',
+          type: 'warning'
+        });
+        return false;
+      } else {
+        // 鏇存柊鑾峰彇鏂囦欢鍚�
+        console.log(files);
+      }
+
+      const fileReader = new FileReader();
+      fileReader.onload = ev => {
+        try {
+          const data = ev.target.result;
+          const workbook = XLSX.read(data, {
+            type: 'binary'
+          });
+          const wsname = workbook.SheetNames[0]; //鍙栫涓�寮犺〃
+          const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]); //鐢熸垚json琛ㄦ牸鍐呭
+          console.log(ws);
+          let list = [];
+
+          ws.forEach(item => {
+            list.push({
+              itemCode: item['闆朵欢缂栧彿'],
+              inType: item['鐢熶骇绫诲瀷'],
+              Desc: item['鐢熶骇鐝嚎'],
+              createTime: item['鐢熶骇鏃ユ湡'],
+              itemNum: item['鐢熶骇鏁伴噺']
+            });
+          });
+          _this.ImportInOrder(JSON.stringify(list));
+        } catch (e) {
+          return false;
+        }
+      };
+      fileReader.readAsBinaryString(files);
+    },
+    //瀵煎叆鎺ュ彛
+    ImportInOrder (list) {
+      ImportInOrder({ userName: getCache('userInfo').userName, items: list }).then(res => {
+        if (res.code == 0) {
+          this.$message({
+            type: 'success',
+            message: '瀵煎叆鎴愬姛'
+          });
+        } else {
+          this.$message({
+            type: 'warning',
+            message: '瀵煎叆澶辫触锛佽鎸夌収妯℃澘濉叆鍐呭'
+          });
+        }
+      });
+      this.InOrderSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+//璧嬪�糹d涓篿nput_finished_product鐨勬牱寮�
+#input_finished_product {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/inbound/purchase/intype/index.vue b/qqjf-Web/src/views/inbound/purchase/intype/index.vue
new file mode 100644
index 0000000..00e4a3a
--- /dev/null
+++ b/qqjf-Web/src/views/inbound/purchase/intype/index.vue
@@ -0,0 +1,186 @@
+<template>
+  <!-- 浠撳簱淇℃伅 -->
+  <div id="intype" class="global-content">
+    <!-- 绛涢�� -->
+    <inbound-inuqer
+      ref="inref"
+      byfilter="鍏ュ簱绫诲瀷"
+      :filterList="filterList"
+      :tolead="false"
+      :derive="false"
+      @refresh="refresh"
+      @addmodal="addmodal"
+      @inquer="inquer"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :operation="false"
+        :pageSize="pageSize"
+        :totle="totle"
+        @edit="edit"
+        @del="del"
+        @CurrentChange="CurrentChange"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import inboundInuqer from '../../components/inboundinuqer';
+const { intype } = require('@/components/tableContainer/tableHead');
+import { InTypeSearch } from '@/api/intype';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      partShow: false,
+      addchooseShow: false,
+      chooselist: [],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      wipelist: ['inOrderCode'],
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '鍏ュ簱绫诲瀷',
+          label: '鍏ュ簱绫诲瀷'
+        },
+        {
+          value: '鐩爣浠撳簱',
+          label: '鐩爣浠撳簱鍚�'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, inboundInuqer, Modal },
+  computed: {
+    tableHead() {
+      return intype;
+    }
+  },
+  mounted() {
+    this.InTypeSearch();
+  },
+  methods: {
+    //鍒锋柊
+    refresh() {
+      this.inuqerobg = {};
+      this.$refs.inref.inrefclear();
+      this.InTypeSearch();
+    },
+    //鏌ヨ
+    inquer(e) {
+      console.log(e);
+      this.page = 1;
+      this.inuqerobg = e;
+      this.InTypeSearch();
+    },
+    //鑾峰彇鐢熶骇璁″垝鍒楄〃
+    InTypeSearch() {
+      this.$Loading(true);
+      const { 璁″垝鍗曞彿: inOrderCode, 鐢熶骇绫诲瀷: orderType, 璁㈠崟鐘舵��: orderStatus } = this.inuqerobg;
+      InTypeSearch(this.page + '&onePageNum=' + this.pageSize, { inOrderCode, orderType, orderStatus }).then(res => {
+        if (res.code == 0) {
+          this.tableData = res.data;
+          this.totle = res.num;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.InTypeSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { inOrderCode } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ョ敓浜ц鍒掍俊鎭�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          InOrderDelete({ inOrderCode }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛'
+              });
+              this.InTypeSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鍒犻櫎澶辫触'
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.UserSearch();
+    },
+    //闆朵欢鍕鹃�夋暟鎹�
+    chooseClick(e) {
+      if (e.length > 0) {
+        this.chooselist = [...e];
+        this.partShow = false;
+      } else {
+        this.$message({
+          type: 'info',
+          message: '璇峰嬀閫�'
+        });
+      }
+    },
+    //鏂板闆朵欢鍚�
+    addchooseclick() {
+      this.addchooseShow = false;
+      this.$refs.partChoose.itemSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#intype {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/inbound/purchase/quotation/index.vue b/qqjf-Web/src/views/inbound/purchase/quotation/index.vue
new file mode 100644
index 0000000..5a60d8f
--- /dev/null
+++ b/qqjf-Web/src/views/inbound/purchase/quotation/index.vue
@@ -0,0 +1,342 @@
+<template>
+  <!-- 浠撳簱淇℃伅 -->
+  <div id="quotation"
+       class="global-content">
+    <!-- 绛涢�� -->
+    <inbound-inuqer ref="inref"
+                    byfilter="璁″垝鍗曞彿"
+                    :filterList="filterList"
+                    :add="true"
+                    :tolead="true"
+                    :derive="true"
+                    :imexcel="true"
+                    :datetimeshow="true"
+                    @refresh="refresh"
+                    @addmodal="addmodal"
+                    @inquer="inquer"
+                    @derive="derive"
+                    @importfile="importfile" />
+    <!-- <input type="file" accept=".xls,.xlsx" @change="readExcel($event)" /> -->
+
+    <!-- table -->
+    <div class="table">
+      <table-container :tableHead="tableHead"
+                       :tableData="tableData"
+                       :editShow="true"
+                       :delShow="true"
+                       :pageSize="pageSize"
+                       :totle="totle"
+                       @edit="edit"
+                       @del="del"
+                       @SizeChange="SizeChange"
+                       @CurrentChange="CurrentChange" />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow"
+             :modabg="true"
+             :modalStyle="modalStyle"
+             @cancel="addmodalShow = false">
+        <p slot="title">鍐插帇鐢熶骇璁″垝鍗�-{{ title }}</p>
+        <div class="height"
+             slot="centent">
+          <quotaion-edit @partclick="partShow = true"
+                         @cancel="
+              addmodalShow = false;
+              refresh();
+            "
+                         :chooselist="chooselist"
+                         :rowitem="rowitem"
+                         @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+    <transition name="modal">
+      <modal v-if="partShow"
+             :modabg="true"
+             @cancel="partShow = false">
+        <p slot="title">闆朵欢閫夋嫨</p>
+        <div class="height"
+             slot="centent">
+          <choose ref="partChoose"
+                  :wipelist="wipelist"
+                  @chooseClick="chooseClick"
+                  @cancel="partShow = false"
+                  @addchoose="addchooseShow = true" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal, Choose, AddChoose } from '@/components/index';
+import inboundInuqer from '../../components/inboundinuqer';
+import quotaionEdit from '../../components/quotaionEdit';
+import { getimestampDate, getymdhms } from '@/utils/date';
+import { exportTableList } from '@/utils/excel';
+const { quotation } = require('@/components/tableContainer/tableHead');
+import { getCache, setCache, removeToken } from '@/utils/sessionStorage';
+import { InOrderSearch, InOrderDelete, ImportInOrder } from '@/api/quotation';
+import XLSX from 'xlsx';
+export default {
+  name: 'quotation',
+  data () {
+    return {
+      modalStyle: {
+        width: '50%'
+      },
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      partShow: false,
+      addchooseShow: false,
+
+      chooselist: [],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      wipelist: ['inOrderCode'],
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '璁″垝鍗曞彿',
+          label: '璁″垝鍗曞彿'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, inboundInuqer, Modal, quotaionEdit, Choose, AddChoose },
+  computed: {
+    tableHead () {
+      return quotation;
+    }
+  },
+  created () { },
+  mounted () {
+    this.InOrderSearch();
+    console.log(getymdhms());
+  },
+  methods: {
+    //鍒锋柊
+    refresh () {
+      this.inuqerobg = {};
+      this.$refs.inref.inrefclear();
+      this.InOrderSearch();
+    },
+    //鏌ヨ
+    inquer (e) {
+      this.page = 1;
+      this.inuqerobg = e;
+      this.InOrderSearch();
+    },
+    //瀵煎嚭
+    derive () {
+      let tHeader = [];
+      let filterVal = [];
+      this.tableHead.forEach(item => {
+        tHeader.push(item.columnDescription);
+        filterVal.push(item.columnName);
+      });
+      this.$Loading(true);
+      const { 璁″垝鍗曞彿: inOrderCode } = this.inuqerobg;
+      //console('inOrderCode' + inOrderCode)
+      const OrderStatusId = this.inuqerobg.OrderStatusId;
+      const orderType = this.inuqerobg.orderType;
+      InOrderSearch('1&onePageNum=99999999', {
+        inOrderCode, orderType, OrderStatusId,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
+            item.updateTime = item.updateTime ? getimestampDate(item.updateTime) : '';
+          });
+          exportTableList(tHeader, filterVal, data, '鍐插帇璁″垝' + getymdhms());
+        }
+        this.$Loading(false);
+      });
+    },
+    //瀵煎叆
+    importfile (e) {
+      this.readExcel(e);
+    },
+
+    //鑾峰彇鐢熶骇璁″垝鍒楄〃
+    InOrderSearch () {
+      this.$Loading(true);
+      const { 璁″垝鍗曞彿: inOrderCode } = this.inuqerobg;
+      //console('inOrderCode' + inOrderCode)
+      const OrderStatusId = this.inuqerobg.OrderStatusId;
+      const orderType = this.inuqerobg.orderType;
+      InOrderSearch(this.page + '&onePageNum=' + this.pageSize, {
+        inOrderCode, orderType, OrderStatusId,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          this.tableData = res.data.filter(item => (item.doTime = getimestampDate(item.doTime)));
+          this.totle = res.num;
+        }
+        this.$Loading();
+      });
+    },
+    //鍒嗛〉
+    CurrentChange (e) {
+      console.log(e);
+      this.page = e;
+      this.InOrderSearch();
+    },
+    //椤垫暟
+    SizeChange (e) {
+      this.pageSize = e;
+      this.InOrderSearch();
+    },
+    //缂栬緫
+    edit (row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del (row) {
+      console.log(row);
+      const { inOrderCode } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ョ敓浜ц鍒掍俊鎭�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          InOrderDelete({ inOrderCode }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛'
+              });
+              this.InOrderSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鍒犻櫎澶辫触'
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal () {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit () {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.UserSearch();
+    },
+    //闆朵欢鍕鹃�夋暟鎹�
+    chooseClick (e) {
+      if (e.length > 0) {
+        this.chooselist = [...e];
+        this.partShow = false;
+      } else {
+        this.$message({
+          type: 'info',
+          message: '璇峰嬀閫�'
+        });
+      }
+    },
+    //鏂板闆朵欢鍚�
+    addchooseclick () {
+      this.addchooseShow = false;
+      this.$refs.partChoose.itemSearch();
+    },
+    readExcel (e) {
+      // 璇诲彇琛ㄦ牸鏂囦欢
+      let _this = this;
+      const files = e.file;
+      // debugger;
+      if (files.length <= 0) {
+        return false;
+      } else if (!/\.(xls|xlsx)$/.test(files.name.toLowerCase())) {
+        this.$message({
+          message: '涓婁紶鏍煎紡涓嶆纭紝璇蜂笂浼爔ls鎴栬�厁lsx鏍煎紡',
+          type: 'warning'
+        });
+        return false;
+      } else {
+        // 鏇存柊鑾峰彇鏂囦欢鍚�
+        console.log(files);
+      }
+
+      const fileReader = new FileReader();
+      fileReader.onload = ev => {
+        try {
+          const data = ev.target.result;
+          const workbook = XLSX.read(data, {
+            type: 'binary'
+          });
+          const wsname = workbook.SheetNames[0]; //鍙栫涓�寮犺〃
+          const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]); //鐢熸垚json琛ㄦ牸鍐呭
+          console.log(ws);
+          let list = [];
+
+          ws.forEach(item => {
+            list.push({
+              itemCode: item['闆朵欢缂栧彿'],
+              inType: item['鐢熶骇绫诲瀷'],
+              Desc: item['鐢熶骇鐝嚎'],
+              createTime: item['鐢熶骇鏃ユ湡'],
+              itemNum: item['鐢熶骇鏁伴噺']
+            });
+          });
+          _this.ImportInOrder(JSON.stringify(list));
+        } catch (e) {
+          return false;
+        }
+      };
+      fileReader.readAsBinaryString(files);
+    },
+    //瀵煎叆鎺ュ彛
+    ImportInOrder (list) {
+      ImportInOrder({ userName: getCache('userInfo').userName, items: list }).then(res => {
+        if (res.code == 0) {
+          this.$message({
+            type: 'success',
+            message: '瀵煎叆鎴愬姛'
+          });
+        } else {
+          this.$message({
+            type: 'warning',
+            message: '瀵煎叆澶辫触锛佽鎸夌収妯℃澘濉叆鍐呭'
+          });
+        }
+      });
+      this.InOrderSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#quotation {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/login/index.vue b/qqjf-Web/src/views/login/index.vue
new file mode 100644
index 0000000..7e866fe
--- /dev/null
+++ b/qqjf-Web/src/views/login/index.vue
@@ -0,0 +1,360 @@
+<template>
+  <div class="login-container">
+    <div class="header">
+      <img class="logo" src="../../assets/heard/logbg.jpg" alt="" />
+    </div>
+    <el-form
+      ref="loginForm"
+      :model="loginForm"
+      :rules="loginRules"
+      class="login-form"
+      autocomplete="on"
+      label-position="left"
+    >
+      <div class="title-container">
+        <h3 class="title">娆㈣繋鐧诲綍鏅鸿兘鍖栫珛浣撳簱绠$悊绯荤粺</h3>
+      </div>
+
+      <el-form-item prop="username">
+        <span class="svg-container">
+          <svg-icon icon-class="user" />
+        </span>
+        <el-input
+          ref="username"
+          v-model="loginForm.username"
+          placeholder="璐︽埛"
+          name="username"
+          type="text"
+          tabindex="1"
+          autocomplete="on"
+        />
+      </el-form-item>
+
+      <el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual>
+        <el-form-item prop="password">
+          <span class="svg-container">
+            <svg-icon icon-class="password" />
+          </span>
+          <el-input
+            :key="passwordType"
+            ref="password"
+            v-model="loginForm.password"
+            :type="passwordType"
+            placeholder="瀵嗙爜"
+            name="password"
+            tabindex="2"
+            autocomplete="on"
+            @keyup.native="checkCapslock"
+            @blur="capsTooltip = false"
+            @keyup.enter.native="handleLogin"
+          />
+          <span class="show-pwd" @click="showPwd">
+            <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" />
+          </span>
+        </el-form-item>
+      </el-tooltip>
+
+      <el-button
+        :loading="loading"
+        type="primary"
+        style="width: 100%; margin-bottom: 30px"
+        @click.native.prevent="handleLogin"
+        >鐧诲綍</el-button
+      >
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { validUsername } from '@/utils/validate';
+import { getCache, setCache } from '@/utils/sessionStorage';
+export default {
+  name: 'Login',
+  components: {},
+  data() {
+    return {
+      loginForm: {
+        username: '',
+        password: ''
+      },
+      loginRules: {
+        username: [{ required: true, message: '璇疯緭鍏ヨ处鍙�', trigger: 'blur' }],
+        password: [{ required: true, trigger: 'blur', message: '璇疯緭鍏ュ瘑鐮�' }]
+      },
+      passwordType: 'password',
+      capsTooltip: false,
+      loading: false,
+      showDialog: false,
+      redirect: undefined,
+      otherQuery: {}
+    };
+  },
+  watch: {
+    $route: {
+      handler: function (route) {
+        const query = route.query;
+        if (query) {
+          this.redirect = query.redirect;
+          this.otherQuery = this.getOtherQuery(query);
+        }
+      },
+      immediate: true
+    }
+  },
+  created() {
+    // window.addEventListener('storage', this.afterQRScan)
+  },
+  mounted() {
+    if (this.loginForm.username === '') {
+      this.$refs.username.focus();
+    } else if (this.loginForm.password === '') {
+      this.$refs.password.focus();
+    }
+  },
+  destroyed() {
+    // window.removeEventListener('storage', this.afterQRScan)
+  },
+  methods: {
+    checkCapslock(e) {
+      const { key } = e;
+      this.capsTooltip = key && key.length === 1 && key >= 'A' && key <= 'Z';
+    },
+    showPwd() {
+      if (this.passwordType === 'password') {
+        this.passwordType = 'text';
+      } else {
+        this.passwordType = 'password';
+      }
+      this.$nextTick(() => {
+        this.$refs.password.focus();
+      });
+    },
+    handleLogin() {
+      this.$refs['loginForm'].validate(valid => {
+        if (valid) {
+          this.loading = true;
+          this.$store
+            .dispatch('user/login', this.loginForm)
+            .then(res => {
+              // this.loading = false;
+              if (res.code == 0) {
+                let data = res.data[0];
+                setCache('userInfo', data);
+                this.$router.push({
+                  path: '/Didproject'
+                });
+              } else {
+                this.$message({
+                  type: 'warning',
+                  message: res.msg
+                });
+              }
+              this.loading = false;
+            })
+            .catch(() => {
+              this.loading = false;
+            });
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    getOtherQuery(query) {
+      return Object.keys(query).reduce((acc, cur) => {
+        if (cur !== 'redirect') {
+          acc[cur] = query[cur];
+        }
+        return acc;
+      }, {});
+    }
+  }
+};
+</script>
+
+<style rel="stylesheet/scss" lang="scss" scoped>
+$bg: #fbfbfb;
+$dark_gray: #889aa4;
+$light_gray: #666;
+$cursor: #666;
+
+.header {
+  background-color: white;
+  position: relative;
+  display: table-cell;
+  display: -webkit-box;
+  -webkit-box-pack: center;
+  -webkit-box-orient: vertical;
+  height: 60px;
+  width: 100%;
+  padding: 10px 30px;
+  border-bottom: 1px solid #f3f3f3;
+
+  .logo {
+    height: 60px;
+  }
+}
+
+/* reset element-ui css */
+.login-container {
+  /deep/ .el-input {
+    display: inline-block;
+    height: 47px;
+    width: 85%;
+    input {
+      background: transparent;
+      border: 0px;
+      -webkit-appearance: none;
+      border-radius: 0px;
+      padding: 12px 5px 12px 15px;
+      color: $light_gray;
+      height: 47px;
+      caret-color: $cursor;
+      &:-webkit-autofill {
+        box-shadow: 0 0 0px 1000px $bg inset !important;
+        -webkit-text-fill-color: $cursor !important;
+      }
+    }
+  }
+  /deep/ .el-form-item {
+    background: rgba(216, 216, 216, 0.05);
+    border: 1px solid #ddd;
+    border-radius: 4px;
+
+    color: #454545;
+    .el-form-item__content {
+      background-color: $bg;
+      border-radius: 4px;
+    }
+  }
+}
+
+.login-container {
+  height: 100%;
+  width: 100%;
+  overflow: hidden;
+  .login-form {
+    position: absolute;
+    left: 50%;
+    top: 50%;
+    transform: translate(-50%, -50%);
+    // right: 0;
+    width: 480px;
+    max-width: 100%;
+    padding: 30px 30px 10px 30px;
+    // margin: 110px auto;
+
+    border: 1px solid #eee;
+    border-radius: 4px;
+    overflow: hidden;
+    .btn-login {
+      width: 100%;
+      margin-bottom: 30px;
+      height: 46px;
+    }
+    .forget-pwd {
+      padding: 0 10px;
+      text-align: right;
+      a {
+        font-family: PingFangSC-Light;
+        font-size: 14px;
+        color: #0099ff;
+        letter-spacing: 0;
+        &:hover {
+          color: #71c6ff;
+        }
+      }
+    }
+  }
+  .tips {
+    font-size: 14px;
+    color: #fff;
+    margin-bottom: 10px;
+    span {
+      &:first-of-type {
+        margin-right: 16px;
+      }
+    }
+  }
+  .svg-container {
+    padding: 6px 5px 6px 15px;
+    color: $dark_gray;
+    vertical-align: middle;
+    width: 30px;
+    display: inline-block;
+  }
+  .title-container {
+    position: relative;
+    .title {
+      font-size: 26px;
+      color: #666;
+      margin: 0px auto 40px auto;
+      text-align: center;
+      font-weight: bold;
+    }
+    .set-language {
+      color: #666;
+      position: absolute;
+      top: 5px;
+      right: 0px;
+    }
+  }
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 7px;
+    font-size: 16px;
+    color: $dark_gray;
+    cursor: pointer;
+    user-select: none;
+  }
+  .thirdparty-button {
+    position: absolute;
+    right: 35px;
+    bottom: 28px;
+  }
+}
+</style>
+
+<style rel="stylesheet/scss" lang="scss">
+html,
+body {
+  background-color: #fff;
+}
+.vux-divider {
+  white-space: nowrap;
+  width: 100%;
+  text-align: center;
+  padding: 10px 0;
+  color: #666;
+  overflow: hidden;
+  position: relative;
+  .text {
+    display: inline-block;
+    padding: 0 10px;
+    position: relative;
+    z-index: 100;
+    background-color: #fff;
+  }
+  &::before {
+    content: ' ';
+    width: 50%;
+    border-top: 1px solid #e4e7ed;
+    height: 1px;
+    display: inline-block;
+    position: absolute;
+    top: 19px;
+    right: 0;
+  }
+  &::after {
+    content: ' ';
+    width: 50%;
+    border-top: 1px solid #e4e7ed;
+    height: 1px;
+    display: inline-block;
+    position: absolute;
+    top: 19px;
+    left: 0;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/outbound/components/outinquer.vue b/qqjf-Web/src/views/outbound/components/outinquer.vue
new file mode 100644
index 0000000..79332b8
--- /dev/null
+++ b/qqjf-Web/src/views/outbound/components/outinquer.vue
@@ -0,0 +1,111 @@
+<template>
+  <div class="flex align-center justify-between">
+    <div class="">
+      <el-button-group>
+        <el-button type="primary" size="mini" icon="el-icon-plus" @click="$emit('addmodal')">鏂板缓</el-button>
+        <el-button v-if="dele" type="primary" size="mini" icon="el-icon-delete">鍒犻櫎</el-button>
+      </el-button-group>
+      <el-button-group class="margin-left">
+        <el-button class="" v-if="tolead" type="primary" size="mini" icon="el-icon-upload2">瀵煎叆</el-button>
+        <el-button v-if="derive" type="primary" size="mini" icon="el-icon-download">瀵煎嚭</el-button>
+      </el-button-group>
+      <el-button
+        class="margin-left"
+        v-if="refresh"
+        :loading="loading"
+        size="mini"
+        icon="el-icon-refresh"
+        @click="$emit('refresh')"
+        >鍒锋柊</el-button
+      >
+    </div>
+    <div id="topinquer" class="flex align-center">
+      <div class="flex align-center margin-right">
+        <el-input size="mini" clearable v-model="iqnuer[filter]" class="input-with-select">
+          <el-select @change="selchange" v-model="filter" slot="prepend">
+            <el-option
+              v-for="(item, index) in filterList"
+              :label="item.label"
+              :value="item.value"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </el-input>
+      </div>
+      <el-button type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      iqnuer: {},
+      applytime: [],
+      visible: false,
+      filter: ''
+    };
+  },
+  props: {
+    advanced: {
+      type: Boolean,
+      default: false
+    },
+    dele: {
+      type: Boolean,
+      default: false
+    },
+    refresh: {
+      type: Boolean,
+      default: true
+    },
+    tolead: {
+      type: Boolean,
+      default: false
+    },
+    derive: {
+      type: Boolean,
+      default: false
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    byfilter: {
+      type: String,
+      default: ''
+    },
+    filterList: {
+      type: Array,
+      default: () => []
+    }
+  },
+  mounted() {
+    this.filter = this.byfilter;
+  },
+  methods: {
+    inquer() {
+      this.$emit('inquer', this.iqnuer);
+    },
+    selchange() {
+      this.iqnuer = {};
+    }
+  },
+  watch: {
+    byfilter: {
+      handler(nvl, ovl) {
+        this.filter = nvl;
+      }
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#topinquer {
+  ::v-deep .el-select {
+    width: 100px;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/outbound/components/plantEdit.vue b/qqjf-Web/src/views/outbound/components/plantEdit.vue
new file mode 100644
index 0000000..fe01062
--- /dev/null
+++ b/qqjf-Web/src/views/outbound/components/plantEdit.vue
@@ -0,0 +1,435 @@
+<template>
+  <div class="plantEdit height overflow">
+    <div class="width overflow height92">
+      <div class="plantEdit-height">
+        <div class="flex justify-between">
+          <div class="width55 flex align-center">
+            <label class="width40 textalign">鍑哄簱璁″垝鍗曞彿锛�</label>
+            <el-input size="mini" disabled v-model="iqnuer.outOrderCode" class="width60"> </el-input>
+          </div>
+          <div class="width40 flex align-center">
+            <label class="width40 textalign">鍑哄簱绫诲瀷锛�</label>
+            <el-select class="width60" filterable size="mini" clearable v-model="iqnuer.orderType" placeholder="璇烽�夋嫨">
+              <el-option v-for="item in orderTypelist" :key="item.value" :label="item.label" :value="item.value">
+              </el-option>
+            </el-select>
+          </div>
+        </div>
+        <div class="flex justify-between margintopbot">
+          <div class="width55 flex align-center">
+            <label class="width40 textalign">鐩爣鐝嚎锛�</label>
+            <el-select
+              class="width60"
+              filterable
+              remote
+              reserve-keyword
+              :remote-method="remoteMethod"
+              :loading="remoloading"
+              size="mini"
+              clearable
+              v-model="iqnuer.productionLineName"
+              placeholder="璇疯緭鍏ュ叧閿瘝"
+            >
+              <el-option
+                v-for="(item, index) in productionLinelist"
+                :key="index + 'produc'"
+                :label="item.productionName"
+                :value="item.productionName"
+              >
+              </el-option>
+            </el-select>
+          </div>
+          <div class="width40 flex align-center">
+            <label class="width40 textalign">鍚堣鏁伴噺锛�</label>
+            <el-input clearable size="mini" disabled v-model="iqnuer.totalOutNum" class="width60"> </el-input>
+          </div>
+        </div>
+        <div class="flex justify-between margintopbot">
+          <div class="width55 flex align-center">
+            <label class="width40 textalign">鍑哄簱鍙o細</label>
+            <el-select class="width60" filterable size="mini" clearable v-model="iqnuer.tranLine" placeholder="璇烽�夋嫨">
+              <el-option
+                v-for="(item, index) in tranLinelist"
+                :key="index + 'produc'"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </div>
+					<div class="width40 flex align-center">
+					  <label class="width40 textalign">鍙夎溅宸ワ細</label>
+					  <el-select class="width60" filterable size="mini" clearable v-model="iqnuer.CarUserId" placeholder="璇烽�夋嫨">
+					    <el-option v-for="item in forkliftWorkers" :key="item.id" :label="item.userName" :value="item.id">
+					    </el-option>
+					  </el-select>
+					</div>
+        </div>
+
+        <el-button-group>
+          <el-button type="primary" size="mini" icon="el-icon-plus" @click="$emit('partclick')">鏂板缓</el-button>
+          <el-button type="primary" size="mini" icon="el-icon-delete" @click="delclick">鍒犻櫎</el-button>
+        </el-button-group>
+      </div>
+      <div class="width plantEdit-tebleheight overflow">
+        <table-container
+          height="85%"
+          :tableHead="tableHead"
+          :tableData="tableData"
+          :operation="true"
+          :editShow="true"
+          :selectionShow="true"
+          :setshow="false"
+          :inputshow="true"
+          :roweditshow="roweditshow"
+          :totle="totle"
+          @handleSelectionChange="handleSelectionChange"
+          @itemchange="itemchange"
+        />
+      </div>
+    </div>
+    <div class="plantEdit-button text-right margin-right15 margin-top2">
+      <el-button type="primary" size="mini" class="form-buttom" :loading="savloading" @click="submitForm"
+        >淇濆瓨</el-button
+      >
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+const { plantEdit } = require('@/components/tableContainer/tableHead');
+
+import { getDate, GetTimeStr } from '@/utils/date';
+import { getCache, setCache, removeToken } from '@/utils/sessionStorage';
+import { itemSearch } from '@/api/enterchoose';
+import { OutOrderAddOrUpdate, OutOrderGetCode } from '@/api/outbound';
+import { ProductionLineSearch } from '@/api/cass-line';
+import { GetForkliftWorkers } from '@/api/outbound';
+
+export default {
+  data() {
+    return {
+      iqnuer: {
+        outOrderCode: '', //璁″垝鍗曞彿
+        orderType: '', //璁″垝绫诲瀷
+        totalOutNum: '', //闆朵欢鎬绘暟
+        doneNum: '', //宸蹭笅绾挎暟 鏂板浼�0锛岀紪杈戯紝鍘熸暟鎹繑鍥�
+        userName: getCache('userInfo').userName, //鍒涘缓浜虹紪鍙� 褰撳墠鐧婚檰浜虹姸鎬�
+        productionLineCode: '', //锛堥鐣欙級浼犵┖
+        doTime: '', //鎵ц鏃堕棿
+        itemName: '', //闆朵欢缂栧彿浼狅紝鍏跺畠闆朵欢淇℃伅鍙笉浼�
+        tranLine: '',
+				CarUserId:'',
+        productionLineName: '' //鏆傛椂浼犵┖
+      },
+      remoloading: false,
+      productionLinelist: [],
+			forkliftWorkers:[],
+      orderTypelist: [
+        {
+          label: '鐒婅鍑哄簱',
+          value: '鐒婅鍑哄簱'
+        },
+        {
+          label: '绌哄櫒鍏峰嚭搴�',
+          value: '绌哄櫒鍏峰嚭搴�'
+        },
+        {
+          label: '璋冧欢鍑哄簱',
+          value: '璋冧欢鍑哄簱'
+        },
+        {
+          label: '杩斾慨鍑哄簱',
+          value: '杩斾慨鍑哄簱'
+        },
+        {
+          label: '鍒嗘嫞鍑哄簱',
+          value: '鍒嗘嫞鍑哄簱'
+        }
+      ],
+      tranLinelist: [
+        {
+          label: '2鍙峰彛',
+          value: '51'
+        },
+        {
+          label: '3鍙峰彛',
+          value: '64'
+        },
+        {
+          label: '4鍙峰彛',
+          value: '67'
+        },
+        {
+          label: '5鍙峰彛',
+          value: '34'
+        },
+        {
+          label: '6鍙峰彛',
+          value: '30'
+        },
+        {
+          label: '7鍙峰彛',
+          value: '19'
+        },
+        {
+          label: '8鍙峰彛',
+          value: '12'
+        }
+      ],
+      Selection: [], //鍕鹃�夋暟鎹�
+      tableData: [],
+      roweditshow: false,
+      savloading: false,
+      totle: 0,
+      page: 1
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: () => {}
+    },
+    chooselist: {
+      type: Array,
+      default: () => []
+    }
+  },
+  components: { TableContainer },
+  computed: {
+    tableHead() {
+      return plantEdit;
+    }
+  },
+  mounted() {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.iqnuer = this.rowitem;
+      console.log(this.rowitem);
+      this.itemSearch(this.rowitem);
+    } else {
+      this.iqnuer.doneNum = 0;
+      this.OutOrderGetCode();
+    }
+    this.ProductionLineSearch({ productionCode: '' });
+		this.getForkliftWorkers()
+  },
+  methods: {
+		getForkliftWorkers(){
+			if (this.forkliftWorkers.length===0) {
+				let params = {roleName:'鍙夎溅姝绘満'};
+				GetForkliftWorkers(params).then((response)=>{
+					if (response.code===0) {
+						this.forkliftWorkers = response.data || []
+					}
+				}).catch(()=>{
+					console.log('err')
+				})
+				
+			}
+		},
+    //鑷姩鐢熸垚鍗曞彿
+    OutOrderGetCode() {
+      OutOrderGetCode().then(res => {
+        this.iqnuer.outOrderCode = res;
+      });
+    },
+    //鐝嚎
+    ProductionLineSearch(query) {
+      const { productionCode } = query;
+      ProductionLineSearch('1&onePageNum=999', { productionCode }).then(res => {
+        if (res.code == 0) {
+          this.productionLinelist = res.data;
+        }
+      });
+    },
+    //缂栬緫鏃惰幏鍙栭浂浠跺垪琛ㄦ暟鎹�
+    itemSearch(e) {
+      const { itemName } = e;
+      console.log(e);
+      itemSearch(this.page, { itemName }).then(res => {
+        if (res.code == 0) {
+          this.storgage(res.data);
+        }
+      });
+    },
+    remoteMethod(query) {
+      if (query !== '') {
+        this.remoloading = true;
+        setTimeout(() => {
+          this.remoloading = false;
+          this.ProductionLineSearch({ productionCode: query });
+        }, 200);
+      } else {
+      }
+    },
+    submitForm() {
+      if (this.iqnuer.itemName) {
+        if (this.roweditshow) {
+          this.$message({
+            type: 'warning',
+            message: '璇峰厛淇濆瓨'
+          });
+        } else {
+          if (this.iqnuer.orderType == '') {
+            this.$message({
+              type: 'warning',
+              message: '璇烽�夋嫨鍑哄簱绫诲瀷'
+            });
+          } else {
+            if (this.iqnuer.tranLine == '') {
+              if (this.iqnuer.orderType == '鐒婅') {
+                this.iqnuer.tranLine = 999;
+              } else {
+                this.iqnuer.tranLine = 997;
+              }
+            }
+            this.tranLinelist.forEach(element => {
+              if (this.iqnuer.tranLine == element.label) {
+                this.iqnuer.tranLine = element.value;
+              }
+            });
+            this.savloading = true;
+            OutOrderAddOrUpdate(this.iqnuer).then(res => {
+              if (res.code == 0) {
+                this.$message({
+                  type: 'success',
+                  message: '娣诲姞鎴愬姛'
+                });
+                this.$emit('cancel');
+              } else {
+                this.$message({
+                  type: 'warning',
+                  message: res.msg
+                });
+              }
+              this.savloading = false;
+            });
+          }
+        }
+      } else {
+        this.$message({
+          type: 'warning',
+          message: '璇锋坊鍔犻浂浠�'
+        });
+      }
+    },
+    //杩囨护瀛樺偍
+    storgage(lists) {
+      let list = [...lists];
+      // list.forEach(element => {
+      //   this.storagelist.push(element);
+      this.storagelist = lists;
+      // });
+      this.filtration();
+    },
+    filtration(lists) {
+      let list = [...this.storagelist];
+      let getWeight = '';
+      console.log(list);
+      if (list.length > 0) {
+        list.forEach(element => {
+          element.edit = false;
+          if (JSON.stringify(this.rowitem) != '{}') {
+            element.doTime = this.rowitem.doTime;
+            element.maxNum = this.rowitem.totalOutNum;
+          } else {
+            element.doTime = getDate() + ' ' + GetTimeStr(0);
+
+            if (element.maxNum) {
+              this.iqnuer.totalOutNum = element.maxNum;
+            } else {
+              this.iqnuer.totalOutNum = 0;
+            }
+          }
+
+          // element.itemNum = element.maxNum;
+        });
+        const { doTime, itemName } = list[0];
+        this.iqnuer.doTime = doTime;
+        this.iqnuer.itemName = itemName;
+        this.tableData = list;
+      }
+    },
+    //鏁伴噺
+    itemchange(e) {
+      const { maxNum, doTime } = e[0];
+      this.roweditshow = !this.roweditshow;
+      this.iqnuer.totalOutNum = maxNum;
+      this.iqnuer.doTime = doTime;
+      // this.storgage(e);
+      // this.iqnuer.itemNum = 0;
+      // e.forEach(element => {
+      //   element.edit = false;
+      //   if (element.weight) {
+      //     weight = element.weight;
+      //   }
+      //   if (element.maxNum) {
+      //     this.iqnuer.itemNum += parseInt(element.maxNum);
+      //   }
+      //   element.itemNum = element.maxNum;
+      // });
+    },
+    //鍕鹃�塼able
+    handleSelectionChange(e) {
+      console.log(e);
+      this.Selection = e;
+    },
+    //鍒犻櫎
+    delclick() {
+      this.Selection.forEach(element => {
+        let index = this.tableData.findIndex(item => item.itemName == element.itemName);
+        let storgindex = this.storagelist.findIndex(item => item.itemName == element.itemName);
+        this.tableData.splice(index, 1);
+        this.storagelist.splice(storgindex, 1);
+      });
+      this.iqnuer.itemName = '';
+      this.iqnuer.totalOutNum = '';
+    }
+  },
+  watch: {
+    chooselist: {
+      handler(nvl, ovl) {
+        this.storgage(nvl);
+      },
+      deep: true
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.plantEdit {
+  width: 98%;
+  padding: 1%;
+  .plantEdit-height {
+    height: 140px;
+  }
+  .plantEdit-tebleheight {
+    height: calc(100% - 125px);
+  }
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .plantEdit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    // width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/outbound/index.vue b/qqjf-Web/src/views/outbound/index.vue
new file mode 100644
index 0000000..1ca3ac4
--- /dev/null
+++ b/qqjf-Web/src/views/outbound/index.vue
@@ -0,0 +1,11 @@
+<template>
+  <keep-alive>
+    <router-view />
+  </keep-alive>
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/outbound/regulator/index.vue b/qqjf-Web/src/views/outbound/regulator/index.vue
new file mode 100644
index 0000000..1cb60c6
--- /dev/null
+++ b/qqjf-Web/src/views/outbound/regulator/index.vue
@@ -0,0 +1,9 @@
+<template>
+  <router-view />
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/outbound/regulator/plant/index.vue b/qqjf-Web/src/views/outbound/regulator/plant/index.vue
new file mode 100644
index 0000000..46426f8
--- /dev/null
+++ b/qqjf-Web/src/views/outbound/regulator/plant/index.vue
@@ -0,0 +1,321 @@
+<template>
+  <!-- 鍑哄簱璁″垝 -->
+  <div id="plant" class="global-content">
+    <!-- 绛涢�� -->
+    <out-inuqer
+      byfilter="璁″垝鍗曞彿"
+      :filterList="filterList"
+      :dele="false"
+      :tolead="false"
+      :derive="false"
+      @refresh="refresh"
+      @addmodal="addmodal"
+      @inquer="inquer"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :naxnumShow="false"
+        :issuShow="true"
+        :totle="totle"
+        :currentPage="page"
+        :pageSize="pageSize"
+        @edit="edit"
+        @del="del"
+        @issu="issu"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+      />
+    </div>
+    <transition name="modal">
+      <modal v-if="addmodalShow" :modabg="true" @cancel="addmodalShow = false">
+        <p slot="title">鍑哄簱璁″垝-{{ title }}</p>
+        <div class="height" slot="centent">
+          <plant-edit
+            @partclick="partShow = true"
+            @cancel="
+              addmodalShow = false;
+              refresh();
+            "
+            :chooselist="chooselist"
+            :rowitem="rowitem"
+            @addsubmit="addsubmit"
+          />
+        </div>
+      </modal>
+    </transition>
+    <transition name="modal">
+      <modal v-if="partShow" :modabg="true" @cancel="partShow = false">
+        <p slot="title">闆朵欢閫夋嫨</p>
+        <div class="height" slot="centent">
+          <choose
+            ref="partChoose"
+            :wipelist="wipelist"
+            :inOrderCodeShow="false"
+            @chooseClick="chooseClick"
+            @cancel="partShow = false"
+            @addchoose="addchooseShow = true"
+          />
+        </div>
+      </modal>
+    </transition>
+    <transition name="modal">
+      <modal v-if="addchooseShow" :modabg="true" @cancel="addchooseShow = false">
+        <p slot="title">闆朵欢鍒楄〃-鏂板</p>
+        <div class="height" slot="centent">
+          <add-choose @addsubmit="addchooseclick" @cancel="addchooseShow = false" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal, Choose, AddChoose } from '@/components/index';
+import outInuqer from '../../components/outinquer';
+import plantEdit from '../../components/plantEdit';
+const { plant } = require('@/components/tableContainer/tableHead');
+import { OutOrderSearch, OutOrderDelete } from '@/api/outbound';
+import { CheckOutOrder, OutOrderAddOrUpdate } from '@/api/outbound';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      partShow: false,
+      addchooseShow: false,
+      chooselist: [],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      wipelist: ['inOrderCode'],
+      inuqerobg: {},
+      filterList: [
+        {
+          label: '璁″垝鍗曞彿',
+          value: '璁″垝鍗曞彿'
+        },
+        {
+          label: '鍑哄簱绫诲瀷',
+          value: '鍑哄簱绫诲瀷'
+        },
+        {
+          label: '璁㈠崟鐘舵��',
+          value: '璁㈠崟鐘舵��'
+        }
+      ],
+      tranLinelist: [
+      {
+          tranLine: 68,
+          title: '1鍙峰彛'
+        },
+        {
+          tranLine: 51,
+          title: '2鍙峰彛'
+        },
+        {
+          tranLine: 64,
+          title: '3鍙峰彛'
+        },
+        {
+          tranLine: 67,
+          title: '4鍙峰彛'
+        },
+        {
+          tranLine: 34,
+          title: '5鍙峰彛'
+        },
+        {
+          tranLine: 30,
+          title: '6鍙峰彛'
+        },
+        {
+          tranLine: 19,
+          title: '7鍙峰彛'
+        },
+        {
+          tranLine: 12,
+          title: '8鍙峰彛'
+        },
+        {
+          tranLine: 999,
+          title: '999'
+        },
+        {
+          tranLine: 997,
+          title: '997'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, outInuqer, Modal, Choose, AddChoose, plantEdit },
+  computed: {
+    tableHead() {
+      return plant;
+    }
+  },
+  mounted() {
+    this.OutOrderSearch();
+  },
+  methods: {
+    //鍒锋柊
+    refresh() {
+      this.OutOrderSearch();
+    },
+    //鏌ヨ
+    inquer(e) {
+      console.log(e);
+      this.page = 1;
+      this.inuqerobg = e;
+      this.OutOrderSearch();
+    },
+    //鑾峰彇鐢熶骇璁″垝鍒楄〃
+    OutOrderSearch() {
+      this.$Loading(true);
+      const { 璁″垝鍗曞彿: outOrderCode, 鍑哄簱绫诲瀷: orderType, 璁㈠崟鐘舵��: orderStatus } = this.inuqerobg;
+      OutOrderSearch(this.page + '&onePageNum=' + this.pageSize, { outOrderCode, orderType, orderStatus }).then(res => {
+        if (res.code == 0) {
+          let data = res.data || [];
+          data.forEach(element => {
+            this.tranLinelist.forEach(item => {
+              if (element.tranLine == item.tranLine) {
+                element.tranLine = item.title;
+              }
+            });
+          });
+          this.tableData = res.data;
+          this.totle = res.num;
+          this.$Loading();
+        }
+      });
+    },
+    CurrentChange(e) {
+      this.page = e;
+      this.OutOrderSearch();
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.OutOrderSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { outOrderCode } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          OutOrderDelete({ outOrderCode }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛'
+              });
+              this.OutOrderSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鍒犻櫎澶辫触'
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //涓嬪彂
+    issu(row) {
+      console.log(row);
+      this.$confirm('涓嬪彂浠诲姟, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          const objs = { ...row };
+          objs.orderStatus = '鎵ц涓�';
+          CheckOutOrder(objs).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '涓嬪彂鎴愬姛'
+              });
+              this.OutOrderSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: res.msg
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.UserSearch();
+    },
+    //闆朵欢鍕鹃�夋暟鎹�
+    chooseClick(e) {
+      if (e.length > 0) {
+        this.chooselist = [...e];
+        this.partShow = false;
+      } else {
+        this.$message({
+          type: 'info',
+          message: '璇峰嬀閫�'
+        });
+      }
+    },
+    //鏂板闆朵欢鍚�
+    addchooseclick() {
+      this.addchooseShow = false;
+      this.$refs.partChoose.itemSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#plant {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/reportforms/Taskbeat/index.vue b/qqjf-Web/src/views/reportforms/Taskbeat/index.vue
new file mode 100644
index 0000000..2507f5b
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/Taskbeat/index.vue
@@ -0,0 +1,74 @@
+<template>
+  <!-- 浠诲姟鑺傛媿 -->
+  <div id="Taskbeat" class="global-content">
+    <div class="width flex align-center justify-end">
+      <label class="color909399 fontsiez1rem">鏌ヨ鏃ユ湡锛�</label>
+      <el-date-picker
+        class="margin-right"
+        size="mini"
+        value-format="yyyy-MM-dd"
+        v-model="pickertime"
+        type="date"
+        placeholder="閫夋嫨鏃ユ湡"
+      >
+      </el-date-picker>
+      <el-button type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      <el-button type="primary" size="mini" @click="linkto">璺宠浆</el-button>
+    </div>
+    <div class="width applyheight overflow margin-top4">
+      <task-echart class="width height" :chartData="chartData" :colorList="colorList" :yTotals="yMax" />
+      <!-- <div class="width height" ref="taskbeatEcharts"></div> -->
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetTaskBeatAnalysis } from '@/api/reportforms';
+import { GetDateStr } from '@/utils/date';
+import TaskEchart from '@/views/Home/components/meterEchart.vue';
+export default {
+  data() {
+    return {
+      pickertime: GetDateStr(-1),
+      chartData: {},
+			yMax:-1,
+      colorList: ['#0090FF', '#36CE9E', '#FFC005', '#FF515A', '#8B5CFF', '#00CA69']
+    };
+  },
+  components: { TaskEchart },
+  computed: {},
+  mounted() {
+    this.GetTaskBeatAnalysis();
+  },
+  methods: {
+    inquer() {
+      this.GetTaskBeatAnalysis();
+    },
+    //璺宠浆
+    linkto() {
+      const { href } = this.$router.resolve({
+        path: '/taskbeat'
+      });
+      window.open(href, '_blank');
+    },
+    GetTaskBeatAnalysis() {
+      GetTaskBeatAnalysis({ startTime: this.pickertime }).then(res => {
+				this.yMax = res.maxNum
+				let stepTotal = 0;
+				res.data[1].xdata = res.data[1].xdata.map((mapObj,mapIndex)=>{
+					stepTotal = stepTotal + Number(mapObj);
+					let rateVal = (this.yMax>0?Number((stepTotal/this.yMax*100).toFixed(2)):0)
+					res.data[0].xdata[mapIndex] = rateVal
+					return mapObj
+				})
+        this.chartData = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#Taskbeat {
+}
+</style>
diff --git a/qqjf-Web/src/views/reportforms/classified/index.vue b/qqjf-Web/src/views/reportforms/classified/index.vue
new file mode 100644
index 0000000..685617b
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/classified/index.vue
@@ -0,0 +1,59 @@
+<template>
+  <!-- 鍒嗙被缁熻 -->
+  <div id="classified" class="global-content">
+    <el-button class="absolute right zindex" type="primary" size="mini" @click="linkto">璺宠浆</el-button>
+    <div class="width height overflow flex">
+      <div class="width50 height overflow">
+        <classified-echart titleechart="闆朵欢鏉ユ簮鍒嗗竷" :chartData="chartData" class="width height" />
+      </div>
+      <div class="width50 height overflow">
+        <classified-echart titleechart="鍣ㄥ叿鏉ユ簮鍒嗗竷" :chartData="applianceData" class="width height" />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetStockClassificationData } from '@/api/reportforms';
+import classifiedEchart from '@/views/Home/components/sourceEchart.vue';
+export default {
+  data() {
+    return {
+      chartData: {},
+      applianceData: {}
+    };
+  },
+  components: { classifiedEchart },
+  computed: {},
+  mounted() {
+    this.GetStockClassificationData();
+    this.applianceDataficationData();
+  },
+  methods: {
+    //璺宠浆
+    linkto() {
+      const { href } = this.$router.resolve({
+        path: '/classified'
+      });
+      window.open(href, '_blank');
+    },
+    //闆朵欢鏉ユ簮
+    GetStockClassificationData() {
+      GetStockClassificationData({ type: 1 }).then(res => {
+        this.chartData = res;
+      });
+    },
+    //鍣ㄥ叿鏉ユ簮
+    applianceDataficationData() {
+      GetStockClassificationData({ type: 2 }).then(res => {
+        this.applianceData = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#classified {
+}
+</style>
diff --git a/qqjf-Web/src/views/reportforms/index.vue b/qqjf-Web/src/views/reportforms/index.vue
new file mode 100644
index 0000000..1ca3ac4
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/index.vue
@@ -0,0 +1,11 @@
+<template>
+  <keep-alive>
+    <router-view />
+  </keep-alive>
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/reportforms/movablerate/index.vue b/qqjf-Web/src/views/reportforms/movablerate/index.vue
new file mode 100644
index 0000000..b8815f8
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/movablerate/index.vue
@@ -0,0 +1,132 @@
+<template>
+  <!-- 璁惧鍙姩鐜� -->
+  <div id="movablerate" class="global-content">
+    <div class="width flex align-center justify-end">
+      <label class="color909399 fontsiez1rem">鏌ヨ鏃ユ湡锛�</label>
+      <el-date-picker
+        class="margin-right"
+        v-model="pickertime"
+        size="mini"
+        type="daterange"
+        value-format="yyyy-MM-dd"
+        range-separator="鑷�"
+        start-placeholder="寮�濮嬫棩鏈�"
+        end-placeholder="缁撴潫鏃ユ湡"
+      >
+      </el-date-picker>
+      <el-button type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      <el-button type="primary" size="mini" @click="linkto">璺宠浆</el-button>
+    </div>
+    <div class="heightclacimport overflowy-auto">
+      <div class="width height48 overflow margin-top10px">
+        <movablerate-echart class="width height" echarttitle="鍫嗗灈鏈�" :chartData="chartData" :colorList="colorList" />
+      </div>
+      <div class="width height48 overflow margin-top10px">
+        <movablerate-echart class="width height" echarttitle="RGV" :chartData="rgvdata" :colorList="colorList" />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetDevMovable } from '@/api/reportforms';
+import { GetDateStr } from '@/utils/date';
+import MovablerateEchart from '@/views/Home/components/movablerateechart.vue';
+export default {
+  data() {
+    return {
+      pickertime: [GetDateStr(-15), GetDateStr(0)],
+      chartData: {},
+      rgvdata: {},
+      colorList: [
+        '#0090FF',
+        '#36CE9E',
+        '#FFC005',
+        '#FF515A',
+        '#8B5CFF',
+        '#00CA69',
+        '#F3A43B',
+        '#D7504B',
+        '#C6E579',
+        '#F0805A',
+        '#26C0C0',
+        '#660077',
+        '#FFCCCC',
+        '#550088',
+        '#FFFFBB',
+        '#99FFFF',
+        '#CC00CC',
+        '#CC00CC',
+        '#C63300',
+        '#9955FF',
+        '#66FF66',
+        '#B5C334',
+        '#FCCE10',
+        '#27727B',
+        '#FE8463',
+        '#FAD860',
+        '#F3A43B',
+        '#D7504B',
+        '#C6E579',
+        '#F0805A',
+        '#26C0C0',
+        '#660077',
+        '#FFCCCC',
+        '#550088',
+        '#FFAA33',
+        '#CC00CC',
+        '#FF77FF',
+        '#C63300',
+        '#F4E001',
+        '#66FF66'
+      ]
+    };
+  },
+  components: { MovablerateEchart },
+  computed: {},
+  mounted() {
+    this.GetDevMovable();
+    this.GetRGVDevMovable();
+  },
+  methods: {
+    inquer() {
+      this.GetDevMovable();
+      this.GetRGVDevMovable();
+    },
+    //璺宠浆
+    linkto() {
+      const { href } = this.$router.resolve({
+        path: '/movablerate'
+      });
+      window.open(href, '_blank');
+    },
+    //鍫嗗灈鏈�
+    GetDevMovable() {
+      let objtimes = {
+        startTime: this.pickertime ? this.pickertime[0] : '',
+        endTime: this.pickertime ? this.pickertime[1] : '',
+        type: 1
+      };
+      GetDevMovable(objtimes).then(res => {
+        this.chartData = res;
+      });
+    },
+    //RGV
+    GetRGVDevMovable() {
+      let objtimes = {
+        startTime: this.pickertime ? this.pickertime[0] : '',
+        endTime: this.pickertime ? this.pickertime[1] : '',
+        type: 2
+      };
+      GetDevMovable(objtimes).then(res => {
+        this.rgvdata = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#movablerate {
+}
+</style>
diff --git a/qqjf-Web/src/views/reportforms/output/index.vue b/qqjf-Web/src/views/reportforms/output/index.vue
new file mode 100644
index 0000000..04bdbeb
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/output/index.vue
@@ -0,0 +1,160 @@
+<template>
+  <!-- 浠诲姟骞冲潎鏃堕暱-->
+  <div id="tasktime" class="global-content">
+    <div class="width flex align-center justify-end">
+      <label class="color909399 fontsiez1rem">鏌ヨ鏃ユ湡锛�</label>
+
+      <el-date-picker
+        size="mini"
+        v-model="datatime"
+        type="date"
+        :clearable="false"
+        value-format="yyyy-MM-dd"
+        placeholder="閫夋嫨鏃ユ湡"
+      >
+      </el-date-picker>
+      <el-button type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      <el-button type="primary" size="mini" @click="linkto">璺宠浆</el-button>
+    </div>
+    <div class="width height-calc90 overflow margin-top4">
+      <line-echarts
+        titleechart="鍑哄叆搴撲换鍔�"
+        :linelist="BarItemlinelist"
+        :colorList="barcolorList"
+        class="width height"
+        colors="#fff"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetInOutCountByHour } from '@/api/output';
+import { getDate } from '@/utils/date';
+import lineEcharts from '@/views/dataview/components/lineEcharts.vue';
+export default {
+  data() {
+    return {
+      datatime: getDate(),
+      BarItemlinelist: {}, //鏁伴噺
+      concolorList: ['#31c3ea', '#17d8b9', '#2599f0', '#e8bdf3', '#ffc637', '#fc7293', '#8477e9']
+    };
+  },
+  components: { lineEcharts },
+  computed: {},
+  mounted() {
+    this.GetInOutCountByHour();
+  },
+  methods: {
+    inquer() {
+      this.GetInOutCountByHour();
+    },
+    //璺宠浆
+    linkto() {
+      const { href } = this.$router.resolve({
+        path: '/output'
+      });
+      window.open(href, '_blank');
+    },
+    GetInOutCountByHour() {
+      let time = {
+        startTime: this.datatime + ' 00:00:00',
+        endTime: this.datatime + ' 23:59:59'
+      };
+      this.BarItemlinelist = {
+        legend: ['鍏ュ簱', '鍑哄簱', '鎬昏'],
+        xdata: [
+          '2021-06-14聽00:00:00',
+          '2021-06-14聽01:00:00',
+          '2021-06-14聽02:00:00',
+          '2021-06-14聽03:00:00',
+          '2021-06-14聽04:00:00',
+          '2021-06-14聽05:00:00',
+          '2021-06-14聽06:00:00',
+          '2021-06-14聽07:00:00',
+          '2021-06-14聽08:00:00',
+          '2021-06-14聽09:00:00',
+          '2021-06-14聽10:00:00',
+          '2021-06-14聽11:00:00',
+          '2021-06-14聽12:00:00',
+          '2021-06-14聽13:00:00',
+          '2021-06-14聽14:00:00',
+          '2021-06-14聽15:00:00',
+          '2021-06-14聽16:00:00',
+          '2021-06-14聽17:00:00',
+          '2021-06-14聽18:00:00',
+          '2021-06-14聽19:00:00',
+          '2021-06-14聽20:00:00',
+          '2021-06-14聽21:00:00',
+          '2021-06-14聽22:00:00',
+          '2021-06-14聽23:00:00'
+        ],
+        data: [
+          {
+            name: '鍏ュ簱',
+            xdata: [
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '29',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00'
+            ]
+          },
+          {
+            name: '鍑哄簱',
+            xdata: [
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '79',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00',
+              '0.00'
+            ]
+          }
+        ]
+      };
+      GetInOutCountByHour(time).then(res => {
+        // this.BarItemlinelist = res.data;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#tasktime {
+}
+</style>
diff --git a/qqjf-Web/src/views/reportforms/product/index.vue b/qqjf-Web/src/views/reportforms/product/index.vue
new file mode 100644
index 0000000..794c305
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/product/index.vue
@@ -0,0 +1,75 @@
+<template>
+  <!-- 鍦ㄥ埗鍝佽祫閲戝垎鏋� -->
+  <div id="product" class="global-content">
+    <div class="width flex align-center justify-end">
+      <label class="color909399 fontsiez1rem">鏌ヨ鏃ユ湡锛�</label>
+      <el-date-picker
+        class="margin-right"
+        v-model="pickertime"
+        size="mini"
+        type="daterange"
+        value-format="yyyy-MM-dd"
+        range-separator="鑷�"
+        start-placeholder="寮�濮嬫棩鏈�"
+        end-placeholder="缁撴潫鏃ユ湡"
+      >
+      </el-date-picker>
+      <el-button type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      <el-button type="primary" size="mini" @click="linkto">璺宠浆</el-button>
+    </div>
+    <div class="width applyheight overflow margin-top4">
+      <product-echart class="width height" :chartData="chartData" :colorList="colorList" />
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetStorageCapitalAnalysis } from '@/api/reportforms';
+import { GetDateStr } from '@/utils/date';
+import resize from '@/mixins/resize';
+import ProductEchart from '@/views/Home/components/product.vue';
+const echarts = require('echarts');
+export default {
+  data() {
+    return {
+      pickertime: [GetDateStr(-15), GetDateStr(0)],
+      chartData: {},
+      rgvdata: {},
+      colorList: ['#9effff', '#9E87FF', '#73DD39', '#73DDFF', '#fe9a', '#fe9a8b', '#F3A43B']
+    };
+  },
+  mixins: [resize],
+  components: { ProductEchart },
+  computed: {},
+  mounted() {
+    this.GetStorageCapitalAnalysis();
+  },
+  methods: {
+    inquer() {
+      this.GetStorageCapitalAnalysis();
+    },
+    //璺宠浆
+    linkto() {
+      const { href } = this.$router.resolve({
+        path: '/product'
+      });
+      window.open(href, '_blank');
+    },
+    //鍫嗗灈鏈�
+    GetStorageCapitalAnalysis() {
+      let objtimes = {
+        startTime: this.pickertime ? this.pickertime[0] : '',
+        endTime: this.pickertime ? this.pickertime[1] : ''
+      };
+      GetStorageCapitalAnalysis(objtimes).then(res => {
+        this.chartData = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#product {
+}
+</style>
diff --git a/qqjf-Web/src/views/reportforms/rateequipment/index.vue b/qqjf-Web/src/views/reportforms/rateequipment/index.vue
new file mode 100644
index 0000000..0306511
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/rateequipment/index.vue
@@ -0,0 +1,135 @@
+<template>
+  <!-- 璁惧鍒╃敤鐜� -->
+  <div id="rateequipment" class="global-content">
+    <div class="width flex align-center justify-end">
+      <label class="color909399 fontsiez1rem">鏌ヨ鏃ユ湡锛�</label>
+      <el-date-picker
+        class="margin-right"
+        v-model="pickertime"
+        size="mini"
+        type="daterange"
+        value-format="yyyy-MM-dd"
+        range-separator="鑷�"
+        start-placeholder="寮�濮嬫棩鏈�"
+        end-placeholder="缁撴潫鏃ユ湡"
+      >
+      </el-date-picker>
+      <el-button type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      <el-button type="primary" size="mini" @click="linkto">璺宠浆</el-button>
+    </div>
+    <div class="heightclacimport overflowy-auto">
+      <div class="width height48 overflow margin-top10px">
+        <rateequipment-echart class="width height" echarttitle="鍫嗗灈鏈�" :chartData="chartData" :colorList="colorList" />
+      </div>
+      <div class="width height48 overflow margin-top10px">
+        <rateequipment-echart class="width height" echarttitle="RGV" :chartData="rgvdata" :colorList="colorList" />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetDevAvailability } from '@/api/reportforms';
+import { GetDateStr } from '@/utils/date';
+import resize from '@/mixins/resize';
+import RateequipmentEchart from '@/views/Home/components/rateequipment.vue';
+const echarts = require('echarts');
+export default {
+  data() {
+    return {
+      pickertime: [GetDateStr(-15), GetDateStr(0)],
+      chartData: {},
+      rgvdata: {},
+      colorList: [
+        '#0090FF',
+        '#36CE9E',
+        '#FFC005',
+        '#FF515A',
+        '#8B5CFF',
+        '#00CA69',
+        '#F3A43B',
+        '#D7504B',
+        '#C6E579',
+        '#F0805A',
+        '#26C0C0',
+        '#660077',
+        '#FFCCCC',
+        '#550088',
+        '#FFFFBB',
+        '#99FFFF',
+        '#CC00CC',
+        '#CC00CC',
+        '#C63300',
+        '#9955FF',
+        '#66FF66',
+        '#B5C334',
+        '#FCCE10',
+        '#27727B',
+        '#FE8463',
+        '#FAD860',
+        '#F3A43B',
+        '#D7504B',
+        '#C6E579',
+        '#F0805A',
+        '#26C0C0',
+        '#660077',
+        '#FFCCCC',
+        '#550088',
+        '#FFAA33',
+        '#CC00CC',
+        '#FF77FF',
+        '#C63300',
+        '#F4E001',
+        '#66FF66'
+      ]
+    };
+  },
+  mixins: [resize],
+  components: { RateequipmentEchart },
+  computed: {},
+  mounted() {
+    this.GetDevAvailability();
+    this.GetRGVDevMovable();
+  },
+  methods: {
+    inquer() {
+      this.GetDevAvailability();
+      this.GetRGVDevMovable();
+    },
+    //璺宠浆
+    linkto() {
+      const { href } = this.$router.resolve({
+        path: '/rateequipment'
+      });
+      window.open(href, '_blank');
+    },
+    //鍫嗗灈鏈�
+    GetDevAvailability() {
+      let objtimes = {
+        startTime: this.pickertime ? this.pickertime[0] : '',
+        endTime: this.pickertime ? this.pickertime[1] : '',
+        type: 1
+      };
+      GetDevAvailability(objtimes).then(res => {
+        this.chartData = res;
+      });
+    },
+    //RGV
+    GetRGVDevMovable() {
+      let objtimes = {
+        startTime: this.pickertime ? this.pickertime[0] : '',
+        endTime: this.pickertime ? this.pickertime[1] : '',
+        type: 2
+      };
+      GetDevAvailability(objtimes).then(res => {
+        this.rgvdata = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#rateequipment {
+}
+</style>
diff --git a/qqjf-Web/src/views/reportforms/statelibrary/index.vue b/qqjf-Web/src/views/reportforms/statelibrary/index.vue
new file mode 100644
index 0000000..f394ec0
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/statelibrary/index.vue
@@ -0,0 +1,106 @@
+<template>
+  <!-- 绔嬪簱鎬昏 -->
+  <div id="statelibrary" class="global-content">
+    <el-button statelibrary="absolute right zindex" type="primary" size="mini" @click="linkto">璺宠浆</el-button>
+    <h3 class="text-center color636972" style="font-size: 40px">绔嬪簱鎬昏</h3>
+    <div class="width96 padding10 borderradius margintopbot flex flex-wrap justify-between align-center">
+      <div
+        class="didproject-title width45 flex justify-around align-center borderdashed borderradius overflow pointer"
+        v-for="(item, index) in titlelist"
+        :key="index"
+        :style="'margin-top:' + item.margin"
+      >
+        <div class="heigth padding10 overflow">
+          <p class="text-center fontsize2rem fontweight600 color409EFF margin-top15" style="font-size: 40px">
+            <countTo :startVal="startVal" :endVal="item.mun" :duration="3000"></countTo>
+          </p>
+          <p class="fontsiez1rem" style="font-size: 40px">{{ item.titel }}</p>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import countTo from 'vue-count-to';
+import { GetStorageOverviewData } from '@/api/Didproject';
+export default {
+  data() {
+    return {
+      startVal: 0,
+      titlelist: [
+        {
+          titel: '搴撲綅鎬绘暟',
+          mun: 0,
+          color: '#40C9C6'
+        },
+        {
+          titel: '鏈夎揣搴撲綅',
+          mun: 0,
+          color: '#F4516C'
+        },
+        {
+          titel: '甯︿欢鍣ㄥ叿',
+          mun: 0,
+          color: '#36A3F7',
+          margin: '1%'
+        },
+        {
+          titel: '绌哄櫒鍏锋暟',
+          mun: 0,
+          color: '#34BFA3',
+          margin: '1%'
+        }
+        // {
+        //   titel: '鍒朵欢鎬绘暟',
+        //   mun: 1,
+        //   color: '#ffc637'
+        // }
+      ],
+      cleartime: null
+    };
+  },
+  components: { countTo },
+  computed: {},
+  mounted() {
+    this.GetStorageOverviewData();
+    this.cleartime = setInterval(() => {
+      this.GetStorageOverviewData();
+    }, 60000);
+  },
+  methods: {
+    //璺宠浆
+    linkto() {
+      const { href } = this.$router.resolve({
+        path: '/statelibrary'
+      });
+      window.open(href, '_blank');
+    },
+    //绔嬪簱鎬昏鍜屽埗浠舵�昏
+    GetStorageOverviewData() {
+      // no 缂栧彿锛泃itle 鏍囬锛泇alue 鏁伴噺
+      GetStorageOverviewData().then(res => {
+        let data = res.data || [];
+        this.titlelist.forEach(item => {
+          data.forEach(element => {
+            if (item.titel == element.titel) {
+              item.mun = element.value;
+            }
+          });
+        });
+      });
+    }
+  },
+  beforeDestroy() {
+    if (this.cleartime) {
+      clearInterval(this.cleartime);
+      this.cleartime = null;
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#statelibrary {
+}
+</style>
diff --git a/qqjf-Web/src/views/reportforms/statistics/components/eltablecolumn.vue b/qqjf-Web/src/views/reportforms/statistics/components/eltablecolumn.vue
new file mode 100644
index 0000000..90c354a
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/statistics/components/eltablecolumn.vue
@@ -0,0 +1,30 @@
+<template>
+  <div class="eltablecolumn">
+    <template v-if="!itemcolumn.children">
+      <el-table-column
+        align="center"
+        :prop="itemcolumn.columnName"
+        :label="itemcolumn.columnDescription"
+        :width="itemcolumn.width ? itemcolumn.width : ''"
+      >
+      </el-table-column>
+    </template>
+    <el-table-column
+      v-else
+      align="center"
+      :label="itemcolumn.columnDescription"
+      :width="itemcolumn.width ? itemcolumn.width : ''"
+    >
+      <eltablecolumn v-for="(item, index) in itemcolumn.children" :itemcolumn="item" :key="index" />
+    </el-table-column>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'eltablecolumn',
+  props: ['itemcolumn']
+};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/reportforms/statistics/components/statisticsinquer.vue b/qqjf-Web/src/views/reportforms/statistics/components/statisticsinquer.vue
new file mode 100644
index 0000000..14efb7c
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/statistics/components/statisticsinquer.vue
@@ -0,0 +1,273 @@
+<template>
+  <div ref="serchinquer" class="flex align-center padding10 justify-between">
+    <div v-if="buttonShow" class="width25" :style="buttonWidth ? 'width:' + buttonWidth + '%' : ''">
+      <el-button-group>
+        <template v-for="(item, index) in elbuttonlist">
+          <el-button :key="index" type="primary" size="mini" icon="el-icon-plus" @click="$emit(item.value)">{{
+            item.label
+          }}</el-button>
+        </template>
+      </el-button-group>
+      <el-button-group class="margin-left">
+        <div class="flex">
+          <el-upload
+            class="upload-demo"
+            ref="upload"
+            action=""
+            accept=".xls,.xlsx"
+            name="files"
+            :show-file-list="false"
+            :http-request="httprequest"
+          >
+            <el-button v-if="imexcel" style="margin-left: 10px" icon="el-icon-upload2" size="mini" type="success"
+              >瀵煎叆</el-button
+            >
+          </el-upload>
+
+          <el-button
+            v-if="derive"
+            style="margin-left: 10px"
+            type="primary"
+            size="mini"
+            icon="el-icon-download"
+            @click="$emit('derive')"
+            >瀵煎嚭</el-button
+          >
+          <el-button
+            v-if="templateShow"
+            style="margin-left: 10px"
+            type="primary"
+            size="mini"
+            icon="el-icon-download"
+            @click="$emit('download')"
+            >涓嬭浇妯℃澘</el-button
+          >
+        </div>
+      </el-button-group>
+    </div>
+    <div
+      id="topinquer"
+      v-if="inquerShow"
+      class="width80 flex align-start"
+      :style="inquerWdith ? 'width:' + inquerWdith + '%' : ''"
+    >
+      <div class="width96 flex margin-right" :class="flexwrap ? 'justify-start flex-wrap' : 'justify-end'">
+        <template v-for="(item, index) in inuqerlist">
+          <div
+            :key="index + 'input'"
+            class="width25 flex align-center"
+            :class="item.class"
+            :style="item.boxWdith ? 'width:' + item.boxWdith + '%' : ''"
+          >
+            <label class="textalign margin-right5px" :style="item.label ? 'width:' + fixWidth(item.label) + 'px' : ''">
+              {{ item.label ? item.label + ':' : '' }}</label
+            >
+
+            <el-date-picker
+              v-if="item.type == 'pickerOptions'"
+              :style="'width:calc(100% - ' + fixWidth(item.label) + 'px)'"
+              v-model="containinquer[item.prop]"
+              size="mini"
+              type="datetimerange"
+              :clearable="item.clearable"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              range-separator="鑷�"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+            >
+            </el-date-picker>
+            <el-date-picker
+              v-if="item.type == 'date'"
+              :style="'width:calc(100% - ' + fixWidth(item.label) + 'px)'"
+              v-model="containinquer[item.prop]"
+              type="date"
+              size="mini"
+              :clearable="item.clearable"
+              value-format="yyyy-MM-dd"
+              placeholder="閫夋嫨鏃ユ湡"
+            >
+            </el-date-picker>
+            <el-input
+              v-if="item.type == 'text'"
+              :style="item.label ? 'width:calc(100% - ' + fixWidth(item.label) + 'px)' : ''"
+              size="mini"
+              :placeholder="item.placeholder ? item.placeholder : '璇疯緭鍏�' + item.label"
+              @keyup.enter.native="focussearch"
+              v-model="containinquer[item.prop]"
+              :clearable="item.clearable"
+            ></el-input>
+            <el-select
+              v-if="item.type == 'select'"
+              :style="'width:calc(100% - ' + fixWidth(item.label) + 'px)'"
+              v-model="containinquer[item.prop]"
+              size="mini"
+              :clearable="item.clearable"
+              :multiple="item.multiple"
+              :filterable="item.filterable"
+              :collapse-tags="item.collapseTags"
+              :placeholder="'璇烽�夋嫨' + item.label"
+              @change="$emit('selectchange', containinquer[item.prop])"
+            >
+              <el-option
+                v-for="(selectItem, selectIndex) in item.list"
+                :key="selectIndex + 'selet'"
+                :label="selectItem.label"
+                :value="selectItem.value"
+              >
+              </el-option>
+            </el-select>
+          </div>
+        </template>
+      </div>
+
+      <div class="flex">
+        <el-button v-if="inquerbuttonshow" type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { throttle } from '@/utils/throttle';
+import { GetDateStr } from '@/utils/date';
+export default {
+  data() {
+    return {
+      iqnuer: {
+        startend: [GetDateStr(-15), GetDateStr(0)]
+      },
+      materia_name: '',
+      agvtypecodelist: []
+    };
+  },
+  props: {
+    addshow: {
+      type: Boolean,
+      default: false
+    },
+    delshow: {
+      type: Boolean,
+      default: false
+    },
+    templateShow: {
+      type: Boolean,
+      default: false
+    },
+    flexwrap: {
+      type: Boolean,
+      default: false
+    },
+    inquerShow: {
+      type: Boolean,
+      default: true
+    },
+    inquerbuttonshow: {
+      type: Boolean,
+      default: true
+    },
+    imexcel: {
+      type: Boolean,
+      default: false
+    },
+    derive: {
+      type: Boolean,
+      default: false
+    },
+    inuqerlist: {
+      type: Array,
+      default: () => []
+    },
+    elbuttonlist: {
+      type: Array,
+      default: () => []
+    },
+    containinquer: {
+      type: Object,
+      require: true
+    },
+    inquerWdith: {
+      type: String,
+      require: true
+    },
+    buttonWidth: {
+      type: String,
+      require: true
+    },
+
+    boxWdith: {
+      type: String,
+      require: true
+    },
+    buttonShow: {
+      type: Boolean,
+      default: false
+    }
+  },
+  mounted() {},
+  methods: {
+    fixWidth(val) {
+      let length = 0;
+      if (val.indexOf('(') != -1) {
+        length = val.length * 16 + 10;
+      } else {
+        length = val.length * 20;
+      }
+      if (length < 100) {
+        length = 80;
+      }
+      return length;
+    },
+    focussearch: throttle(function () {
+      this.emits();
+    }, 3000),
+
+    inquer: throttle(function () {
+      this.emits();
+    }, 1500),
+
+    emits() {
+      this.$emit('inquer');
+    },
+
+    reset() {
+      // this.containinquer = {};
+      // this.inquer();
+    },
+    //瀵煎叆
+    httprequest(file) {
+      this.$emit('importfile', file);
+    },
+    //鐗╂枡绛涢��
+    formquerySearchAsync(queryString, cb) {
+      let index = queryString.split('');
+      if (queryString && index.length > 1) {
+        let keywords = JSON.stringify({ keywords: queryString });
+      }
+    },
+    elautocom(el) {
+      this.iqnuer.material_code = el.label;
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+#topinquer {
+  ::v-deep .el-select {
+    width: 90%;
+  }
+  ::v-deep .el-select > .el-input {
+    width: 100%;
+  }
+  ::v-deep .el-input {
+    width: 100%;
+  }
+  ::v-deep .el-date-editor--daterange.el-input,
+  .el-date-editor--daterange.el-input__inner,
+  .el-date-editor--timerange.el-input,
+  .el-date-editor--timerange.el-input__inner {
+    width: 70%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/reportforms/statistics/components/statisticstable.vue b/qqjf-Web/src/views/reportforms/statistics/components/statisticstable.vue
new file mode 100644
index 0000000..73c66d4
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/statistics/components/statisticstable.vue
@@ -0,0 +1,121 @@
+<template>
+  <div id="statisticstable" class="scrollCss" :key="number">
+    <el-table
+      :data="tableData"
+      class="borderR8"
+      element-loading-text="鎷煎懡鍔犺浇涓�"
+      element-loading-spinner="el-icon-loading"
+      highlight-current-row
+      stripe
+      height="100%"
+      style="height: 100% !important"
+      :header-cell-style="headercellstyle"
+    >
+      <eltablecolumn v-for="(item, index) in containHead" :itemcolumn="item" :key="index" />
+    </el-table>
+  </div>
+</template>
+
+<script>
+import eltablecolumn from './eltablecolumn.vue';
+export default {
+  data() {
+    return {
+      number: Math.random() * 100
+    };
+  },
+  props: {
+    containHead: {
+      type: Array,
+      default: () => []
+    },
+    tableData: {
+      type: Array,
+      default: () => []
+    }
+  },
+  components: { eltablecolumn },
+  methods: {
+    headercellstyle({ row, column, rowIndex, columnIndex }) {
+      // if (rowIndex == 0 && columnIndex == 1) {
+      //   return 'color:red';
+      // }
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+#statisticstable {
+  position: relative;
+  z-index: 6;
+  height: 100%;
+  .widthscope {
+    width: 200px;
+  }
+  .elbuttonsize {
+    font-size: 0.8rem;
+  }
+  .set {
+    color: #0465a8;
+    cursor: pointer;
+    display: inline-block;
+    margin-left: 20px;
+  }
+  .modal-title {
+    background-color: #f0f9eb;
+    color: #67c23a;
+    font-size: 14px;
+    padding: 4px 10px;
+    border-radius: 4px;
+  }
+  .modal-item {
+    border: 1px solid #f8f8f8;
+    padding: 4px 10px;
+    background-color: #f3f3f3;
+    font-size: 14px;
+  }
+  .draggable-main {
+    margin: 0;
+    padding: 0;
+    cursor: pointer;
+    .drag {
+      border: 1px dotted rgb(44, 104, 163);
+      background-color: #409eff;
+    }
+
+    .chosen {
+      background-color: #409eff;
+      color: #fff;
+    }
+
+    .ghost {
+      background-color: #409eff;
+    }
+  }
+  ::v-deep {
+    .el-table__fixed-right {
+      right: 1px !important;
+    }
+    .el-table--border td {
+      // border-right: none !important;
+    }
+  }
+  ::v-deep .el-table {
+    // height: calc(100% - 35px) !important;
+  }
+
+  ::v-deep .el-button + .el-button {
+    margin-left: 5px;
+  }
+  ::v-deep .el-table__empty-text {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+  }
+  ::v-deep .el-table td,
+  .el-table th {
+    padding: 4px 0;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/reportforms/statistics/index.vue b/qqjf-Web/src/views/reportforms/statistics/index.vue
new file mode 100644
index 0000000..0d4df2a
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/statistics/index.vue
@@ -0,0 +1,167 @@
+<template>
+  <!-- 鍑哄叆搴撶粺璁� -->
+  <div id="statistics" class="global-content">
+    <!-- 绛涢�� -->
+    <statistics-inquer
+      ref="searchinquer"
+      :inquerbuttonshow="true"
+      inquerWdith="100"
+      :inuqerlist="inuqerlist"
+      :containinquer.sync="containinquer"
+      @inquer="inquer"
+    />
+    <!-- table width height-calc padding-right padding-left overflow-->
+    <div class="width height-calc55 overflow">
+      <statistics-table :containHead="containHead" :tableData="tableData" />
+    </div>
+  </div>
+</template>
+
+<script>
+import StatisticsInquer from './components/statisticsinquer.vue';
+import StatisticsTable from './components/statisticstable.vue';
+import { GetDateStr } from '@/utils/date';
+import { statistics } from '@/components/tableContainer/tableHead';
+import { GetEnterNum } from '@/api/statistics';
+import itemVue from '@/Layout/components/Sidebar/item.vue';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      containinquer: {
+        hasFinished: 1,
+        startend: GetDateStr(0)
+      },
+      inuqerlist: [
+        {
+          label: '鏃ユ湡',
+          type: 'date',
+          prop: 'startend',
+          class: 'margin-top5px',
+          clearable: false,
+          boxWdith: 20
+        }
+      ],
+      comparison: [
+        {
+          value: 47,
+          table: 'in_one_mark'
+        },
+        {
+          value: 48,
+          table: 'in_two_mark'
+        },
+        {
+          value: 61,
+          table: 'in_three_mark'
+        },
+        {
+          value: 65,
+          table: 'in_four_mark'
+        },
+        {
+          value: 32,
+          table: 'in_five_mark'
+        },
+
+        {
+          value: 15,
+          table: 'in_seven_mark'
+        },
+
+        {
+          value: 68,
+          table: 'out_one_mark'
+        },
+        {
+          value: 51,
+          table: 'out_two_mark'
+        },
+        {
+          value: 64,
+          table: 'out_three_mark'
+        },
+        {
+          value: 67,
+          table: 'out_four_mark'
+        },
+        {
+          value: 34,
+          table: 'out_five_mark'
+        },
+        {
+          value: 30,
+          table: 'out_six_mark'
+        },
+        {
+          value: 19,
+          table: 'out_seven_mark'
+        },
+        {
+          value: 12,
+          table: 'out_eight_mark'
+        }
+      ]
+    };
+  },
+  components: { StatisticsInquer, StatisticsTable },
+  computed: {
+    containHead() {
+      return statistics;
+    }
+  },
+  mounted() {
+    this.GetEnterNum();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.page = 1;
+      this.GetEnterNum();
+    },
+    GetEnterNum() {
+      const { hasFinished, startend } = this.containinquer;
+      this.tableData = [];
+      this.$Loading(true);
+      GetEnterNum({ hasFinished, createTimeStart: startend + ' 00:00:00', createTimeEnd: startend + ' 23:59:59' }).then(
+        res => {
+          res.forEach((element, index) => {
+            let outEnterVsNumList = element.data.outEnterVsNumList;
+            let inEnterVsNumList = element.data.inEnterVsNumList;
+            let arr = outEnterVsNumList.concat(inEnterVsNumList);
+            this.tableData.push({
+              time: element.time,
+              allNum: element.data.allNum,
+              outExchange: element.data.outExchange,
+              inExchange: element.data.inExchange,
+              outNum: element.data.outNum,
+              inNum: element.data.inNum
+            });
+            arr.forEach(item => {
+              this.comparison.forEach(vl => {
+                if (vl.value == item.enter) {
+                  item[vl.table] = item.num;
+                  this.tableData[index][vl.table] = item.num;
+                }
+              });
+            });
+          });
+          this.$Loading();
+        }
+      );
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#statistics {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/reportforms/tasktime/index.vue b/qqjf-Web/src/views/reportforms/tasktime/index.vue
new file mode 100644
index 0000000..e739aeb
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/tasktime/index.vue
@@ -0,0 +1,111 @@
+<template>
+  <!-- 浠诲姟骞冲潎鏃堕暱-->
+  <div id="tasktime" class="global-content">
+    <div class="width flex align-center justify-end">
+      <label class="color909399 fontsiez1rem">鏌ヨ鏃ユ湡锛�</label>
+
+      <el-date-picker
+        class="margin-right"
+        v-model="pickertime"
+        size="mini"
+        type="daterange"
+        value-format="yyyy-MM-dd"
+        range-separator="鑷�"
+        start-placeholder="寮�濮嬫棩鏈�"
+        end-placeholder="缁撴潫鏃ユ湡"
+      >
+      </el-date-picker>
+      <el-button type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      <el-button type="primary" size="mini" @click="linkto">璺宠浆</el-button>
+    </div>
+    <div class="width height-calc90 overflow margin-top4">
+      <tasktime-echart class="width height" :chartData="chartData" :colorList="colorList" />
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetInOutAverageTime } from '@/api/reportforms';
+import { GetDateStr } from '@/utils/date';
+import TasktimeEchart from '@/views/Home/components/tasktimeecharts.vue';
+export default {
+  data() {
+    return {
+      pickertime: [GetDateStr(-15), GetDateStr(0)],
+      chartData: {},
+      colorList: [
+        '#0090FF',
+        '#36CE9E',
+        '#FFC005',
+        '#FF515A',
+        '#8B5CFF',
+        '#00CA69',
+        '#F3A43B',
+        '#D7504B',
+        '#C6E579',
+        '#F0805A',
+        '#26C0C0',
+        '#660077',
+        '#FFCCCC',
+        '#550088',
+        '#FFFFBB',
+        '#99FFFF',
+        '#CC00CC',
+        '#CC00CC',
+        '#C63300',
+        '#9955FF',
+        '#66FF66',
+        '#B5C334',
+        '#FCCE10',
+        '#27727B',
+        '#FE8463',
+        '#FAD860',
+        '#F3A43B',
+        '#D7504B',
+        '#C6E579',
+        '#F0805A',
+        '#26C0C0',
+        '#660077',
+        '#FFCCCC',
+        '#550088',
+        '#FFAA33',
+        '#CC00CC',
+        '#FF77FF',
+        '#C63300',
+        '#F4E001',
+        '#66FF66'
+      ]
+    };
+  },
+  components: { TasktimeEchart },
+  computed: {},
+  mounted() {
+    this.GetInOutAverageTime();
+  },
+  methods: {
+    inquer() {
+      this.GetInOutAverageTime();
+    },
+    //璺宠浆
+    linkto() {
+      const { href } = this.$router.resolve({
+        path: '/tasktime'
+      });
+      window.open(href, '_blank');
+    },
+    GetInOutAverageTime() {
+      console.log(this.pickertime);
+      let startTime = this.pickertime ? this.pickertime[0] : '';
+      let endTime = this.pickertime ? this.pickertime[1] : '';
+      GetInOutAverageTime({ startTime: startTime, endTime: endTime }).then(res => {
+        this.chartData = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#tasktime {
+}
+</style>
diff --git a/qqjf-Web/src/views/reportforms/turnover/index.vue b/qqjf-Web/src/views/reportforms/turnover/index.vue
new file mode 100644
index 0000000..6c8a935
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/turnover/index.vue
@@ -0,0 +1,144 @@
+<template>
+  <!-- 鍒朵欢鍛ㄨ浆 -->
+  <div id="turnover" class="global-content">
+    <div class="width flex align-center justify-end">
+      <div class="flex width12 align-center margin-right15 justify-end">
+        <label class="color909399 fontsiez1rem">骞达細</label>
+        <el-date-picker v-model="intimers.year" size="mini" value-format="yyyy" type="year" placeholder="閫夋嫨骞�">
+        </el-date-picker>
+      </div>
+      <div class="flex width20 margin-right15 align-center justify-end">
+        <label class="color909399 fontsiez1rem">鏈堬細</label>
+        <el-date-picker
+          v-model="intimers.month"
+          type="monthrange"
+          size="mini"
+          value-format="MM"
+          format="MM"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫湀浠�"
+          end-placeholder="缁撴潫鏈堜唤"
+        >
+        </el-date-picker>
+      </div>
+      <div class="flex width15 align-center margin-right15 justify-end">
+        <label class="color909399 width40 fontsiez1rem">寮�濮嬪懆锛�</label>
+        <el-select style="width: 55%" v-model="intimers.stWeek" size="mini" clearable placeholder="璇烽�夋嫨鍛�">
+          <el-option
+            v-for="(item, index) in startweeklist"
+            :key="index + 'startweek'"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </div>
+      <div class="flex width15 align-center margin-right15 justify-end">
+        <label class="color909399 width40 fontsiez1rem">缁撴潫鍛細</label>
+        <el-select style="width: 55%" v-model="intimers.edWeek" size="mini" clearable placeholder="璇烽�夋嫨鍛�">
+          <el-option
+            v-for="(item, index) in endweeklist"
+            :key="index + 'endtweek'"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </div>
+      <el-button type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      <el-button type="primary" size="mini" @click="linkto">璺宠浆</el-button>
+    </div>
+    <div class="width height-calc90 overflow margin-top4">
+      <turnover-echart class="width height" :chartData="chartData" :colorList="colorList" />
+      <!-- <div class="width height" ref="taskbeatEcharts"></div> -->
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetPartTurnover } from '@/api/reportforms';
+import TurnoverEchart from '@/views/Home/components/turnoverEchart.vue';
+export default {
+  data() {
+    return {
+      intimers: {
+        year: '',
+        month: null,
+        stWeek: '',
+        edWeek: ''
+      },
+      startweeklist: [
+        {
+          label: '绗竴鍛�',
+          value: 1
+        },
+        {
+          label: '绗簩鍛�',
+          value: 2
+        },
+        {
+          label: '绗笁鍛�',
+          value: 3
+        },
+        {
+          label: '绗洓鍛�',
+          value: 4
+        }
+      ],
+      endweeklist: [
+        {
+          label: '绗竴鍛�',
+          value: 1
+        },
+        {
+          label: '绗簩鍛�',
+          value: 2
+        },
+        {
+          label: '绗笁鍛�',
+          value: 3
+        },
+        {
+          label: '绗洓鍛�',
+          value: 4
+        }
+      ],
+      chartData: {},
+      colorList: ['#0090FF', '#36CE9E', '#FFC005', '#FF515A', '#8B5CFF', '#00CA69']
+    };
+  },
+  components: { TurnoverEchart },
+  computed: {},
+  mounted() {
+    this.GetPartTurnover();
+  },
+  methods: {
+    inquer() {
+      this.GetPartTurnover();
+    },
+    //璺宠浆
+    linkto() {
+      const { href } = this.$router.resolve({
+        path: '/turnover'
+      });
+      window.open(href, '_blank');
+    },
+    GetPartTurnover() {
+      const { year, stWeek, edWeek } = this.intimers;
+      let stMonth = this.intimers.month ? this.intimers.month[0] : '';
+      let edMonth = this.intimers.month ? this.intimers.month[1] : '';
+      GetPartTurnover({ year, stWeek, edWeek, stMonth: stMonth, edMonth: edMonth }).then(res => {
+        this.chartData = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#turnover {
+  ::v-deep .el-input__inner {
+    // width: 80%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/reportforms/warehouse/index.vue b/qqjf-Web/src/views/reportforms/warehouse/index.vue
new file mode 100644
index 0000000..7ffd92b
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/warehouse/index.vue
@@ -0,0 +1,72 @@
+<template>
+  <!-- 璐ф牸鍒╃敤鐜� -->
+  <div id="warehouse" class="global-content">
+    <div class="width flex align-center justify-end">
+      <label class="color909399 fontsiez1rem">鏌ヨ鏃ユ湡锛�</label>
+      <el-date-picker
+        class="margin-right"
+        v-model="pickertime"
+        size="mini"
+        type="daterange"
+        value-format="yyyy-MM-dd"
+        range-separator="鑷�"
+        start-placeholder="寮�濮嬫棩鏈�"
+        end-placeholder="缁撴潫鏃ユ湡"
+      >
+      </el-date-picker>
+      <el-button type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      <el-button type="primary" size="mini" @click="linkto">璺宠浆</el-button>
+    </div>
+    <div class="width applyheight overflow margin-top4">
+      <warehouse-echart class="width height" :chartData="chartData" :colorList="colorList" />
+      <!-- <div class="width height" ref="taskbeatEcharts"></div> -->
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetStorageVailability } from '@/api/reportforms';
+import { GetDateStr } from '@/utils/date';
+import WarehouseEchart from '@/views/Home/components/warehouseechart.vue';
+
+export default {
+  data() {
+    return {
+      pickertime: [GetDateStr(-15), GetDateStr(0)],
+      chartData: {},
+      colorList: ['#0090FF', '#36CE9E', '#FFC005', '#FF515A', '#8B5CFF', '#00CA69']
+    };
+  },
+  components: { WarehouseEchart },
+  computed: {},
+  mounted() {
+    this.GetStorageVailability();
+  },
+  methods: {
+    inquer() {
+      this.GetStorageVailability();
+    },
+    //璺宠浆
+    linkto() {
+      const { href } = this.$router.resolve({
+        path: '/warehouse'
+      });
+      window.open(href, '_blank');
+    },
+    GetStorageVailability() {
+      let objtimes = {
+        startTime: this.pickertime ? this.pickertime[0] : '',
+        endTime: this.pickertime ? this.pickertime[1] : ''
+      };
+      GetStorageVailability(objtimes).then(res => {
+        this.chartData = res;
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#warehouse {
+}
+</style>
diff --git a/qqjf-Web/src/views/reportforms/workpiece/index.vue b/qqjf-Web/src/views/reportforms/workpiece/index.vue
new file mode 100644
index 0000000..0e80e5d
--- /dev/null
+++ b/qqjf-Web/src/views/reportforms/workpiece/index.vue
@@ -0,0 +1,130 @@
+<template>
+  <!-- 鍒朵欢鎬昏 -->
+  <div id="workpiece" class="global-content">
+    <el-button statelibrary="absolute right zindex" type="primary" size="mini" @click="linkto">璺宠浆</el-button>
+    <h3 class="text-center color636972" style="font-size: 40px">鍒朵欢鎬昏</h3>
+    <div class="width96 padding10 borderradius margintopbot flex flex-wrap justify-between align-center">
+      <div
+        class="didproject-title width45 flex justify-around align-center borderdashed borderradius overflow pointer"
+        v-for="(item, index) in titlelist"
+        :key="index"
+        :style="'margin-top:' + item.margin"
+      >
+        <div class="heigth padding10 overflow">
+          <p class="text-center fontsize2rem fontweight600 color409EFF margin-top15" style="font-size: 40px">
+            <countTo :startVal="startVal" :endVal="item.mun" :duration="3000"></countTo>
+          </p>
+          <p class="fontsiez1rem" style="font-size: 40px">{{ item.titel }}</p>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import countTo from 'vue-count-to';
+import { GetHomeNumData } from '@/api/Didproject';
+import { GetStorageOverviewData } from '@/api/Didproject';
+import { ItemStorage } from '@/api/materials';
+export default {
+  data() {
+    return {
+      startVal: 0,
+      titlelist: [
+        {
+          titel: '鍒朵欢鎬绘暟',
+          name: '鍒朵欢鎬绘暟',
+          mun: 0,
+          color: '#ffc637'
+        },
+        {
+          titel: '鍒朵欢绉嶇被',
+          name: '鍒朵欢绉嶇被',
+          mun: 0,
+          color: '#40C9C6'
+        },
+        {
+          titel: '浠婃棩鍏ュ簱',
+          name: '浠婃棩鍏ュ簱闆朵欢鏁�',
+          mun: 0,
+          color: '#F4516C',
+          margin: '1%'
+        },
+        {
+          titel: '浠婃棩鍑哄簱',
+          name: '浠婃棩鍑哄簱闆朵欢鏁�',
+          mun: 0,
+          color: '#36A3F7',
+          margin: '1%'
+        }
+      ],
+      cleartime: null,
+      list: []
+    };
+  },
+  components: { countTo },
+  computed: {},
+  mounted() {
+    this.GetHomeNumData();
+    this.cleartime = setInterval(() => {
+      this.GetHomeNumData();
+    }, 60000);
+  },
+  methods: {
+    //璺宠浆
+    linkto() {
+      const { href } = this.$router.resolve({
+        path: '/workpiece'
+      });
+      window.open(href, '_blank');
+    },
+    //浠婃棩鍑哄叆搴撴暟鎹�
+    GetHomeNumData() {
+      // no 缂栧彿锛泃itle 鏍囬锛泇alue 鏁伴噺
+      GetHomeNumData().then(res => {
+        let data = res.data || [];
+        this.list = data;
+        this.GetStorageOverviewData(data);
+      });
+    },
+    GetStorageOverviewData() {
+      GetStorageOverviewData().then(res => {
+        let data = res.data || [];
+        this.list = this.list.concat(data);
+        console.log(this.list);
+        this.ItemStorage();
+      });
+    },
+    ItemStorage() {
+      ItemStorage('1&onePageNum=1').then(res => {
+        if (res.code == 0) {
+          this.list.push({
+            titel: '鍒朵欢绉嶇被',
+            name: '鍒朵欢绉嶇被',
+            value: res.num
+          });
+          this.titlelist.forEach(item => {
+            this.list.forEach(element => {
+              if (item.name == element.titel) {
+                item.mun = element.value;
+              }
+            });
+          });
+        }
+        console.log(this.list);
+      });
+    }
+  },
+  beforeDestroy() {
+    if (this.cleartime) {
+      clearInterval(this.cleartime);
+      this.cleartime = null;
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#workpiece {
+}
+</style>
diff --git a/qqjf-Web/src/views/statistics/index.vue b/qqjf-Web/src/views/statistics/index.vue
new file mode 100644
index 0000000..1cb60c6
--- /dev/null
+++ b/qqjf-Web/src/views/statistics/index.vue
@@ -0,0 +1,9 @@
+<template>
+  <router-view />
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/storage/base/index.vue b/qqjf-Web/src/views/storage/base/index.vue
new file mode 100644
index 0000000..1cb60c6
--- /dev/null
+++ b/qqjf-Web/src/views/storage/base/index.vue
@@ -0,0 +1,9 @@
+<template>
+  <router-view />
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/storage/base/inventory/index.vue b/qqjf-Web/src/views/storage/base/inventory/index.vue
new file mode 100644
index 0000000..3d9ea7c
--- /dev/null
+++ b/qqjf-Web/src/views/storage/base/inventory/index.vue
@@ -0,0 +1,232 @@
+<template>
+  <!-- 搴撳瓨绠$悊-->
+  <div id="inventory" class="global-content">
+    <!-- 绛涢��  :iscontainer="true"
+      @iscontainer="iscontainer"-->
+    <storage-inquer
+      byfilter="搴撲綅鍙�"
+      :groupshow="false"
+      :dele="false"
+      :filterList="filterList"
+      :derive="true"
+      :isBadshow="true"
+      :stStatusshow="true"
+      :taskTypeshow="true"
+      :isEmptyContainershow="true"
+      @derive="derive"
+      @addmodal="addmodal"
+      @inquer="inquer"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="false"
+        :delShow="true"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        @edit="edit"
+        @del="del"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+      />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow" :modabg="true" @cancel="addmodalShow = false">
+        <p slot="title">搴撳瓨绠$悊-{{ title }}</p>
+        <div class="height" slot="centent">
+          <inventory-edit @cancel="addmodalShow = false" :rowitem="rowitem" @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import StorageInquer from '../../components/storage-inquer';
+import inventoryEdit from '../../components/inventoryEdit';
+import { exportTableList } from '@/utils/excel';
+import { getymdhms } from '@/utils/date';
+const { inventory } = require('@/components/tableContainer/tableHead');
+import { PlaceVsContainer, PlaceVsContainerDelete } from '@/api/inventory';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: [],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      pageNum: 0,
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '搴撲綅鍙�',
+          label: '搴撲綅鍙�'
+        },
+        {
+          value: '鍣ㄥ叿缂栧彿',
+          label: '鍣ㄥ叿缂栧彿'
+        },
+        {
+          value: '闆朵欢缂栧彿',
+          label: '闆朵欢缂栧彿'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, StorageInquer, Modal, inventoryEdit },
+  computed: {
+    tableHead() {
+      return inventory;
+    }
+  },
+  mounted() {
+    this.PlaceVsContainer();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.inuqerobg = e;
+      this.page = 1;
+      this.PlaceVsContainer();
+    },
+    //鎼滅储鐢ㄦ埛
+    PlaceVsContainer() {
+      this.$Loading(true);
+      const {
+        搴撲綅鍙�: place,
+        鍣ㄥ叿缂栧彿: containerName,
+        闆朵欢缂栧彿: itemName,
+        isEmptyContainer,
+        isBad,
+        stStatus,
+        taskType
+      } = this.inuqerobg;
+      PlaceVsContainer(this.page + '&onePageNum=' + this.pageSize, {
+        place,
+        containerName,
+        itemName,
+        isBad,
+        stStatus,
+        isEmptyContainer,
+        taskType
+      }).then(res => {
+        if (res.code == 0) {
+          this.tableData = res.data;
+          this.totle = res.num;
+          this.pageNum = res.pageNum;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.PlaceVsContainer();
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.PlaceVsContainer();
+    },
+    //瀵煎嚭
+    derive() {
+      let tHeader = [];
+      let filterVal = [];
+      this.tableHead.forEach(item => {
+        tHeader.push(item.columnDescription);
+        filterVal.push(item.columnName);
+      });
+      this.$Loading(true);
+      const {
+        搴撲綅鍙�: place,
+        鍣ㄥ叿缂栧彿: containerName,
+        闆朵欢鍚嶇О: itemName,
+        isEmptyContainer,
+        isBad,
+        stStatus,
+        taskType
+      } = this.inuqerobg;
+      PlaceVsContainer('1&onePageNum=99999999', {
+        place,
+        containerName,
+        itemName,
+        isBad,
+        stStatus,
+        isEmptyContainer,
+        taskType
+      }).then(res => {
+        if (res.code == 0) {
+          exportTableList(tHeader, filterVal, res.data, '搴撳瓨绠$悊' + getymdhms());
+        }
+
+        this.$Loading();
+      });
+    },
+    //缂栬緫
+    edit(row) {
+      this.rowitem = { ...row };
+      this.addmodalShow = true;
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { place } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          PlaceVsContainerDelete({ place }).then(res => {
+            this.$message({
+              type: 'success',
+              message: '鍒犻櫎鎴愬姛!'
+            });
+            this.PlaceVsContainer();
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.PlaceVsContainer();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#inventory {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/base/materials/index.vue b/qqjf-Web/src/views/storage/base/materials/index.vue
new file mode 100644
index 0000000..1e91eda
--- /dev/null
+++ b/qqjf-Web/src/views/storage/base/materials/index.vue
@@ -0,0 +1,170 @@
+<template>
+  <!-- 鐗╂枡搴撳瓨-->
+  <div id="materials" class="global-content">
+    <!-- 绛涢�� -->
+    <storage-inquer
+      byfilter="闆朵欢缂栧彿"
+      :groupshow="false"
+      :dele="false"
+      :derive="true"
+      :refresh="true"
+      :isOverDayshow="true"
+      :loading="loading"
+      :filterList="filterList"
+      @inquer="inquer"
+      @refresh="refresh"
+      @derive="derive"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :operation="false"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+        @del="del"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer } from '@/components/index';
+import StorageInquer from '../../components/storage-inquer';
+const { materials } = require('@/components/tableContainer/tableHead');
+import { ItemStorage } from '@/api/materials';
+import { exportTableList } from '@/utils/excel';
+import { getymdhms } from '@/utils/date';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: [],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      pageNum: 0,
+      loading: false,
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '闆朵欢缂栧彿',
+          label: '闆朵欢缂栧彿'
+        },
+        {
+          value: '闆朵欢鍚嶇О',
+          label: '闆朵欢鍚嶇О'
+        },
+        {
+          value: '浜х嚎',
+          label: '浜х嚎'
+        },
+        {
+          value: '搴撳悕',
+          label: '搴撳悕'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, StorageInquer },
+  computed: {
+    tableHead() {
+      return materials;
+    }
+  },
+  mounted() {
+    this.ItemStorage();
+  },
+  methods: {
+    //鍒锋柊
+    refresh() {
+      this.loading = true;
+      this.ItemStorage();
+    },
+    //鏌ヨ
+    inquer(e) {
+      this.inuqerobg = e;
+      this.page = 1;
+      this.ItemStorage();
+    },
+    //鎼滅储鐢ㄦ埛
+    ItemStorage() {
+      this.$Loading(true);
+      const { 闆朵欢缂栧彿: itemName, 闆朵欢鍚嶇О: itemDes, 浜х嚎: createLine, 搴撳悕: storageName, isOverDay } = this.inuqerobg;
+      ItemStorage(this.page + '&onePageNum=' + this.pageSize, {
+        itemDes,
+        createLine,
+        storageName,
+        itemName,
+        isOverDay
+      }).then(res => {
+        if (res.code == 0) {
+          this.tableData = res.data;
+          this.totle = res.num;
+          this.pageNum = res.pageNum;
+        }
+        this.$Loading();
+        this.loading = false;
+      });
+    },
+    //瀵煎嚭
+    derive() {
+      let tHeader = [];
+      let filterVal = [];
+      this.tableHead.forEach(item => {
+        tHeader.push(item.columnDescription);
+        filterVal.push(item.columnName);
+      });
+      this.$Loading(true);
+      const { 闆朵欢缂栧彿: itemName, 闆朵欢鍚嶇О: itemDes, 浜х嚎: createLine, 搴撳悕: storageName, isOverDay } = this.inuqerobg;
+      ItemStorage('1&onePageNum=99999999', {
+        itemDes,
+        createLine,
+        storageName,
+        itemName,
+        isOverDay
+      }).then(res => {
+        if (res.code == 0) {
+          exportTableList(tHeader, filterVal, res.data, '鐗╂枡搴撳瓨' + getymdhms());
+        }
+        this.$Loading();
+      });
+    },
+    //鍒嗛〉
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.ItemStorage();
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.ItemStorage();
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#materials {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/base/viewdata/index.vue b/qqjf-Web/src/views/storage/base/viewdata/index.vue
new file mode 100644
index 0000000..48f8bfc
--- /dev/null
+++ b/qqjf-Web/src/views/storage/base/viewdata/index.vue
@@ -0,0 +1,233 @@
+<template>
+  <!-- 搴撳瓨绠$悊-->
+  <div id="viewdata" class="global-content">
+    <!-- 绛涢�� -->
+    <div class="width margin4auto paddingtopbottom boxshadow4">
+      <view-inquer @inquer="inquer" />
+      <div class="flex flex-wrap margin-top10px align-center justify-around">
+        <div class="flex align-center margin-right" v-for="(item, index) in statuslist" :key="index + 'status'">
+          <p>
+            <i class="iconi" :style="'background:' + item.bgcl" /> {{ item.title }}锛歿{ StatusPlaceCount[item.name] }}
+          </p>
+        </div>
+      </div>
+    </div>
+    <div class="allheigth width margin4auto paddingtopbottom overflowauto">
+      <div v-for="(item, index) in GetAllPlace" :key="index + 'getallpace'">
+        <!-- <p class="margintopbot">灞傛暟{{ item.layer }}</p> -->
+        <div class="flex">
+          <div v-for="(element, index) in item.llist" :key="index + 'layer'">
+            <div
+              class="view-chunk"
+              :class="
+                element.placeStates == 1
+                  ? 'emptyappliance chunkkhover pointer'
+                  : element.placeStates == 2
+                  ? 'instore chunkkhover pointer'
+                  : element.placeStates == 3
+                  ? 'lock chunkkhover pointer'
+                  : element.placeStates == 99
+                  ? 'bgnull'
+                  : 'pointer chunkkhover'
+              "
+              :key="index + 'place'"
+              @click="Placeclick(element)"
+            >
+              {{ element.placeName }}
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <transition name="modal">
+      <viewdata-info v-if="viewinfoshow" @cancel="viewinfoshow = false">
+        <p slot="title">瑙嗗浘璇︽儏</p>
+        <div class="height" slot="centent">
+          <div class="width height overflowy-auto">
+            <div class="width96 margin-auto boxshadow4 viewpadding" v-show="tableData.length > 0">
+              <template v-for="(i, index) in tableData">
+                <div v-if="tableData.length > 0" class="width height" :key="index + 'tabledata'">
+                  <div class="flex margintopbot" v-for="(item, count) in tableHead" :key="count + 'tablehead'">
+                    <label class="color909399 fontsiez1rem width15">{{ item.columnDescription }}锛�</label>
+                    <p class="borderbottom345 width70">
+                      {{ tableData[index][item.columnName] }}
+                    </p>
+                  </div>
+                </div>
+              </template>
+            </div>
+            <p class="color909399 fontsize2rem absolute transformtopleft" v-show="tableData.length == 0">鏆傛棤鏁版嵁</p>
+          </div>
+          <!-- <table-container :tableHead="tableHead" :tableData="tableData" :operation="false" :paginationshow="false" /> -->
+        </div>
+      </viewdata-info>
+    </transition>
+  </div>
+</template>
+
+<script>
+import ViewInquer from '../../components/viewdataInquer.vue';
+import { GetAllStatusPlaceCount, GetAllPlaceInfo, GetPVCVIInfo } from '@/api/viewdata';
+import viewdataInfo from '../../components/viewdatainfo.vue';
+const { viewdata } = require('@/components/tableContainer/tableHead');
+export default {
+  data() {
+    return {
+      tableData: [],
+      statuslist: [
+        {
+          title: '褰撳墠宸烽亾閿佸畾鐨勫簱浣嶆暟閲�',
+          name: 'lPlaceCount',
+          bgcl: '#C82627'
+        },
+        {
+          title: '褰撳墠宸烽亾绌哄簱浣嶆暟閲�',
+          name: 'ePlaceCount',
+          bgcl: '#909399'
+        },
+        {
+          title: '褰撳墠宸烽亾绌哄櫒鍏峰簱浣嶆暟閲�',
+          name: 'cPlaceCount',
+          bgcl: '#59A9AA'
+        },
+        {
+          title: '褰撳墠宸烽亾鏈夎揣搴撲綅鏁伴噺',
+          name: 'iPlaceCount',
+          bgcl: '#67C23A'
+        }
+     
+      ],
+      inquerobj: {
+        storageNo: 1,
+        row: 1
+      },
+      StatusPlaceCount: {},
+      GetAllPlace: [],
+      viewinfoshow: false
+    };
+  },
+  components: {  ViewInquer, viewdataInfo },
+  computed: {
+    tableHead() {
+      return viewdata;
+    }
+  },
+  mounted() {
+    this.GetAllStatusPlaceCount();
+    this.GetAllPlaceInfo();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.inquerobj = e;
+      this.GetAllStatusPlaceCount();
+      this.GetAllPlaceInfo();
+    },
+    //鑾峰彇鍚勭鐘舵�佺殑搴撲綅鏁伴噺
+    GetAllStatusPlaceCount() {
+      const { storageNo } = this.inquerobj;
+      GetAllStatusPlaceCount({ storageNo }).then(res => {
+        this.StatusPlaceCount = res;
+      });
+    },
+    //鑾峰彇鎸囧畾宸烽亾搴撶殑鎵�鏈夊簱浣嶄俊鎭�
+    GetAllPlaceInfo() {
+      const { storageNo, row } = this.inquerobj;
+      this.GetAllPlace = [];
+      this.$Loading(true);
+      GetAllPlaceInfo({ storageNo, row }).then(res => {
+        if (res.code == 0) {
+          console.log(res.data);
+          let data = res.data;
+          let list = [];
+          data.forEach(element => {
+            list.push(element.layer);
+          });
+          list = Array.from(new Set(list));
+          list.forEach((item, index) => {
+            this.GetAllPlace.push({ layer: item, llist: [] });
+            data.forEach(element => {
+              if (item == element.layer) {
+                this.GetAllPlace[index].llist.push(element);
+              }
+            });
+          });
+          this.GetAllPlace.forEach(item => {
+            console.log(item);
+            item.llist.sort((a, b) => {
+              return a.col - b.col;
+            });
+          });
+          console.log(this.GetAllPlace);
+          // this.GetAllPlace = res.data;
+        }
+        this.$Loading();
+      });
+    },
+    //鐐瑰嚮鑾峰彇搴撲綅閲岀殑鎵樼洏鎴栬�呯墿鏂欎俊鎭�
+    Placeclick(item) {
+      if (item.placeStates != 99) {
+        const { placeName } = item;
+        this.viewinfoshow = true;
+        this.tableData = [];
+        GetPVCVIInfo({ placeName }).then(res => {
+          if (res) {
+            res.forEach(item => {
+              item.isFull = item.isFull == 1 ? '鏄�' : item.isFull == 0 ? '鍚�' : item.isFull;
+              item.isBad = item.isBad == 1 ? '鏄�' : item.isBad == 0 ? '鍚�' : item.isBad;
+            });
+            this.tableData = res;
+          }
+        });
+      }
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#viewdata {
+  .allheigth {
+    height: calc(100% - 110px);
+  }
+  .viewpadding {
+    padding: 1px 10px;
+  }
+  .iconi {
+    display: inline-block;
+    width: 16px;
+    height: 16px;
+    border-radius: 4px;
+    box-shadow: 0 0 4px #eaedef;
+  }
+  .view-chunk {
+    width: 100px;
+    height: 20px;
+    padding: 8px;
+    text-align: center;
+    margin: 0 5px 10px;
+    border-radius: 4px;
+    // box-shadow: 0 0 4px #345;
+    color: #fff;
+    background: #909399;
+    transition: all 0.5s;
+  }
+  .chunkkhover {
+    &:hover {
+      background: #e6a23c;
+    }
+  }
+  .emptyappliance {
+    background: #59a9aa;
+  }
+  .instore {
+    background: #67c23a;
+  }
+  .lock {
+    background: #c82627;
+  }
+  .bgnull {
+    background: unset;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/components/casslineEdit.vue b/qqjf-Web/src/views/storage/components/casslineEdit.vue
new file mode 100644
index 0000000..64f57e0
--- /dev/null
+++ b/qqjf-Web/src/views/storage/components/casslineEdit.vue
@@ -0,0 +1,133 @@
+<template>
+  <div class="casslineEdit height overflow">
+    <div class="centent-form overflowy-auto">
+      <el-form
+        class="margin-auto width90"
+        ref="registerForm"
+        :model="registerForm"
+        size="mini"
+        :rules="rules"
+        label-position="left"
+        label-width="130px"
+      >
+        <el-form-item label="鐝嚎缂栧彿:" prop="productionCode">
+          <el-input v-model="registerForm.productionCode" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鐝嚎鍚嶇О:" prop="productionName">
+          <el-input v-model="registerForm.productionName" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鑳藉惁浣滀负鐩殑鍦�:" prop="isDestination">
+          <el-select v-model="registerForm.isDestination" clearable placeholder="璇烽�夋嫨">
+            <el-option v-for="item in isDestinationlist" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="palteEdit-button text-right margin-right15 margin-top2">
+      <el-button
+        type="primary"
+        size="mini"
+        class="form-buttom"
+        :loading="savloading"
+        @click="submitForm('registerForm')"
+        >鎻愪氦</el-button
+      >
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { ProductionLineAddOrUpdate } from '@/api/cass-line';
+export default {
+  data() {
+    return {
+      registerForm: {},
+      usernameList: [],
+      isDestinationlist: [
+        {
+          label: '鏄�',
+          value: 1
+        },
+        {
+          label: '鍚�',
+          value: 0
+        }
+      ],
+      rules: {
+        productionCode: { required: true, message: '璇疯緭鍏ョ彮绾跨紪鍙�', trigger: 'change' },
+        productionName: { required: true, message: '璇疯緭鍏ョ彮绾垮悕绉�', trigger: 'change' },
+        isDestination: { required: true, message: '璇烽�夋嫨鑳藉惁浣滀负鐩殑鍦�', trigger: 'change' }
+      },
+      savloading: false
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: {}
+    }
+  },
+  mounted() {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.registerForm = this.rowitem;
+    }
+  },
+  methods: {
+    submitForm(registerForm) {
+      this.$refs[registerForm].validate(valid => {
+        if (valid) {
+          this.savloading = true;
+          ProductionLineAddOrUpdate(this.registerForm).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.$emit('addsubmit');
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触'
+              });
+            }
+            this.savloading = false;
+          });
+        } else {
+        }
+      });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.casslineEdit {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .casslineEdit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/components/chooseEdit.vue b/qqjf-Web/src/views/storage/components/chooseEdit.vue
new file mode 100644
index 0000000..a4b2c71
--- /dev/null
+++ b/qqjf-Web/src/views/storage/components/chooseEdit.vue
@@ -0,0 +1,262 @@
+<template>
+  <div class="addchoose height overflow">
+    <div class="centent-form overflowy-auto">
+      <el-form
+        class="margin-auto width90"
+        ref="registerForm"
+        :model="registerForm"
+        size="mini"
+        :rules="rules"
+        label-position="left"
+        label-width="120px"
+      >
+        <el-form-item label="闆朵欢缂栧彿:" prop="itemName">
+          <el-input :disabled="disabled" v-model="registerForm.itemName" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="闆朵欢鍚嶇О:" prop="enable">
+          <el-input v-model="registerForm.itemDes" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="閲�:" prop="creatorid">
+          <el-input oninput="value=value.replace(/[^\d.]/g,'')" v-model="registerForm.weight" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="绫诲瀷:" prop="creatorid" v-if="false">
+          <el-input v-model="registerForm.itemType" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鍗曚釜鍏樊:" prop="creatorid">
+          <el-input
+            oninput="value=value.replace(/[^\d.]/g,'')"
+            v-model="registerForm.weightDifference"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <!-- <el-form-item label="鍚敤:" prop="creatorid">
+          <el-select v-model="registerForm.enable" clearable placeholder="璇烽�夋嫨">
+            <el-option v-for="item in enableList" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item> -->
+        <el-form-item label="鐢熶骇鐝嚎:" prop="creatorid">
+          <!-- <el-input v-model="registerForm.createLine" clearable></el-input> -->
+          <el-select v-model="registerForm.createLine" filterable clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="(item, index) in createLineList"
+              :key="'productionLineName' + index"
+              :label="item.productionName"
+              :value="item.productionName"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="瑁呯鏁伴噺:" prop="creatorid">
+          <el-input v-model="registerForm.maxNum" oninput="value=value.replace(/[^\d.]/g,'')" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鍗曚环:" prop="creatorid">
+          <el-input oninput="value=value.replace(/[^\d.]/g,'')" v-model="registerForm.price" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鍗曚綅:" prop="creatorid">
+          <el-input v-model="registerForm.unit" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鏈�澶у簱瀹归噺:" prop="creatorid">
+          <el-input v-model="registerForm.maxStorage" oninput="value=value.replace(/[^\d.]/g,'')" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鏈�灏忓簱瀹归噺:" prop="creatorid">
+          <el-input v-model="registerForm.minStorage" oninput="value=value.replace(/[^\d.]/g,'')" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="瓒呮湡鏃堕棿(澶�):" prop="creatorid">
+          <el-input v-model="registerForm.overDueTime" oninput="value=value.replace(/[^\d.]/g,'')" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鏄惁閿佸畾:" prop="creatorid">
+          <el-select v-model="registerForm.isLock" clearable placeholder="璇烽�夋嫨">
+            <el-option v-for="item in lockList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鎵�闇�鍣ㄥ叿瑙勬牸1:" prop="useContainerType">
+          <el-select v-model="registerForm.useContainerType" filterable multiple clearable placeholder="璇烽�夋嫨">
+            <el-option v-for="(item, index) in containerTypeList" :key="index" :label="item.titel" :value="item.titel">
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="addchoose-button text-right margin-right15 margin-top2">
+      <el-button
+        type="primary"
+        size="mini"
+        class="form-buttom"
+        :loading="savloading"
+        @click="submitForm('registerForm')"
+        >鎻愪氦</el-button
+      >
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { ItemAddOrUpdate } from '@/api/enterchoose';
+import { ProductionLineSearch } from '@/api/ProductionLine';
+import { ContainerTypeSearch } from '@/api/inventory';
+export default {
+  data() {
+    return {
+      registerForm: {
+        itemName: '',
+        itemDes: '',
+        weight: '',
+        itemType: '',
+        weightDifference: '',
+        createLine: '',
+        maxNum: '',
+        price: '',
+        unit: '',
+        maxStorage: '',
+        minStorage: '',
+        overDueTime: '',
+        isLock: '',
+        useContainerType: []
+      },
+      useContainerType: [],
+      disabled: false,
+      lockList: [
+        {
+          label: '鏄�',
+          value: 1
+        },
+        {
+          label: '鍚�',
+          value: 0
+        }
+      ],
+      // containerTypeList: [],
+      statusList: [
+        {
+          label: 0,
+          value: 0
+        },
+        {
+          label: 1,
+          value: 1
+        }
+      ],
+      enableList: [
+        {
+          label: '鍚敤',
+          value: 1
+        },
+        {
+          label: '绂佺敤',
+          value: 0
+        }
+      ],
+      createLineList: [],
+      rules: {
+        itemName: { required: true, message: '璇疯緭闆朵欢缂栧彿', trigger: 'change' },
+        useContainerType: { required: true, message: '璇烽�夋嫨鎵�闇�鍣ㄥ叿瑙勬牸', trigger: 'change' }
+      },
+      savloading: false
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: () => {}
+    },
+    containerTypeList: {
+      type: Array,
+      default: () => []
+    }
+  },
+  mounted() {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.registerForm = this.rowitem;
+      this.registerForm.useContainerType = this.rowitem.useContainerType.split(',');
+      this.disabled = true;
+    } else {
+      this.disabled = false;
+      this.registerForm.itemType = '鍐插帇浠�';
+    }
+    this.ProductionLineSearch();
+    // this.ContainerTypeSearch();
+  },
+  methods: {
+    ContainerTypeSearch() {
+      ContainerTypeSearch().then(res => {
+        if (res != null && res != []) {
+          let data = res || [];
+          // this.containerTypeList = data;
+        }
+      });
+    },
+    //鐝嚎
+    ProductionLineSearch() {
+      ProductionLineSearch('1&onePageNum=999', { isDestination: 0 }).then(res => {
+        if (res.code == 0) {
+          let data = res.data || [];
+          this.createLineList = data.filter(item => {
+            if (item.productionName.indexOf('鍑哄彛') == -1) {
+              if (item.productionName != '鍐插帇杞﹂棿') {
+                return item;
+              }
+            }
+          });
+        }
+      });
+    },
+    submitForm(registerForm) {
+      this.$refs[registerForm].validate(valid => {
+        if (valid) {
+          this.savloading = true;
+          let obj = { ...this.registerForm };
+          obj.itemType = '鍐插帇浠�';
+          obj.useContainerType = obj.useContainerType.join(',');
+          ItemAddOrUpdate(obj).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.$emit('addsubmit');
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触'
+              });
+            }
+            this.savloading = false;
+          });
+        }
+      });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.addchoose {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .addchoose-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/components/forkliftEdit.vue b/qqjf-Web/src/views/storage/components/forkliftEdit.vue
new file mode 100644
index 0000000..ae45cc9
--- /dev/null
+++ b/qqjf-Web/src/views/storage/components/forkliftEdit.vue
@@ -0,0 +1,175 @@
+<template>
+  <div class="addchoose height overflow">
+    <div class="centent-form overflowy-auto">
+      <el-form
+        class="margin-auto width90"
+        ref="registerForm"
+        :model="registerForm"
+        size="mini"
+        :rules="rules"
+        label-position="left"
+        label-width="100px"
+      >
+        <el-form-item label="鍙夎溅鍚�:" prop="carName">
+          <el-input :disabled="disabled" v-model="registerForm.carName" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鍙夎溅鍙�:" prop="enable">
+          <el-input v-model="registerForm.carCode" clearable></el-input>
+        </el-form-item>
+
+        <el-form-item label="鏄惁宸ヤ綔:" prop="creatorid">
+          <el-select v-model="registerForm.isWork" clearable placeholder="璇烽�夋嫨">
+            <el-option v-for="item in enableList" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="椹鹃┒鍛�:" prop="creatorid">
+          <el-select v-model="registerForm.userName" clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="(item, index) in userNameList"
+              :key="index + 'userName'"
+              :label="item.userName"
+              :value="item.userName"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+    <!--     <el-form-item label="鎵ц浠诲姟鍚�:" prop="creatorid">
+          <el-input disabled v-model="registerForm.carTaskName" clearable></el-input>
+        </el-form-item> -->
+      </el-form>
+    </div>
+    <div class="addchoose-button text-right margin-right15 margin-top2">
+      <el-button
+        type="primary"
+        size="mini"
+        class="form-buttom"
+        :loading="savloading"
+        @click="submitForm('registerForm')"
+        >鎻愪氦</el-button
+      >
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { CarAddOrUpdate } from '@/api/forklift';
+import { UserSearch } from '@/api/manage';
+export default {
+  data() {
+    return {
+      registerForm: {},
+      disabled: false,
+      userNameList: [],
+      statusList: [
+        {
+          label: 0,
+          value: 0
+        },
+        {
+          label: 1,
+          value: 1
+        }
+      ],
+      enableList: [
+        {
+          label: '鏄�',
+          value: 1
+        },
+        {
+          label: '鍚�',
+          value: 0
+        }
+      ],
+      createLineList: [],
+
+      rules: {
+        carName: { required: true, message: '璇疯緭鍙夎溅鍚�', trigger: 'change' }
+      },
+      savloading: false
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: {}
+    }
+  },
+  mounted() {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.registerForm = this.rowitem;
+      this.disabled = true;
+    } else {
+      this.disabled = false;
+    }
+    this.UserSearch();
+  },
+  methods: {
+    //鐢ㄦ埛
+    UserSearch() {
+      UserSearch('1&onePageNum=999').then(res => {
+        if (res.code == 0) {
+          let data = res.data || [];
+          this.userNameList = data;
+        }
+      });
+    },
+    submitForm(registerForm) {
+      console.log(this.registerForm);
+      this.$refs[registerForm].validate(valid => {
+        if (valid) {
+          this.savloading = true;
+          CarAddOrUpdate(this.registerForm).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.$emit('addsubmit');
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触'
+              });
+            }
+            this.savloading = false;
+          });
+        }
+      });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.addchoose {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .addchoose-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/components/inventoryEdit.vue b/qqjf-Web/src/views/storage/components/inventoryEdit.vue
new file mode 100644
index 0000000..8d65e29
--- /dev/null
+++ b/qqjf-Web/src/views/storage/components/inventoryEdit.vue
@@ -0,0 +1,166 @@
+<template>
+  <div class="invetoryEdit height overflow">
+    <div class="centent-form overflowy-auto">
+      <el-form
+        class="margin-auto width90"
+        ref="registerForm"
+        :model="registerForm"
+        size="mini"
+        :rules="rules"
+        label-position="left"
+        label-width="120px"
+      >
+        <el-form-item label="缂栧彿:" prop="place">
+          <el-input disabled v-model="registerForm.pvcCode" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="搴撲綅鍙�:" prop="placeType">
+          <el-select v-model="registerForm.place" filterable clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="(item, index) in placeList"
+              :key="'place' + index"
+              :label="item.place"
+              :value="item.place"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鍣ㄥ叿鍙�:" prop="placeType">
+          <el-select v-model="registerForm.containerName" filterable clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="(item, index) in containerNameList"
+              :key="'containerName' + index"
+              :label="item.containerName"
+              :value="item.containerName"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="palteEdit-button text-right margin-right15 margin-top2">
+      <el-button
+        type="primary"
+        size="mini"
+        class="form-buttom"
+        :loading="savloading"
+        @click="submitForm('registerForm')"
+        >鎻愪氦</el-button
+      >
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { PlaceAddOrUpdate, PlaceVsContainerGetCode } from '@/api/inventory';
+import { PlaceSearch } from '@/api/position';
+import { ContainerSearch } from '@/api/palte';
+export default {
+  data() {
+    return {
+      registerForm: { pvcCode: '' },
+      placeList: [],
+      containerNameList: [],
+      disabled: false,
+      rules: {
+        deptName: { required: true, message: '璇疯緭閮ㄩ棬鍚嶇О', trigger: 'change' },
+        deptDes: { required: true, message: '璇疯緭鍏ラ儴闂ㄦ弿杩�', trigger: 'change' },
+        enable: { required: true, message: '璇烽�夋嫨鏄惁鍚敤', trigger: 'change' }
+      },
+      savloading: false
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: {}
+    }
+  },
+  mounted() {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.registerForm = this.rowitem;
+    } else {
+      this.PlaceVsContainerGetCode();
+    }
+
+    this.PlaceSearch();
+    this.ContainerSearch();
+  },
+  methods: {
+    //缂栧彿
+    PlaceVsContainerGetCode() {
+      PlaceVsContainerGetCode().then(res => {
+        this.registerForm.pvcCode = res;
+      });
+    },
+    //搴撲綅缂栧彿
+    PlaceSearch() {
+      PlaceSearch('1&onePageNum=999').then(res => {
+        if (res.code == 0) {
+          this.placeList = res.data;
+        }
+      });
+    },
+    //鍣ㄥ叿缂栧彿
+    ContainerSearch() {
+      ContainerSearch('1&onePageNum=999').then(res => {
+        if (res.code == 0) {
+          this.containerNameList = res.data;
+        }
+      });
+    },
+    submitForm(registerForm) {
+      this.$refs[registerForm].validate(valid => {
+        if (valid) {
+          this.savloading = true;
+          PlaceAddOrUpdate(this.registerForm).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.$emit('addsubmit');
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触'
+              });
+            }
+            this.savloading = false;
+          });
+        }
+      });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.invetoryEdit {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .invetoryEdit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/components/palteEdit.vue b/qqjf-Web/src/views/storage/components/palteEdit.vue
new file mode 100644
index 0000000..f2c1044
--- /dev/null
+++ b/qqjf-Web/src/views/storage/components/palteEdit.vue
@@ -0,0 +1,263 @@
+<template>
+  <div class="palteEdit height overflow">
+    <div class="centent-form overflowy-auto">
+      <el-form
+        class="margin-auto width90"
+        ref="registerForm"
+        :model="registerForm"
+        size="mini"
+        :rules="rules"
+        label-position="left"
+        label-width="100px"
+      >
+        <el-form-item label="鍣ㄥ叿缂栧彿:" prop="containerName">
+          <el-input
+            :disabled="disabled"
+            v-model="registerForm.containerName"
+            @blur="onBsp($event)"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="鍣ㄥ叿绫诲瀷:" prop="enable">
+          <el-input v-model="registerForm.containerType" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="瑙勬牸缂栧彿:" prop="creatorid" v-show="false">
+          <el-input v-model="registerForm.palletCode" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="瑙勬牸绫诲瀷:" prop="creatorid">
+          <el-select
+            v-model="registerForm.palletType"
+            filterable
+            clearable
+            placeholder="璇烽�夋嫨"
+            @change="onSelectedDrug($event)"
+          >
+            <el-option v-for="item in pallList" :key="item.id" :label="item.PalletType" :value="item.PalletCode">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鍏樊:" prop="creatorid">
+          <el-input
+            oninput="value=value.replace(/[^\d.]/g,'')"
+            v-model="registerForm.weightDifference"
+            autocomplete="off"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="鑷噸:" prop="creatorid">
+          <el-input
+            oninput="value=value.replace(/[^\d.]/g,'')"
+            v-model="registerForm.weight"
+            autocomplete="off"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="楂�:" prop="creatorid">
+          <el-input
+            oninput="value=value.replace(/[^\d.]/g,'')"
+            v-model="registerForm.height"
+            autocomplete="off"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="闀�:" prop="creatorid">
+          <el-input
+            oninput="value=value.replace(/[^\d.]/g,'')"
+            v-model="registerForm.length"
+            autocomplete="off"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="瀹�:" prop="creatorid">
+          <el-input
+            oninput="value=value.replace(/[^\d.]/g,'')"
+            v-model="registerForm.width"
+            autocomplete="off"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="鏄惁閿佸畾:" prop="creatorid">
+          <el-select v-model="registerForm.isLock" clearable placeholder="璇烽�夋嫨">
+            <el-option v-for="item in lockList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="palteEdit-button text-right margin-right15 margin-top2">
+      <el-button
+        type="primary"
+        size="mini"
+        class="form-buttom"
+        :loading="savloading"
+        @click="submitForm('registerForm')"
+        >鎻愪氦</el-button
+      >
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { ContainerAddOrUpdate } from '@/api/palte';
+import { PalletSearch } from '@/api/palte';
+export default {
+  data() {
+    return {
+      registerForm: {
+        containerName: '',
+        containerType: '',
+        palletCode: '',
+        palletType: '',
+        weightDifference: '',
+        weight: '',
+        height: '',
+        length: '',
+        width: '',
+        isLock: ''
+      },
+      pallList: [],
+      lockList: [
+        {
+          label: '鏄�',
+          value: 1
+        },
+        {
+          label: '鍚�',
+          value: 0
+        }
+      ],
+      containerTypeList: [
+        {
+          label: 'P71-2222',
+          value: 'P71-2222'
+        },
+        {
+          label: 'P71-3333',
+          value: 'P71-3333'
+        }
+      ],
+      statusList: [
+        {
+          label: 0,
+          value: 0
+        },
+        {
+          label: 1,
+          value: 1
+        }
+      ],
+      enableList: [
+        {
+          label: '鍚敤',
+          value: 1
+        },
+        {
+          label: '绂佺敤',
+          value: 0
+        }
+      ],
+      disabled: false,
+
+      rules: {
+        containerName: { required: true, message: '璇疯緭鍣ㄥ叿缂栧彿', trigger: 'change' }
+      },
+      savloading: false
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  mounted() {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.registerForm = this.rowitem;
+      this.disabled = true;
+    } else {
+      this.disabled = false;
+      this.PalletsSearch();
+    }
+  },
+  methods: {
+    onBsp(e) {
+      var name = this.registerForm.containerName;
+      if (name != '' && name.indexOf('-') != -1) {
+        var spname = name.split('-');
+        this.registerForm.containerType = spname[0] + '-' + spname[1];
+      }
+      this.$forceUpdate();
+    },
+    onSelectedDrug(e) {
+      let obj = {};
+      obj = this.pallList.find(item => {
+        //杩欓噷鐨刾allList灏辨槸涓婇潰閬嶅巻鐨勬暟鎹簮
+        return item.id === e; //绛涢�夊嚭鍖归厤鏁版嵁
+      });
+      this.registerForm.palletCode = obj.PalletCode;
+      this.registerForm.length = obj.LengthMax;
+      this.registerForm.height = obj.HeightMax;
+      this.registerForm.width = obj.WidthMax;
+    },
+    PalletsSearch() {
+      PalletSearch('1&onePageNum=99').then(res => {
+        if (res.code == 0) {
+          this.pallList = res.data;
+        }
+      });
+    },
+    submitForm(registerForm) {
+      this.$refs[registerForm].validate(valid => {
+        if (valid) {
+          this.savloading = true;
+          ContainerAddOrUpdate(this.registerForm).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.$emit('addsubmit');
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触'
+              });
+            }
+            this.savloading = false;
+          });
+        }
+      });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.palteEdit {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .palteEdit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/components/positionEdit.vue b/qqjf-Web/src/views/storage/components/positionEdit.vue
new file mode 100644
index 0000000..d4aca8b
--- /dev/null
+++ b/qqjf-Web/src/views/storage/components/positionEdit.vue
@@ -0,0 +1,178 @@
+<template>
+  <div class="storageEdit height overflow">
+    <div class="centent-form overflowy-auto">
+      <el-form
+        class="margin-auto width90"
+        ref="registerForm"
+        :model="registerForm"
+        size="mini"
+        :rules="rules"
+        label-position="left"
+        label-width="120px"
+      >
+        <el-form-item label="搴撲綅鍚嶇О:" prop="place">
+          <el-input :disabled="disabled" v-model="registerForm.place" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="搴撲綅绫诲瀷:" prop="placeType">
+          <el-input :disabled="disabled" v-model="registerForm.placeType" clearable></el-input>
+        </el-form-item>
+
+        <el-form-item label="鎺掓暟:" prop="row">
+          <el-input
+            oninput="value=value.replace(/[^\d.]/g,'')"
+            :disabled="disabled"
+            v-model="registerForm.row"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="鍒楁暟:" prop="col">
+          <el-input
+            oninput="value=value.replace(/[^\d.]/g,'')"
+            :disabled="disabled"
+            v-model="registerForm.col"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="灞傛暟:" prop="layer">
+          <el-input
+            oninput="value=value.replace(/[^\d.]/g,'')"
+            :disabled="disabled"
+            v-model="registerForm.layer"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="宸烽亾(鍫嗗灈鏈�)鍙�:" prop="creatorid">
+          <el-input :disabled="disabled" v-model="registerForm.srmId" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="闀�:" prop="creatorid">
+          <el-input oninput="value=value.replace(/[^\d.]/g,'')" v-model="registerForm.length" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="瀹�:" prop="creatorid">
+          <el-input oninput="value=value.replace(/[^\d.]/g,'')" v-model="registerForm.width" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="楂�:" prop="creatorid">
+          <el-input oninput="value=value.replace(/[^\d.]/g,'')" v-model="registerForm.height" clearable></el-input>
+        </el-form-item>
+            <el-form-item label="鏄惁閿佸畾:" prop="creatorid">
+          <el-select
+            v-model="registerForm.isLock"
+            clearable
+            placeholder="璇烽�夋嫨"
+          >
+            <el-option v-for="item in lockList" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="palteEdit-button text-right margin-right15 margin-top2">
+      <el-button
+        type="primary"
+        size="mini"
+        class="form-buttom"
+        :loading="savloading"
+        @click="submitForm('registerForm')"
+        >鎻愪氦</el-button
+      >
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { PlaceAddOrUpdate } from '@/api/position';
+export default {
+  data() {
+    return {
+      registerForm: {},
+      usernameList: [],
+         lockList:[
+         {
+          label: '鏄�',
+          value: 1
+        },
+        {
+          label: '鍚�',
+          value: 0
+        }
+      ],
+      disabled: false,
+      rules: {
+        deptName: { required: true, message: '璇疯緭閮ㄩ棬鍚嶇О', trigger: 'change' },
+        deptDes: { required: true, message: '璇疯緭鍏ラ儴闂ㄦ弿杩�', trigger: 'change' },
+        enable: { required: true, message: '璇烽�夋嫨鏄惁鍚敤', trigger: 'change' }
+      },
+      savloading: false
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: {}
+    }
+  },
+  mounted() {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.registerForm = this.rowitem;
+      this.registerForm.isLock== 1 ? '鏄�' : '鍚�';
+      this.disabled = true;
+    } else {
+      this.disabled = false;
+    }
+  },
+  methods: {
+    submitForm(registerForm) {
+      this.$refs[registerForm].validate(valid => {
+        if (valid) {
+          this.savloading = true;
+          PlaceAddOrUpdate(this.registerForm).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.$emit('addsubmit');
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触'
+              });
+            }
+          });
+          this.savloading = false;
+        }
+      });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.storageEdit {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .storageEdit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/components/storage-inquer.vue b/qqjf-Web/src/views/storage/components/storage-inquer.vue
new file mode 100644
index 0000000..96959cc
--- /dev/null
+++ b/qqjf-Web/src/views/storage/components/storage-inquer.vue
@@ -0,0 +1,424 @@
+<template>
+  <div class="flex align-center justify-between">
+    <div class="flex">
+      <el-button-group v-if="groupshow">
+        <el-button type="primary" size="mini" icon="el-icon-plus" @click="$emit('addmodal')">鏂板缓</el-button>
+        <el-button v-if="dele" type="primary" size="mini" icon="el-icon-delete">鍒犻櫎</el-button>
+      </el-button-group>
+      <el-button-group class="margin-left">
+        <div class="flex">
+          <el-upload
+            class="upload-demo"
+            ref="upload"
+            action=""
+            accept=".xls,.xlsx"
+            :show-file-list="false"
+            :http-request="httprequest"
+            v-if="imexcel"
+          >
+            <el-button style="margin-left: 10px" icon="el-icon-upload2" size="mini" type="success">瀵煎叆</el-button>
+          </el-upload>
+          <el-button
+            v-if="temp"
+            style="margin-left: 10px"
+            type="primary"
+            size="mini"
+            icon="el-icon-download"
+            @click="tempclick"
+            >妯℃澘</el-button
+          >
+          <el-button
+            v-if="derive"
+            style="margin-left: 10px"
+            type="primary"
+            size="mini"
+            icon="el-icon-download"
+            @click="$emit('derive')"
+            >瀵煎嚭</el-button
+          >
+          <el-button
+            v-if="setLimit"
+            style="margin-left: 10px"
+            type="success"
+            size="mini"
+            icon="el-icon-edit"
+            @click="$emit('setAllLimit')"
+            >鎵归噺璁剧疆涓婁笅绾�</el-button
+          >
+          <el-button
+            v-if="useLimit"
+            style="margin-left: 10px"
+            type="warning"
+            size="mini"
+            @click="$emit('changeUseLimitValue')"
+          >
+            <span class="btn-radio-outer">
+              <span class="btn-radio-flex" v-if="useLimitValue"><span class="btn-radio-inner"></span></span>
+            </span>
+            鍚敤涓婁笅绾垮垽鏂�
+          </el-button>
+        </div>
+      </el-button-group>
+
+      <el-button
+        class="margin-left"
+        v-if="refresh"
+        :loading="loading"
+        size="mini"
+        icon="el-icon-refresh"
+        @click="$emit('refresh')"
+        >鍒锋柊</el-button
+      >
+    </div>
+    <div class="width85 flex align-center justify-end">
+      <div class="flex width align-center justify-end margin-right">
+        <div v-if="isEmptyContainershow" class="flex align-center margin-right width25">
+          <label class="color909399 fontsizeinitial" :style="'width:' + fixWidth('鏄惁绌烘墭鐩�:') + 'px'"
+            >鏄惁绌烘墭鐩�:</label
+          >
+          <el-select class="width60" v-model="iqnuer.isEmptyContainer" size="mini" clearable>
+            <el-option
+              v-for="(item, index) in isEmptyContainerList"
+              :label="item.label"
+              :value="item.value"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </div>
+        <div v-if="isOverDayshow" class="flex align-center margin-right width25">
+          <label class="color909399 fontsizeinitial" :style="'width:' + fixWidth('鏄惁瓒呭簱瀛�:') + 'px'"
+            >鏄惁瓒呭簱瀛�:</label
+          >
+          <el-select class="width60" v-model="iqnuer.isOverDay" size="mini" clearable>
+            <el-option
+              v-for="(item, index) in isOverDayList"
+              :label="item.label"
+              :value="item.value"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </div>
+        <div v-if="isBadshow" class="flex align-center margin-right width25">
+          <label class="color909399 fontsizeinitial" :style="'width:' + fixWidth('鏄惁杩斾慨:') + 'px'">鏄惁杩斾慨:</label>
+          <el-select class="width60" v-model="iqnuer.isBad" size="mini" clearable>
+            <el-option
+              v-for="(item, index) in isBadList"
+              :label="item.label"
+              :value="item.value"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </div>
+        <div v-if="stStatusshow" class="flex align-center margin-right width25">
+          <label class="color909399 fontsizeinitial" :style="'width:' + fixWidth('搴撻緞鐘舵��:') + 'px'">搴撻緞鐘舵��:</label>
+          <el-select class="width60" v-model="iqnuer.stStatus" size="mini" clearable>
+            <el-option
+              v-for="(item, index) in stStatusList"
+              :label="item.label"
+              :value="item.value"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </div>
+        <div v-if="taskTypeshow" class="flex align-center margin-right width25">
+          <label class="color909399 fontsizeinitial" :style="'width:' + fixWidth('鍏ュ簱绫诲瀷:') + 'px'">鍏ュ簱绫诲瀷:</label>
+          <el-select class="width60" v-model="iqnuer.taskType" size="mini" clearable>
+            <el-option
+              v-for="(item, index) in taskTypeList"
+              :label="item.label"
+              :value="item.value"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </div>
+        <div v-if="isLockshow" class="flex align-center margin-right">
+          <label class="color909399 fontsizeinitial" :style="'width:' + fixWidth('鏄惁閿佸畾:') + 'px'">鏄惁閿佸畾:</label>
+          <el-select v-model="iqnuer.isLock" size="mini">
+            <el-option
+              v-for="(item, index) in isLocklist"
+              :label="item.label"
+              :value="item.value"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </div>
+        <el-input id="storageinquer" size="mini" clearable v-model="iqnuer[filter]" class="width30">
+          <el-select @change="selchange" v-model="filter" slot="prepend">
+            <el-option
+              v-for="(item, index) in filterList"
+              :label="item.label"
+              :value="item.value"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </el-input>
+      </div>
+      <el-button type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      filter: '',
+      iqnuer: { isLock: '', isOverDay: '' },
+      applytime: [],
+      isEmptyContainerList: [
+        {
+          label: '鏄�',
+          value: '鏄�'
+        },
+        {
+          label: '鍚�',
+          value: '鍚�'
+        }
+      ],
+      isOverDayList: [
+        {
+          label: '鍏ㄩ儴',
+          value: ''
+        },
+        {
+          label: '鏄�',
+          value: '鏄�'
+        },
+        {
+          label: '鍚�',
+          value: '鍚�'
+        }
+      ],
+      isBadList: [
+        {
+          label: '鏄�',
+          value: 1
+        },
+        {
+          label: '鍚�',
+          value: 0
+        }
+      ],
+      taskTypeList: [
+        {
+          label: '鏉庢钵鍏ュ簱',
+          value: '鏉庢钵鍏ュ簱'
+        },
+        {
+          label: '鍗冲ⅷ鍏ュ簱',
+          value: '鍗冲ⅷ鍏ュ簱'
+        },
+        {
+          label: 'EU绠卞叆绔嬩綋搴�',
+          value: 'EU绠卞叆绔嬩綋搴�'
+        },
+        {
+          label: '浣欐枡鍥炲簱',
+          value: '浣欐枡鍥炲簱'
+        }
+      ],
+      stStatusList: [
+        {
+          label: '姝e父',
+          value: '姝e父'
+        },
+        {
+          label: '棰勮',
+          value: '棰勮'
+        },
+        {
+          label: '瓒呮湡',
+          value: '瓒呮湡'
+        }
+      ],
+      isLocklist: [
+        {
+          label: '鍏ㄩ儴',
+          value: ''
+        },
+        {
+          label: '鍚�',
+          value: 0
+        },
+        {
+          label: '鏄�',
+          value: 1
+        }
+      ],
+
+      visible: false,
+      value1: ''
+    };
+  },
+  props: {
+    groupshow: {
+      type: Boolean,
+      default: true
+    },
+    temp: {
+      type: Boolean,
+      default: false
+    },
+    imexcel: {
+      type: Boolean,
+      default: false
+    },
+    setLimit: {
+      type: Boolean,
+      default: false
+    },
+    useLimit: {
+      type: Boolean,
+      default: false
+    },
+    useLimitValue: {
+      type: Boolean,
+      default: false
+    },
+    advanced: {
+      type: Boolean,
+      default: false
+    },
+    isOverDayshow: {
+      type: Boolean,
+      default: false
+    },
+    isBadshow: {
+      type: Boolean,
+      default: false
+    },
+    taskTypeshow: {
+      type: Boolean,
+      default: false
+    },
+    isLockshow: {
+      type: Boolean,
+      default: false
+    },
+    isEmptyContainershow: {
+      type: Boolean,
+      default: false
+    },
+    stStatusshow: {
+      type: Boolean,
+      default: false
+    },
+    dele: {
+      type: Boolean,
+      default: false
+    },
+    byfilter: {
+      type: String,
+      default: ''
+    },
+    filterList: {
+      type: Array,
+      default: () => []
+    },
+
+    derive: {
+      type: Boolean,
+      default: false
+    },
+    refresh: {
+      type: Boolean,
+      default: false
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  mounted() {
+    this.filter = this.byfilter;
+  },
+  methods: {
+    fixWidth(val) {
+      let length = 0;
+      if (val.indexOf('(') != -1) {
+        length = val.length * 16 + 10;
+      } else {
+        length = val.length * 20 - 30;
+      }
+      // if (length < 100) {
+      //   length = 85;
+      // }
+
+      return length;
+    },
+    inquer() {
+      this.$emit('inquer', this.iqnuer);
+    },
+    selchange() {
+      this.iqnuer = {};
+    },
+    httprequest(file) {
+      this.$emit('importfile', file);
+    },
+    //妯℃澘
+    tempclick() {
+      // let a = document.createElement('a');
+      // //  a.download = name + ".xls";
+      // a.href = '120.53.244.200:8085\ExcelTemple\闆朵欢瀵煎叆妯℃澘.xlsx';
+      // $('body').append(a); // 淇firefox涓棤娉曡Е鍙慶lick
+      // a.click();
+      // $(a).remove();
+      console.log(process.env.IMAGE_URL);
+      // window.location.href = 'http://10.103.9.200:8085/ExcelTemple/闆朵欢瀵煎叆妯℃澘.xlsx';
+      window.location.href = process.env.IMAGE_URL + 'ExcelTemple/闆朵欢瀵煎叆妯℃澘.xlsx';
+      // window.open('\ExcelTemple\闆朵欢瀵煎叆妯℃澘.xlsx');
+    }
+  },
+  watch: {
+    byfilter: {
+      handler(nvl, ovl) {
+        this.filter = nvl;
+      }
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#topinquer {
+  ::v-deep .el-select {
+    width: 100px;
+  }
+}
+#storageinquer {
+  ::v-deep .el-range-editor.el-input__inner {
+    padding: 3px;
+  }
+  .el-input__inner {
+    padding-left: 4px;
+    padding-right: 25px;
+  }
+}
+::v-deep .el-input-group__append,
+::v-deep .el-input-group__prepend {
+  width: 55px;
+  padding-left: 10px;
+  padding-right: 14px;
+}
+.btn-radio-outer {
+  display: inline-block;
+  width: 10px;
+  height: 10px;
+  border-radius: 50%;
+  border: 1px solid #fff;
+  margin-right: 6px;
+  .btn-radio-flex {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    .btn-radio-inner {
+      width: 6px;
+      height: 6px;
+      border-radius: 50%;
+      background-color: #fff;
+    }
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/components/storageEdit.vue b/qqjf-Web/src/views/storage/components/storageEdit.vue
new file mode 100644
index 0000000..0596208
--- /dev/null
+++ b/qqjf-Web/src/views/storage/components/storageEdit.vue
@@ -0,0 +1,173 @@
+<template>
+  <div class="storageEdit height overflow">
+    <div class="centent-form overflowy-auto">
+      <el-form
+        class="margin-auto width90"
+        ref="registerForm"
+        :model="registerForm"
+        size="mini"
+        :rules="rules"
+        label-position="left"
+        label-width="100px"
+      >
+        <!-- <el-form-item label="鍣ㄥ叿绉嶇被:" prop="enable">
+          <el-select v-model="registerForm.enable" clearable placeholder="璇烽�夋嫨">
+            <el-option v-for="item in enableList" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item> -->
+        <el-form-item label="浠撳簱缂栫爜:" prop="deptName">
+          <el-input v-model="registerForm.deptName" clearable></el-input>
+        </el-form-item>
+
+        <el-form-item label="浠撳簱鍚嶇О:" prop="creatorid">
+          <el-input v-model="registerForm.deptDes" autocomplete="off" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鏄惁鍙敤:" prop="creatorid">
+          <el-input v-model="registerForm.deptDes" autocomplete="off" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="澶囨敞:" prop="creatorid">
+          <el-input v-model="registerForm.deptDes" autocomplete="off" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鎺掑簭鍙�:" prop="creatorid">
+          <el-input v-model="registerForm.deptDes" autocomplete="off" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鍒嗘嫞璐т綅绫诲瀷:" prop="creatorid">
+          <el-input v-model="registerForm.deptDes" autocomplete="off" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="浠撳簱鍦板潃:" prop="creatorid">
+          <el-input v-model="registerForm.deptDes" autocomplete="off" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鍏徃鍚嶇О:" prop="creatorid">
+          <el-input type="number" v-model="registerForm.deptDes" autocomplete="off" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="濮撳悕:" prop="creatorid">
+          <el-select v-model="registerForm.enable" clearable placeholder="璇烽�夋嫨">
+            <el-option v-for="item in enableList" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鐢佃瘽鍙风爜:" prop="creatorid">
+          <el-input v-model="registerForm.deptDes" autocomplete="off" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鎵嬫満:" prop="creatorid">
+          <el-select v-model="registerForm.enable" clearable placeholder="璇烽�夋嫨">
+            <el-option v-for="item in enableList" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鍒涘缓浜�:" prop="creatorid">
+          <el-input v-model="registerForm.deptDes" autocomplete="off" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鏄惁鍙敤:" prop="creatorid">
+          <el-switch v-model="registerForm.sortable" :active-value="true" :inactive-value="false"> </el-switch>
+        </el-form-item>
+        <el-form-item label="澶囨敞:" prop="creatorid">
+          <el-input v-model="registerForm.deptDes" autocomplete="off" clearable></el-input>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="palteEdit-button text-right margin-right15 margin-top2">
+      <el-button
+        type="primary"
+        size="mini"
+        class="form-buttom"
+        :loading="savloading"
+        @click="submitForm('registerForm')"
+        >鎻愪氦</el-button
+      >
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { DeptAddOrUpdate } from '@/api/manage';
+export default {
+  data() {
+    return {
+      registerForm: {},
+      usernameList: [],
+      enableList: [
+        {
+          label: '鍚敤',
+          value: 1
+        },
+        {
+          label: '绂佺敤',
+          value: 0
+        }
+      ],
+
+      rules: {
+        deptName: { required: true, message: '璇疯緭閮ㄩ棬鍚嶇О', trigger: 'change' },
+        deptDes: { required: true, message: '璇疯緭鍏ラ儴闂ㄦ弿杩�', trigger: 'change' },
+        enable: { required: true, message: '璇烽�夋嫨鏄惁鍚敤', trigger: 'change' }
+      },
+      savloading: false
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: {}
+    }
+  },
+  mounted() {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      const { DEPTNAME, DEPTDES, ENABLE } = this.rowitem;
+      this.registerForm = {
+        deptName: DEPTNAME,
+        deptDes: DEPTDES,
+        enable: ENABLE == 1 ? '鍚敤' : '绂佺敤'
+      };
+    }
+  },
+  methods: {
+    submitForm(registerForm) {
+      this.registerForm.enable =
+        this.registerForm.enable == '鍚敤' ? 1 : this.registerForm.enable == '绂佺敤' ? 0 : this.registerForm.enable;
+      this.$refs[registerForm].validate(valid => {
+        if (valid) {
+          this.savloading = true;
+          DeptAddOrUpdate(this.registerForm).then(res => {
+            this.savloading = false;
+            this.$emit('addsubmit');
+          });
+        } else {
+        }
+      });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.storageEdit {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .storageEdit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/components/viewdataInquer.vue b/qqjf-Web/src/views/storage/components/viewdataInquer.vue
new file mode 100644
index 0000000..4af8252
--- /dev/null
+++ b/qqjf-Web/src/views/storage/components/viewdataInquer.vue
@@ -0,0 +1,141 @@
+<template>
+  <div class="flex align-center justify-between">
+    <div class="flex align-center">
+      <p class="">褰撳墠宸烽亾锛歿{ iqnuer.storageNo }}</p>
+      <p class="margin-left">褰撳墠鎺掓暟锛歿{ iqnuer.row }}</p>
+    </div>
+    <div id="topinquer" class="flex align-center">
+      <div class="flex align-center margin-right">
+        <p>宸烽亾锛�</p>
+        <el-select size="mini" v-model="iqnuer.storageNo" @change="storageNochange">
+          <el-option
+            v-for="(item, index) in storageNoList"
+            :label="item.label"
+            :value="item.value"
+            :key="index"
+          ></el-option>
+        </el-select>
+      </div>
+      <div class="flex align-center margin-right">
+        <p style="width: 36%">绗嚑鎺掞細</p>
+        <el-select size="mini" v-model="iqnuer.row">
+          <el-option v-for="(item, index) in rowList" :label="item.label" :value="item.value" :key="index"></el-option>
+        </el-select>
+      </div>
+      <el-button type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      iqnuer: {
+        storageNo: '1',
+        row: '1'
+      },
+      storageNoList: [
+        {
+          label: '1',
+          value: 1
+        },
+        {
+          label: '2',
+          value: 2
+        },
+        {
+          label: '3',
+          value: 3
+        },
+
+        {
+          label: '4',
+          value: 4
+        },
+        {
+          label: '5',
+          value: 5
+        },
+
+        {
+          label: '6',
+          value: 6
+        },
+        {
+          label: '7',
+          value: 7
+        },
+        {
+          label: '8',
+          value: 8
+        },
+        {
+          label: '9',
+          value: 9
+        }
+      ],
+      rowList: [
+        {
+          label: '1',
+          value: 1
+        },
+        {
+          label: '2',
+          value: 2
+        }
+      ],
+
+      visible: false,
+      value1: ''
+    };
+  },
+
+  mounted() {},
+  methods: {
+    inquer() {
+      this.$emit('inquer', this.iqnuer);
+    },
+    storageNochange() {
+      this.iqnuer.row = 1;
+      if (this.iqnuer.storageNo == 1 || this.iqnuer.storageNo == 5) {
+        this.rowList = [
+          {
+            label: '1',
+            value: 1
+          },
+          {
+            label: '2',
+            value: 2
+          }
+        ];
+      } else {
+        this.rowList = [
+          {
+            label: '1',
+            value: 1
+          },
+          {
+            label: '2',
+            value: 2
+          },
+          {
+            label: '3',
+            value: 3
+          },
+          {
+            label: '4',
+            value: 4
+          }
+        ];
+      }
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+#topinquer {
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/components/viewdatainfo.vue b/qqjf-Web/src/views/storage/components/viewdatainfo.vue
new file mode 100644
index 0000000..fe6d891
--- /dev/null
+++ b/qqjf-Web/src/views/storage/components/viewdatainfo.vue
@@ -0,0 +1,77 @@
+<template>
+  <div class="viewdata fixed width height overflow">
+    <div class="box-modal borderR8">
+      <div class="title-modal">
+        <p class="p-title">
+          <slot name="title"></slot>
+        </p>
+        <i class="el-icon-close pointer fontSize1_2" @click="$emit('cancel')"></i>
+      </div>
+      <div class="centent-modal">
+        <!-- <el-scrollbar wrap-class="scrollbar-wrapper" style="height:100%"> -->
+        <slot name="centent"></slot>
+        <!-- </el-scrollbar> -->
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  },
+
+  mounted() {},
+  methods: {},
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.viewdata {
+  top: 0;
+  left: 0;
+  z-index: 999;
+  background: rgba(0, 0, 0, 0.5);
+  .box-modal {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    width: 45%;
+    height: 60%;
+    border-radius: 6px;
+    transform: translate(-50%, -50%);
+    background: #fff;
+    box-shadow: 0 0 4px #345;
+    // transition: all 0.5s;
+    overflow: hidden;
+    .title-modal {
+      padding: 10px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      border-bottom: 1px solid #e6eaf1;
+      background: #f5f7fa;
+      .p-title {
+        font-size: 20px;
+        padding-left: 5px;
+      }
+      .fontSize1_2 {
+        font-size: 20px;
+        margin-right: 15px;
+        &:hover {
+          transition: all 0.3s;
+          transform: rotate(360deg);
+        }
+      }
+    }
+    .centent-modal {
+      width: 98%;
+      height: calc(100% - 62px);
+      padding: 1%;
+      overflow: hidden;
+    }
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/index.vue b/qqjf-Web/src/views/storage/index.vue
new file mode 100644
index 0000000..1ca3ac4
--- /dev/null
+++ b/qqjf-Web/src/views/storage/index.vue
@@ -0,0 +1,11 @@
+<template>
+  <keep-alive>
+    <router-view />
+  </keep-alive>
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/storage/setting/cass-line/index.vue b/qqjf-Web/src/views/storage/setting/cass-line/index.vue
new file mode 100644
index 0000000..8fa35a6
--- /dev/null
+++ b/qqjf-Web/src/views/storage/setting/cass-line/index.vue
@@ -0,0 +1,169 @@
+<template>
+  <!-- 浠撳簱淇℃伅 -->
+  <div id="cassline" class="global-content">
+    <!-- 绛涢�� -->
+    <storage-inquer
+      byfilter="鐝嚎缂栧彿"
+      :groupshow="true"
+      :dele="false"
+      :filterList="filterList"
+      @addmodal="addmodal"
+      @inquer="inquer"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        @edit="edit"
+        @del="del"
+        @SizeChange="SizeChange"
+        @CurrentChange="CurrentChange"
+      />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow" :modabg="true" @cancel="addmodalShow = false">
+        <p slot="title">璐т綅绠$悊-{{ title }}</p>
+        <div class="height" slot="centent">
+          <cassline-edit @cancel="addmodalShow = false" :rowitem="rowitem" @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import StorageInquer from '../../components/storage-inquer';
+import CasslineEdit from '../../components/casslineEdit';
+const { cassline } = require('@/components/tableContainer/tableHead');
+import { ProductionLineSearch, ProductionLineDelete } from '@/api/cass-line';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: [],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      pageNum: 0,
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '鐝嚎缂栧彿',
+          label: '鐝嚎缂栧彿'
+        },
+        {
+          value: '鐝嚎鍚嶇О',
+          label: '鐝嚎鍚嶇О'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, StorageInquer, Modal, CasslineEdit },
+  computed: {
+    tableHead() {
+      return cassline;
+    }
+  },
+  mounted() {
+    this.ProductionLineSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.inuqerobg = e;
+      this.page = 1;
+      this.ProductionLineSearch();
+    },
+    //鎼滅储鐢ㄦ埛
+    ProductionLineSearch() {
+      this.$Loading(true);
+      const { 鐝嚎缂栧彿: productionCode, 鐝嚎鍚嶇О: productionName } = this.inuqerobg;
+      ProductionLineSearch(this.page + '&onePageNum=' + this.pageSize, { productionCode, productionName }).then(res => {
+        if (res.code == 0) {
+          this.tableData = res.data;
+          this.totle = res.num;
+          this.pageNum = res.pageNum;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.ProductionLineSearch();
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.PlaceVsContainer();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { productionCode } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ョ彮绾�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          ProductionLineDelete({ productionCode }).then(res => {
+            this.$message({
+              type: 'success',
+              message: '鍒犻櫎鎴愬姛!'
+            });
+            this.ProductionLineSearch();
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.ProductionLineSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#cassline {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/setting/choose/components/limitModal.vue b/qqjf-Web/src/views/storage/setting/choose/components/limitModal.vue
new file mode 100644
index 0000000..34cc2ed
--- /dev/null
+++ b/qqjf-Web/src/views/storage/setting/choose/components/limitModal.vue
@@ -0,0 +1,139 @@
+<template>
+  <el-dialog
+    class="project-modal"
+    title="鎵归噺璁剧疆涓婁笅绾�"
+    :visible.sync="innerVisible"
+    :close-on-click-modal="false"
+    width="500px"
+    @opened="onModalOpened"
+    @close="onModalClose"
+  >
+    <div class="storage-setting-choose-limit-modal" v-loading="loading">
+      <el-form label-width="70px" ref="form" :model="form" :rules="rules" size="mini" @submit.native.prevent>
+        <!-- <el-form-item label="浠诲姟鍙凤細">{{ row.task_no }}</el-form-item>
+        <el-form-item label="褰撳墠浼樺厛绾э細">{{ row.task_priority }}</el-form-item> -->
+        <el-form-item label-width="0px">
+          <el-radio-group v-model="form.setType">
+            <el-radio :label="item.value" v-for="(item, index) in types" :key="'set-type-' + index">{{
+              item.label
+            }}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="闄愬畾鍊硷細" prop="number">
+          <el-input-number v-model="form.number" :min="0" />
+        </el-form-item>
+      </el-form>
+    </div>
+    <span slot="footer" class="dialog-footer">
+      <el-button @click="onClose">鍏� 闂�</el-button>
+      <el-button type="primary" @click="onSubmit">鎻愪氦</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+import { UpdateMinStorage, UpdateMaxStorage } from '@/api/enterchoose';
+const defaultForm = {
+  setType: 'minStorage',
+  number: ''
+};
+export default {
+  name: 'storageSettingChooseLimitModal',
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      innerVisible: false,
+      loading: false,
+      form: { ...defaultForm },
+      types: [
+        { value: 'minStorage', label: '鏈�灏忓簱瀹�' },
+        { value: 'maxStorage', label: '鏈�澶у簱瀹�' }
+      ],
+      rules: {
+        number: [{ validator: this.validateInput, trigger: 'change' }]
+      }
+    };
+  },
+  watch: {
+    visible(newVal, oldVal) {
+      if (newVal !== this.innerVisible) {
+        this.innerVisible = newVal;
+      }
+    },
+    innerVisible(newVal, oldVal) {
+      if (newVal !== this.visible) {
+        this.$emit('update:visible', newVal);
+      }
+    }
+  },
+  methods: {
+    onModalOpened() {},
+    onModalClose() {
+      this.form = { ...defaultForm };
+    },
+    onClose() {
+      this.innerVisible = false;
+    },
+    onSubmit() {
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          this.dealSubmit();
+        } else {
+          return false;
+        }
+      });
+    },
+    validateInput(rule, value, callback) {
+      if (value === '' || value === null) {
+        callback(new Error('璇风‘璁ら檺瀹氬��'));
+      } else if (value !== parseInt(value)) {
+        callback(new Error('闄愬畾鍊煎彧鑳芥槸鏁存暟'));
+      } else if (value < 0) {
+        callback(new Error('闄愬畾鍊间笉鍙皬浜�0'));
+      } else {
+        callback();
+      }
+    },
+    dealSubmit() {
+      if (this.loading) return false;
+      this.loading = true;
+      let params = {};
+      params[this.form.setType] = this.form.number;
+      this.submitAjax(params)
+        .then(response => {
+          if (response.code == 0) {
+            this.$message.success('鎿嶄綔鎴愬姛锛�');
+          } else {
+            let msg = response.msg || '鎿嶄綔澶辫触';
+            this.$alert(msg, '绯荤粺鎻愮ず', { type: 'error' });
+          }
+          this.loading = false;
+          if (response.code == 0) {
+            this.innerVisible = false;
+          }
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+    submitAjax(params) {
+      if (this.form.setType === 'minStorage') {
+        return UpdateMinStorage(params);
+      } else {
+        return UpdateMaxStorage(params);
+      }
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.storage-setting-choose-limit-modal {
+  padding: 12px 8px 0px 18px;
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/setting/choose/index.vue b/qqjf-Web/src/views/storage/setting/choose/index.vue
new file mode 100644
index 0000000..9259bb6
--- /dev/null
+++ b/qqjf-Web/src/views/storage/setting/choose/index.vue
@@ -0,0 +1,365 @@
+<template>
+  <!-- 闆朵欢绠$悊 -->
+  <div id="choose" class="global-content">
+    <!-- 绛涢�� -->
+    <storage-inquer
+      byfilter="闆朵欢缂栧彿"
+      :groupshow="true"
+      :derive="true"
+      :dele="false"
+      :imexcel="true"
+      :temp="true"
+      :set-limit="true"
+      :use-limit="true"
+      :use-limit-value="useLimitValue"
+      :filterList="filterList"
+      @addmodal="addmodal"
+      @inquer="inquer"
+      @derive="derive"
+      @importfile="importfile"
+      @changeUseLimitValue="changeUseLimitValue"
+      @setAllLimit="onOpenLimitModal"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        :naxnumShow="false"
+        @edit="edit"
+        @del="del"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+      />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow" :modabg="true" @cancel="addmodalShow = false">
+        <p slot="title">闆朵欢绠$悊-{{ title }}</p>
+        <div class="height" slot="centent">
+          <choose-edit
+            @cancel="addmodalShow = false"
+            :rowitem="rowitem"
+            @addsubmit="addsubmit"
+            :containerTypeList="containerTypeList"
+          />
+        </div>
+      </modal>
+    </transition>
+
+    <limit-modal :visible.sync="limitModalVisible"></limit-modal>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import StorageInquer from '../../components/storage-inquer';
+import chooseEdit from '../../components/chooseEdit';
+import { exportTableList } from '@/utils/excel';
+import { getymdhms } from '@/utils/date';
+import { getCache, setCache, removeToken } from '@/utils/sessionStorage';
+const { edterchoose } = require('@/components/tableContainer/tableHead');
+import {
+  itemSearch,
+  ItemDelete,
+  ImportItemInfo,
+  GetAllItem,
+  SearchStorageEnable,
+  UpdateStorageEnable
+} from '@/api/enterchoose';
+import { ContainerTypeSearch } from '@/api/inventory';
+import XLSX from 'xlsx';
+import LimitModal from './components/limitModal.vue';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: ['inOrderCode'],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      pageNum: 0,
+      inuqerobg: {},
+      containerTypeList: [],
+      filterList: [
+        {
+          value: '闆朵欢缂栧彿',
+          label: '闆朵欢缂栧彿'
+        },
+        {
+          value: '闆朵欢鎻忚堪',
+          label: '闆朵欢鎻忚堪'
+        },
+        {
+          value: '鐢熶骇鐝嚎',
+          label: '鐢熶骇鐝嚎'
+        }
+      ],
+      useLimitValue: false,
+      limitModalVisible: false
+    };
+  },
+  components: { TableContainer, StorageInquer, Modal, chooseEdit, LimitModal },
+  computed: {
+    tableHead() {
+      return edterchoose;
+    }
+  },
+  mounted() {
+    this.searchStorageEnable(f => {
+      if (f) {
+        this.itemSearch();
+        this.ContainerTypeSearch();
+      }
+    });
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.inuqerobg = e;
+      this.page = 1;
+      this.itemSearch();
+    },
+    //瀵煎叆
+    importfile(e) {
+      this.readExcel(e);
+    },
+    //瀵煎嚭
+    derive() {
+      let tHeader = [];
+      let filterVal = [];
+      GetAllItem().then(res => {
+        res.forEach(item => (item.isLock = item.isLock == 1 ? '鏄�' : item.isLock == 0 ? '鍚�' : item.isLock));
+        this.tableHead.forEach(item => {
+          tHeader.push(item.columnDescription);
+          filterVal.push(item.columnName);
+        });
+        exportTableList(tHeader, filterVal, res, '闆朵欢绠$悊' + getymdhms());
+      });
+    },
+    searchStorageEnable(callback) {
+      SearchStorageEnable()
+        .then(d => {
+          if (d.code === 0) {
+            this.useLimitValue = true;
+          } else {
+            this.useLimitValue = false;
+          }
+          callback && callback(true);
+        })
+        .catch(err => {
+          callback && callback(false);
+        });
+    },
+    changeUseLimitValue() {
+      let msg = '鏄惁纭瑕�';
+      if (this.useLimitValue) {
+        msg += '鍏抽棴';
+      } else {
+        msg += '鍚敤';
+      }
+      msg += '涓婁笅绾垮垽鏂紵';
+      this.$confirm(msg, '绯荤粺鎻愮ず', {
+        type: 'warning'
+      })
+        .then(() => {
+          this.dealChangeUseLimitValue();
+        })
+        .catch(() => {});
+    },
+    dealChangeUseLimitValue() {
+      this.$Loading(true);
+      let params = { storageEnable: 1 };
+      if (this.useLimitValue) {
+        params.storageEnable = 0;
+      }
+      UpdateStorageEnable(params)
+        .then(d => {
+          this.$Loading();
+          if (d.code === 0) {
+            this.useLimitValue = !this.useLimitValue;
+            this.$message.success('鎿嶄綔鎴愬姛');
+          } else {
+            let msg = d.msg || '鎿嶄綔澶辫触';
+            this.$alert(msg, '绯荤粺鎻愮ず', { type: 'error' });
+          }
+        })
+        .catch(() => {
+          this.$Loading();
+        });
+    },
+    //鎼滅储闆朵欢
+    itemSearch() {
+      console.log(process.env.IMAGE_URL);
+      var url = process.env.IMAGE_URL;
+      this.$Loading(true);
+      const { 闆朵欢缂栧彿: itemName, 闆朵欢鎻忚堪: itemDes, 鐢熶骇鐝嚎: createLine } = this.inuqerobg;
+      itemSearch(this.page + '&onePageNum=' + this.pageSize, { itemName, itemDes, createLine }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.image = process.env.IMAGE_URL + item.image;
+          });
+          this.tableData = data;
+          this.totle = res.num;
+          this.pageNum = res.pageNum;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      this.page = e;
+      this.itemSearch();
+    },
+    ContainerTypeSearch() {
+      ContainerTypeSearch().then(res => {
+        if (res != null && res != []) {
+          let data = res || [];
+          this.containerTypeList = data;
+        }
+      });
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.itemSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      const { itemName } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ラ浂浠朵俊鎭�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          ItemDelete({ itemName }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛!'
+              });
+              this.itemSearch();
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.itemSearch();
+    },
+    readExcel(e) {
+      // 璇诲彇琛ㄦ牸鏂囦欢
+      let _this = this;
+      const files = e.file;
+      // debugger;
+      if (files.length <= 0) {
+        return false;
+      } else if (!/\.(xls|xlsx)$/.test(files.name.toLowerCase())) {
+        this.$message({
+          message: '涓婁紶鏍煎紡涓嶆纭紝璇蜂笂浼爔ls鎴栬�厁lsx鏍煎紡',
+          type: 'warning'
+        });
+        return false;
+      } else {
+        // 鏇存柊鑾峰彇鏂囦欢鍚�
+        console.log(files);
+      }
+
+      const fileReader = new FileReader();
+      fileReader.onload = ev => {
+        try {
+          const data = ev.target.result;
+          const workbook = XLSX.read(data, {
+            type: 'binary'
+          });
+          const wsname = workbook.SheetNames[0]; //鍙栫涓�寮犺〃
+          const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]); //鐢熸垚json琛ㄦ牸鍐呭
+          let list = [];
+
+          ws.forEach(item => {
+            list.push({
+              itemName: item['闆朵欢缂栧彿'],
+              itemDes: item['闆朵欢鎻忚堪'],
+              unit: item['鍗曚綅'],
+              price: item['鍗曚环'],
+              weight: item['閲嶉噺'],
+              weightDifference: item['鍗曚釜鍏樊'],
+              createLine: item['鐢熶骇鐝嚎'],
+              maxNum: item['瑁呯鏁伴噺'],
+              maxStorage: item['搴撳鏈�澶ч噺'],
+              minStorage: item['搴撳鏈�灏忛噺'],
+              overDueTime: item['瓒呮湡鏃堕棿(/澶�)']
+            });
+          });
+          _this.ImportItemInfo(JSON.stringify(list));
+        } catch (e) {
+          return false;
+        }
+      };
+      fileReader.readAsBinaryString(files);
+    },
+    //瀵煎叆鎺ュ彛
+    ImportItemInfo(list) {
+      ImportItemInfo({ userName: getCache('userInfo').userName, items: list }).then(res => {
+        if (res.code == 0) {
+          this.$message({
+            type: 'success',
+            message: '瀵煎叆鎴愬姛'
+          });
+        } else {
+          this.$message({
+            type: 'warning',
+            message: '瀵煎叆澶辫触锛佽鎸夌収妯℃澘濉叆鍐呭'
+          });
+        }
+      });
+      this.itemSearch();
+    },
+    onOpenLimitModal() {
+      this.limitModalVisible = true;
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#choose {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/setting/forklift/index.vue b/qqjf-Web/src/views/storage/setting/forklift/index.vue
new file mode 100644
index 0000000..634b035
--- /dev/null
+++ b/qqjf-Web/src/views/storage/setting/forklift/index.vue
@@ -0,0 +1,176 @@
+<template>
+  <!-- 鍙夎溅绠$悊 -->
+  <div id="forklift" class="global-content">
+    <!-- 绛涢�� -->
+    <storage-inquer
+      byfilter="鍙夎溅鍚�"
+      :groupshow="true"
+      :dele="false"
+      :filterList="filterList"
+      @addmodal="addmodal"
+      @inquer="inquer"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        :naxnumShow="false"
+        @edit="edit"
+        @del="del"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+      />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow" :modabg="true" @cancel="addmodalShow = false">
+        <p slot="title">鍙夎溅绠$悊-{{ title }}</p>
+        <div class="height" slot="centent">
+          <forklift-edit @cancel="addmodalShow = false" :rowitem="rowitem" @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import StorageInquer from '../../components/storage-inquer';
+import forkliftEdit from '../../components/forkliftEdit';
+const { forklift } = require('@/components/tableContainer/tableHead');
+import { CarSearch, CarDelete } from '@/api/forklift';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: ['inOrderCode'],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      pageNum: 0,
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '鍙夎溅鍚�',
+          label: '鍙夎溅鍚�'
+        },
+        {
+          value: '鍙夎溅鍙�',
+          label: '鍙夎溅鍙�'
+        },
+        {
+          value: '椹鹃┒鍛�',
+          label: '椹鹃┒鍛�'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, StorageInquer, Modal, forkliftEdit },
+  computed: {
+    tableHead() {
+      return forklift;
+    }
+  },
+  mounted() {
+    this.CarSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.inuqerobg = e;
+      this.page = 1;
+      this.CarSearch();
+    },
+    //鎼滅储鐢ㄦ埛
+    CarSearch() {
+      this.$Loading(true);
+      const { 鍙夎溅鍚�: carName, 鍙夎溅鍙�: carCode, 椹鹃┒鍛�: userName} = this.inuqerobg;
+      CarSearch(this.page + '&onePageNum=' + this.pageSize, { carName, carCode, userName }).then(res => {
+        if (res.code == 0) {
+          this.tableData = res.data;
+          this.totle = res.num;
+          this.pageNum = res.pageNum;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.CarSearch();
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.CarSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { carName } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          CarDelete({ carName }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛!'
+              });
+              this.CarSearch();
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.CarSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#forklift {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/setting/index.vue b/qqjf-Web/src/views/storage/setting/index.vue
new file mode 100644
index 0000000..1cb60c6
--- /dev/null
+++ b/qqjf-Web/src/views/storage/setting/index.vue
@@ -0,0 +1,9 @@
+<template>
+  <router-view />
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/storage/setting/palte/index.vue b/qqjf-Web/src/views/storage/setting/palte/index.vue
new file mode 100644
index 0000000..81a472b
--- /dev/null
+++ b/qqjf-Web/src/views/storage/setting/palte/index.vue
@@ -0,0 +1,196 @@
+<template>
+  <!-- 浠撳簱淇℃伅 -->
+  <div id="palte" class="global-content">
+    <!-- 绛涢�� -->
+    <storage-inquer
+      byfilter="鍣ㄥ叿缂栧彿"
+      :filterList="filterList"
+      :derive="true"
+      :dele="false"
+      @addmodal="addmodal"
+      @inquer="inquer"
+      @derive="derive"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        @edit="edit"
+        @del="del"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+      />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow" :modabg="true" @cancel="addmodalShow = false">
+        <p slot="title">鍣ㄥ叿绠$悊-{{ title }}</p>
+        <div class="height" slot="centent">
+          <palte-edit @cancel="addmodalShow = false" :rowitem="rowitem" @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import StorageInquer from '../../components/storage-inquer';
+import PalteEdit from '../../components/palteEdit';
+import { exportTableList } from '@/utils/excel';
+import { getymdhms } from '@/utils/date';
+const { palte } = require('@/components/tableContainer/tableHead');
+import { ContainerSearch, ContainerDelete, GetAllContainer } from '@/api/palte';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: [],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '鍣ㄥ叿缂栧彿',
+          label: '鍣ㄥ叿缂栧彿'
+        },
+        {
+          value: '鍣ㄥ叿瑙勬牸',
+          label: '鍣ㄥ叿瑙勬牸'
+        },
+        {
+          value: '瑙勬牸鎻忚堪',
+          label: '瑙勬牸鎻忚堪'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, StorageInquer, Modal, PalteEdit },
+  computed: {
+    tableHead() {
+      return palte;
+    }
+  },
+  mounted() {
+    this.ContainerSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      console.log(e);
+      this.inuqerobg = e;
+      this.page = 1;
+      this.ContainerSearch();
+    },
+    //鎼滅储鐢ㄦ埛
+    ContainerSearch() {
+      this.$Loading(true);
+      const { 鍣ㄥ叿缂栧彿: containerName, 鍣ㄥ叿瑙勬牸: containerType, 瑙勬牸鎻忚堪: palletType } = this.inuqerobg;
+      ContainerSearch(this.page + '&onePageNum=' + this.pageSize, { containerName, containerType, palletType }).then(
+        res => {
+          if (res.code == 0) {
+            this.tableData = res.data;
+            this.totle = res.num;
+          }
+          this.$Loading();
+        }
+      );
+    },
+    //瀵煎嚭
+    derive() {
+      let tHeader = [];
+      let filterVal = [];
+      GetAllContainer().then(res => {
+        res.forEach(item => (item.isLock = item.isLock == 1 ? '鏄�' : item.isLock == 0 ? '鍚�' : item.isLock));
+        this.tableHead.forEach(item => {
+          tHeader.push(item.columnDescription);
+          filterVal.push(item.columnName);
+        });
+        exportTableList(tHeader, filterVal, res, '鍣ㄥ叿绠$悊' + getymdhms());
+      });
+    },
+    CurrentChange(e) {
+      this.page = e;
+      this.ContainerSearch();
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.ContainerSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { containerName } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎閫変腑鐨勬暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          ContainerDelete({ containerName }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛!'
+              });
+              this.ContainerSearch();
+            } else {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎澶辫触!'
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.ContainerSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#palte {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/setting/position/index.vue b/qqjf-Web/src/views/storage/setting/position/index.vue
new file mode 100644
index 0000000..224aa52
--- /dev/null
+++ b/qqjf-Web/src/views/storage/setting/position/index.vue
@@ -0,0 +1,170 @@
+<template>
+  <!-- 浠撳簱淇℃伅 -->
+  <div id="position" class="global-content">
+    <!-- 绛涢�� -->
+    <storage-inquer
+      byfilter="璐т綅鍚嶇О"
+      :groupshow="false"
+      :dele="true"
+      :isLockshow="true"
+      :filterList="filterList"
+      @addmodal="addmodal"
+      @inquer="inquer"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        @edit="edit"
+        @del="del"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+      />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow" :modabg="true" @cancel="addmodalShow = false">
+        <p slot="title">璐т綅绠$悊-{{ title }}</p>
+        <div class="height" slot="centent">
+          <position-edit @cancel="addmodalShow = false" :rowitem="rowitem" @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import StorageInquer from '../../components/storage-inquer';
+import PositionEdit from '../../components/positionEdit';
+const { position } = require('@/components/tableContainer/tableHead');
+import { PlaceSearch, UserDelete } from '@/api/position';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: [],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      pageNum: 0,
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '璐т綅鍚嶇О',
+          label: '璐т綅鍚嶇О'
+        },
+        {
+          value: '搴撲綅瑙勬牸',
+          label: '搴撲綅瑙勬牸'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, StorageInquer, Modal, PositionEdit },
+  computed: {
+    tableHead() {
+      return position;
+    }
+  },
+  mounted() {
+    this.PlaceSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.inuqerobg = e;
+      this.page = 1;
+      this.PlaceSearch();
+    },
+    //鎼滅储鐢ㄦ埛
+    PlaceSearch() {
+      this.$Loading(true);
+      const { 璐т綅鍚嶇О: place, 搴撲綅绫诲瀷: placeType, isLock } = this.inuqerobg;
+      PlaceSearch(this.page + '&onePageNum=' + this.pageSize, { place, placeType, isLock }).then(res => {
+        if (res.code == 0) {
+          this.tableData = res.data;
+          this.totle = res.num;
+          this.pageNum = res.pageNum;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.PlaceSearch();
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.PlaceSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+      this.addmodalShow = true;
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { USERNAME } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ョ敤鎴�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          // UserDelete({ userName: USERNAME }).then(res => {
+          //   this.$message({
+          //     type: 'success',
+          //     message: '鍒犻櫎鎴愬姛!'
+          //   });
+          //   this.PlaceSearch();
+          // });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.PlaceSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#position {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/storage/setting/storage-area/index.vue b/qqjf-Web/src/views/storage/setting/storage-area/index.vue
new file mode 100644
index 0000000..e904c17
--- /dev/null
+++ b/qqjf-Web/src/views/storage/setting/storage-area/index.vue
@@ -0,0 +1,9 @@
+<template>
+  <div></div>
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/storage/setting/storage/index.vue b/qqjf-Web/src/views/storage/setting/storage/index.vue
new file mode 100644
index 0000000..53de4ae
--- /dev/null
+++ b/qqjf-Web/src/views/storage/setting/storage/index.vue
@@ -0,0 +1,136 @@
+<template>
+  <!-- 浠撳簱淇℃伅 -->
+  <div id="storage" class="global-content">
+    <!-- 绛涢�� -->
+    <storage-inquer @addmodal="addmodal" />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :totle="totle"
+        @edit="edit"
+        @del="del"
+        @handleSizeChange="handleSizeChange"
+      />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow" :modabg="true" @cancel="addmodalShow = false">
+        <p slot="title">浠撳簱绠$悊-{{ title }}</p>
+        <div class="height" slot="centent">
+          <storage-edit @cancel="addmodalShow = false" :rowitem="rowitem" @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import StorageInquer from '../../components/storage-inquer';
+import StorageEdit from '../../components/storageEdit';
+const { storage } = require('@/components/tableContainer/tableHead');
+// import { UserSearch, UserDelete } from '@/api/storage';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: [],
+      rowitem: {},
+      totle: 0,
+      page: 1
+    };
+  },
+  components: { TableContainer, StorageInquer, Modal, StorageEdit },
+  computed: {
+    tableHead() {
+      return storage;
+    }
+  },
+  mounted() {
+    this.UserSearch();
+  },
+  methods: {
+    //鎼滅储鐢ㄦ埛
+    UserSearch() {
+      this.$Loading(true);
+      UserSearch(this.page).then(res => {
+        if (res.code == 0) {
+          // this.tableData = res.data;
+          // this.totle = res.num;
+        }
+      });
+    },
+    handleSizeChange(e) {
+      console.log(e);
+      this.page = e;
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.PlaceSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { USERNAME } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          UserDelete({ userName: USERNAME }).then(res => {
+            this.$message({
+              type: 'success',
+              message: '鍒犻櫎鎴愬姛!'
+            });
+            this.UserSearch();
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.UserSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#storage {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/system/index.vue b/qqjf-Web/src/views/system/index.vue
new file mode 100644
index 0000000..1ca3ac4
--- /dev/null
+++ b/qqjf-Web/src/views/system/index.vue
@@ -0,0 +1,11 @@
+<template>
+  <keep-alive>
+    <router-view />
+  </keep-alive>
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/system/user/components/deptEdit.vue b/qqjf-Web/src/views/system/user/components/deptEdit.vue
new file mode 100644
index 0000000..458a81a
--- /dev/null
+++ b/qqjf-Web/src/views/system/user/components/deptEdit.vue
@@ -0,0 +1,135 @@
+<template>
+  <div class="manageEdit height overflow">
+    <div class="centent-form overflowy-auto">
+      <el-form
+        ref="registerForm"
+        :model="registerForm"
+        size="mini"
+        :rules="rules"
+        label-position="left"
+        label-width="100px"
+      >
+        <el-form-item label="閮ㄩ棬鍚嶇О:" prop="deptName">
+          <el-input v-model="registerForm.deptName" clearable></el-input>
+        </el-form-item>
+
+        <el-form-item label="閮ㄩ棬鎻忚堪:" prop="creatorid">
+          <el-input v-model="registerForm.deptDes" autocomplete="off" clearable></el-input>
+        </el-form-item>
+
+        <el-form-item label="鏄惁鍚敤:" prop="enable">
+          <el-select v-model="registerForm.enable" clearable placeholder="璇烽�夋嫨">
+            <el-option v-for="item in enableList" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="manageedit-button text-right">
+      <el-button
+        type="primary"
+        size="mini"
+        class="form-buttom"
+        :loading="savloading"
+        @click="submitForm('registerForm')"
+        >鎻愪氦</el-button
+      >
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { DeptAddOrUpdate } from '@/api/dept';
+export default {
+  data() {
+    return {
+      registerForm: {
+        deptName: '',
+        deptDes: '',
+        enable: ''
+      },
+      passwordType: 'password',
+      usernameList: [],
+      enableList: [
+        {
+          label: '鍚敤',
+          value: 1
+        },
+        {
+          label: '绂佺敤',
+          value: 0
+        }
+      ],
+      rules: {
+        deptName: { required: true, message: '璇疯緭閮ㄩ棬鍚嶇О', trigger: 'change' },
+        deptDes: { required: true, message: '璇疯緭鍏ラ儴闂ㄦ弿杩�', trigger: 'change' },
+        enable: { required: true, message: '璇烽�夋嫨鏄惁鍚敤', trigger: 'change' }
+      },
+      savloading: false
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: {}
+    }
+  },
+  mounted() {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.registerForm = this.rowitem;
+      // const { DEPTNAME, DEPTDES, ENABLE } = this.rowitem;
+      // this.registerForm = {
+      //   deptName: DEPTNAME,
+      //   deptDes: DEPTDES,
+      //   enable: ENABLE == 1 ? '鍚敤' : '绂佺敤'
+      // };
+    }
+  },
+  methods: {
+    submitForm(registerForm) {
+      this.registerForm.enable =
+        this.registerForm.enable == '鍚敤' ? 1 : this.registerForm.enable == '绂佺敤' ? 0 : this.registerForm.enable;
+      this.$refs[registerForm].validate(valid => {
+        if (valid) {
+          this.savloading = true;
+          DeptAddOrUpdate(this.registerForm).then(res => {
+            this.$emit('addsubmit');
+            this.savloading = false;
+          });
+        }
+      });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.manageEdit {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 92%;
+    margin: auto;
+  }
+  .manageedit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/system/user/components/manageEdit.vue b/qqjf-Web/src/views/system/user/components/manageEdit.vue
new file mode 100644
index 0000000..7ad3364
--- /dev/null
+++ b/qqjf-Web/src/views/system/user/components/manageEdit.vue
@@ -0,0 +1,199 @@
+<template>
+  <div class="manageEdit height overflow">
+    <div class="centent-form overflowy-auto">
+      <el-form ref="registerForm"
+               :model="registerForm"
+               size="mini"
+               :rules="rules"
+               label-position="left"
+               label-width="100px">
+        <el-form-item label="鐧诲綍鍚�:"
+                      prop="userName">
+          <el-input v-model="registerForm.userName"
+                    clearable></el-input>
+        </el-form-item>
+
+        <el-form-item prop="password"
+                      label="瀵嗙爜:">
+          <el-input :key="passwordType"
+                    ref="password"
+                    v-model="registerForm.password"
+                    :type="passwordType"
+                    placeholder=""
+                    name="password"
+                    tabindex="2"
+                    autocomplete="on" />
+          <span class="show-pwd"
+                @click="showPwd">
+            <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" />
+          </span>
+        </el-form-item>
+        <el-form-item label="鐪熷疄濮撳悕:"
+                      prop="userTrueName">
+          <el-input v-model="registerForm.userTrueName"
+                    clearable></el-input>
+        </el-form-item>
+
+        <el-form-item label="閮ㄩ棬:"
+                      prop="deptName">
+          <!-- <el-input v-model="registerForm.deptName" autocomplete="off" clearable></el-input> -->
+          <el-select v-model="registerForm.deptName"
+                     filterable
+                     clearable
+                     placeholder="璇烽�夋嫨">
+            <el-option v-for="(item, index) in deptList"
+                       :key="index + 'deptName'"
+                       :label="item.deptName"
+                       :value="item.deptName">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="瑙掕壊鍚�:"
+                      prop="roleName">
+          <!-- <el-input v-model="registerForm.rolename" clearable></el-input> -->
+          <el-select v-model="registerForm.roleName"
+                     filterable
+                     clearable
+                     placeholder="璇烽�夋嫨">
+            <el-option v-for="(item, index) in usernameList"
+                       :key="index + 'rolname'"
+                       :label="item.roleName"
+                       :value="item.roleName">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label=""
+                      prop="IsWeldingAuditGroup">
+          <el-checkbox v-model="registerForm.IsWeldingAuditGroup">鏄惁鐒婅瀹℃牳缁�</el-checkbox>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="manageedit-button text-right">
+      <el-button type="primary"
+                 size="mini"
+                 class="form-buttom"
+                 :loading="savloading"
+                 @click="submitForm('registerForm')">鎻愪氦</el-button>
+      <el-button type="primary"
+                 size="mini"
+                 class="form-buttom"
+                 @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { AddOrUpdate } from '@/api/manage';
+import { DeptSearch } from '@/api/dept';
+import { RoleSearch } from '@/api/role';
+export default {
+  data () {
+    return {
+      registerForm: {
+        userName: '',
+        password: '',
+        userTrueName: '',
+        deptName: '',
+        roleName: '',
+        IsWeldingAuditGroup: false
+      },
+      passwordType: 'password',
+      usernameList: [],
+      deptList: [],
+      rules: {
+        userName: { required: true, message: '璇疯緭鐧诲綍鍚�', trigger: 'change' },
+        password: { required: true, message: '璇疯緭鍏ュ瘑鐮�', trigger: 'change' },
+        userTrueName: { required: true, message: '璇疯緭鍏ョ湡瀹炲鍚�', trigger: 'change' },
+        deptName: { required: true, message: '璇疯緭鍏ラ儴闂�', trigger: 'change' },
+        roleName: { required: true, message: '璇疯緭鍏ヨ鑹插悕', trigger: 'change' }
+      },
+      savloading: false
+    };
+  },
+  props: {
+    rowitem: {
+      type: [Object, Array],
+      default: {}
+    }
+  },
+  mounted () {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.registerForm = this.rowitem;
+      //console.log('IsWeldingAuditGroup' + this.registerForm.IsWeldingAuditGroup);
+    }
+    this.DeptSearch();
+    this.RoleSearch();
+  },
+  methods: {
+    //缁欓暱瀹介珮璧嬪��
+    DeptSearch () {
+      DeptSearch('1&onePageNum=999').then(res => {
+        if (res.code == 0) {
+          this.deptList = res.data;
+        }
+      });
+    },
+    //瑙掕壊
+    RoleSearch () {
+      RoleSearch('1&onePageNum=999').then(res => {
+        if (res.code == 0) {
+          this.usernameList = res.data;
+        }
+      });
+    },
+    showPwd () {
+      if (this.passwordType === 'password') {
+        this.passwordType = '';
+      } else {
+        this.passwordType = 'password';
+      }
+      this.$nextTick(() => {
+        this.$refs.password.focus();
+      });
+    },
+    submitForm (registerForm) {
+      this.$refs[registerForm].validate(valid => {
+        if (valid) {
+          let params = { ...this.registerForm }
+          delete params.passWord;
+          this.savloading = true;
+          AddOrUpdate(params).then(res => {
+            this.$emit('addsubmit');
+            this.savloading = false;
+          });
+        }
+      });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.manageEdit {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 92%;
+    margin: auto;
+  }
+  .manageedit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/system/user/components/roleEdIt.vue b/qqjf-Web/src/views/system/user/components/roleEdIt.vue
new file mode 100644
index 0000000..3485690
--- /dev/null
+++ b/qqjf-Web/src/views/system/user/components/roleEdIt.vue
@@ -0,0 +1,139 @@
+<template>
+  <div class="manageEdit height overflow">
+    <div class="centent-form overflowy-auto">
+      <el-form
+        ref="registerForm"
+        :model="registerForm"
+        size="mini"
+        :rules="rules"
+        label-position="left"
+        label-width="100px"
+      >
+        <el-form-item label="瑙掕壊鍚嶇О:" prop="roleName">
+          <el-input v-model="registerForm.roleName" clearable></el-input>
+        </el-form-item>
+
+        <el-form-item label="鍒涘缓鐢ㄦ埛:" prop="creatorId">
+          <el-input v-model="registerForm.creatorId" autocomplete="off" clearable></el-input>
+        </el-form-item>
+
+        <el-form-item label="鏄惁鍚敤:" prop="enable">
+          <el-select v-model="registerForm.enable" clearable placeholder="璇烽�夋嫨">
+            <el-option v-for="item in enableList" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="manageedit-button text-right">
+      <el-button
+        type="primary"
+        size="mini"
+        class="form-buttom"
+        :loading="savloading"
+        @click="submitForm('registerForm')"
+        >鎻愪氦</el-button
+      >
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { RoleAddOrUpdate } from '@/api/role';
+export default {
+  data() {
+    return {
+      registerForm: {
+        roleName: '',
+        creatorId: '',
+        enable: ''
+      },
+      enableList: [
+        {
+          label: '鍚敤',
+          value: 1
+        },
+        {
+          label: '绂佺敤',
+          value: 0
+        }
+      ],
+      rules: {
+        roleName: { required: true, message: '璇疯緭瑙掕壊鍚嶇О', trigger: 'change' },
+        creatorId: { required: true, message: '璇疯緭鍏ュ垱寤虹敤鎴�', trigger: 'change' },
+        enable: { required: true, message: '璇烽�夋嫨鏄惁鍚敤', trigger: 'change' }
+      },
+      savloading: false
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: {}
+    }
+  },
+  mounted() {
+    console.log(this.rowitem);
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.registerForm = this.rowitem;
+      // const { ROLENAME, ENABLE, CREATORID } = this.rowitem;
+      // this.registerForm = {
+      //   roleName: ROLENAME,
+      //   creatorid: CREATORID,
+      //   enable: ENABLE == 1 ? '鍚敤' : '绂佺敤'
+      // };
+    }
+  },
+  methods: {
+    submitForm(registerForm) {
+      console.log(this.registerForm);
+      this.registerForm.enable =
+        this.registerForm.enable == '鍚敤' ? 1 : this.registerForm.enable == '绂佺敤' ? 0 : this.registerForm.enable;
+      this.$refs[registerForm].validate(valid => {
+        if (valid) {
+          this.savloading = true;
+          RoleAddOrUpdate(this.registerForm).then(res => {
+            this.$emit('addsubmit');
+            this.savloading = false;
+          });
+        }
+      });
+    }
+  },
+  watch: {
+    rowitem: {
+      handler(nvl, ovl) {}
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.manageEdit {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 92%;
+    margin: auto;
+  }
+  .manageedit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/system/user/components/topinquer.vue b/qqjf-Web/src/views/system/user/components/topinquer.vue
new file mode 100644
index 0000000..59f89db
--- /dev/null
+++ b/qqjf-Web/src/views/system/user/components/topinquer.vue
@@ -0,0 +1,120 @@
+<template>
+  <div class="flex align-center justify-between">
+    <div class="">
+      <el-button-group>
+        <el-button type="primary"
+                   size="mini"
+                   icon="el-icon-plus"
+                   @click="$emit('addmodal')">鏂板缓</el-button>
+        <el-button v-if="delshow"
+                   type="primary"
+                   size="mini"
+                   icon="el-icon-delete">鍒犻櫎</el-button>
+      </el-button-group>
+    </div>
+    <div id="topinquer"
+         class="flex align-center">
+      <div class="flex align-center margin-right">
+        <el-checkbox v-model="iqnuer.IsWeldingAuditGroup">鏄惁鐒婅瀹℃牳缁�</el-checkbox>
+      </div>
+      <div class="flex align-center margin-right">
+        <!-- <el-input size="mini" v-model="iqnuer" clearable class="input-with-select" /> -->
+        <el-input size="mini"
+                  clearable
+                  v-model="iqnuer[filter]"
+                  class="input-with-select">
+          <el-select @change="selchange"
+                     v-model="filter"
+                     slot="prepend">
+            <el-option v-for="(item, index) in filterList"
+                       :label="item.label"
+                       :value="item.value"
+                       :key="index"></el-option>
+          </el-select>
+        </el-input>
+      </div>
+      <el-button type="primary"
+                 size="mini"
+                 @click="inquer">鏌ヨ</el-button>
+
+      <!-- <el-popover v-if="advanced" placement="bottom" title="楂樼骇鏌ヨ" width="400" trigger="manual" v-model="visible">
+        <div>
+          <div class="width flex margin-right align-center justify-between">
+            <label class="width30 text-right">淇敼鏃堕棿锛�</label>
+            <el-date-picker
+              v-model="applytime"
+              type="datetimerange"
+              clearable
+              size="mini"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              range-separator="鑷�"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+              :default-time="['00:00:00', '23:59:59']"
+            >
+            </el-date-picker>
+          </div>
+        </div>
+        <span slot="reference" class="margin-left color409EFF pointer" @click="visible = !visible">楂樼骇</span>
+      </el-popover> -->
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      iqnuer: {},
+      applytime: [],
+      filter: '',
+      visible: false,
+      value1: ''
+    };
+  },
+  props: {
+    advanced: {
+      type: Boolean,
+      default: false
+    },
+    delshow: {
+      type: Boolean,
+      default: false
+    },
+    byfilter: {
+      type: String,
+      default: ''
+    },
+    filterList: {
+      type: Array,
+      default: () => []
+    }
+  },
+  mounted () {
+    this.filter = this.byfilter;
+  },
+  methods: {
+    inquer () {
+      this.$emit('inquer', this.iqnuer);
+    },
+    selchange () {
+      this.iqnuer = {};
+    }
+  },
+  watch: {
+    byfilter: {
+      handler (nvl, ovl) {
+        this.filter = nvl;
+      }
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#topinquer {
+  ::v-deep .el-select {
+    width: 100px;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/system/user/dept/index.vue b/qqjf-Web/src/views/system/user/dept/index.vue
new file mode 100644
index 0000000..d7bbbde
--- /dev/null
+++ b/qqjf-Web/src/views/system/user/dept/index.vue
@@ -0,0 +1,165 @@
+<template>
+  <!-- 閮ㄩ棬绠$悊 -->
+  <div id="dept" class="global-content">
+    <!-- 绛涢�� -->
+    <top-inquer byfilter="閮ㄩ棬鍚嶇О" :filterList="filterList" @addmodal="EditmodalShow = true" @inquer="inquer" />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        @edit="edit"
+        @del="del"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+      />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="EditmodalShow" :modabg="true" @cancel="EditmodalShow = false">
+        <p slot="title">缁勭粐鏋舵瀯-{{ title }}</p>
+        <div class="height" slot="centent">
+          <dept-edit :rowitem="rowitem" @addsubmit="addsubmit" @cancel="EditmodalShow = false" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import TopInquer from '../components/topinquer';
+import DeptEdit from '../components/deptEdit';
+const { dept } = require('@/components/tableContainer/tableHead');
+import { DeptSearch, DeptDelete } from '@/api/dept';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      EditmodalShow: false,
+      wipelist: [],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '閮ㄩ棬鍚嶇О',
+          label: '閮ㄩ棬鍚嶇О'
+        },
+        {
+          value: '閮ㄩ棬鎻忚堪',
+          label: '閮ㄩ棬鎻忚堪'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, TopInquer, Modal, DeptEdit },
+  computed: {
+    tableHead() {
+      return dept;
+    }
+  },
+  mounted() {
+    this.DeptSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.inuqerobg = e;
+      this.DeptSearch(e);
+    },
+    //鎼滅储鏁版嵁
+    DeptSearch(e) {
+      this.$Loading(true);
+      const { 閮ㄩ棬鍚嶇О: deptName, 閮ㄩ棬鎻忚堪: deptDes } = this.inuqerobg;
+      DeptSearch(this.page + '&onePageNum=' + this.pageSize, { deptName, deptDes }).then(res => {
+        if (res.code == 0) {
+          this.tableData = res.data;
+          this.totle = res.num;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      this.page = e;
+      this.DeptSearch(e);
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.DeptSearch();
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { deptName } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ラ儴闂ㄤ俊鎭�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          DeptDelete({ deptName }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛!'
+              });
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鍒犻櫎澶辫触!'
+              });
+            }
+
+            this.DeptSearch();
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //缂栬緫
+    edit(row) {
+      this.rowitem = { ...row };
+      this.EditmodalShow = true;
+      this.title = '缂栬緫';
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.EditmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.EditmodalShow = false;
+      this.DeptSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#dept {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/system/user/index.vue b/qqjf-Web/src/views/system/user/index.vue
new file mode 100644
index 0000000..1cb60c6
--- /dev/null
+++ b/qqjf-Web/src/views/system/user/index.vue
@@ -0,0 +1,9 @@
+<template>
+  <router-view />
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/system/user/manage/index.vue b/qqjf-Web/src/views/system/user/manage/index.vue
new file mode 100644
index 0000000..2373a56
--- /dev/null
+++ b/qqjf-Web/src/views/system/user/manage/index.vue
@@ -0,0 +1,172 @@
+<template>
+  <!-- 鐢ㄦ埛绠$悊 -->
+  <div id="manage"
+       class="global-content">
+    <!-- 绛涢�� -->
+    <top-inquer byfilter="鐧诲綍鍚�"
+                :filterList="filterList"
+                @addmodal="addmodal"
+                @inquer="inquer" />
+    <!-- table -->
+    <div class="table">
+      <table-container :wipelist="wipelist"
+                       :tableHead="tableHead"
+                       :tableData="tableData"
+                       :editShow="true"
+                       :delShow="true"
+                       :currentPage="page"
+                       :pageSize="pageSize"
+                       :totle="totle"
+                       @edit="edit"
+                       @del="del"
+                       @CurrentChange="CurrentChange"
+                       @SizeChange="SizeChange" />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow"
+             :modabg="true"
+             @cancel="addmodalShow = false">
+        <p slot="title">鍏徃鍛樺伐-{{ title }}</p>
+        <div class="height"
+             slot="centent">
+          <manage-edit @cancel="addmodalShow = false"
+                       :rowitem="rowitem"
+                       @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import TopInquer from '../components/topinquer';
+const { manage } = require('@/components/tableContainer/tableHead');
+import ManageEdit from '../components/manageEdit';
+import { UserSearch, UserDelete } from '@/api/manage';
+export default {
+  data () {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: [],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '鐧诲綍鍚�',
+          label: '鐧诲綍鍚�'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, TopInquer, Modal, ManageEdit },
+  computed: {
+    tableHead () {
+      return manage;
+    }
+  },
+  mounted () {
+    this.UserSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer (e) {
+      console.log(e);
+      this.inuqerobg = e;
+      this.UserSearch();
+    },
+    //鎼滅储鐢ㄦ埛
+    UserSearch () {
+      this.$Loading(true);
+      const { 鐧诲綍鍚�: userName, IsWeldingAuditGroup: IsWeldingAuditGroup } = this.inuqerobg;
+      UserSearch(this.page + '&onePageNum=' + this.pageSize, { userName, IsWeldingAuditGroup }).then(res => {
+        if (res.code == 0) {
+          this.tableData = res.data;
+          this.totle = res.num;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange (e) {
+      console.log(e);
+      this.page = e;
+      this.UserSearch();
+    },
+    //椤垫暟
+    SizeChange (e) {
+      this.pageSize = e;
+      this.UserSearch();
+    },
+    //缂栬緫
+    edit (row) {
+      this.rowitem = { ...row };
+      this.addmodalShow = true;
+
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del (row) {
+      console.log(row);
+      const { userName } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ョ敤鎴�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          UserDelete({ userName }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛!'
+              });
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鍒犻櫎澶辫触!'
+              });
+            }
+
+            this.UserSearch();
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal () {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit () {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.UserSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#manage {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/system/user/role/index.vue b/qqjf-Web/src/views/system/user/role/index.vue
new file mode 100644
index 0000000..3fab029
--- /dev/null
+++ b/qqjf-Web/src/views/system/user/role/index.vue
@@ -0,0 +1,156 @@
+<template>
+  <!-- 瑙掕壊绠$悊 -->
+  <div id="role" class="global-content">
+    <!-- 绛涢�� -->
+    <top-inquer byfilter="瑙掕壊鍚嶇О" :filterList="filterList" :advanced="true" @addmodal="addmodal" @inquer="inquer" />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :totle="totle"
+        :currentPage="page"
+        :pageSize="pageSize"
+        @del="del"
+        @edit="edit"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+      />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="EditmodalShow" :modabg="true" @cancel="EditmodalShow = false">
+        <p slot="title">瑙掕壊绠$悊-{{ title }}</p>
+        <div class="height" slot="centent">
+          <role-edit :rowitem="rowitem" @addsubmit="addsubmit" @cancel="EditmodalShow = false" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import TopInquer from '../components/topinquer';
+import RoleEdit from '../components/roleEdIt';
+const { role } = require('@/components/tableContainer/tableHead');
+import { RoleSearch, RoleDelete } from '@/api/role';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      EditmodalShow: false,
+      wipelist: [],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '瑙掕壊鍚嶇О',
+          label: '瑙掕壊鍚嶇О'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, TopInquer, Modal, RoleEdit },
+  computed: {
+    tableHead() {
+      return role;
+    }
+  },
+  mounted() {
+    this.RoleSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      console.log(e);
+      this.inuqerobg = e;
+      this.RoleSearch();
+    },
+    //鏌ヨ鐢ㄦ埛
+    RoleSearch() {
+      this.$Loading(true);
+      const { 瑙掕壊鍚嶇О: roleName } = this.inuqerobg;
+      RoleSearch(this.page + '&onePageNum=' + this.pageSize, { roleName }).then(res => {
+        if (res.code == 0) {
+          this.tableData = res.data;
+          this.totle = res.num;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.RoleSearch();
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.RoleSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.EditmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { roleName } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ョ敤鎴�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          RoleDelete({ roleName }).then(res => {
+            this.$message({
+              type: 'success',
+              message: '鍒犻櫎鎴愬姛!'
+            });
+            this.RoleSearch();
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.EditmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.EditmodalShow = false;
+      this.modalShow = false;
+      this.RoleSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#role {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/system/user/roleAuth/index.vue b/qqjf-Web/src/views/system/user/roleAuth/index.vue
new file mode 100644
index 0000000..f5348bf
--- /dev/null
+++ b/qqjf-Web/src/views/system/user/roleAuth/index.vue
@@ -0,0 +1,360 @@
+<template>
+  <div id="role-auth" class="global-content">
+    <div class="width height overflow flex align-start justify-around">
+      <div class="width20 height99 left-aside overflow">
+        <div class="left-role-title" @click="refresh">璇烽�夋嫨瑙掕壊</div>
+        <div class="width height-calc40 overflowy-auto">
+          <template v-for="(item, index) in roleList">
+            <div
+              @click="activeclick(item, index)"
+              class="pointer paddingtopbottom textindex2 hover"
+              :class="activeindex == index ? 'color409EFF backgroundecf5ff' : ''"
+              :key="index + 'role'"
+            >
+              {{ item.roleName }}
+            </div>
+          </template>
+        </div>
+      </div>
+      <div class="width78 height overflow">
+        <el-tabs v-model="currentTab" type="card" class="width height" @tab-click="handleClick">
+          <el-tab-pane class="width height" label="瑙掕壊鏉冮檺璁剧疆" name="user">
+            <div ref="el-main" class="height" style="padding: 0">
+              <el-card class="box-card height99 overflow">
+                <div slot="header" class="clearfix">
+                  <span>瑙掕壊鏉冮檺璁剧疆 - {{ title }}</span>
+                </div>
+                <tree-table
+                  ref="tree-table"
+                  :data="menuList"
+                  :expand-all="expandAll"
+                  height="100%"
+                  border
+                  class="heightclacimport overflow"
+                  tree-column-label="鑿滃崟鍚嶇О"
+                  @row-selected="rowSelected"
+                >
+                  <el-table-column label="鏉冮檺鐐�">
+                    <template slot-scope="scope">
+                      <el-checkbox
+                        v-for="(item, index) in scope.row.auth"
+                        :key="index"
+                        v-model="item.value"
+                        :true-label="1"
+                        :false-label="0"
+                        :checked="!!item.value"
+                        @change="checkAuthNode(scope.row)"
+                        >{{ item.label }}</el-checkbox
+                      >
+                    </template>
+                  </el-table-column>
+                </tree-table>
+                <div class="tool absolute bottom7">
+                  <el-button :loading="loading" type="primary" size="mini" @click="saveAuth">淇濆瓨</el-button>
+                </div>
+              </el-card>
+            </div>
+          </el-tab-pane>
+          <el-tab-pane class="width height" label="APP鏉冮檺璁剧疆" name="app">
+            <el-main ref="el-main" class="height" style="padding: 0">
+              <el-card class="box-card height99 overflow">
+                <div slot="header" class="clearfix">
+                  <span>APP鏉冮檺璁剧疆 - {{ title }}</span>
+                </div>
+                <tree-table
+                  ref="tree-table"
+                  :data="menuList"
+                  :expand-all="expandAll"
+                  height="100%"
+                  class="heightclacimport overflow"
+                  border
+                  tree-column-label="鑿滃崟鍚嶇О"
+                  @row-selected="rowSelected"
+                >
+                  <el-table-column label="鏉冮檺鐐�">
+                    <template slot-scope="scope">
+                      <el-checkbox
+                        v-for="(item, index) in scope.row.auth"
+                        :key="index"
+                        v-model="item.value"
+                        :true-label="1"
+                        :false-label="0"
+                        :checked="!!item.value"
+                        @change="checkAuthNode(scope.row)"
+                        >{{ item.label }}</el-checkbox
+                      >
+                    </template>
+                  </el-table-column>
+                </tree-table>
+                <div class="tool absolute bottom7">
+                  <el-button :loading="loading" type="primary" size="mini" @click="saveAuth">淇濆瓨</el-button>
+                </div>
+              </el-card>
+            </el-main>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import treeTable from '@/components/TreeTable';
+import { getCache, setCache } from '@/utils/sessionStorage';
+import { SearchPermission, AddOrUpdateRoleVsPermission, GetUserRoleAllPermission } from '@/api/role-auth';
+import { RoleSearch } from '@/api/role';
+export default {
+  name: 'sys-permission-role-auth',
+  components: { treeTable },
+  data() {
+    return {
+      title: '[璇烽�夋嫨宸︿晶瑙掕壊鍚嶇О]',
+      // 鍔犺浇鐘舵��
+      loading: false,
+      expandAll: true,
+      activeindex: -1,
+      // 閫変腑瑙掕壊
+      currentRoleInfo: {},
+      // 宸︿晶瀵艰埅闆嗗悎
+      roleList: [],
+      // 鍙充晶琛ㄦ牸鏍戞潈闄愬垪琛ㄩ泦鍚�
+      menuList: [],
+      // 闇�瑕佷繚瀛樼殑瑙掕壊鏉冮檺闆嗗悎
+      saveMenuList: [],
+      currentTab: 'user',
+      // 鍙充晶琛ㄦ牸鏍慉PP鏉冮檺鍒楄〃闆嗗悎
+      menuAppList: [],
+      // app閫変腑瑙掕壊
+      currentAppRoleInfo: {},
+      role_Id: null,
+      types: 1,
+      tablabel: ''
+    };
+  },
+  mounted() {
+    this.RoleSearch();
+    // this.GetUserRoleAllPermission();
+  },
+  methods: {
+    //鍒锋柊
+    refresh() {
+      this.activeindex = -1;
+      this.GetUserRoleAllPermission();
+    },
+    // 宸︿晶鍔犺浇鏁版嵁
+    RoleSearch() {
+      RoleSearch('1&onePageNum=999').then(res => {
+        if (res.code == 0) {
+          this.roleList = res.data;
+        }
+      });
+    },
+    // 宸︿晶鑿滃崟鐐瑰嚮浜嬩欢
+    activeclick(item, index) {
+      this.activeindex = index;
+      // var item = node.$attrs.item;
+      // this.currentRoleInfo = item;
+      this.$Loading(true);
+      this.title = item.roleName;
+
+      this.GetUserRoleAllPermission(item.roleName);
+    },
+    // 鑾峰緱鎵�鏈夋潈闄愬彸渚ц〃鏍兼爲鍒楄〃
+    GetUserRoleAllPermission(e) {
+      this.$Loading(true);
+      this.menuList = [];
+      GetUserRoleAllPermission({ roleName: this.title, type: this.types }).then(res => {
+        if (res.code == 0) {
+          if (e) {
+            let data = res.data;
+            let curcir = element => {
+              element.forEach(item => {
+                // item.isSelected = true;
+                if (item.children) {
+                  curcir(item.children);
+                }
+                // if (item.value == 0) {
+                //   item.isSelected = false;
+                // }
+              });
+            };
+            let Selected = element => {
+              element.forEach(item => {
+                if (item.auth) {
+                  let auth = item.auth;
+                  auth.forEach(i => {
+                    if (i.value == 1) {
+                      item.isSelected = true;
+                    }
+                  });
+                }
+                if (item.children) {
+                  Selected(item.children);
+                }
+              });
+            };
+            Selected(data);
+            curcir(data);
+            data.forEach(element => {
+              if (element.children) {
+                let item = element.children;
+                item.forEach(i => {
+                  if (i.isSelected) {
+                    element.isSelected = true;
+                  }
+                });
+              }
+              if (element.menuName == '棣栭〉') {
+                element.isSelected = true;
+              }
+            });
+            console.log(data);
+            this.menuList = data;
+          } else {
+            this.menuList = res.data;
+          }
+        }
+        this.$Loading();
+      });
+    },
+    // 鏉冮檺鐐规敼鍙�
+    checkAuthNode(row) {
+      row.auth.forEach(item => {
+        if (item.value == 1) {
+          row.isSelected = true;
+          if (row.parent) {
+            row.parent.isSelected = true;
+          }
+        }
+      });
+    },
+    // 鏍戝墠闈㈠閫夋閫変腑
+    rowSelected(isSelected, row) {
+      let circulation = element => {
+        element.forEach(item => {
+          if (row.parentId == item.menu_Id) {
+            item.isSelected = row.isSelected;
+          } else {
+            if (item.children) {
+              circulation(item.children);
+            }
+          }
+        });
+      };
+      let setValue = authList => {
+        if (authList) {
+          authList.forEach(item => {
+            item.value = isSelected ? 1 : 0;
+          });
+        }
+      };
+      let eachChildren = children => {
+        if (children) {
+          children.forEach(item => {
+            item.isSelected = isSelected;
+            setValue(item.auth);
+            eachChildren(item.children);
+            // 鏀瑰彉淇濆瓨鏁版嵁闆嗗悎
+            this.checkAuthNode(item);
+          });
+        }
+      };
+      setValue(row.auth);
+      eachChildren(row.children);
+    },
+    // 淇濆瓨鏁版嵁
+    saveAuth() {
+      let list = [];
+      //鑾峰彇鍕鹃�夌殑
+      let savlist = element => {
+        element.forEach(item => {
+          if (item.isSelected) {
+            list.push(item.menu_Id);
+          }
+          if (item.children) {
+            savlist(item.children);
+          }
+          if (item.value == 1) {
+            list.push(item.menu_Id);
+          }
+          if (item.auth) {
+            savlist(item.auth);
+          }
+        });
+      };
+      savlist(this.menuList);
+      if (list.length == 0) {
+        this.$message.error('娌℃湁鍙繚瀛樼殑鏁版嵁锛�');
+        return;
+      }
+      const { roleName } = getCache('userInfo');
+      if (this.title == '[璇烽�夋嫨宸︿晶瑙掕壊鍚嶇О]') {
+        this.$message.error('璇烽�夋嫨瑙掕壊');
+      } else {
+        this.$Loading(true);
+        AddOrUpdateRoleVsPermission({ roleName: this.title, permissionNameList: JSON.stringify(list) }).then(res => {
+          if (res.code == 0) {
+            this.$message({
+              type: 'success',
+              message: '淇敼鎴愬姛'
+            });
+          } else {
+            this.$message({
+              type: 'warning',
+              message: res.msg
+            });
+          }
+          this.$Loading();
+        });
+      }
+    },
+    // 澶撮儴鍒囨崲
+    handleClick(tab, event) {
+      this.activeindex = -1;
+      this.title = '';
+      this.tablabel = tab.label;
+      if (tab.label === 'APP鏉冮檺璁剧疆') {
+        this.types = 2;
+        this.GetUserRoleAllPermission();
+      }
+      if (tab.label === '瑙掕壊鏉冮檺璁剧疆') {
+        this.types = 1;
+        this.GetUserRoleAllPermission();
+      }
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.left-aside {
+  box-shadow: 0 0 4px #eaedef;
+  .left-role-title {
+    padding: 8px 10px;
+    background-color: #66b1ff;
+    color: white;
+  }
+}
+.box-card {
+  ::v-deep .el-card__body {
+    padding: 10px;
+    height: calc(100% - 75px);
+    .el-checkbox:first-child {
+      margin-left: 0px;
+    }
+    .el-checkbox + .el-checkbox {
+      margin-left: 0px;
+    }
+    .el-checkbox__label {
+      padding-left: 2px;
+    }
+  }
+}
+</style>
+<style lang="scss">
+#role-auth {
+  .el-tabs__content {
+    height: calc(100% - 60px) !important;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/task/components/forklifttasksEdit.vue b/qqjf-Web/src/views/task/components/forklifttasksEdit.vue
new file mode 100644
index 0000000..a4f95bb
--- /dev/null
+++ b/qqjf-Web/src/views/task/components/forklifttasksEdit.vue
@@ -0,0 +1,254 @@
+<template>
+  <div class="forklifttasksEdit height overflow">
+    <div class="centent-form overflowy-auto">
+      <el-form
+        class="margin-auto width90"
+        ref="registerForm"
+        :model="registerForm"
+        size="mini"
+        :rules="rules"
+        label-position="left"
+        label-width="100px"
+      >
+        <el-form-item label="浠诲姟缂栧彿:" prop="carTaskName">
+          <el-input disabled v-model="registerForm.carTaskName" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鐩殑鍦�:" prop="toDestination">
+          <!-- <el-input v-model="registerForm.toDestination" clearable></el-input> -->
+          <el-select v-model="registerForm.toDestination" filterable clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="(item, index) in toDestinationList"
+              :key="index + 'toDestination'"
+              :label="item.productionName"
+              :value="item.productionName"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="鍙栬揣鍦�:" prop="fromDestination">
+          <!-- <el-input v-model="registerForm.fromDestination" clearable></el-input> -->
+          <el-select v-model="registerForm.fromDestination" filterable clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="(item, index) in fromDestinationist"
+              :key="index + 'toDestination'"
+              :label="item.productionName"
+              :value="item.productionName"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="鍣ㄥ叿缂栧彿:" prop="containerName">
+          <!-- <el-input v-model="registerForm.containerName" clearable></el-input> -->
+          <el-select v-model="registerForm.containerName" filterable clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="(item, index) in containerNameList"
+              :key="index + 'containerName'"
+              :label="item.containerName"
+              :value="item.containerName"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="璁㈠崟鐘舵��:" prop="taskStatus">
+          <!-- <el-input v-model="registerForm.containerName" clearable></el-input> -->
+          <el-select v-model="registerForm.taskStatus" filterable clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="(item,index) in orderstatusList"
+              :key="index + 'taskStatus'"
+              :label="item.label"
+              :value="item.label"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="forklifttasksEdit-button text-right margin-right15 margin-top2">
+      <el-button
+        type="primary"
+        size="mini"
+        class="form-buttom"
+        :loading="savloading"
+        @click="submitForm('registerForm')"
+        >鎻愪氦</el-button
+      >
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { CarTaskAddOrUpdate, CarTaskGetCode } from '@/api/forklifttasks';
+import { ContainerSearch } from '@/api/palte';
+import { ProductionLineSearch } from '@/api/cass-line';
+import { getCache } from '@/utils/sessionStorage';
+export default {
+  data() {
+    return {
+      registerForm: {
+        carTaskName: '',
+        toDestination: '',
+        fromDestination: '',
+        containerName: ''
+      },
+      toDestinationList: [],
+      fromDestinationist: [],
+      containerNameList: [],
+      disabled: false,
+      orderstatusList: [
+        {
+          label: '鏂板缓',
+          value: 0
+        },
+        {
+          label: '浠诲姟鎵ц涓�',
+          value: 1
+        },
+        {
+          label: '瀹屾垚',
+          value: 2
+        }
+      ],
+      statusList: [
+        {
+          label: 0,
+          value: 0
+        },
+        {
+          label: 1,
+          value: 1
+        }
+      ],
+      enableList: [
+        {
+          label: '鍚敤',
+          value: 1
+        },
+        {
+          label: '绂佺敤',
+          value: 0
+        }
+      ],
+      createLineList: [],
+
+      rules: {
+        carTaskName: { required: true, message: '璇疯緭鍏ヤ换鍔$紪鍙�', trigger: 'change' },
+        //toDestination: { required: true, message: '璇疯緭鍏ョ洰鐨勫湴', trigger: 'change' },
+        fromDestination: { required: true, message: '璇疯緭鍏ュ彇璐у湴', trigger: 'change' },
+        containerName: { required: true, message: '璇烽�夋嫨鍣ㄥ叿缂栧彿', trigger: 'change' },
+        taskStatus: { required: true, message: '璇烽�夋嫨璁㈠崟鐘舵��', trigger: 'change' },
+      },
+      savloading: false
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: {}
+    }
+  },
+  mounted() {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.registerForm = this.rowitem;
+      this.disabled = true;
+    } else {
+      this.disabled = false;
+      this.CarTaskGetCode();
+    }
+    this.ContainerSearch();
+    this.ProductionLineSearch();
+    this.ProductSearch();
+  },
+  methods: {
+    //鍣ㄥ叿
+    ContainerSearch() {
+      ContainerSearch('1&onePageNum=999').then(res => {
+        if (res.code == 0) {
+          let data = res.data || [];
+          this.containerNameList = data;
+        }
+      });
+    },
+    //鐩殑鍦�
+    ProductionLineSearch() {
+      ProductionLineSearch('1&onePageNum=999', { isDestination: 1 }).then(res => {
+        if (res.code == 0) {
+          this.toDestinationList = res.data || [];
+        }
+      });
+    },
+    //鍙栬揣鍦�
+    ProductSearch() {
+      ProductionLineSearch('1&onePageNum=999', { isDestination: 0 }).then(res => {
+        if (res.code == 0) {
+          this.fromDestinationist = res.data || [];
+        }
+      });
+    },
+    //鍙夎溅浠诲姟缂栧彿
+    CarTaskGetCode() {
+      CarTaskGetCode().then(res => {
+        this.registerForm.carTaskName = res;
+      });
+    },
+    submitForm(registerForm) {
+      console.log(this.registerForm);
+      this.$refs[registerForm].validate(valid => {
+        if (valid) {
+          this.registerForm.userName = getCache('userInfo').userName;
+          this.savloading = true;
+          CarTaskAddOrUpdate(this.registerForm).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.$emit('addsubmit');
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触'
+              });
+            }
+            this.savloading = false;
+          });
+        } else {
+        }
+      });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.forklifttasksEdit {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .forklifttasksEdit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/task/components/maintask-inquer.vue b/qqjf-Web/src/views/task/components/maintask-inquer.vue
new file mode 100644
index 0000000..5358aa9
--- /dev/null
+++ b/qqjf-Web/src/views/task/components/maintask-inquer.vue
@@ -0,0 +1,212 @@
+<template>
+  <div class="flex align-center justify-between">
+    <div class="">
+      <el-button-group v-if="groupshow">
+        <el-button v-if="addmodalshow" type="primary" size="mini" icon="el-icon-plus" @click="$emit('addmodal')"
+          >鏂板缓</el-button
+        >
+        <el-button v-if="dele" type="primary" size="mini" icon="el-icon-delete">鍒犻櫎</el-button>
+        <el-button v-if="derive" type="primary" size="mini" icon="el-icon-download" @click="$emit('derive')"
+          >瀵煎嚭</el-button
+        >
+      </el-button-group>
+    </div>
+    <div class="width85 flex align-center justify-end">
+      <!-- <div class="flex align-center width35 margin-right"></div> -->
+      <div class="flex width align-center justify-end margin-right">
+        <div v-if="tasktypeshow" class="flex align-center margin-right width25">
+          <label class="color909399 fontsizeinitial width7rem">浠诲姟绫诲瀷锛�</label>
+          <el-select style="width: 65%" v-model="iqnuer.taskType" size="mini" clearable>
+            <el-option
+              v-for="(item, index) in taskTypeList"
+              :label="item.label"
+              :value="item.value"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </div>
+        <div v-if="taskstatushow" class="flex align-center margin-right width25">
+          <label class="color909399 width7rem fontsizeinitial">浠诲姟鐘舵�侊細</label>
+          <el-select style="width: 67%" v-model="iqnuer.taskStatus" size="mini" clearable>
+            <el-option
+              v-for="(item, index) in taskStatusList"
+              :label="item.label"
+              :value="item.value"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </div>
+        <div v-if="forkliftshow" class="flex align-center margin-right width30">
+          <label class="color909399 fontsizeinitial width7rem">鍙夎溅鍙告満锛�</label>
+          <el-select style="width: 66%" v-model="iqnuer.userName" size="mini" clearable>
+            <el-option v-for="(item, index) in caruserlist" :label="item" :value="item" :key="index"></el-option>
+          </el-select>
+        </div>
+        <div id="maindatetimeer" class="flex align-center margin-right width35">
+          <label class="textalign color909399 width7rem fontsizeinitial">璧锋鏃堕棿锛�</label>
+          <el-date-picker
+            size="mini"
+            v-model="iqnuer.timepick"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            type="datetimerange"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+          >
+          </el-date-picker>
+        </div>
+
+        <el-input id="topinquer" size="mini" clearable v-model="iqnuer[filter]" class="width30">
+          <el-select @change="selchange" v-model="filter" slot="prepend">
+            <el-option
+              v-for="(item, index) in filterList"
+              :label="item.label"
+              :value="item.value"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </el-input>
+      </div>
+
+      <el-button type="primary" size="mini" @click="inquer">鏌ヨ</el-button>
+      <el-button v-if="priority" type="primary" size="mini" @click="$emit('precedence')">浼樺厛鍑哄簱</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { GetCarUser } from '@/api/forklifttasks';
+export default {
+  data() {
+    return {
+      filter: '',
+      iqnuer: {},
+      taskStatusList: [
+        {
+          label: '鏂板缓',
+          value: '鏂板缓'
+        },
+        {
+          label: '浠诲姟鎵ц涓�',
+          value: '浠诲姟鎵ц涓�'
+        },
+        {
+          label: '寮傚父/鍙栨秷',
+          value: '寮傚父/鍙栨秷'
+        },
+        {
+          label: '瀹屾垚',
+          value: '瀹屾垚'
+        }
+      ],
+      taskTypeList: [
+        {
+          label: '鍏ュ簱',
+          value: 1
+        },
+        {
+          label: '鍑哄簱',
+          value: 2
+        }
+      ],
+      caruserlist: [],
+      applytime: [],
+
+      visible: false,
+      value1: ''
+    };
+  },
+  props: {
+    groupshow: {
+      type: Boolean,
+      default: true
+    },
+    priority: {
+      type: Boolean,
+      default: false
+    },
+    addmodalshow: {
+      type: Boolean,
+      default: true
+    },
+    derive: {
+      type: Boolean,
+      default: false
+    },
+    tasktypeshow: {
+      type: Boolean,
+      default: false
+    },
+    taskstatushow: {
+      type: Boolean,
+      default: false
+    },
+    forkliftshow: {
+      type: Boolean,
+      default: false
+    },
+    advanced: {
+      type: Boolean,
+      default: false
+    },
+    dele: {
+      type: Boolean,
+      default: false
+    },
+    byfilter: {
+      type: String,
+      default: ''
+    },
+    filterList: {
+      type: Array,
+      default: () => []
+    }
+  },
+  mounted() {
+    this.filter = this.byfilter;
+    this.GetCarUser();
+  },
+  methods: {
+    //鍙夎溅鍙告満
+    GetCarUser() {
+      GetCarUser().then(res => {
+        this.caruserlist = res;
+      });
+    },
+    inquer() {
+      this.$emit('inquer', this.iqnuer);
+    },
+    selchange() {
+      this.iqnuer = {};
+    }
+  },
+  watch: {
+    byfilter: {
+      handler(nvl, ovl) {
+        this.filter = nvl;
+      }
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#topinquer {
+  ::v-deep .el-select {
+    width: 100px;
+  }
+}
+#maindatetimeer {
+  ::v-deep .el-range-editor.el-input__inner {
+    padding: 3px;
+  }
+  ::v-deep .el-date-editor--datetimerange.el-input,
+  .el-date-editor--datetimerange.el-input__inner {
+    width: 74%;
+  }
+}
+::v-deep .el-input-group__append,
+::v-deep .el-input-group__prepend {
+  width: 60px;
+}
+</style>
diff --git a/qqjf-Web/src/views/task/components/maintaskEdit.vue b/qqjf-Web/src/views/task/components/maintaskEdit.vue
new file mode 100644
index 0000000..e9d379a
--- /dev/null
+++ b/qqjf-Web/src/views/task/components/maintaskEdit.vue
@@ -0,0 +1,283 @@
+<template>
+  <div class="maintaskEdit height overflow">
+    <div class="centent-form overflowy-auto">
+      <el-form
+        class="margin-auto width90"
+        ref="registerForm"
+        :model="registerForm"
+        size="mini"
+        :rules="rules"
+        label-position="left"
+        label-width="100px"
+      >
+        <el-form-item label="浠诲姟绫诲瀷:" prop="taskType">
+          <el-select v-model="registerForm.taskType" @change="taskchange" clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="(item, index) in taskTypeList"
+              :key="index + 'taskType'"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="璧峰浣�:" prop="sourcePlace">
+          <el-select v-model="registerForm.sourcePlace" filterable clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="(item, index) in sourcePlaceList"
+              :key="index + 'sourcePlace'"
+              :label="item.placeName"
+              :value="item.placeCode"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="鐩爣浣�:" prop="toPlace">
+          <el-select v-model="registerForm.toPlace" filterable clearable placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="(item, index) in toPlaceList"
+              :key="index + 'toPlace'"
+              :label="item.placeName"
+              :value="item.placeCode"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="浠诲姟浼樺厛绾�:" prop="taskLevel">
+          <el-input oninput="value=value.replace(/[^\d.]/g,'')" v-model="registerForm.taskLevel" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="鎵樼洏鍙�:" prop="containerName">
+          <el-select
+            v-model="registerForm.containerName"
+            filterable
+            remote
+            reserve-keyword
+            :remote-method="remoteMethod"
+            :loading="remoloading"
+            clearable
+            placeholder="璇烽�夋嫨"
+          >
+            <el-option
+              v-for="(item, index) in containerNameList"
+              :key="index + 'containerName'"
+              :label="item.containerName"
+              :value="item.containerName"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="maintaskEdit-button text-right margin-right15 margin-top2">
+      <el-button type="primary" size="mini" class="form-buttom" @click="submitForm('registerForm')">鎻愪氦</el-button>
+      <el-button type="primary" size="mini" class="form-buttom" @click="$emit('cancel')">鍙栨秷</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { TaskAddOrUpdate } from '@/api/maintask';
+import { ContainerSearch } from '@/api/palte';
+import { getCache } from '@/utils/sessionStorage';
+import { PlaceGetPlace } from '@/api/position';
+export default {
+  data() {
+    return {
+      registerForm: {
+        sourcePlace: '',
+        toPlace: '',
+        taskType: '',
+        taskStatus: '鏂板缓',
+        userName: getCache('userInfo').userName,
+        taskLevel: '',
+        hasReaded: 0,
+        containerName: ''
+      },
+      remoloading: false,
+      sourcePlace: '', //璧峰浣�
+      toPlace: '', //鐩爣浣�
+      sourcePlaceList: [],
+      toPlaceList: [],
+      taskTypeList: [
+        {
+          label: '鍏ュ簱',
+          value: 1
+        },
+        {
+          label: '鍑哄簱',
+          value: 2
+        },
+        {
+          label: '绉诲簱',
+          value: 3
+        }
+      ],
+      containerNameList: [],
+      disabled: false,
+      createLineList: [],
+
+      rules: {
+        sourcePlace: { required: true, message: '璇烽�夋嫨璧峰浣�', trigger: 'change' },
+        toPlace: { required: true, message: '璇烽�夋嫨鐩爣浣�', trigger: 'change' },
+        taskType: { required: true, message: '璇烽�夋嫨浠诲姟绫诲瀷', trigger: 'change' },
+        taskLevel: { required: true, message: '璇疯緭鍏ヤ换鍔′紭鍏堢骇', trigger: 'change' },
+        containerName: { required: false, message: '璇疯緭鍏ユ墭鐩樺彿', trigger: 'change' }
+      }
+    };
+  },
+  props: {
+    rowitem: {
+      type: Object,
+      default: {}
+    }
+  },
+  mounted() {
+    if (JSON.stringify(this.rowitem) != '{}') {
+      this.registerForm = this.rowitem;
+      this.sourcePlace = this.rowitem.sourcePlace; //璧峰浣�
+      this.toPlace = this.rowitem.toPlace; //鐩爣浣�
+      this.registerForm.taskType =
+        this.registerForm.taskType == '鍏ュ簱'
+          ? 1
+          : this.registerForm.taskType == '鍑哄簱'
+          ? 2
+          : this.registerForm.taskType == '绉诲簱'
+          ? 3
+          : this.registerForm.taskType;
+      this.disabled = true;
+    } else {
+      this.disabled = false;
+    }
+    this.ContainerSearch({ containerName: '' });
+    this.sourcePlacePlaceGetPlace();
+    this.toPlacePlacePlaceGetPlace();
+  },
+  methods: {
+    //鍣ㄥ叿
+    ContainerSearch(query) {
+      const { containerName } = query;
+      ContainerSearch('1&onePageNum=999', { containerName }).then(res => {
+        if (res.code == 0) {
+          let data = res.data || [];
+          this.containerNameList = data;
+        }
+      });
+    },
+    remoteMethod(query) {
+      if (query !== '') {
+        this.remoloading = true;
+        setTimeout(() => {
+          this.remoloading = false;
+          this.ContainerSearch({ containerName: query });
+        }, 200);
+      }
+    },
+    //璧峰浣嶅簱浣�
+    sourcePlacePlaceGetPlace() {
+      let taskType = this.registerForm.taskType ? this.registerForm.taskType : 1;
+      PlaceGetPlace({ isSourcePlace: 1, taskType: taskType }).then(res => {
+        if (res.code == 0) {
+          this.sourcePlaceList = res.data;
+          if (this.registerForm.sourcePlace) {
+            this.registerForm.sourcePlace = res.data.filter(item => {
+              if (item.placeCode == this.registerForm.sourcePlace) {
+                return item.placeName;
+              }
+            });
+          }
+        }
+      });
+    },
+    //鐩爣浣�
+    toPlacePlacePlaceGetPlace() {
+      let taskType = this.registerForm.taskType ? this.registerForm.taskType : 1;
+      PlaceGetPlace({ isSourcePlace: 0, taskType: taskType }).then(res => {
+        if (res.code == 0) {
+          this.toPlaceList = res.data;
+          if (this.registerForm.sourcePlace) {
+            this.registerForm.toPlace = res.data.filter(item => {
+              if (item.placeCode == this.registerForm.toPlace) {
+                return item.placeName;
+              }
+            });
+          }
+        }
+      });
+    },
+    //浠诲姟绫诲瀷
+    taskchange() {
+      this.registerForm.sourcePlace = '';
+      this.registerForm.toPlace = '';
+      this.sourcePlaceList = [];
+      this.toPlaceList = [];
+      this.sourcePlacePlaceGetPlace();
+      this.toPlacePlacePlaceGetPlace();
+       let taskType = this.registerForm.taskType ? this.registerForm.taskType : 1;
+      this.rules.containerName.message="";
+      if(taskType==1)
+      {
+      this.rules.containerName.required=true;
+
+      }else
+      {
+         this.rules.containerName.required=false;
+      }
+    },
+    submitForm(registerForm) {
+      console.log(this.registerForm);
+      this.$refs[registerForm].validate(valid => {
+        if (valid) {
+          this.savloading = true;
+          TaskAddOrUpdate(this.registerForm).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              });
+              this.$emit('addsubmit');
+            } else {
+              this.$message({
+                type: 'warning',
+                message: '鎻愪氦澶辫触'
+              });
+            }
+            this.savloading = false;
+          });
+        }
+      });
+    }
+  },
+  watch: {}
+};
+</script>
+
+<style lang="scss" scoped>
+.maintaskEdit {
+  width: 98%;
+  padding: 1%;
+  .show-pwd {
+    position: absolute;
+    right: 10px;
+    top: 3px;
+    font-size: 16px;
+    color: #889aa4;
+    cursor: pointer;
+    user-select: none;
+  }
+  .centent-form {
+    height: 92%;
+    width: 100%;
+    margin: auto;
+  }
+  .maintaskEdit-button {
+  }
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+  ::v-deep .el-select {
+    width: 100%;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/task/forklifttasks/index.vue b/qqjf-Web/src/views/task/forklifttasks/index.vue
new file mode 100644
index 0000000..bbebe45
--- /dev/null
+++ b/qqjf-Web/src/views/task/forklifttasks/index.vue
@@ -0,0 +1,246 @@
+<template>
+  <!-- 鍙夎溅浠诲姟 -->
+  <div id="forklifttasks" class="global-content">
+    <!-- 绛涢�� -->
+    <maintask-inquer
+      byfilter="浠诲姟缂栧彿"
+      :groupshow="true"
+      :dele="false"
+      :derive="true"
+      :forkliftshow="true"
+      :filterList="filterList"
+      @addmodal="addmodal"
+      @derive="derive"
+      @inquer="inquer"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        :naxnumShow="false"
+        @edit="edit"
+        @del="del"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+      />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow" :modabg="true" @cancel="addmodalShow = false">
+        <p slot="title">鍙夎溅浠诲姟-{{ title }}</p>
+        <div class="height" slot="centent">
+          <forklifttasks-edit @cancel="addmodalShow = false" :rowitem="rowitem" @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import maintaskInquer from '../components/maintask-inquer';
+import forklifttasksEdit from '../components/forklifttasksEdit';
+const { forklifttasks } = require('@/components/tableContainer/tableHead');
+import { CarTaskSearch, CarTaskDelete } from '@/api/forklifttasks';
+import { exportTableList } from '@/utils/excel';
+import { getimestampDate, getymdhms } from '@/utils/date';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: ['inOrderCode'],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      pageNum: 0,
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '浠诲姟缂栧彿',
+          label: '浠诲姟缂栧彿'
+        },
+        {
+          value: '鐩殑鍦�',
+          label: '鐩殑鍦�'
+        },
+        {
+          value: '鍙栬揣鍦�',
+          label: '鍙栬揣鍦�'
+        },
+        {
+          value: '鍣ㄥ叿缂栧彿',
+          label: '鍣ㄥ叿缂栧彿'
+        },
+        {
+          value: '闆朵欢缂栧彿',
+          label: '闆朵欢缂栧彿'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, maintaskInquer, Modal, forklifttasksEdit },
+  computed: {
+    tableHead() {
+      return forklifttasks;
+    }
+  },
+  mounted() {
+    this.CarTaskSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.inuqerobg = e;
+      this.page = 1;
+      this.CarTaskSearch();
+    },
+    //瀵煎嚭
+    derive() {
+      let tHeader = [];
+      let filterVal = [];
+      this.tableHead.forEach(item => {
+        tHeader.push(item.columnDescription);
+        filterVal.push(item.columnName);
+      });
+      const {
+        浠诲姟缂栧彿: carTaskName,
+        鐩殑鍦�: toDestination,
+        鍙栬揣鍦�: fromDestination,
+        闆朵欢缂栧彿: itemName,
+        鍣ㄥ叿缂栧彿: containerName,
+        userName
+      } = this.inuqerobg;
+      this.$Loading(true);
+      CarTaskSearch('1&onePageNum=99999999', {
+        itemName,
+        carTaskName,
+        toDestination,
+        fromDestination,
+        containerName,
+        userName,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.updateTime = item.updateTime ? getimestampDate(item.updateTime) : '';
+          });
+          exportTableList(tHeader, filterVal, data, '鍙夎溅浠诲姟' + getymdhms());
+        }
+        this.$Loading();
+      });
+    },
+    //鎼滅储鍙夎溅浠诲姟
+    CarTaskSearch() {
+      const {
+        浠诲姟缂栧彿: carTaskName,
+        鐩殑鍦�: toDestination,
+        鍙栬揣鍦�: fromDestination,
+        闆朵欢缂栧彿: itemName,
+        鍣ㄥ叿缂栧彿: containerName,
+        userName
+      } = this.inuqerobg;
+      this.$Loading(true);
+      CarTaskSearch(this.page + '&onePageNum=' + this.pageSize, {
+        itemName,
+        carTaskName,
+        toDestination,
+        fromDestination,
+        containerName,
+        userName,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.updateTime = item.updateTime ? getimestampDate(item.updateTime) : '';
+          });
+          this.tableData = data;
+          this.totle = res.num;
+          this.pageNum = res.pageNum;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.CarTaskSearch();
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.CarTaskSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { carTaskName } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          CarTaskDelete({ carTaskName }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛!'
+              });
+              this.CarTaskSearch();
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.CarTaskSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#forklifttasks {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/task/index.vue b/qqjf-Web/src/views/task/index.vue
new file mode 100644
index 0000000..1ca3ac4
--- /dev/null
+++ b/qqjf-Web/src/views/task/index.vue
@@ -0,0 +1,11 @@
+<template>
+  <keep-alive>
+    <router-view />
+  </keep-alive>
+</template>
+
+<script>
+export default {};
+</script>
+
+<style></style>
diff --git a/qqjf-Web/src/views/task/maintask/index.vue b/qqjf-Web/src/views/task/maintask/index.vue
new file mode 100644
index 0000000..57e2cab
--- /dev/null
+++ b/qqjf-Web/src/views/task/maintask/index.vue
@@ -0,0 +1,430 @@
+<template>
+  <!-- 涓讳换鍔� -->
+  <div id="forklifttasks" class="global-content">
+    <!-- 绛涢�� -->
+    <maintask-inquer
+      byfilter="鍣ㄥ叿缂栧彿"
+      :groupshow="true"
+      :dele="false"
+      :derive="true"
+      :tasktypeshow="true"
+      :taskstatushow="true"
+      :priority="true"
+      :filterList="filterList"
+      @addmodal="addmodal"
+      @derive="derive"
+      @inquer="inquer"
+      @precedence="precedence"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="false"
+        :delShow="true"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        :naxnumShow="false"
+        :operation="true"
+        :selectionShow="true"
+        :must-first-show="true"
+        @edit="edit"
+        @del="del"
+        @abnormal="abnormal"
+        @CurrentChange="CurrentChange"
+        @SizeChange="SizeChange"
+        @rowchange="rowchange"
+        @handleSelectionChange="handleSelectionChange"
+        @mustFirst="onMustFirst"
+      />
+    </div>
+
+    <transition name="modal">
+      <modal v-if="addmodalShow" :modabg="true" @cancel="addmodalShow = false">
+        <p slot="title">浠诲姟绠$悊-{{ title }}</p>
+        <div class="height" slot="centent">
+          <maintask-edit @cancel="addmodalShow = false" :rowitem="rowitem" @addsubmit="addsubmit" />
+        </div>
+      </modal>
+    </transition>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import maintaskInquer from '../components/maintask-inquer';
+import maintaskEdit from '../components/maintaskEdit';
+const { maintask } = require('@/components/tableContainer/tableHead');
+import { TaskSearch, UpTaskLevel, TaskDeleteErrorTask, TaskDelete, GetAllMainTask, MustTask } from '@/api/maintask';
+import { exportTableList } from '@/utils/excel';
+import { getimestampDate, getymdhms } from '@/utils/date';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: ['inOrderCode'],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      pageNum: 0,
+      inuqerobg: {},
+      rowobj: null,
+      filterList: [
+        {
+          value: '鍣ㄥ叿缂栧彿',
+          label: '鍣ㄥ叿缂栧彿'
+        },
+        {
+          value: '璧峰浣�',
+          label: '璧峰浣�'
+        },
+        {
+          value: '鐩爣浣�',
+          label: '鐩爣浣�'
+        }
+      ],
+      tranLinelist: [
+        {
+          tranLine: 68,
+          title: '1鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 51,
+          title: '2鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 64,
+          title: '3鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 67,
+          title: '4鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 34,
+          title: '5鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 30,
+          title: '6鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 19,
+          title: '7鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 12,
+          title: '8鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 47,
+          title: '1鍙峰叆鍙�'
+        },
+        {
+          tranLine: 48,
+          title: '2鍙峰叆鍙�'
+        },
+        {
+          tranLine: 61,
+          title: '3鍙峰叆鍙�'
+        },
+        {
+          tranLine: 65,
+          title: '4鍙峰叆鍙�'
+        },
+        {
+          tranLine: 32,
+          title: '5鍙峰叆鍙�'
+        },
+        {
+          tranLine: 15,
+          title: '7鍙峰叆鍙�'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, maintaskInquer, Modal, maintaskEdit },
+  computed: {
+    tableHead() {
+      return maintask;
+    }
+  },
+  mounted() {
+    this.TaskSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.inuqerobg = e;
+      this.page = 1;
+      this.TaskSearch();
+    },
+    //浼樺厛
+    precedence() {
+      if (this.rowobj) {
+        const { id } = this.rowobj;
+        UpTaskLevel({ id }).then(res => {
+          if (res.code == 0) {
+            this.$message({
+              type: 'success',
+              message: '澶勭悊鎴愬姛'
+            });
+            this.page = 1;
+            this.TaskSearch();
+          } else {
+            this.$message({
+              type: 'warning',
+              message: res.msg
+            });
+          }
+        });
+      } else {
+        this.$message({
+          type: 'warning',
+          message: '璇风偣鍕鹃�夋垨鐐瑰嚮琛�'
+        });
+      }
+    },
+    //鍗曞嚮琛�
+    rowchange(row) {
+      this.rowobj = { ...row };
+    },
+    //鍕鹃��
+    handleSelectionChange(row) {
+      console.log(row);
+      if (row.length > 1) {
+        this.$message({
+          type: 'warning',
+          message: '鍙厑璁稿嬀閫変竴鏉℃暟鎹�'
+        });
+      } else {
+        this.rowobj = { ...row[0] };
+      }
+    },
+    //瀵煎嚭
+    derive() {
+      let tHeader = [];
+      let filterVal = [];
+      this.$Loading(true);
+      const { 鍣ㄥ叿缂栧彿: containerName, 璧峰浣�: sourcePlace, 鐩爣浣�: toPlace, taskStatus, taskType } = this.inuqerobg;
+      GetAllMainTask({
+        containerName,
+        sourcePlace,
+        toPlace,
+        taskStatus,
+        taskType,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        res.forEach(element => {
+          element.taskType =
+            element.taskType == 1
+              ? '鍏ュ簱'
+              : element.taskType == 2
+              ? '鍑哄簱'
+              : element.taskType == 3
+              ? '绉诲簱'
+              : element.taskType;
+          element.isError = element.isError == 1 ? '鏄�' : element.isError == 0 ? '鍚�' : element.isError;
+          element.isExchange = element.isExchange == 1 ? '鏄�' : element.isExchange == 0 ? '鍚�' : element.isExchange;
+          element.createTime = element.createTime ? getimestampDate(element.createTime) : '';
+          this.tranLinelist.forEach(item => {
+            if (element.sourcePlace == item.tranLine) {
+              element.sourcePlace = item.title;
+            }
+            if (element.toPlace == item.tranLine) {
+              element.toPlace = item.title;
+            }
+          });
+        });
+        this.tableHead.forEach(item => {
+          tHeader.push(item.columnDescription);
+          filterVal.push(item.columnName);
+        });
+        exportTableList(tHeader, filterVal, res, '涓讳换鍔�' + getymdhms());
+        this.$Loading(false);
+      });
+    },
+    //鎼滅储
+    TaskSearch() {
+      const { 鍣ㄥ叿缂栧彿: containerName, 璧峰浣�: sourcePlace, 鐩爣浣�: toPlace, taskStatus, taskType } = this.inuqerobg;
+      this.$Loading(true);
+      TaskSearch(this.page + '&onePageNum=' + this.pageSize, {
+        containerName,
+        sourcePlace,
+        toPlace,
+        taskStatus,
+        taskType,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          let data = res.data || [];
+          data.forEach(element => {
+            element.taskType =
+              element.taskType == 1
+                ? '鍏ュ簱'
+                : element.taskType == 2
+                ? '鍑哄簱'
+                : element.taskType == 3
+                ? '绉诲簱'
+                : element.taskType;
+            element.isError = element.isError == 1 ? '鏄�' : element.isError == 0 ? '鍚�' : element.isError;
+            this.tranLinelist.forEach(item => {
+              if (element.sourcePlace == item.tranLine) {
+                element.sourcePlace = item.title;
+              }
+              if (element.toPlace == item.tranLine) {
+                element.toPlace = item.title;
+              }
+            });
+          });
+
+          this.tableData = data;
+					//console.log(this.tableData)
+          this.totle = res.num;
+          this.pageNum = res.pageNum;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.TaskSearch();
+    },
+    //椤垫暟
+    SizeChange(e) {
+      this.pageSize = e;
+      this.TaskSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { id } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          TaskDelete({ id }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛!'
+              });
+              this.TaskSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: res.msg
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //寮傚父澶勭悊
+    abnormal(row) {
+      const { id } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢澶勭悊璇ヤ换鍔�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          TaskDeleteErrorTask({ id }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '澶勭悊鎴愬姛!'
+              });
+              this.TaskSearch();
+            } else {
+              this.$message({
+                type: 'warning',
+                message: res.msg
+              });
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝鐞�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.TaskSearch();
+    },
+    onMustFirst(obj) {
+      let msg = '鏄惁瑕佸浠诲姟鍙枫��' + obj.id + '銆戝己鍒朵紭鍏堟墽琛岋紵';
+      this.$confirm(msg, '绯荤粺鎻愮ず', {
+        type: 'warning'
+      })
+        .then(() => {
+          this.dealMustFirst(obj.id);
+        })
+        .catch(() => {});
+    },
+    dealMustFirst(id) {
+      this.$Loading(true);
+      let params = { id };
+      MustTask(params)
+        .then(d => {
+          this.$Loading();
+          if (d.code === 0) {
+            this.$message.success('鎿嶄綔鎴愬姛');
+            this.TaskSearch();
+          } else {
+            let msg = d.msg || '鎿嶄綔澶辫触';
+            this.$alert(msg, '绯荤粺鎻愮ず', { type: 'error' });
+          }
+        })
+        .catch(() => {
+          this.$Loading();
+        });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#forklifttasks {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/task/taskdocuments/index.vue b/qqjf-Web/src/views/task/taskdocuments/index.vue
new file mode 100644
index 0000000..883e247
--- /dev/null
+++ b/qqjf-Web/src/views/task/taskdocuments/index.vue
@@ -0,0 +1,205 @@
+<template>
+  <!-- 浠诲姟璁板綍 -->
+  <div id="taskdocuments" class="global-content">
+    <!-- 绛涢�� -->
+    <maintask-inquer
+      byfilter="闆朵欢缂栧彿"
+      :groupshow="false"
+      :dele="false"
+      :filterList="filterList"
+      @addmodal="addmodal"
+      @inquer="inquer"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :operation="false"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        :naxnumShow="false"
+        @edit="edit"
+        @del="del"
+        @SizeChange="SizeChange"
+        @CurrentChange="CurrentChange"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import maintaskInquer from '../components/maintask-inquer';
+const { taskrecord } = require('@/components/tableContainer/tableHead');
+import { TaskRecodeSearch, TaskRecodeDelete } from '@/api/taskrecord';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: ['inOrderCode'],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      pageNum: 0,
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '闆朵欢缂栧彿',
+          label: '闆朵欢缂栧彿'
+        },
+        {
+          value: '闆朵欢鍚嶇О',
+          label: '闆朵欢鍚嶇О'
+        },
+
+        {
+          value: '璧峰浣�',
+          label: '璧峰浣�'
+        },
+        {
+          value: '鐩爣浣�',
+          label: '鐩爣浣�'
+        },
+        {
+          value: '璧峰浣�',
+          label: '璧峰浣�'
+        },
+        {
+          value: '浠诲姟鐘舵��',
+          label: '浠诲姟鐘舵��'
+        },
+        {
+          value: '鍣ㄥ叿缂栧彿',
+          label: '鍣ㄥ叿缂栧彿'
+        },
+        {
+          value: '鍑哄簱鍗曞彿',
+          label: '鍑哄簱鍗曞彿'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, maintaskInquer, Modal },
+  computed: {
+    tableHead() {
+      return taskrecord;
+    }
+  },
+  mounted() {
+    this.TaskRecodeSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.inuqerobg = e;
+      this.page = 1;
+      this.TaskRecodeSearch();
+    },
+    //鎼滅储鐢ㄦ埛
+    TaskRecodeSearch() {
+      const {
+        闆朵欢缂栧彿: itemName,
+        闆朵欢鍚嶇О: itemDes,
+        璧峰浣�: sourcePlace,
+        鐩爣浣�: toPlace,
+        鍣ㄥ叿缂栧彿: containerName,
+        浠诲姟鐘舵��: taskStatus,
+        鍑哄簱鍗曞彿: outOrderCode
+      } = this.inuqerobg;
+      this.$Loading(true);
+      TaskRecodeSearch(this.page + '&onePageNum=' + this.pageSize, {
+        itemName,
+        itemDes,
+        sourcePlace,
+        toPlace,
+        containerName,
+        taskStatus,
+        outOrderCode,
+        createTimeStart: this.inuqerobg.timepick ? this.inuqerobg.timepick[0] : '',
+        createTimeEnd: this.inuqerobg.timepick ? this.inuqerobg.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          this.tableData = res.data;
+          this.totle = res.num;
+          this.pageNum = res.pageNum;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.TaskRecodeSearch();
+    },
+    SizeChange(e) {
+      this.pageSize = e;
+      this.TaskRecodeSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { id } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          TaskRecodeDelete({ id }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛!'
+              });
+              this.TaskRecodeSearch();
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.TaskRecodeSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#taskdocuments {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/task/taskrecord/index.vue b/qqjf-Web/src/views/task/taskrecord/index.vue
new file mode 100644
index 0000000..46e4ff4
--- /dev/null
+++ b/qqjf-Web/src/views/task/taskrecord/index.vue
@@ -0,0 +1,345 @@
+<template>
+  <!-- 浠诲姟璁板綍 -->
+  <div id="taskrecord" class="global-content">
+    <!-- 绛涢�� -->
+    <maintask-inquer
+      byfilter="闆朵欢缂栧彿"
+      :groupshow="true"
+      :dele="false"
+      :addmodalshow="false"
+      :derive="true"
+      :tasktypeshow="true"
+      :filterList="filterList"
+      @addmodal="addmodal"
+      @derive="derive"
+      @inquer="inquer"
+    />
+    <!-- table -->
+    <div class="table">
+      <table-container
+        :wipelist="wipelist"
+        :tableHead="tableHead"
+        :tableData="tableData"
+        :editShow="true"
+        :delShow="true"
+        :operation="false"
+        :currentPage="page"
+        :pageSize="pageSize"
+        :totle="totle"
+        :naxnumShow="false"
+        @edit="edit"
+        @del="del"
+        @SizeChange="SizeChange"
+        @CurrentChange="CurrentChange"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+import { TableContainer, Modal } from '@/components/index';
+import maintaskInquer from '../components/maintask-inquer';
+const { taskrecord } = require('@/components/tableContainer/tableHead');
+import { TaskRecodeSearch, TaskRecodeDelete } from '@/api/taskrecord';
+import { exportTableList } from '@/utils/excel';
+import { getymdhms, getimestampDate } from '@/utils/date';
+export default {
+  data() {
+    return {
+      title: '',
+      tableData: [],
+      modalShow: false,
+      addmodalShow: false,
+      wipelist: ['inOrderCode'],
+      rowitem: {},
+      totle: 0,
+      page: 1,
+      pageSize: 20,
+      pageNum: 0,
+      inuqerobg: {},
+      filterList: [
+        {
+          value: '闆朵欢缂栧彿',
+          label: '闆朵欢缂栧彿'
+        },
+        {
+          value: '闆朵欢鍚嶇О',
+          label: '闆朵欢鍚嶇О'
+        },
+
+        {
+          value: '璧峰浣�',
+          label: '璧峰浣�'
+        },
+        {
+          value: '鐩爣浣�',
+          label: '鐩爣浣�'
+        },
+        {
+          value: '浠诲姟鐘舵��',
+          label: '浠诲姟鐘舵��'
+        },
+        {
+          value: '鍣ㄥ叿缂栧彿',
+          label: '鍣ㄥ叿缂栧彿'
+        },
+        {
+          value: '鍑哄簱鍗曞彿',
+          label: '鍑哄簱鍗曞彿'
+        }
+        // {
+        //   value: '浠诲姟绫诲瀷',
+        //   label: '浠诲姟绫诲瀷'
+        // }
+      ],
+      tranLinelist: [
+        {
+          tranLine: 68,
+          title: '1鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 51,
+          title: '2鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 64,
+          title: '3鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 67,
+          title: '4鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 34,
+          title: '5鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 30,
+          title: '6鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 19,
+          title: '7鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 12,
+          title: '8鍙峰嚭鍙�'
+        },
+        {
+          tranLine: 47,
+          title: '1鍙峰叆鍙�'
+        },
+        {
+          tranLine: 48,
+          title: '2鍙峰叆鍙�'
+        },
+        {
+          tranLine: 61,
+          title: '3鍙峰叆鍙�'
+        },
+        {
+          tranLine: 65,
+          title: '4鍙峰叆鍙�'
+        },
+        {
+          tranLine: 32,
+          title: '5鍙峰叆鍙�'
+        },
+        {
+          tranLine: 15,
+          title: '7鍙峰叆鍙�'
+        }
+      ]
+    };
+  },
+  components: { TableContainer, maintaskInquer, Modal },
+  computed: {
+    tableHead() {
+      return taskrecord;
+    }
+  },
+  mounted() {
+    this.TaskRecodeSearch();
+  },
+  methods: {
+    //鏌ヨ
+    inquer(e) {
+      this.inuqerobg = e;
+      this.page = 1;
+      this.TaskRecodeSearch();
+    },
+    //瀵煎嚭
+    derive() {
+      let tHeader = [];
+      let filterVal = [];
+      this.tableHead.forEach(item => {
+        tHeader.push(item.columnDescription);
+        filterVal.push(item.columnName);
+      });
+      let obj = { ...this.inuqerobg };
+      console.log(obj);
+      const {
+        闆朵欢缂栧彿: itemName,
+        闆朵欢鍚嶇О: itemDes,
+        璧峰浣�: sourcePlace,
+        鐩爣浣�: toPlace,
+        鍣ㄥ叿缂栧彿: containerName,
+        浠诲姟鐘舵��: taskStatus,
+        鍑哄簱鍗曞彿: outOrderCode,
+        taskType
+      } = obj;
+      this.$Loading(true);
+      TaskRecodeSearch('1&onePageNum=99999999', {
+        itemName,
+        itemDes,
+        sourcePlace,
+        toPlace,
+        containerName,
+        taskStatus,
+        outOrderCode,
+        taskType,
+        createTimeStart: obj.timepick ? obj.timepick[0] : '',
+        createTimeEnd: obj.timepick ? obj.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.taskType =
+              item.taskType == 1 ? '鍏ュ簱' : item.taskType == 2 ? '鍑哄簱' : item.taskType == 3 ? '绉诲簱' : item.taskType;
+            item.isMainOut = item.isMainOut == 1 ? '鏄�' : item.isMainOut == 0 ? '鍚�' : item.isMainOut;
+            item.createTime = item.createTime ? getimestampDate(item.createTime) : '';
+            item.doTime = item.doTime ? getimestampDate(item.doTime) : '';
+            item.finishTime = item.finishTime ? getimestampDate(item.finishTime) : '';
+            item.taskCreateTime = item.taskCreateTime ? getimestampDate(item.taskCreateTime) : '';
+            this.tranLinelist.forEach(element => {
+              if (item.sourcePlace == element.tranLine) {
+                item.sourcePlace = element.title;
+              }
+              if (item.toPlace == element.tranLine) {
+                item.toPlace = element.title;
+              }
+            });
+          });
+          exportTableList(tHeader, filterVal, data, '浠诲姟璁板綍' + getymdhms());
+        }
+        this.$Loading();
+      });
+    },
+    //鎼滅储鐢ㄦ埛
+    TaskRecodeSearch() {
+      let obj = { ...this.inuqerobg };
+      console.log(obj);
+      const {
+        闆朵欢缂栧彿: itemName,
+        闆朵欢鍚嶇О: itemDes,
+        璧峰浣�: sourcePlace,
+        鐩爣浣�: toPlace,
+        鍣ㄥ叿缂栧彿: containerName,
+        浠诲姟鐘舵��: taskStatus,
+        鍑哄簱鍗曞彿: outOrderCode,
+        taskType
+      } = obj;
+      this.$Loading(true);
+
+      TaskRecodeSearch(this.page + '&onePageNum=' + this.pageSize, {
+        itemName,
+        itemDes,
+        sourcePlace,
+        toPlace,
+        containerName,
+        taskStatus,
+        outOrderCode,
+        taskType,
+        createTimeStart: obj.timepick ? obj.timepick[0] : '',
+        createTimeEnd: obj.timepick ? obj.timepick[1] : ''
+      }).then(res => {
+        if (res.code == 0) {
+          let data = res.data;
+          data.forEach(item => {
+            item.taskType =
+              item.taskType == 1 ? '鍏ュ簱' : item.taskType == 2 ? '鍑哄簱' : item.taskType == 3 ? '绉诲簱' : item.taskType;
+            item.isMainOut = item.isMainOut == 1 ? '鏄�' : item.isMainOut == 0 ? '鍚�' : item.isMainOut;
+            this.tranLinelist.forEach(element => {
+              if (item.sourcePlace == element.tranLine) {
+                item.sourcePlace = element.title;
+              }
+              if (item.toPlace == element.tranLine) {
+                item.toPlace = element.title;
+              }
+            });
+          });
+          this.tableData = data;
+          this.totle = res.num;
+          this.pageNum = res.pageNum;
+        }
+        this.$Loading();
+      });
+    },
+    CurrentChange(e) {
+      console.log(e);
+      this.page = e;
+      this.TaskRecodeSearch();
+    },
+    SizeChange(e) {
+      this.pageSize = e;
+      this.TaskRecodeSearch();
+    },
+    //缂栬緫
+    edit(row) {
+      this.addmodalShow = true;
+      this.rowitem = { ...row };
+      this.title = '缂栬緫';
+    },
+    //鍒犻櫎
+    del(row) {
+      console.log(row);
+      const { id } = { ...row };
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          TaskRecodeDelete({ id }).then(res => {
+            if (res.code == 0) {
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛!'
+              });
+              this.TaskRecodeSearch();
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '宸插彇娑堝垹闄�'
+          });
+        });
+    },
+    //鏂板缓
+    addmodal() {
+      this.rowitem = {};
+      this.addmodalShow = true;
+      this.title = '鏂板缓';
+    },
+    //鏂板淇敼鍚�
+    addsubmit() {
+      this.addmodalShow = false;
+      this.modalShow = false;
+      this.TaskRecodeSearch();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+#taskrecord {
+  .table {
+    width: 100%;
+    margin-top: 10px;
+    height: calc(100% - 40px);
+    overflow: hidden;
+  }
+}
+</style>
diff --git a/qqjf-Web/src/views/test/index.vue b/qqjf-Web/src/views/test/index.vue
new file mode 100644
index 0000000..d0571d5
--- /dev/null
+++ b/qqjf-Web/src/views/test/index.vue
@@ -0,0 +1,35 @@
+<!--  -->
+<template>
+  <div id=""></div>
+</template>
+
+<script>
+//杩欓噷鍙互瀵煎叆鍏朵粬鏂囦欢锛堟瘮濡傦細缁勪欢锛屽伐鍏穓s锛岀涓夋柟鎻掍欢js锛宩son鏂囦欢锛屽浘鐗囨枃浠剁瓑绛夛級
+//渚嬪锛歩mport 銆婄粍浠跺悕绉般�� from '銆婄粍浠惰矾寰勩��';
+
+export default {
+  //name鏀惧叆妯℃澘鍚�,鏂逛究鍦ㄥ叾浠栧湴鏂瑰紩鐢�
+  name: '',
+  //import寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    //杩欓噷瀛樻斁鏁版嵁
+    return {};
+  },
+  //鐩戝惉灞炴�� 绫讳技浜巇ata姒傚康
+  computed: {},
+  //鐢熷懡鍛ㄦ湡 - 鍒涘缓瀹屾垚锛堝彲浠ヨ闂綋鍓峵his瀹炰緥锛�
+  created() {},
+  //鐢熷懡鍛ㄦ湡 - 鎸傝浇瀹屾垚锛堝彲浠ヨ闂瓺OM鍏冪礌锛�
+  mounted() {},
+  //鏂规硶闆嗗悎
+  methods: {},
+  //鐩戞帶data涓殑鏁版嵁鍙樺寲
+  watch: {},
+  //濡傛灉椤甸潰鏈塳eep-alive缂撳瓨鍔熻兘锛岃繖涓嚱鏁颁細瑙﹀彂
+  activated() {}
+};
+</script>
+<style lang="scss" scoped>
+/* @import url(); 寮曞叆鍏叡css绫� */
+</style>
diff --git a/qqjf-Web/vue.config.js b/qqjf-Web/vue.config.js
new file mode 100644
index 0000000..f557b76
--- /dev/null
+++ b/qqjf-Web/vue.config.js
@@ -0,0 +1,160 @@
+const webpack = require('webpack');
+const path = require('path');
+
+const CompressionWebpackPlugin = require('compression-webpack-plugin');
+const defaultSettings = require('./src/settings.js');
+const port = process.env.port || process.env.npm_config_port || 9527; // dev port
+function resolve (dir) {
+  return path.join(__dirname, dir);
+}
+const isProd = process.env.NODE_ENV === 'production';
+const name = defaultSettings.title || '鏅鸿兘鍖栫珛浣撳簱绠$悊绯荤粺'; // page title
+const {
+  VueCDN,
+  AxiosCDN,
+  VueRouterCDN,
+  VuexCDN
+} = require('./src/plugins/cdn');
+
+const cdn = {
+  css: [],
+  js: [VueCDN, AxiosCDN, VueRouterCDN, VuexCDN],
+  externals: {
+    vue: 'Vue',
+    'vue-router': 'VueRouter',
+    vuex: 'Vuex',
+    axios: 'axios'
+  }
+};
+module.exports = {
+  /**
+   *鏌ョ湅閰嶇疆 https://cli.vuejs.org/config/#publicpath
+   */
+  publicPath: '/', //鏍硅矾寰� cli3.0浠ヤ笂浣跨敤publicPath
+  //鎵撳寘鍚庤緭鍑鸿矾寰�
+  outputDir: 'dist',
+  assetsDir: 'static',
+  lintOnSave: false,
+  //鍘婚櫎鐢熶骇鐜鐨刾roductionSourceMap
+  productionSourceMap: false,
+  devServer: {
+    port: port,
+    open: true,
+    overlay: {
+      warnings: false,
+      errors: true
+    },
+    proxy: {
+      [process.env.VUE_APP_BASE_API]: {
+        //target: 'http://10.103.11.236:8085', // 鍐呯綉鏈嶅姟鍣ㄩ儴缃� 11缃戞
+        //target: 'http://10.103.9.200:8085/', // 鍐呯綉鏈嶅姟鍣ㄩ儴缃� 9缃戞
+        //target: 'http://120.53.244.200:8085', // 浜戞湇鍔″櫒娴嬭瘯
+        //target: 'http://192.168.43.252:8085', // 鏈満鍙戝竷娴嬭瘯
+        //target: 'http://localhost:12319/', // 鏈満璋冭瘯娴嬭瘯
+        //target: 'http://10.103.11.130:8085/', //11缃戞
+        target: 'http://localhost:6099/', //9缃戞
+        changeOrigin: true,
+        pathRewrite:{
+          '[process.env.VUE_APP_BASE_API]': ''
+        }
+      }
+    }
+  },
+  css: {
+    loaderOptions: {
+      sass: {}
+    }
+  },
+  // configureWebpack 鍊间负瀵硅薄锛屼細閫氳繃 webpack-merge 鍚堝苟鍒版渶缁堢殑閰嶇疆
+  configureWebpack: {
+    //鍦╳ebpack鐨刵ame瀛楁涓彁渚涘簲鐢ㄧ▼搴忕殑鏍囬锛屼互渚垮彲浠ュ湪index.html涓闂畠鏉ユ敞鍏ユ纭殑鏍囬
+    name: name,
+    resolve: {
+      alias: {
+        '@': resolve('src')
+      }
+    },
+
+    externals: {}
+  },
+
+  chainWebpack (config) {
+    config.plugin('define').tap(args => {
+      //args[0]['process.env'].IMAGE_URL = "'http://120.53.244.200:8085/'"; //娴嬭瘯鐜
+      // args[0]['process.env'].IMAGE_URL = "'http://localhost:8085/'"; //姝e紡鐜 11缃戞
+      args[0]['process.env'].IMAGE_URL = "'http://10.103.9.200:8085/'"; //姝e紡鐜 9缃戞
+      //args[0]['process.env'].IMAGE_URL = "'http://192.168.137.200:8085/'"; //鏈満鍙戝竷娴嬭瘯
+      return args;
+    });
+    config.plugin('provide').use(webpack.ProvidePlugin, [{
+      $: 'jquery',
+      jquery: 'jquery',
+      jQuery: 'jquery',
+      'window.jQuery': 'jquery'
+    }]);
+    // 璁剧疆svg
+    config.module.rule('svg').exclude.add(resolve('src/icons')).end();
+    config.module
+      .rule('icons')
+      .test(/\.svg$/)
+      .include.add(resolve('src/icons'))
+      .end()
+      .use('svg-sprite-loader')
+      .loader('svg-sprite-loader')
+      .options({
+        symbolId: 'icon-[name]'
+      })
+      .end();
+    //璁剧疆寮�鍙戠幆澧僺ourceMap
+    config.when(!isProd, config => config.devtool('cheap-source-map'));
+    //寮�鍙戠幆澧�
+
+    config.when(isProd, config => {
+      config.optimization.splitChunks({
+        chunks: 'all',
+        cacheGroups: {
+          libs: {
+            name: 'chunk-libs',
+            test: /[\\/]node_modules[\\/]/,
+            priority: 10,
+            chunks: 'initial'
+          },
+          elementUI: {
+            name: 'chunk-elementUI',
+            priority: 20,
+            test: /[\\/]node_modules[\\/]_?element-ui(.*)/
+          },
+          commons: {
+            name: 'chunk-commons',
+            test: resolve('src/components'),
+            minChunks: 3,
+            priority: 5,
+            reuseExistingChunk: true
+          }
+        }
+      });
+      // config.plugin('html').tap(args => {
+      //     args[0].cdn = cdn;
+      //     return args;
+      // });
+      config.optimization.runtimeChunk('single');
+
+      //鍘婚櫎鐢熶骇鐜debugger 鍜宑onsole
+      config.optimization.minimizer('terser').tap(args => {
+        args[0].terserOptions.compress.warnings = false;
+        args[0].terserOptions.compress.drop_console = true;
+        args[0].terserOptions.compress.drop_debugger = true;
+        args[0].terserOptions.compress.pure_funcs = ['console.*'];
+        return args;
+      });
+      //g-zip寮�鍚�
+      config.plugin('CompressionWebpackPlugin').use(CompressionWebpackPlugin, [{
+        filename: '[path].gz[query]',
+        algorithm: 'gzip',
+        test: /\.js$|\.css/, //鍖归厤鏂囦欢鍚�
+        threshold: 10240, //瀵硅秴杩�10k鐨勬暟鎹帇缂�
+        minRatio: 0.8
+      }]);
+    });
+  }
+};
\ No newline at end of file

--
Gitblit v1.9.3