From 1dfc8bc300a6ae0822514ddf2e1399d4762fa1b1 Mon Sep 17 00:00:00 2001
From: 沈斌 <bluelazysb@hotmail.com>
Date: Thu, 12 Jul 2018 14:01:00 +0800
Subject: [PATCH] updates

---
 README-zh_CN.md                                                                                          |  107 
 src/app/layout/fullscreen/fullscreen.component.ts                                                        |    2 
 src/app/layout/default/header/components/user.component.ts                                               |    5 
 src/app/routes/map/coordinates-picker/coordinates-picker.component.html                                  |   44 
 src/app/layout/default/sidebar/sidebar.component.html                                                    |    6 
 src/app/routes/users/installer/edit/edit.component.ts                                                    |   90 
 src/assets/i18n/en.json                                                                                  |    6 
 src/environments/environment.chore.ts                                                                    |    1 
 src/app/routes/report/images/table_bg.png                                                                |    0 
 src/app/business/pipe/tyep-handle.pipe.ts                                                                |   36 
 src/app/layout/default/header/header.component.html                                                      |   10 
 src/app/routes/report/report.component.html                                                              |   80 
 src/app/routes/devices/monitor-point/monitor-point.component.ts                                          |  245 
 src/environments/environment.ts                                                                          |    6 
 src/app/routes/reports/reports.module.ts                                                                 |   57 
 src/app/business/services/http/operate-user.service.ts                                                   |   32 
 src/app/business/services/http/alarm-config.service.ts                                                   |   56 
 src/app/layout/default/header/components/icon.component.ts                                               |    0 
 src/app/routes/systems/account/account-edit/account-edit.component.ts                                    |   94 
 src/app/routes/systems/organization/organization-list/organization-list.component.ts                     |  269 
 CONTRIBUTING.md                                                                                          |  200 
 src/app/routes/reports/alarm/alarm.component.ts                                                          |  310 
 src/app/routes/report/report.component.css                                                               |   61 
 src/app/routes/report/images/t_right.png                                                                 |    0 
 src/app/layout/default/header/components/i18n.component.ts                                               |    4 
 src/app/layout/default/header/index.md                                                                   |    0 
 src/app/routes/reports/demo/demo.component.ts                                                            |  330 
 src/app/layout/passport/passport.component.less                                                          |    0 
 src/app/routes/dashboard/monitor/monitor.component.html                                                  |   98 
 src/app/routes/sensors/sensors.module.ts                                                                 |   40 
 src/index.html                                                                                           |  112 
 src/app/layout/default/header/header.component.spec.ts                                                   |    3 
 src/app/routes/devices/version/version.component.ts                                                      |  212 
 src/app/routes/dashboard/monitor/monitor.component.ts                                                    |   96 
 docker-compose.yml                                                                                       |   10 
 src/app/layout/default/default.component.ts                                                              |    6 
 yarn.lock                                                                                                | 3201 +++---
 src/app/app.component.spec.ts                                                                            |    6 
 src/app/core/net/default.interceptor.ts                                                                  |  150 
 src/app/routes/passport/login/login.component.ts                                                         |  167 
 src/app/routes/devices/basic-info/basic-info.component.html                                              |   51 
 src/app/routes/sensors/basic-info/sensor-unit/sensor-unit.component.ts                                   |  166 
 src/app/routes/systems/organization/organization-config-unit/organization-config-unit.component.html     |   43 
 src/app/routes/reports/excel/excel.component.ts                                                          |  206 
 src/app/routes/devices/basic-info/device-edit/device-edit.component.html                                 |  126 
 src/app/routes/dashboard/analysis/analysis.component.html                                                |  288 
 src/app/business/services/util/date.service.ts                                                           |   58 
 src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.ts                                   |   64 
 src/app/delon.module.ts                                                                                  |  236 
 src/app/routes/devices/devices.module.ts                                                                 |   62 
 src/tsconfig.spec.json                                                                                   |   14 
 src/app/business/services/http/device-adjust-value.service.ts                                            |   25 
 src/app/business/services/http/sensors.service.ts                                                        |   47 
 yarn-error.log                                                                                           | 8403 ++++++++++++++++
 package-lock.json                                                                                        | 4251 +++++---
 src/environments/environment.hmr.ts                                                                      |    6 
 src/test.ts                                                                                              |    2 
 src/app/core/core.module.ts                                                                              |    4 
 src/app/layout/default/header/components/theme.component.ts                                              |    0 
 src/assets/i18n/zh-CN.json                                                                               |    8 
 src/app/routes/dashboard/v1/v1.component.html                                                            |  150 
 src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.ts                  |  153 
 src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.html                                 |   64 
 src/app/routes/users/alarm-user/alarm-user-edit/alarm-user-edit.component.ts                             |   71 
 src/app/routes/devices/version/version-edit/version-edit.component.html                                  |   46 
 src/app/routes/reports/demo/demo.component.html                                                          |  154 
 src/app/routes/report/images/bg02.png                                                                    |    0 
 src/app/routes/systems/organization/organization.component.html                                          |   12 
 src/app/routes/report/images/bg2.png                                                                     |    0 
 src/app/routes/users/alarm-user/alarm-user-edit/alarm-user-edit.component.html                           |   56 
 src/app/routes/users/installer/edit/edit.component.html                                                  |   41 
 src/app/routes/users/alarm-user/alarm-user.component.ts                                                  |  141 
 src/app/routes/report/images/logo.png                                                                    |    0 
 src/app/layout/default/default.component.html                                                            |    5 
 docker-compose.debug.yml                                                                                 |   13 
 src/app/routes/devices/monitor-point/monitor-point.component.html                                        |   82 
 src/app/routes/dashboard/monitor/monitor.component.less                                                  |   60 
 src/app/routes/sensors/basic-info/sensor-unit/sensor-unit.component.html                                 |   84 
 src/app/routes/systems/organization/organization-config-screen/organization-config-screen.component.ts   |  222 
 src/app/business/services/http/monitor-point.service.ts                                                  |   61 
 src/app/business/services/util/example.service.ts                                                        |   62 
 src/tsconfig.app.json                                                                                    |   14 
 src/app/business/services/http/sensor-unit.service.ts                                                    |   18 
 src/app/routes/systems/registration/registration.component.ts                                            |   72 
 src/app/core/startup/startup.service.ts                                                                  |   57 
 src/app/routes/dashboard/workplace/workplace.component.ts                                                |  459 
 src/app/business/entity/token.ts                                                                         |    7 
 src/app/routes/users/installer/installer.component.ts                                                    |  199 
 src/app/routes/systems/organization/organization-list/organization-list.component.html                   |   83 
 src/app/layout/default/header/components/storage.component.ts                                            |    0 
 src/app/business/enum/types.enum.ts                                                                      |   33 
 src/app/business/services/util/tools.service.ts                                                          |   50 
 src/app/routes/systems/organization/organization-config-unit/organization-config-unit.component.ts       |   71 
 src/app/business/services/http/areacode.service.ts                                                       |   77 
 src/app/routes/systems/organization/organization-config/organization-config.component.ts                 |  294 
 src/app/routes/devices/version/version.component.html                                                    |   67 
 src/app/layout/passport/passport.component.ts                                                            |    8 
 src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.html                |   55 
 src/styles/index.less                                                                                    |    3 
 src/app/routes/devices/basic-info/adjust-config/adjust-config.component.ts                               |  129 
 src/app/routes/sensors/basic-info/basic-info.component.html                                              |   68 
 src/app/routes/report/images/text_t_bg.png                                                               |    0 
 src/app/routes/systems/organization/organization.component.ts                                            |   17 
 src/app/routes/reports/alarm/alarm.component.html                                                        |  124 
 src/app/business/services/http/organization.service.ts                                                   |   52 
 src/app/routes/report/report.component.ts                                                                |  262 
 src/app/routes/systems/account/account.component.ts                                                      |  201 
 src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.ts                  |  167 
 src/app/routes/report/images/text_t_left.png                                                             |    0 
 src/app/layout/default/default.component.spec.ts                                                         |   17 
 src/app/routes/users/alarm-user/alarm-user.component.html                                                |  114 
 src/app/routes/systems/account/account-edit/account-edit.component.html                                  |   57 
 src/app/layout/default/header/components/task.component.ts                                               |    0 
 src/app/routes/systems/registration/registration.component.html                                          |   27 
 src/app/routes/map/coordinates-picker/coordinates-picker.component.css                                   |   19 
 src/app/routes/dashboard/v1/v1.component.spec.ts                                                         |   16 
 src/environments/environment.prod.ts                                                                     |    4 
 src/app/routes/report/images/t_left.png                                                                  |    0 
 src/app/business/services/http/device.service.ts                                                         |   45 
 LICENSE                                                                                                  |   21 
 src/app/routes/report/images/bg_yuanjiao01.png                                                           |    0 
 src/app/routes/routes.module.ts                                                                          |   36 
 src/app/routes/passport/login/login.component.less                                                       |   75 
 src/app/business/business.module.ts                                                                      |   22 
 src/app/business/entity/grid.ts                                                                          |  120 
 src/app/app.module.ts                                                                                    |   42 
 src/app/routes/systems/organization/organization-config-screen/organization-config-screen.component.html |  161 
 src/app/core/i18n/i18n.service.ts                                                                        |   27 
 src/app/business/enum/patterns.enum.ts                                                                   |    3 
 CHANGELOG.md                                                                                             |  194 
 src/app/routes/sensors/basic-info/basic-info.component.ts                                                |  186 
 README.md                                                                                                |  105 
 src/app/routes/dashboard/analysis/analysis.component.less                                                |  149 
 src/app/business/entity/data.ts                                                                          |  187 
 src/app/routes/systems/organization/organization-edit/organization-edit.component.ts                     |  116 
 src/app/core/i18n/i18n.service.spec.ts                                                                   |    6 
 tsconfig.json                                                                                            |    8 
 src/app/layout/default/sidebar/sidebar.component.spec.ts                                                 |    2 
 src/app/routes/routes-routing.module.ts                                                                  |   54 
 src/app/layout/default/header/components/fullscreen.component.ts                                         |    2 
 src/app/business/services/http/version.service.ts                                                        |   48 
 src/app/routes/passport/login/login.component.html                                                       |   44 
 src/app/app.component.ts                                                                                 |   57 
 src/app/core/README.md                                                                                   |    5 
 src/app/routes/devices/basic-info/adjust-config/adjust-config.component.html                             |   45 
 src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.html                |   76 
 src/app/routes/systems/organization/organization-edit/organization-edit.component.html                   |   91 
 src/app/routes/users/users.module.ts                                                                     |   37 
 e2e/app.e2e-spec.ts                                                                                      |    2 
 src/app/routes/reports/query/query.component.html                                                        |  239 
 src/app/shared/README.md                                                                                 |   30 
 src/app/routes/devices/version/version-edit/version-edit.component.ts                                    |  120 
 src/app/business/services/http/login.service.ts                                                          |  112 
 src/app/routes/map/coordinates-picker/coordinates-picker.component.ts                                    |  172 
 src/app/routes/devices/basic-info/device-edit/device-edit.component.ts                                   |  229 
 src/app/routes/systems/account/account.component.html                                                    |  171 
 src/app/layout/layout.module.ts                                                                          |   42 
 src/app/routes/report/images/bg_yuanjiao.png                                                             |    0 
 src/app/routes/report/images/t_bg.png                                                                    |    0 
 src/app/layout/default/header/components/notify.component.ts                                             |    0 
 src/app/routes/dashboard/v1/v1.component.ts                                                              |   41 
 src/app/routes/map/coordinates-picker/coordinates-picker.service.ts                                      |   15 
 src/app/layout/passport/passport.component.html                                                          |   17 
 src/app/routes/dashboard/analysis/analysis.component.ts                                                  |   82 
 src/app/routes/devices/basic-info/basic-info.component.ts                                                |  307 
 src/app/routes/users/installer/installer.component.html                                                  |  150 
 src/app/layout/default/header/header.component.ts                                                        |    0 
 src/app/routes/map/map.module.ts                                                                         |   21 
 src/app/layout/default/header/components/search.component.ts                                             |    0 
 src/app/routes/systems/organization/organization-config/organization-config.component.html               |  124 
 src/app/shared/shared.module.ts                                                                          |  195 
 src/app/routes/dashboard/workplace/workplace.component.less                                              |  389 
 src/app/routes/reports/excel/excel.component.html                                                        |  121 
 src/assets/app-data.json                                                                                 |  196 
 src/testing/common.spec.ts                                                                               |   20 
 src/app/routes/reports/query/query.component.less                                                        |   24 
 /dev/null                                                                                                |    0 
 Dockerfile                                                                                               |   27 
 src/app/layout/default/sidebar/sidebar.component.ts                                                      |   20 
 src/app/routes/dashboard/workplace/workplace.component.html                                              |  262 
 src/app/routes/reports/query/query.component.ts                                                          |  797 +
 src/app/routes/systems/systems.module.ts                                                                 |   60 
 package.json                                                                                             |   61 
 src/app/routes/report/images/bg.png                                                                      |    0 
 src/app/routes/report/images/text_t_right.png                                                            |    0 
 src/app/business/pipe/pipe.module.ts                                                                     |   14 
 src/app/routes/report/images/bg01.png                                                                    |    0 
 187 files changed, 26,904 insertions(+), 3,650 deletions(-)

diff --git a/.angular-cli.json b/.angular-cli.json
deleted file mode 100644
index c11dab3..0000000
--- a/.angular-cli.json
+++ /dev/null
@@ -1,89 +0,0 @@
-{
-    "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
-    "project": {
-        "name": "ng-alain"
-    },
-    "apps": [{
-        "root": "src",
-        "outDir": "dist",
-        "assets": [
-            "assets",
-            "favicon.ico"
-        ],
-        "index": "index.html",
-        "main": "main.ts",
-        "polyfills": "polyfills.ts",
-        "test": "test.ts",
-        "tsconfig": "tsconfig.app.json",
-        "testTsconfig": "tsconfig.spec.json",
-        "prefix": "app",
-        "styles": [
-            "styles.less"
-        ],
-        "scripts": [
-            "../node_modules/@antv/g2/dist/g2.min.js",
-            "../node_modules/@antv/data-set/dist/data-set.min.js",
-            "../node_modules/@antv/g2-plugin-slider/dist/g2-plugin-slider.min.js"
-        ],
-        "environmentSource": "environments/environment.ts",
-        "environments": {
-            "dev": "environments/environment.ts",
-            "prod": "environments/environment.prod.ts",
-            "hmr": "environments/environment.hmr.ts",
-            "chore": "environments/environment.chore.ts"
-        }
-    }],
-    "e2e": {
-        "protractor": {
-            "config": "./protractor.conf.js"
-        }
-    },
-    "lint": [{
-            "project": "src/tsconfig.app.json",
-            "exclude": "**/node_modules/**"
-        },
-        {
-            "project": "src/tsconfig.spec.json",
-            "exclude": "**/node_modules/**"
-        },
-        {
-            "project": "e2e/tsconfig.e2e.json",
-            "exclude": "**/node_modules/**"
-        }
-    ],
-    "test": {
-        "karma": {
-            "config": "./karma.conf.js"
-        }
-    },
-    "defaults": {
-        "styleExt": "less",
-        "class": {
-            "spec": false
-        },
-        "component": {
-            "flat": false,
-            "spec": false,
-            "inlineStyle": true,
-            "inlineTemplate": false
-        },
-        "directive": {
-            "spec": false
-        },
-        "guard": {
-            "spec": false
-        },
-        "interface": {
-            "prefix": "I"
-        },
-        "module": {
-            "spec": false
-        },
-        "pipe": {
-            "spec": true
-        },
-        "service": {
-            "spec": false
-        }
-    }
-}
diff --git a/.angulardoc.json b/.angulardoc.json
deleted file mode 100644
index 2e20cf5..0000000
--- a/.angulardoc.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "repoId": "618725ce-edd5-4e4a-bc7a-dec9a2bfd5ba",
-  "lastSync": 0
-}
\ No newline at end of file
diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index 6e87a00..0000000
--- a/.editorconfig
+++ /dev/null
@@ -1,13 +0,0 @@
-# Editor configuration, see http://editorconfig.org
-root = true
-
-[*]
-charset = utf-8
-indent_style = space
-indent_size = 2
-insert_final_newline = true
-trim_trailing_whitespace = true
-
-[*.md]
-max_line_length = off
-trim_trailing_whitespace = false
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 54bfd20..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,42 +0,0 @@
-# See http://help.github.com/ignore-files/ for more about ignoring files.
-
-# compiled output
-/dist
-/tmp
-/out-tsc
-
-# dependencies
-/node_modules
-
-# IDEs and editors
-/.idea
-.project
-.classpath
-.c9/
-*.launch
-.settings/
-*.sublime-workspace
-
-# IDE - VSCode
-.vscode/*
-!.vscode/settings.json
-!.vscode/tasks.json
-!.vscode/launch.json
-!.vscode/extensions.json
-
-# misc
-/.sass-cache
-/connect.lock
-/coverage
-/libpeerconnection.log
-npm-debug.log
-testem.log
-/typings
-
-# e2e
-/e2e/*.js
-/e2e/*.map
-
-# System Files
-.DS_Store
-Thumbs.db
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..1c03fbf
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,194 @@
+# update no more, please to [release](https://github.com/cipchk/ng-alain/releases) page.
+
+-------------------
+
+# 0.1.2-beta.10
+
++ ng-zorro-antd 0.6.x ������[#504](https://github.com/NG-ZORRO/ng-zorro-antd/issues/504)��������������������������������������������� ng-zorro-antd ������������������������������
+
+# 0.1.2-beta.9
+
++ ������ ng-zorro-antd ������������������������ [translator.service](./src/app/core/translator/translator.service.ts)
+    + ������ ng-zorro-antd ��� `rc` ������������������������������������ `@angular/cdk` ���������������������������
+
+> ���������������������������������������������������������������������������
+
+# 0.1.2-beta.8
+
++ ������������������������ [menu.service.ts](./src/app/core/services/menu.service.ts)
++ ������������������������������������������������
++ ������ ng-zorro-antd ������������������������ bug ������������ `header.component.ts`���
+
+# 0.1.2-beta.7
+
++ ������Docker������
+    + ������ `.dockerignore`���`docker-compose.yml`���`docker-compose.debug.yml`���`Dockerfile` ������
+    + ������ `_nginx` ������
+
+# 0.1.2-beta.6
+
++ ������������������������[���������������](https://cipchk.github.io/ng-alain/#/data-v/relation)
++ ������������������������������ `target` ������
++ ������Front-End-Checklist������ `index.html`
+
+# 0.1.2-beta.5
+
++ ������ `[_src]` ������������������������������
+    + ���������������qq���������������������������
+    + ������������http&https������http
+    + ������������onerror������
++ ���������������
+    + ������ `text-truncate` ��� `!important`���
+    + ������ `.simple-table` ��� `img` ��������� `padding-left` ��������� `margin-left` ���������������
++ ������������EMAIL���������������������closes [#35](https://github.com/cipchk/ng-alain/issues/35)
++ ������������������������������������������������������������closes [#34](https://github.com/cipchk/ng-alain/issues/34)
++ ������ `sparkline.directive.ts` ���������
++ ������tsline���������`curly: false`���
+
+# 0.1.2-beta.4
+
++ ���������������������hover���������������������closes [#31](https://github.com/cipchk/ng-alain/issues/31)
+
+# 0.1.2-beta.3
+
++ ������ `file-upload` ������������ `span` ���������������������������������������������closes [#27](https://github.com/cipchk/ng-alain/issues/27)
+
+# 0.1.2-beta.2
+
++ ������ `TitleService` ������������������������
+
+# 0.1.2-beta.1
+
++ ������������������ git-subtree ������ `styles` ��������������� `src/styles/alain/`��������� `themes.service.ts` ���������
+
+# 0.1.1-beta.2
+
++ ������ `ng-zorro-antd` ������������������
++ ������������������������
+
+# 0.1.1-beta.1
+
+������ ng-alain ��������������������������� alain ������������������������������������������������������ scss ������ less��������� scss ������������������������������������������
+
++ scss ��� less ������������
+    + `.angular-cli.json` ��� `styles`���`styleExt` ��������� `.less`
+    + `themes.service.ts` ��������� `.less`
+    + ��������� `.scss` ������������������ `.less`
++ **������** ������������������������������������������ `.less` ������������������������������������������������������������������������������������������������������������������
++ ������ `down-file` ���������
++ ������ `ng-zorro-antd` ���������������������������������������BUG������������������������
+
+# 0.1.0-beta.1
+
+**0.1.0���������������**
+
+������ `nz-menu` ������������ ng-alain ������������������������������������������������������������������������������������ `0.0.x` ���������������������������������������������������������
+
++ `0.1.0` ��������������� `layout`���������������������������`styles` ���������������������������������������������������������
++ ���10������������������������5������������������������������������������������������������������������������������10���������������
++ ������������ `14px` ���������
++ ������������������������������������������������ `_alain-custom-variables.scss` ������������������������������������ng-alain��������� `ng-zorro-antd` ���������������������������������������������������������������������������������������������������
++ ������������������������������������������������������
++ **���������������** ��������������� ng-zorro-antd ������������������
++ closes [#6](https://github.com/cipchk/ng-alain/issues/6) [#12](https://github.com/cipchk/ng-alain/issues/12) [#13](https://github.com/cipchk/ng-alain/issues/13) [#14](https://github.com/cipchk/ng-alain/issues/14) [#23](https://github.com/cipchk/ng-alain/issues/23)
+
+**������**
+
++ ������ `ng lint`
++ ��� `app.component.ts` ������������������ `nz-root`
++ ���������
+    + ������ `badge-dot` ������������
+    + ������ `nz-table` ������������������������������
+    + ������ `unwrap` ���������������������������header���aside ������
+    + ������ `width-*`���`modal-*`
++ ������������������IE������������������ `polyfills.ts` ���������������
++ ��� Logo
++ ������ `angular`���`angular-cli`���`ng-zorro-antd` ���������������
+    + ��������������������������������������� `licenses` BUG������������������������
+    + close [#15](https://github.com/cipchk/ng-alain/issues/15)
+
+# 0.1.0-beta.1
+
++ ������ `.simple-table`���`.search-form`���`.fixed-btns` ������������������[���������](https://cipchk.github.io/ng-alain/#/extras/poi)
++ ������HTML������������������������������������������������������������ `_alain-custom-variables.scss` ������ `$form-state-visual-feedback-enabled: true;`
++ ���������������
++ ������ `_HttpClient`���`ModalHelper` ���
+    + `_HttpClient` ������������������������������ `[nzLoading]` ���������������
+    + `ModalHelper` ���������������������������
++ ������Modal���������������������������������������������[CSS���������������](./_documents/component-patch.md)
+
+# 0.0.1-beta.3
+
++ **���** ������������ `_alain-custom-variables.scss` ������ `styles` ������������������������������������������������������������ [������������������](./_documents/upgrade.md)���
++ ������ `yn`���`keys` ������������ [pipe������](./_documents/pipe.md)
++ ������ `badge` ������
++ ������ `angular-cli@4.4.1`���`ng-zorro-antd@0.5.1`
+
+# 0.0.1-beta.2
+
++ ������ `tree`���`sortable`���`sweetalert` ������
+
+# 0.0.1-beta.1
+
++ ��������������������������������������� `header-left-right.component` ������������������������������ `.top-nav-wrap` ������
++ ���������������������������������������
++ ������������ `environments` ���������������������������������������������������������������
++ ������ `TokenService` ������������������
++ ���������������������
++ ������ `StartupService` ���������������������BUG
++ ������ `@angular/cli` ��������������������������������������������� `licenses` BUG������������ ` --extract-licenses=false` ������������������������
++ ������������������������
+
+# 0.0.1-beta
+
++ ������ `core`���`shared` ��������������������� `@shared/shared.module` ������ `SharedModule`
++ ��������������������� `.full` ������������������������������������������������
++ ������������������������������������������
++ ������������������������������������ `ueditor` ���������������������������������
++ ������������������������������������������������������������
++ ������ `core/services` ������������
+
+# 0.0.1-alpha.7
+
++ ������TOKEN���������������
++ ���������������������������������������������closes #8
++ ������ `angular-cli`���`ng-zorro-antd` ���������������
++ ������������ `angular-cli` ���commonjs������������������������������������������ `preloader` ��� ������ `main.ts` ������������������
+
+# 0.0.1-alpha.6
+
++ ���������������������������������������������������������������������
++ ������ACL
++ ������������������
++ ������ #6 #7
+
+# 0.0.1-alpha.5
+
++ ���������������������
++ ������ `algin`���`img` ������CSS���������
++ ������10*10���������CSS���������
++ ������ `ng-zorro-antd` ���������������
+
+# 0.0.1-alpha.4
+
++ ������G2������
++ ��������������� `nz-avatar` antd������������
++ ������ `ng-zorro-antd` ���������������
++ ������ [#1](https://github.com/cipchk/ng-alain/issues/1)
+
+# 0.0.1-alpha.3
+
++ ������������������DEMO
++ ������������������������
++ ������ `nz-carousel` ���������������������
++ ���������������������
+
+# 0.0.1-alpha.2
+
++ ������ `.list-group` CSS������
++ ������ `_date`���`_currenty` Pipe
++ ���������������������������������������������
++ ������ component-patch.md pipe.md ������
+
++ ������������������������ `nzFocus`���`nzBlur` ���������
++ ������ `color.service`���`scroll.service` ��� services ���������
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..a1a6489
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,200 @@
+# Contributing to ng-alain
+
+We would love for you to contribute to ng-alain and help make it even better than it is
+today! As a contributor, here are the guidelines we would like you to follow:
+
+ - [Issues and Bugs](#issue)
+ - [Feature Requests](#feature)
+ - [Submission Guidelines](#submit)
+ - [Coding Rules](#rules)
+ - [Commit Message Guidelines](#commit)
+
+## <a name="issue"></a> Found a Bug?
+If you find a bug in the source code, you can help us by
+[submitting an issue](#submit-issue) to our [GitHub Repository][github]. Even better, you can
+[submit a Pull Request](#submit-pr) with a fix.
+
+## <a name="feature"></a> Missing a Feature?
+You can *request* a new feature by [submitting an issue](#submit-issue) to our GitHub
+Repository. If you would like to *implement* a new feature, please submit an issue with
+a  for your work first, to be sure that we can use it.
+Please consider what kind of change it is:
+
+* For a **Major Feature**, first open an issue and outline your proposal so that it can be
+discussed. This will also allow us to better coordinate our efforts, prevent duplication of work,
+and help you to craft the change so that it is successfully accepted into the project.
+* **Small Features** can be crafted and directly [submitted as a Pull Request](#submit-pr).
+
+## <a name="submit"></a> Submission Guidelines
+
+### <a name="submit-issue"></a> Submitting an Issue
+
+Before you submit an issue, please search the issue tracker, maybe an issue for your problem already exists and the discussion might inform you of workarounds readily available.
+
+We want to fix all the issues as soon as possible, but before fixing a bug we need to reproduce and confirm it. In order to reproduce bugs we will systematically ask you to provide a minimal reproduction scenario using http://plnkr.co. Having a live, reproducible scenario gives us wealth of important information without going back & forth to you with additional questions like:
+
+- version of ng-alain used
+- 3rd-party libraries and their versions
+- and most importantly - a use-case that fails
+
+A minimal reproduce scenario using http://plnkr.co/ allows us to quickly confirm a bug (or point out coding problem) as well as confirm that we are fixing the right problem. If plunker is not a suitable way to demonstrate the problem (for example for issues related to our npm packaging), please create a standalone git repository demonstrating the problem.
+
+We will be insisting on a minimal reproduce scenario in order to save maintainers time and ultimately be able to fix more bugs. Interestingly, from our experience users often find coding problems themselves while preparing a minimal plunk. We understand that sometimes it might be hard to extract essentials bits of code from a larger code-base but we really need to isolate the problem before we can fix it.
+
+Unfortunately we are not able to investigate / fix bugs without a minimal reproduction, so if we don't hear back from you we are going to close an issue that don't have enough info to be reproduced.
+
+You can file new issues by filling out our [new issue form](https://github.com/cipchk/ng-alain/issues/new).
+
+
+### <a name="submit-pr"></a> Submitting a Pull Request (PR)
+Before you submit your Pull Request (PR) consider the following guidelines:
+
+* Search [GitHub](https://github.com/cipchk/ng-alain/pulls) for an open or closed PR
+  that relates to your submission. You don't want to duplicate effort.
+* Make your changes in a new git branch:
+
+     ```shell
+     git checkout -b my-fix-branch master
+     ```
+
+* Create your patch, **including appropriate test cases**.
+* Follow our [Coding Rules](#rules).
+* Run the full ng-alain test suite <!-- , as described in the [developer documentation][dev-doc] -->, and ensure that all tests pass.
+* Commit your changes using a descriptive commit message that follows our
+  [commit message conventions](#commit). Adherence to these conventions
+  is necessary because release notes are automatically generated from these messages.
+
+     ```shell
+     git commit -a
+     ```
+  Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files.
+
+* Push your branch to GitHub:
+
+    ```shell
+    git push origin my-fix-branch
+    ```
+
+* In GitHub, send a pull request to `ng-alain:master`.
+* If we suggest changes then:
+  * Make the required updates.
+  * Re-run the ng-alain test suites to ensure tests are still passing.
+  * Rebase your branch and force push to your GitHub repository (this will update your Pull Request):
+
+    ```shell
+    git rebase master -i
+    git push -f
+    ```
+
+That's it! Thank you for your contribution!
+
+#### After your pull request is merged
+
+After your pull request is merged, you can safely delete your branch and pull the changes
+from the main (upstream) repository:
+
+* Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows:
+
+    ```shell
+    git push origin --delete my-fix-branch
+    ```
+
+* Check out the master branch:
+
+    ```shell
+    git checkout master -f
+    ```
+
+* Delete the local branch:
+
+    ```shell
+    git branch -D my-fix-branch
+    ```
+
+* Update your master with the latest upstream version:
+
+    ```shell
+    git pull --ff upstream master
+    ```
+
+## <a name="rules"></a> Coding Rules
+To ensure consistency throughout the source code, keep these rules in mind as you are working:
+
+* All features or bug fixes **must be tested** by one or more specs (unit-tests).
+* All public API methods **must be documented**.
+
+## <a name="commit"></a> Commit Message Guidelines
+
+We have very precise rules over how our git commit messages can be formatted.  This leads to **more
+readable messages** that are easy to follow when looking through the **project history**.  But also,
+we use the git commit messages to **generate the ng-alain change log**.
+
+### Commit Message Format
+Each commit message consists of a **header**, a **body** and a **footer**.  The header has a special
+format that includes a **type**, a **scope** and a **subject**:
+
+```
+<type>(<scope>): <subject>
+<BLANK LINE>
+<body>
+<BLANK LINE>
+<footer>
+```
+
+The **header** is mandatory and the **scope** of the header is optional.
+
+Any line of the commit message cannot be longer 100 characters! This allows the message to be easier
+to read on GitHub as well as in various git tools.
+
+Footer should contain a [closing reference to an issue](https://help.github.com/articles/closing-issues-via-commit-messages/) if any.
+
+Samples: (even more [samples](https://github.com/cipchk/ng-alain/commits/master))
+
+```
+docs(changelog): update change log to beta.5
+```
+```
+fix(release): need to depend on latest rxjs and zone.js
+
+The version in our package.json gets copied to the one we publish, and users need the latest of these.
+```
+
+### Revert
+If the commit reverts a previous commit, it should begin with `revert: `, followed by the header of the reverted commit. In the body it should say: `This reverts commit <hash>.`, where the hash is the SHA of the commit being reverted.
+
+### Type
+Must be one of the following:
+
+* **build**: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
+* **ci**: Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)
+* **docs**: Documentation only changes
+* **feat**: A new feature
+* **fix**: A bug fix
+* **perf**: A code change that improves performance
+* **refactor**: A code change that neither fixes a bug nor adds a feature
+* **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
+* **test**: Adding missing tests or correcting existing tests
+
+### Subject
+The subject contains succinct description of the change:
+
+* use the imperative, present tense: "change" not "changed" nor "changes"
+* don't capitalize first letter
+* no dot (.) at the end
+
+### Body
+Just as in the **subject**, use the imperative, present tense: "change" not "changed" nor "changes".
+The body should include the motivation for the change and contrast this with previous behavior.
+
+### Footer
+The footer should contain any information about **Breaking Changes** and is also the place to
+reference GitHub issues that this commit **Closes**.
+
+**Breaking Changes** should start with the word `BREAKING CHANGE:` with a space or two newlines. The rest of the commit message is then used for this.
+
+A detailed explanation can be found in this [document][commit-message-format].
+
+
+[commit-message-format]: https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit#
+[github]: https://github.com/cipchk/ng-alain
+[plunker]: http://plnkr.co/edit
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..8b7adbd
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,27 @@
+# STEP 1: Build
+FROM node:8-alpine as builder
+
+LABEL authors="cipchk <cipchk@qq.com>"
+
+COPY package.json package-lock.json ./
+
+RUN npm set progress=false && npm config set depth 0 && npm cache clean --force
+RUN npm i && mkdir /ng-alain && cp -R ./node_modules ./ng-alain
+
+WORKDIR /ng-alain
+
+COPY . .
+
+RUN npm run build
+
+# STEP 2: Setup
+FROM nginx:1.13.5-alpine
+
+COPY --from=builder /ng-alain/_nginx/default.conf /etc/nginx/conf.d/default.conf
+COPY --from=builder /ng-alain/_nginx/ssl/* /etc/nginx/ssl/
+
+RUN rm -rf /usr/share/nginx/html/*
+
+COPY --from=builder /ng-alain/dist /usr/share/nginx/html
+
+CMD [ "nginx", "-g", "daemon off;"]
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..9f404ed
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 ������
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README-zh_CN.md b/README-zh_CN.md
new file mode 100644
index 0000000..7ed4c59
--- /dev/null
+++ b/README-zh_CN.md
@@ -0,0 +1,107 @@
+[![Build Status](https://travis-ci.org/cipchk/ng-alain.svg?branch=master)](https://travis-ci.org/cipchk/ng-alain)
+[![Dependency Status](https://david-dm.org/cipchk/ng-alain/status.svg)](https://david-dm.org/cipchk/ng-alain)
+[![NPM version](https://img.shields.io/npm/v/ng-alain.svg)](https://www.npmjs.com/package/ng-alain)
+
+# ng-alain
+
+������������ [Ng-zorro-antd](https://github.com/NG-ZORRO/ng-zorro-antd)���ANT DESIGN��� ������������������������
+
+[README in English](README.md)
+
+[DEMO](https://cipchk.github.io/ng-alain/)
+
+## ������������
+
+������ `node` ������ >= 6.9.0 ��� `npm` ������ >= 3 ���������
+
+`ng-alain` ���������������������������������������������������������������������������**������������**���������������������������������������������������
+
+```bash
+# clone a blank ng-alain repo, just only basic function
+#   --depth 1 removes all but one .git commit history
+git clone -b blank --depth 1 https://github.com/cipchk/ng-alain.git
+# or full master branch
+git clone --depth 1 https://github.com/cipchk/ng-alain.git
+
+# change directory
+cd ng-alain
+
+# install npm package
+npm install
+# in china please use cnpm ���https://github.com/cnpm/cnpm���
+# cnpm install
+
+# start the serve
+npm start
+
+# use HMR
+npm run serve:hmr
+```
+
+> [vscode] ������������ [ng-zorro-vscode](https://marketplace.visualstudio.com/items?itemName=cipchk.ng-zorro-vscode) ������������ `nz-alain-*` ���������������
+
+
+## Links
+
++ [������](http://ng-alain.com)
++ [@delon](https://github.com/cipchk/delon)
++ [DEMO](https://cipchk.github.io/ng-alain/)
+
+## Delon
+
+[delong](https://github.com/cipchk/delon) ��������� Ant Design ������������������������������������������������������������
+
+[![Build Status](https://travis-ci.org/cipchk/delon.svg?branch=master)](https://travis-ci.org/cipchk/delon)
+[![Dependency Status](https://david-dm.org/cipchk/delon/status.svg)](https://david-dm.org/cipchk/delon)
+[![DevDependency Status](https://david-dm.org/cipchk/delon/dev-status.svg)](https://david-dm.org/cipchk/delon?type=dev)
+
+[![npm](https://img.shields.io/npm/l/@delon/theme.svg)](https://www.npmjs.com/package/@delon/theme)
+[![npm](https://img.shields.io/npm/dm/@delon/theme.svg)](https://www.npmjs.com/package/@delon/theme)
+
+| package name | version | next version |
+| ------------ |:-----:|:----------:|
+| @delon/theme | [![NPM version](https://img.shields.io/npm/v/@delon/theme.svg)](https://www.npmjs.com/package/@delon/theme) | [![NPM version](https://img.shields.io/npm/v/@delon/theme/next.svg)](https://www.npmjs.com/package/@delon/theme) |
+| @delon/abc | [![NPM version](https://img.shields.io/npm/v/@delon/abc.svg)](https://www.npmjs.com/package/@delon/abc) | [![NPM version](https://img.shields.io/npm/v/@delon/abc/next.svg)](https://www.npmjs.com/package/@delon/abc) |
+| @delon/acl | [![NPM version](https://img.shields.io/npm/v/@delon/acl.svg)](https://www.npmjs.com/package/@delon/acl) | [![NPM version](https://img.shields.io/npm/v/@delon/acl/next.svg)](https://www.npmjs.com/package/@delon/acl) |
+| @delon/auth | [![NPM version](https://img.shields.io/npm/v/@delon/auth.svg)](https://www.npmjs.com/package/@delon/auth) | [![NPM version](https://img.shields.io/npm/v/@delon/auth/next.svg)](https://www.npmjs.com/package/@delon/auth) |
+| @delon/mock | [![NPM version](https://img.shields.io/npm/v/@delon/mock.svg)](https://www.npmjs.com/package/@delon/mock) | [![NPM version](https://img.shields.io/npm/v/@delon/mock/next.svg)](https://www.npmjs.com/package/@delon/mock) |
+| @delon/cache | - | [![NPM version](https://img.shields.io/npm/v/@delon/cache/next.svg)](https://www.npmjs.com/package/@delon/cache) |
+| @delon/cli | - | [![NPM version](https://img.shields.io/npm/v/@delon/cli/next.svg)](https://www.npmjs.com/package/@delon/cli) |
+
+## Architecture
+
+![Architecture](https://github.com/cipchk/delon/blob/master/_screenshot/architecture.png)
+
+## ������
+
++ ������ `ng-zorro-antd`
++ ���������
++ ���������
++ ACL������������
++ ������������������������������������
++ ���������UI������������
++ ������������������
++ Less���������
++ ���������������������������
++ ������������
++ ���������������
++ ������[Docker](_documents/docker.md)������
+
+## ������������
+
+![desktop](https://github.com/cipchk/delon/blob/master/_screenshot/desktop.png)
+![ipad](https://github.com/cipchk/delon/blob/master/_screenshot/ipad.png)
+![iphone](https://github.com/cipchk/delon/blob/master/_screenshot/iphone.png)
+
+## Troubleshooting
+
+Please follow this guidelines when reporting bugs and feature requests:
+
+1. Use [GitHub Issues](https://github.com/cipchk/ng-alain/issues) board to report bugs and feature requests (not our email address)
+2. Please **always** write steps to reproduce the error. That way we can focus on fixing the bug, not scratching our heads trying to reproduce it.
+
+Thanks for understanding!
+
+### License
+
+The MIT License (see the [LICENSE](https://github.com/cipchk/ng-alain/blob/master/LICENSE) file for the full text)
diff --git a/README.md b/README.md
index 051306d..939d3a6 100644
--- a/README.md
+++ b/README.md
@@ -1,27 +1,104 @@
-# ScreenFrontend
+[![Build Status](https://travis-ci.org/cipchk/ng-alain.svg?branch=master)](https://travis-ci.org/cipchk/ng-alain)
+[![Dependency Status](https://david-dm.org/cipchk/ng-alain/status.svg)](https://david-dm.org/cipchk/ng-alain)
+[![NPM version](https://img.shields.io/npm/v/ng-alain.svg)](https://www.npmjs.com/package/ng-alain)
 
-This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.6.0.
+# ng-alain
 
-## Development server
+[Ng-zorro-antd](https://github.com/NG-ZORRO/ng-zorro-antd) admin panel front-end framework.
 
-Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
+���������������[������ README](README-zh_CN.md)
 
-## Code scaffolding
+[DEMO](https://cipchk.github.io/ng-alain/)
 
-Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
+## Quick start
 
-## Build
+Make sure you have Node version >= 6.9.0 and NPM >= 3 or higher.
 
-Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build.
+```bash
+# clone a blank ng-alain repo, just only basic function
+#   --depth 1 removes all but one .git commit history
+git clone -b blank --depth 1 https://github.com/cipchk/ng-alain.git
+# or full master branch
+git clone --depth 1 https://github.com/cipchk/ng-alain.git
 
-## Running unit tests
+# change directory
+cd ng-alain
 
-Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
+# install npm package
+npm install
+# in china please use cnpm ���https://github.com/cnpm/cnpm���
+# cnpm install
 
-## Running end-to-end tests
+# start the serve
+npm start
 
-Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
+# use HMR
+npm run serve:hmr
+```
 
-## Further help
+> [vscode] recommended install [ng-zorro-vscode](https://marketplace.visualstudio.com/items?itemName=cipchk.ng-zorro-vscode) plugins, that includes `nz-alain-*` snippets.
 
-To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
+## Links
+
++ [Document](http://ng-alain.com)
++ [@delon](https://github.com/cipchk/delon)
++ [DEMO](https://cipchk.github.io/ng-alain/)
+
+## Delon
+
+[delong](https://github.com/cipchk/delon) is a production-ready solution for admin business components packages, Built on the design principles developed by Ant Design.
+
+[![Build Status](https://travis-ci.org/cipchk/delon.svg?branch=master)](https://travis-ci.org/cipchk/delon)
+[![Dependency Status](https://david-dm.org/cipchk/delon/status.svg)](https://david-dm.org/cipchk/delon)
+[![DevDependency Status](https://david-dm.org/cipchk/delon/dev-status.svg)](https://david-dm.org/cipchk/delon?type=dev)
+
+[![npm](https://img.shields.io/npm/l/@delon/theme.svg)](https://www.npmjs.com/package/@delon/theme)
+[![npm](https://img.shields.io/npm/dm/@delon/theme.svg)](https://www.npmjs.com/package/@delon/theme)
+
+| package name | version | next version |
+| ------------ |:-----:|:----------:|
+| @delon/theme | [![NPM version](https://img.shields.io/npm/v/@delon/theme.svg)](https://www.npmjs.com/package/@delon/theme) | [![NPM version](https://img.shields.io/npm/v/@delon/theme/next.svg)](https://www.npmjs.com/package/@delon/theme) |
+| @delon/abc | [![NPM version](https://img.shields.io/npm/v/@delon/abc.svg)](https://www.npmjs.com/package/@delon/abc) | [![NPM version](https://img.shields.io/npm/v/@delon/abc/next.svg)](https://www.npmjs.com/package/@delon/abc) |
+| @delon/acl | [![NPM version](https://img.shields.io/npm/v/@delon/acl.svg)](https://www.npmjs.com/package/@delon/acl) | [![NPM version](https://img.shields.io/npm/v/@delon/acl/next.svg)](https://www.npmjs.com/package/@delon/acl) |
+| @delon/auth | [![NPM version](https://img.shields.io/npm/v/@delon/auth.svg)](https://www.npmjs.com/package/@delon/auth) | [![NPM version](https://img.shields.io/npm/v/@delon/auth/next.svg)](https://www.npmjs.com/package/@delon/auth) |
+| @delon/mock | [![NPM version](https://img.shields.io/npm/v/@delon/mock.svg)](https://www.npmjs.com/package/@delon/mock) | [![NPM version](https://img.shields.io/npm/v/@delon/mock/next.svg)](https://www.npmjs.com/package/@delon/mock) |
+| @delon/cache | - | [![NPM version](https://img.shields.io/npm/v/@delon/cache/next.svg)](https://www.npmjs.com/package/@delon/cache) |
+| @delon/cli | - | [![NPM version](https://img.shields.io/npm/v/@delon/cli/next.svg)](https://www.npmjs.com/package/@delon/cli) |
+
+## Architecture
+
+![Architecture](https://github.com/cipchk/delon/blob/master/_screenshot/architecture.png)
+
+## Features
+
++ `ng-zorro-antd` based
++ Responsive Layout
++ I18n
++ ACL
++ Lazy load Assets
++ UI Router States
++ Multiple color options
++ Less preprocessor
++ Well organized & commented code
++ Simple upgrade
++ Hot Module Replacement
++ Support [Docker](_documents/docker.md) deploy
+
+## App Shots
+
+![desktop](https://github.com/cipchk/delon/blob/master/_screenshot/desktop.png)
+![ipad](https://github.com/cipchk/delon/blob/master/_screenshot/ipad.png)
+![iphone](https://github.com/cipchk/delon/blob/master/_screenshot/iphone.png)
+
+## Troubleshooting
+
+Please follow this guidelines when reporting bugs and feature requests:
+
+1. Use [GitHub Issues](https://github.com/cipchk/ng-alain/issues) board to report bugs and feature requests (not our email address)
+2. Please **always** write steps to reproduce the error. That way we can focus on fixing the bug, not scratching our heads trying to reproduce it.
+
+Thanks for understanding!
+
+### License
+
+The MIT License (see the [LICENSE](https://github.com/cipchk/ng-alain/blob/master/LICENSE) file for the full text)
diff --git a/docker-compose.debug.yml b/docker-compose.debug.yml
new file mode 100644
index 0000000..ced6180
--- /dev/null
+++ b/docker-compose.debug.yml
@@ -0,0 +1,13 @@
+version: '2.1'
+
+services:
+  ng-alain:
+    image: ng-alain
+    build: .
+    environment:
+      NODE_ENV: development
+    ports:
+      - 80:80
+      - 9229:9229
+    ## set your startup file here
+    command: node --inspect app.js
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..b1930e2
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,10 @@
+version: '2.1'
+
+services:
+  ng-alain:
+    image: ng-alain
+    build: .
+    environment:
+      NODE_ENV: production
+    ports:
+      - 80:80
diff --git a/e2e/app.e2e-spec.ts b/e2e/app.e2e-spec.ts
index cedad8f..1140f84 100644
--- a/e2e/app.e2e-spec.ts
+++ b/e2e/app.e2e-spec.ts
@@ -1,6 +1,6 @@
 import { AppPage } from './app.po';
 
-describe('screen-frontend App', () => {
+describe('ng-alain App', () => {
   let page: AppPage;
 
   beforeEach(() => {
diff --git a/package-lock.json b/package-lock.json
index e69daf1..5cee46c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,13 +1,13 @@
 {
   "name": "ng-alain",
-  "version": "0.3.0-rc.1",
+  "version": "0.6.6",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
     "@angular-devkit/build-optimizer": {
-      "version": "0.0.36",
-      "resolved": "http://registry.npm.taobao.org/@angular-devkit/build-optimizer/download/@angular-devkit/build-optimizer-0.0.36.tgz",
-      "integrity": "sha1-6Bbum+Itu3d3JPAoGs+nLP/xhLc=",
+      "version": "0.3.2",
+      "resolved": "http://registry.npm.taobao.org/@angular-devkit/build-optimizer/download/@angular-devkit/build-optimizer-0.3.2.tgz",
+      "integrity": "sha1-d9TR5PzQlXXwIA4tbSHBo/mVCW8=",
       "dev": true,
       "requires": {
         "loader-utils": "1.1.0",
@@ -25,25 +25,47 @@
       }
     },
     "@angular-devkit/core": {
-      "version": "0.0.22",
-      "resolved": "http://registry.npm.taobao.org/@angular-devkit/core/download/@angular-devkit/core-0.0.22.tgz",
-      "integrity": "sha1-6Q9Gv3/0fSYKdnlZJnvGX/7jnvE=",
+      "version": "0.3.2",
+      "resolved": "http://registry.npm.taobao.org/@angular-devkit/core/download/@angular-devkit/core-0.3.2.tgz",
+      "integrity": "sha1-tv1qouT0rDw5R4GYupGlPUwPiNU=",
       "dev": true,
       "requires": {
+        "ajv": "5.5.1",
+        "chokidar": "1.7.0",
+        "rxjs": "5.5.6",
         "source-map": "0.5.7"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "5.5.6",
+          "resolved": "http://registry.npm.taobao.org/rxjs/download/rxjs-5.5.6.tgz",
+          "integrity": "sha1-4x+5bW/S/x/YS86orpwC0AcXnAI=",
+          "dev": true,
+          "requires": {
+            "symbol-observable": "1.0.1"
+          }
+        }
       }
     },
     "@angular-devkit/schematics": {
-      "version": "0.0.42",
-      "resolved": "http://registry.npm.taobao.org/@angular-devkit/schematics/download/@angular-devkit/schematics-0.0.42.tgz",
-      "integrity": "sha1-NO6nE2RVVFyKvSHt+Uo2hwoHP+o=",
+      "version": "0.3.2",
+      "resolved": "http://registry.npm.taobao.org/@angular-devkit/schematics/download/@angular-devkit/schematics-0.3.2.tgz",
+      "integrity": "sha1-CaImj61h9PlW9C24eRO4dIxRKng=",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "0.0.22",
-        "@ngtools/json-schema": "1.1.0",
-        "@schematics/schematics": "0.0.11",
-        "minimist": "1.2.0",
-        "rxjs": "5.5.5"
+        "@ngtools/json-schema": "1.2.0",
+        "rxjs": "5.5.6"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "5.5.6",
+          "resolved": "http://registry.npm.taobao.org/rxjs/download/rxjs-5.5.6.tgz",
+          "integrity": "sha1-4x+5bW/S/x/YS86orpwC0AcXnAI=",
+          "dev": true,
+          "requires": {
+            "symbol-observable": "1.0.1"
+          }
+        }
       }
     },
     "@angular/animations": {
@@ -63,37 +85,40 @@
       }
     },
     "@angular/cli": {
-      "version": "1.6.0",
-      "resolved": "http://registry.npm.taobao.org/@angular/cli/download/@angular/cli-1.6.0.tgz",
-      "integrity": "sha1-66Uh9qjkwttigwC63bxNoTypaZg=",
+      "version": "1.7.1",
+      "resolved": "http://registry.npm.taobao.org/@angular/cli/download/@angular/cli-1.7.1.tgz",
+      "integrity": "sha1-Op0LgxTUxUIm+UG+61MHE4XClOA=",
       "dev": true,
       "requires": {
-        "@angular-devkit/build-optimizer": "0.0.36",
-        "@angular-devkit/schematics": "0.0.42",
-        "@ngtools/json-schema": "1.1.0",
-        "@ngtools/webpack": "1.9.0",
-        "@schematics/angular": "0.1.11",
-        "autoprefixer": "6.7.7",
+        "@angular-devkit/build-optimizer": "0.3.2",
+        "@angular-devkit/core": "0.3.2",
+        "@angular-devkit/schematics": "0.3.2",
+        "@ngtools/json-schema": "1.2.0",
+        "@ngtools/webpack": "1.10.1",
+        "@schematics/angular": "0.3.2",
+        "@schematics/package-update": "0.3.2",
+        "ajv": "6.2.0",
+        "autoprefixer": "7.2.6",
+        "cache-loader": "1.2.1",
         "chalk": "2.2.2",
-        "circular-dependency-plugin": "4.3.0",
-        "common-tags": "1.5.1",
-        "copy-webpack-plugin": "4.3.0",
+        "circular-dependency-plugin": "4.4.0",
+        "clean-css": "4.1.9",
+        "common-tags": "1.7.2",
+        "copy-webpack-plugin": "4.4.2",
         "core-object": "3.1.5",
-        "css-loader": "0.28.7",
-        "cssnano": "3.10.0",
         "denodeify": "1.2.1",
         "ember-cli-string-utils": "1.1.0",
-        "exports-loader": "0.6.4",
         "extract-text-webpack-plugin": "3.0.2",
-        "file-loader": "1.1.5",
+        "file-loader": "1.1.10",
         "fs-extra": "4.0.3",
         "glob": "7.1.2",
         "html-webpack-plugin": "2.30.1",
-        "istanbul-instrumenter-loader": "2.0.0",
+        "istanbul-instrumenter-loader": "3.0.0",
         "karma-source-map-support": "1.2.0",
         "less": "2.7.3",
-        "less-loader": "4.0.5",
-        "license-webpack-plugin": "1.1.1",
+        "less-loader": "4.0.6",
+        "license-webpack-plugin": "1.1.2",
+        "loader-utils": "1.1.0",
         "lodash": "4.17.4",
         "memory-fs": "0.4.1",
         "minimatch": "3.0.4",
@@ -102,30 +127,95 @@
         "nopt": "4.0.1",
         "opn": "5.1.0",
         "portfinder": "1.0.13",
-        "postcss-custom-properties": "6.2.0",
-        "postcss-loader": "2.0.9",
-        "postcss-url": "7.3.0",
+        "postcss": "6.0.19",
+        "postcss-import": "11.1.0",
+        "postcss-loader": "2.1.1",
+        "postcss-url": "7.3.1",
         "raw-loader": "0.5.1",
         "resolve": "1.5.0",
-        "rxjs": "5.5.5",
+        "rxjs": "5.5.6",
         "sass-loader": "6.0.6",
         "semver": "5.4.1",
         "silent-error": "1.1.0",
-        "source-map-loader": "0.2.3",
         "source-map-support": "0.4.18",
-        "style-loader": "0.13.2",
+        "style-loader": "0.19.1",
         "stylus": "0.54.5",
-        "stylus-loader": "3.0.1",
-        "uglifyjs-webpack-plugin": "1.1.4",
+        "stylus-loader": "3.0.2",
+        "uglifyjs-webpack-plugin": "1.2.2",
         "url-loader": "0.6.2",
-        "webpack": "3.10.0",
-        "webpack-concat-plugin": "1.4.2",
+        "webpack": "3.11.0",
         "webpack-dev-middleware": "1.12.2",
-        "webpack-dev-server": "2.9.7",
-        "webpack-merge": "4.1.1",
+        "webpack-dev-server": "2.11.2",
+        "webpack-merge": "4.1.2",
         "webpack-sources": "1.1.0",
-        "webpack-subresource-integrity": "1.0.3",
-        "zone.js": "0.8.18"
+        "webpack-subresource-integrity": "1.0.4"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.2.0",
+          "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-6.2.0.tgz",
+          "integrity": "sha1-r6wpW7qgFSRJ5SJ0LkVHwa6TKNI=",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "1.0.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "6.0.19",
+          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.19.tgz",
+          "integrity": "sha1-dqeDhvZwudlJSmVb8jrAEu/9FVU=",
+          "dev": true,
+          "requires": {
+            "chalk": "2.3.1",
+            "source-map": "0.6.1",
+            "supports-color": "5.2.0"
+          },
+          "dependencies": {
+            "chalk": {
+              "version": "2.3.1",
+              "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.1.tgz",
+              "integrity": "sha1-Uj/iZ4rsewToBBkJKS/osXBZt5Y=",
+              "dev": true,
+              "requires": {
+                "ansi-styles": "3.2.0",
+                "escape-string-regexp": "1.0.5",
+                "supports-color": "5.2.0"
+              }
+            }
+          }
+        },
+        "rxjs": {
+          "version": "5.5.6",
+          "resolved": "http://registry.npm.taobao.org/rxjs/download/rxjs-5.5.6.tgz",
+          "integrity": "sha1-4x+5bW/S/x/YS86orpwC0AcXnAI=",
+          "dev": true,
+          "requires": {
+            "symbol-observable": "1.0.1"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.2.0",
+          "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.2.0.tgz",
+          "integrity": "sha1-sNUzOxGE3TZmy+WqC0XFrHrBeko=",
+          "dev": true,
+          "requires": {
+            "has-flag": "3.0.0"
+          }
+        }
       }
     },
     "@angular/common": {
@@ -226,86 +316,117 @@
       }
     },
     "@antv/data-set": {
-      "version": "0.7.0",
-      "resolved": "http://registry.npm.taobao.org/@antv/data-set/download/@antv/data-set-0.7.0.tgz",
-      "integrity": "sha1-DhqzyIq+g61mhgDeThixY3wGIaM=",
+      "version": "0.8.5",
+      "resolved": "http://registry.npm.taobao.org/@antv/data-set/download/@antv/data-set-0.8.5.tgz",
+      "integrity": "sha1-mrX1O3rAePUiEdts79DGpCgivQ4=",
       "requires": {
         "d3-array": "1.2.1",
         "d3-composite-projections": "1.2.0",
         "d3-dsv": "1.0.8",
-        "d3-geo": "1.9.1",
-        "d3-geo-projection": "2.3.2",
+        "d3-geo": "1.6.4",
+        "d3-geo-projection": "2.1.2",
+        "d3-hexjson": "1.0.1",
         "d3-hierarchy": "1.1.5",
         "d3-sankey": "0.7.1",
         "d3-voronoi": "1.1.2",
         "lodash": "4.17.4",
-        "point-at-length": "1.1.0",
+        "point-at-length": "1.0.2",
         "regression": "2.0.1",
         "simple-statistics": "4.1.1",
         "topojson-client": "3.0.0",
-        "wolfy87-eventemitter": "5.2.4"
+        "wolfy87-eventemitter": "5.1.0"
+      },
+      "dependencies": {
+        "wolfy87-eventemitter": {
+          "version": "5.1.0",
+          "resolved": "http://registry.npm.taobao.org/wolfy87-eventemitter/download/wolfy87-eventemitter-5.1.0.tgz",
+          "integrity": "sha1-NcGsDdGsDBXjXZgVCPwiCEoToBE="
+        }
       }
     },
     "@antv/g": {
-      "version": "2.0.2",
-      "resolved": "http://registry.npm.taobao.org/@antv/g/download/@antv/g-2.0.2.tgz",
-      "integrity": "sha1-z87alIq1lfZMkKUl8wp+TOSi4+I=",
+      "version": "2.0.6",
+      "resolved": "http://registry.npm.taobao.org/@antv/g/download/@antv/g-2.0.6.tgz",
+      "integrity": "sha1-iKhbWJnq5vPVHwFolLUeOTVuVrE=",
       "requires": {
         "d3-ease": "1.0.3",
         "d3-interpolate": "1.1.6",
         "d3-timer": "1.0.7",
-        "gl-matrix": "2.4.0",
+        "gl-matrix": "2.3.2",
         "lodash": "4.17.4",
-        "wolfy87-eventemitter": "5.2.4"
+        "wolfy87-eventemitter": "5.1.0"
+      },
+      "dependencies": {
+        "gl-matrix": {
+          "version": "2.3.2",
+          "resolved": "http://registry.npm.taobao.org/gl-matrix/download/gl-matrix-2.3.2.tgz",
+          "integrity": "sha1-qsgIx0r31dsF/gTLYMoaD8sXTXQ="
+        },
+        "wolfy87-eventemitter": {
+          "version": "5.1.0",
+          "resolved": "http://registry.npm.taobao.org/wolfy87-eventemitter/download/wolfy87-eventemitter-5.1.0.tgz",
+          "integrity": "sha1-NcGsDdGsDBXjXZgVCPwiCEoToBE="
+        }
       }
     },
     "@antv/g2": {
-      "version": "3.0.2",
-      "resolved": "http://registry.npm.taobao.org/@antv/g2/download/@antv/g2-3.0.2.tgz",
-      "integrity": "sha1-LerE+l1I42g4ZlF1FmpIEr9nTl4=",
+      "version": "3.0.5-beta.3",
+      "resolved": "http://registry.npm.taobao.org/@antv/g2/download/@antv/g2-3.0.5-beta.3.tgz",
+      "integrity": "sha1-HL3zpvvxvLzPhI+z79OrfFxwyaA=",
       "requires": {
-        "@antv/g": "2.0.2",
-        "fecha": "2.3.2",
+        "@antv/g": "2.0.6",
+        "fecha": "2.3.3",
         "gl-matrix": "2.4.0",
         "lodash": "4.17.4",
         "wolfy87-eventemitter": "5.2.4"
       }
     },
     "@antv/g2-plugin-slider": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/@antv/g2-plugin-slider/download/@antv/g2-plugin-slider-2.0.0.tgz",
-      "integrity": "sha1-OY7D2LhpExBB+Hj6+EXnaoS6+VQ="
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.taobao.org/@antv/g2-plugin-slider/download/@antv/g2-plugin-slider-2.0.1.tgz",
+      "integrity": "sha1-Rc9tpvIFD6vmQWaiE2dEIq/k7r8="
     },
     "@delon/abc": {
-      "version": "0.3.0",
-      "resolved": "http://registry.npm.taobao.org/@delon/abc/download/@delon/abc-0.3.0.tgz",
-      "integrity": "sha1-3z61AAo9cSv1bUdGGA49vYIsYoA="
+      "version": "0.6.6",
+      "resolved": "http://registry.npm.taobao.org/@delon/abc/download/@delon/abc-0.6.6.tgz",
+      "integrity": "sha1-l0kIKi+8ZAltbfneTvxzC8VKNHM="
     },
     "@delon/acl": {
-      "version": "0.3.0",
-      "resolved": "http://registry.npm.taobao.org/@delon/acl/download/@delon/acl-0.3.0.tgz",
-      "integrity": "sha1-vp2hDXRCVcA0QYeTAHbsgz6VIp8="
+      "version": "0.6.6",
+      "resolved": "http://registry.npm.taobao.org/@delon/acl/download/@delon/acl-0.6.6.tgz",
+      "integrity": "sha1-xxgc6LaR/0BMKN1FeL+3GjDYjf4="
     },
     "@delon/auth": {
-      "version": "0.3.0",
-      "resolved": "http://registry.npm.taobao.org/@delon/auth/download/@delon/auth-0.3.0.tgz",
-      "integrity": "sha1-x7Knv2yrueOlC/Cc98CdFjd/aYw="
+      "version": "0.6.6",
+      "resolved": "http://registry.npm.taobao.org/@delon/auth/download/@delon/auth-0.6.6.tgz",
+      "integrity": "sha1-CtaKuxiuIVyb9aQJ0/fogmInMm8="
+    },
+    "@delon/cache": {
+      "version": "0.6.6",
+      "resolved": "http://registry.npm.taobao.org/@delon/cache/download/@delon/cache-0.6.6.tgz",
+      "integrity": "sha1-ckmrNhHs8LeFkyAIVAsxScjnJfI="
+    },
+    "@delon/cli": {
+      "version": "0.6.6",
+      "resolved": "http://registry.npm.taobao.org/@delon/cli/download/@delon/cli-0.6.6.tgz",
+      "integrity": "sha1-DhesFjwSovbHOsMvW/kZYksxsz8=",
+      "dev": true
     },
     "@delon/theme": {
-      "version": "0.3.0",
-      "resolved": "http://registry.npm.taobao.org/@delon/theme/download/@delon/theme-0.3.0.tgz",
-      "integrity": "sha1-GnkzMaXe3KFyxmJ8Qu7acLV1/og="
+      "version": "0.6.6",
+      "resolved": "http://registry.npm.taobao.org/@delon/theme/download/@delon/theme-0.6.6.tgz",
+      "integrity": "sha1-3jQ51wm9w7rDEvPyG0oJ2czCVGc="
     },
     "@ngtools/json-schema": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/@ngtools/json-schema/download/@ngtools/json-schema-1.1.0.tgz",
-      "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=",
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/@ngtools/json-schema/download/@ngtools/json-schema-1.2.0.tgz",
+      "integrity": "sha1-BuXs0p6aN9JgpEfdhz6ivs0ijE8=",
       "dev": true
     },
     "@ngtools/webpack": {
-      "version": "1.9.0",
-      "resolved": "http://registry.npm.taobao.org/@ngtools/webpack/download/@ngtools/webpack-1.9.0.tgz",
-      "integrity": "sha1-7zlcRb4t6b65OiufXxcdKMNE6xA=",
+      "version": "1.10.1",
+      "resolved": "http://registry.npm.taobao.org/@ngtools/webpack/download/@ngtools/webpack-1.10.1.tgz",
+      "integrity": "sha1-CvneGalxbOAke2qtg7qcVwJ2agM=",
       "dev": true,
       "requires": {
         "chalk": "2.2.2",
@@ -314,7 +435,8 @@
         "magic-string": "0.22.4",
         "semver": "5.4.1",
         "source-map": "0.5.7",
-        "tree-kill": "1.2.0"
+        "tree-kill": "1.2.0",
+        "webpack-sources": "1.1.0"
       }
     },
     "@ngx-translate/core": {
@@ -328,19 +450,43 @@
       "integrity": "sha1-nBbQfNBwxnraJwoulAKB64JrP0M="
     },
     "@schematics/angular": {
-      "version": "0.1.11",
-      "resolved": "http://registry.npm.taobao.org/@schematics/angular/download/@schematics/angular-0.1.11.tgz",
-      "integrity": "sha1-tfFTILu2CWnWbHao72VFBYrIHs4=",
+      "version": "0.3.2",
+      "resolved": "http://registry.npm.taobao.org/@schematics/angular/download/@schematics/angular-0.3.2.tgz",
+      "integrity": "sha1-viCaAyo+RXeZLZT7qhS9S/3kheI=",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "0.0.22"
+        "typescript": "2.6.2"
+      },
+      "dependencies": {
+        "typescript": {
+          "version": "2.6.2",
+          "resolved": "http://registry.npm.taobao.org/typescript/download/typescript-2.6.2.tgz",
+          "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=",
+          "dev": true
+        }
       }
     },
-    "@schematics/schematics": {
-      "version": "0.0.11",
-      "resolved": "http://registry.npm.taobao.org/@schematics/schematics/download/@schematics/schematics-0.0.11.tgz",
-      "integrity": "sha1-yPcPJw7TjymyhzJIEm/Vmr1jWGI=",
-      "dev": true
+    "@schematics/package-update": {
+      "version": "0.3.2",
+      "resolved": "http://registry.npm.taobao.org/@schematics/package-update/download/@schematics/package-update-0.3.2.tgz",
+      "integrity": "sha1-xaKZzrqLnlbz4fgE+G8HZk7G4Bw=",
+      "dev": true,
+      "requires": {
+        "rxjs": "5.5.6",
+        "semver": "5.4.1",
+        "semver-intersect": "1.3.1"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "5.5.6",
+          "resolved": "http://registry.npm.taobao.org/rxjs/download/rxjs-5.5.6.tgz",
+          "integrity": "sha1-4x+5bW/S/x/YS86orpwC0AcXnAI=",
+          "dev": true,
+          "requires": {
+            "symbol-observable": "1.0.1"
+          }
+        }
+      }
     },
     "@types/jasmine": {
       "version": "2.6.3",
@@ -356,6 +502,26 @@
       "requires": {
         "@types/jasmine": "2.6.3"
       }
+    },
+    "@types/jquery": {
+      "version": "3.3.0",
+      "resolved": "http://registry.npm.taobao.org/@types/jquery/download/@types/jquery-3.3.0.tgz",
+      "integrity": "sha1-YxasIKGhPF1SGi3GYb78cYT3P1s="
+    },
+    "@types/jszip": {
+      "version": "3.1.3",
+      "resolved": "http://registry.npm.taobao.org/@types/jszip/download/@types/jszip-3.1.3.tgz",
+      "integrity": "sha1-VWfp8KMQEjQc7cxwcXXywopDAAU=",
+      "dev": true,
+      "requires": {
+        "@types/node": "6.0.94"
+      }
+    },
+    "@types/mockjs": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/@types/mockjs/download/@types/mockjs-1.0.0.tgz",
+      "integrity": "sha1-ppbh9kyS571q9jQ7+DUNG50Ss4g=",
+      "dev": true
     },
     "@types/node": {
       "version": "6.0.94",
@@ -419,6 +585,16 @@
         }
       }
     },
+    "adler-32": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/adler-32/download/adler-32-1.2.0.tgz",
+      "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=",
+      "dev": true,
+      "requires": {
+        "exit-on-epipe": "1.0.1",
+        "printj": "1.1.1"
+      }
+    },
     "adm-zip": {
       "version": "0.4.7",
       "resolved": "http://registry.npm.taobao.org/adm-zip/download/adm-zip-0.4.7.tgz",
@@ -478,37 +654,45 @@
         "repeat-string": "1.6.1"
       }
     },
-    "alphanum-sort": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/alphanum-sort/download/alphanum-sort-1.0.2.tgz",
-      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
-      "dev": true
-    },
     "amdefine": {
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz",
       "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
       "dev": true
     },
-    "angular-baidu-maps": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/angular-baidu-maps/download/angular-baidu-maps-1.0.1.tgz",
-      "integrity": "sha1-AA8gaxmSM2uspCzHpK6FdXJqlrk="
-    },
     "angular-qq-maps": {
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/angular-qq-maps/download/angular-qq-maps-1.0.1.tgz",
       "integrity": "sha1-uk8xL1AbsgiDcIHtndfllbpTyBA="
     },
+    "angular-split": {
+      "version": "1.0.0-rc.1",
+      "resolved": "http://registry.npm.taobao.org/angular-split/download/angular-split-1.0.0-rc.1.tgz",
+      "integrity": "sha1-vUFjAMcmR7JYJWL5tZ5crZSFmlo=",
+      "requires": {
+        "tslib": "1.8.1"
+      }
+    },
     "angular-tree-component": {
-      "version": "6.1.0",
-      "resolved": "http://registry.npm.taobao.org/angular-tree-component/download/angular-tree-component-6.1.0.tgz",
-      "integrity": "sha1-nZprKKaIHCByzWMGtVIpV56JQHE=",
+      "version": "7.0.1",
+      "resolved": "http://registry.npm.taobao.org/angular-tree-component/download/angular-tree-component-7.0.1.tgz",
+      "integrity": "sha1-/I0OctjDS4cTGjuivTKtIJRWiaw=",
       "requires": {
         "lodash": "4.17.4",
         "mobx": "3.4.1",
-        "mobx-angular": "2.0.1"
+        "mobx-angular": "2.1.1"
       }
+    },
+    "angular2-baidu-map": {
+      "version": "4.1.0",
+      "resolved": "http://registry.npm.taobao.org/angular2-baidu-map/download/angular2-baidu-map-4.1.0.tgz",
+      "integrity": "sha1-mZKEA0mnjj08Pq87OFf9heWcyzI="
+    },
+    "angular2-cookie": {
+      "version": "1.2.6",
+      "resolved": "http://registry.npm.taobao.org/angular2-cookie/download/angular2-cookie-1.2.6.tgz",
+      "integrity": "sha1-j6hFUx53etsEL+LzOcAED23b8J0=",
+      "dev": true
     },
     "ansi-escapes": {
       "version": "1.4.0",
@@ -660,6 +844,12 @@
       "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=",
       "dev": true
     },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "http://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "dev": true
+    },
     "array-differ": {
       "version": "1.0.0",
       "resolved": "http://registry.npm.taobao.org/array-differ/download/array-differ-1.0.0.tgz",
@@ -765,9 +955,9 @@
       "dev": true
     },
     "asn1.js": {
-      "version": "4.9.2",
-      "resolved": "http://registry.npm.taobao.org/asn1.js/download/asn1.js-4.9.2.tgz",
-      "integrity": "sha1-gRfvT37YfNj4kES1v/l6wkOhbJo=",
+      "version": "4.10.1",
+      "resolved": "http://registry.npm.taobao.org/asn1.js/download/asn1.js-4.10.1.tgz",
+      "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=",
       "dev": true,
       "requires": {
         "bn.js": "4.11.8",
@@ -788,6 +978,12 @@
       "version": "0.2.0",
       "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-0.2.0.tgz",
       "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
+      "dev": true
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
       "dev": true
     },
     "async": {
@@ -824,18 +1020,75 @@
       "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
       "dev": true
     },
+    "atob": {
+      "version": "2.0.3",
+      "resolved": "http://registry.npm.taobao.org/atob/download/atob-2.0.3.tgz",
+      "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=",
+      "dev": true
+    },
     "autoprefixer": {
-      "version": "6.7.7",
-      "resolved": "http://registry.npm.taobao.org/autoprefixer/download/autoprefixer-6.7.7.tgz",
-      "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=",
+      "version": "7.2.6",
+      "resolved": "http://registry.npm.taobao.org/autoprefixer/download/autoprefixer-7.2.6.tgz",
+      "integrity": "sha1-JWZy+G98c12oScTwfQCKuwVgZ9w=",
       "dev": true,
       "requires": {
-        "browserslist": "1.7.7",
-        "caniuse-db": "1.0.30000783",
+        "browserslist": "2.11.3",
+        "caniuse-lite": "1.0.30000810",
         "normalize-range": "0.1.2",
         "num2fraction": "1.2.2",
-        "postcss": "5.2.18",
+        "postcss": "6.0.19",
         "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "caniuse-lite": {
+          "version": "1.0.30000810",
+          "resolved": "http://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30000810.tgz",
+          "integrity": "sha1-R1hf/84OnzWTpv7qRnO5RUJDUdk=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "2.3.1",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.1.tgz",
+          "integrity": "sha1-Uj/iZ4rsewToBBkJKS/osXBZt5Y=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "3.2.0",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "5.2.0"
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "6.0.19",
+          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.19.tgz",
+          "integrity": "sha1-dqeDhvZwudlJSmVb8jrAEu/9FVU=",
+          "dev": true,
+          "requires": {
+            "chalk": "2.3.1",
+            "source-map": "0.6.1",
+            "supports-color": "5.2.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.2.0",
+          "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.2.0.tgz",
+          "integrity": "sha1-sNUzOxGE3TZmy+WqC0XFrHrBeko=",
+          "dev": true,
+          "requires": {
+            "has-flag": "3.0.0"
+          }
+        }
       }
     },
     "aws-sign2": {
@@ -997,6 +1250,38 @@
       "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
       "dev": true
     },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "http://registry.npm.taobao.org/base/download/base-0.11.2.tgz",
+      "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=",
+      "dev": true,
+      "requires": {
+        "cache-base": "1.0.1",
+        "class-utils": "0.3.6",
+        "component-emitter": "1.2.1",
+        "define-property": "1.0.0",
+        "isobject": "3.0.1",
+        "mixin-deep": "1.3.1",
+        "pascalcase": "0.1.1"
+      },
+      "dependencies": {
+        "component-emitter": {
+          "version": "1.2.1",
+          "resolved": "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz",
+          "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+          "dev": true
+        },
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "1.0.2"
+          }
+        }
+      }
+    },
     "base64-arraybuffer": {
       "version": "0.1.5",
       "resolved": "http://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.1.5.tgz",
@@ -1004,9 +1289,9 @@
       "dev": true
     },
     "base64-js": {
-      "version": "1.2.1",
-      "resolved": "http://registry.npm.taobao.org/base64-js/download/base64-js-1.2.1.tgz",
-      "integrity": "sha1-qRlH2h9KUW6jjltOwOw3c2deCIY=",
+      "version": "1.2.3",
+      "resolved": "http://registry.npm.taobao.org/base64-js/download/base64-js-1.2.3.tgz",
+      "integrity": "sha1-+xNmgjPZYUz1+0vOlam6QJbN+AE=",
       "dev": true
     },
     "base64id": {
@@ -1140,7 +1425,7 @@
         "deep-equal": "1.0.1",
         "dns-equal": "1.0.0",
         "dns-txt": "2.0.2",
-        "multicast-dns": "6.2.1",
+        "multicast-dns": "6.2.3",
         "multicast-dns-service-types": "1.1.0"
       }
     },
@@ -1229,7 +1514,7 @@
       "dev": true,
       "requires": {
         "bn.js": "4.11.8",
-        "randombytes": "2.0.5"
+        "randombytes": "2.0.6"
       }
     },
     "browserify-sign": {
@@ -1257,13 +1542,27 @@
       }
     },
     "browserslist": {
-      "version": "1.7.7",
-      "resolved": "http://registry.npm.taobao.org/browserslist/download/browserslist-1.7.7.tgz",
-      "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+      "version": "2.11.3",
+      "resolved": "http://registry.npm.taobao.org/browserslist/download/browserslist-2.11.3.tgz",
+      "integrity": "sha1-/jYWeu0bvN5IJ+v+cTR6LMcLmbI=",
       "dev": true,
       "requires": {
-        "caniuse-db": "1.0.30000783",
-        "electron-to-chromium": "1.3.28"
+        "caniuse-lite": "1.0.30000810",
+        "electron-to-chromium": "1.3.34"
+      },
+      "dependencies": {
+        "caniuse-lite": {
+          "version": "1.0.30000810",
+          "resolved": "http://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30000810.tgz",
+          "integrity": "sha1-R1hf/84OnzWTpv7qRnO5RUJDUdk=",
+          "dev": true
+        },
+        "electron-to-chromium": {
+          "version": "1.3.34",
+          "resolved": "http://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.34.tgz",
+          "integrity": "sha1-2TSY9AORuwwWpgPYJBuZUUBBV+0=",
+          "dev": true
+        }
       }
     },
     "buffer": {
@@ -1272,7 +1571,7 @@
       "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
       "dev": true,
       "requires": {
-        "base64-js": "1.2.1",
+        "base64-js": "1.2.3",
         "ieee754": "1.1.8",
         "isarray": "1.0.0"
       }
@@ -1314,9 +1613,9 @@
       "dev": true
     },
     "cacache": {
-      "version": "10.0.1",
-      "resolved": "http://registry.npm.taobao.org/cacache/download/cacache-10.0.1.tgz",
-      "integrity": "sha1-PgX25hYRfZtUZlsbIMiuuT6l028=",
+      "version": "10.0.4",
+      "resolved": "http://registry.npm.taobao.org/cacache/download/cacache-10.0.4.tgz",
+      "integrity": "sha1-ZFI2eZnv+dQYiu/ZoU6dfGomNGA=",
       "dev": true,
       "requires": {
         "bluebird": "3.5.1",
@@ -1324,14 +1623,51 @@
         "glob": "7.1.2",
         "graceful-fs": "4.1.11",
         "lru-cache": "4.1.1",
-        "mississippi": "1.3.0",
+        "mississippi": "2.0.0",
         "mkdirp": "0.5.1",
         "move-concurrently": "1.0.1",
         "promise-inflight": "1.0.1",
         "rimraf": "2.6.2",
-        "ssri": "5.0.0",
+        "ssri": "5.2.4",
         "unique-filename": "1.1.0",
-        "y18n": "3.2.1"
+        "y18n": "4.0.0"
+      }
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz",
+      "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=",
+      "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"
+      },
+      "dependencies": {
+        "component-emitter": {
+          "version": "1.2.1",
+          "resolved": "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz",
+          "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+          "dev": true
+        }
+      }
+    },
+    "cache-loader": {
+      "version": "1.2.1",
+      "resolved": "http://registry.npm.taobao.org/cache-loader/download/cache-loader-1.2.1.tgz",
+      "integrity": "sha1-4XHVZwGIeIwIr1GwfLUvQOixV6I=",
+      "dev": true,
+      "requires": {
+        "async": "2.6.0",
+        "loader-utils": "1.1.0",
+        "mkdirp": "0.5.1",
+        "schema-utils": "0.4.5"
       }
     },
     "callsite": {
@@ -1365,24 +1701,6 @@
         "camelcase": "2.1.1",
         "map-obj": "1.0.1"
       }
-    },
-    "caniuse-api": {
-      "version": "1.6.1",
-      "resolved": "http://registry.npm.taobao.org/caniuse-api/download/caniuse-api-1.6.1.tgz",
-      "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=",
-      "dev": true,
-      "requires": {
-        "browserslist": "1.7.7",
-        "caniuse-db": "1.0.30000783",
-        "lodash.memoize": "4.1.2",
-        "lodash.uniq": "4.5.0"
-      }
-    },
-    "caniuse-db": {
-      "version": "1.0.30000783",
-      "resolved": "http://registry.npm.taobao.org/caniuse-db/download/caniuse-db-1.0.30000783.tgz",
-      "integrity": "sha1-FrMNRyZqT1FcxprgMWtnDJYDzb4=",
-      "dev": true
     },
     "caniuse-lite": {
       "version": "1.0.30000783",
@@ -1420,6 +1738,16 @@
         }
       }
     },
+    "cfb": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/cfb/download/cfb-1.0.2.tgz",
+      "integrity": "sha1-9R2bvltdHnVwBYHWgiLy70bsIUI=",
+      "dev": true,
+      "requires": {
+        "commander": "2.12.2",
+        "printj": "1.1.1"
+      }
+    },
     "chalk": {
       "version": "2.2.2",
       "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.2.2.tgz",
@@ -1453,12 +1781,6 @@
       "version": "1.1.1",
       "resolved": "http://registry.npm.taobao.org/character-reference-invalid/download/character-reference-invalid-1.1.1.tgz",
       "integrity": "sha1-lCg191Dk7GGjCOYMLvjMEBEgLvw=",
-      "dev": true
-    },
-    "charenc": {
-      "version": "0.0.2",
-      "resolved": "http://registry.npm.taobao.org/charenc/download/charenc-0.0.2.tgz",
-      "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=",
       "dev": true
     },
     "chokidar": {
@@ -1512,9 +1834,9 @@
       }
     },
     "circular-dependency-plugin": {
-      "version": "4.3.0",
-      "resolved": "http://registry.npm.taobao.org/circular-dependency-plugin/download/circular-dependency-plugin-4.3.0.tgz",
-      "integrity": "sha1-KhKCTlhFRuGu6lhlt78jShHEppU=",
+      "version": "4.4.0",
+      "resolved": "http://registry.npm.taobao.org/circular-dependency-plugin/download/circular-dependency-plugin-4.4.0.tgz",
+      "integrity": "sha1-+KGnRqP2yOV/Ta6bVNmRzSpYL10=",
       "dev": true
     },
     "circular-json": {
@@ -1523,38 +1845,82 @@
       "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=",
       "dev": true
     },
-    "clap": {
-      "version": "1.2.3",
-      "resolved": "http://registry.npm.taobao.org/clap/download/clap-1.2.3.tgz",
-      "integrity": "sha1-TzZ0WzIAhJJVf0ZBLWbVDLmbzlE=",
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "http://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz",
+      "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=",
       "dev": true,
       "requires": {
-        "chalk": "1.1.3"
+        "arr-union": "3.1.0",
+        "define-property": "0.2.5",
+        "isobject": "3.0.1",
+        "static-extend": "0.1.2"
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "2.2.1",
-          "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-          "dev": true
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
           "dev": true,
           "requires": {
-            "ansi-styles": "2.2.1",
-            "escape-string-regexp": "1.0.5",
-            "has-ansi": "2.0.0",
-            "strip-ansi": "3.0.1",
-            "supports-color": "2.0.0"
+            "is-descriptor": "0.1.6"
           }
         },
-        "supports-color": {
-          "version": "2.0.0",
-          "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz",
+          "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "0.1.6",
+            "is-data-descriptor": "0.1.4",
+            "kind-of": "5.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz",
+          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=",
           "dev": true
         }
       }
@@ -1644,15 +2010,6 @@
       "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
       "dev": true
     },
-    "coa": {
-      "version": "1.0.4",
-      "resolved": "http://registry.npm.taobao.org/coa/download/coa-1.0.4.tgz",
-      "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=",
-      "dev": true,
-      "requires": {
-        "q": "1.5.1"
-      }
-    },
     "code-point-at": {
       "version": "1.1.0",
       "resolved": "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz",
@@ -1684,21 +2041,39 @@
         "sprintf-js": "1.0.3"
       }
     },
+    "codepage": {
+      "version": "1.12.0",
+      "resolved": "http://registry.npm.taobao.org/codepage/download/codepage-1.12.0.tgz",
+      "integrity": "sha1-nJX1cp+Nd17MfZgZCYp/sjm+7q8=",
+      "dev": true,
+      "requires": {
+        "commander": "2.11.0",
+        "exit-on-epipe": "1.0.1",
+        "voc": "1.0.0"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.11.0",
+          "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.11.0.tgz",
+          "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=",
+          "dev": true
+        }
+      }
+    },
     "collapse-white-space": {
       "version": "1.0.3",
       "resolved": "http://registry.npm.taobao.org/collapse-white-space/download/collapse-white-space-1.0.3.tgz",
       "integrity": "sha1-S5BvZw5aljqHt2sOFolkM0G2Ajw=",
       "dev": true
     },
-    "color": {
-      "version": "0.11.4",
-      "resolved": "http://registry.npm.taobao.org/color/download/color-0.11.4.tgz",
-      "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=",
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
       "dev": true,
       "requires": {
-        "clone": "1.0.3",
-        "color-convert": "1.9.1",
-        "color-string": "0.3.0"
+        "map-visit": "1.0.0",
+        "object-visit": "1.0.1"
       }
     },
     "color-convert": {
@@ -1716,31 +2091,11 @@
       "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
       "dev": true
     },
-    "color-string": {
-      "version": "0.3.0",
-      "resolved": "http://registry.npm.taobao.org/color-string/download/color-string-0.3.0.tgz",
-      "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=",
-      "dev": true,
-      "requires": {
-        "color-name": "1.1.3"
-      }
-    },
     "color-support": {
       "version": "1.1.3",
       "resolved": "http://registry.npm.taobao.org/color-support/download/color-support-1.1.3.tgz",
       "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=",
       "dev": true
-    },
-    "colormin": {
-      "version": "1.1.2",
-      "resolved": "http://registry.npm.taobao.org/colormin/download/colormin-1.1.2.tgz",
-      "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=",
-      "dev": true,
-      "requires": {
-        "color": "0.11.4",
-        "css-color-names": "0.0.4",
-        "has": "1.0.1"
-      }
     },
     "colors": {
       "version": "1.1.2",
@@ -1772,9 +2127,9 @@
       "integrity": "sha1-D1lGxCftnsDZGka7ne9T5UZQ5VU="
     },
     "common-tags": {
-      "version": "1.5.1",
-      "resolved": "http://registry.npm.taobao.org/common-tags/download/common-tags-1.5.1.tgz",
-      "integrity": "sha1-4uOZMaATzQIlPe/u2Joa1hWifwc=",
+      "version": "1.7.2",
+      "resolved": "http://registry.npm.taobao.org/common-tags/download/common-tags-1.7.2.tgz",
+      "integrity": "sha1-JNl2jGPSU6Vuz/k4RbRLTfHVJ3E=",
       "dev": true,
       "requires": {
         "babel-runtime": "6.26.0"
@@ -1817,23 +2172,31 @@
       }
     },
     "compressible": {
-      "version": "2.0.12",
-      "resolved": "http://registry.npm.taobao.org/compressible/download/compressible-2.0.12.tgz",
-      "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=",
+      "version": "2.0.13",
+      "resolved": "http://registry.npm.taobao.org/compressible/download/compressible-2.0.13.tgz",
+      "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=",
       "dev": true,
       "requires": {
-        "mime-db": "1.30.0"
+        "mime-db": "1.33.0"
+      },
+      "dependencies": {
+        "mime-db": {
+          "version": "1.33.0",
+          "resolved": "http://registry.npm.taobao.org/mime-db/download/mime-db-1.33.0.tgz",
+          "integrity": "sha1-o0kgUKXLm2NFBUHjnZeI0icng9s=",
+          "dev": true
+        }
       }
     },
     "compression": {
-      "version": "1.7.1",
-      "resolved": "http://registry.npm.taobao.org/compression/download/compression-1.7.1.tgz",
-      "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=",
+      "version": "1.7.2",
+      "resolved": "http://registry.npm.taobao.org/compression/download/compression-1.7.2.tgz",
+      "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=",
       "dev": true,
       "requires": {
         "accepts": "1.3.4",
         "bytes": "3.0.0",
-        "compressible": "2.0.12",
+        "compressible": "2.0.13",
         "debug": "2.6.9",
         "on-headers": "1.0.1",
         "safe-buffer": "5.1.1",
@@ -1957,21 +2320,25 @@
         "run-queue": "1.0.3"
       }
     },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "dev": true
+    },
     "copy-webpack-plugin": {
-      "version": "4.3.0",
-      "resolved": "http://registry.npm.taobao.org/copy-webpack-plugin/download/copy-webpack-plugin-4.3.0.tgz",
-      "integrity": "sha1-z99NExx41mkXobuGP4ZjBJeqz0I=",
+      "version": "4.4.2",
+      "resolved": "http://registry.npm.taobao.org/copy-webpack-plugin/download/copy-webpack-plugin-4.4.2.tgz",
+      "integrity": "sha1-ySvNffTV5CxROYzDayOCDQ0QRGo=",
       "dev": true,
       "requires": {
-        "cacache": "10.0.1",
+        "cacache": "10.0.4",
         "find-cache-dir": "1.0.0",
         "globby": "7.1.1",
         "is-glob": "4.0.0",
         "loader-utils": "0.2.17",
-        "lodash": "4.17.4",
         "minimatch": "3.0.4",
-        "p-limit": "1.1.0",
-        "pify": "3.0.0",
+        "p-limit": "1.2.0",
         "serialize-javascript": "1.4.0"
       },
       "dependencies": {
@@ -2030,6 +2397,16 @@
       "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=",
       "dev": true
     },
+    "crc-32": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/crc-32/download/crc-32-1.2.0.tgz",
+      "integrity": "sha1-yy224puIUI4y2d0OwWk+e0Ghggg=",
+      "dev": true,
+      "requires": {
+        "exit-on-epipe": "1.0.1",
+        "printj": "1.1.1"
+      }
+    },
     "crc32-stream": {
       "version": "2.0.0",
       "resolved": "http://registry.npm.taobao.org/crc32-stream/download/crc32-stream-2.0.0.tgz",
@@ -2059,7 +2436,7 @@
         "cipher-base": "1.0.4",
         "inherits": "2.0.3",
         "ripemd160": "2.0.1",
-        "sha.js": "2.4.9"
+        "sha.js": "2.4.10"
       }
     },
     "create-hmac": {
@@ -2073,7 +2450,7 @@
         "inherits": "2.0.3",
         "ripemd160": "2.0.1",
         "safe-buffer": "5.1.1",
-        "sha.js": "2.4.9"
+        "sha.js": "2.4.10"
       }
     },
     "cross-spawn": {
@@ -2086,12 +2463,6 @@
         "lru-cache": "4.1.1",
         "which": "1.3.0"
       }
-    },
-    "crypt": {
-      "version": "0.0.2",
-      "resolved": "http://registry.npm.taobao.org/crypt/download/crypt-0.0.2.tgz",
-      "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=",
-      "dev": true
     },
     "cryptiles": {
       "version": "2.0.5",
@@ -2117,36 +2488,8 @@
         "inherits": "2.0.3",
         "pbkdf2": "3.0.14",
         "public-encrypt": "4.0.0",
-        "randombytes": "2.0.5",
-        "randomfill": "1.0.3"
-      }
-    },
-    "css-color-names": {
-      "version": "0.0.4",
-      "resolved": "http://registry.npm.taobao.org/css-color-names/download/css-color-names-0.0.4.tgz",
-      "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
-      "dev": true
-    },
-    "css-loader": {
-      "version": "0.28.7",
-      "resolved": "http://registry.npm.taobao.org/css-loader/download/css-loader-0.28.7.tgz",
-      "integrity": "sha1-Xy7pid0y7dkHcX+VMxdlYWCZnBs=",
-      "dev": true,
-      "requires": {
-        "babel-code-frame": "6.26.0",
-        "css-selector-tokenizer": "0.7.0",
-        "cssnano": "3.10.0",
-        "icss-utils": "2.1.0",
-        "loader-utils": "1.1.0",
-        "lodash.camelcase": "4.3.0",
-        "object-assign": "4.1.1",
-        "postcss": "5.2.18",
-        "postcss-modules-extract-imports": "1.1.0",
-        "postcss-modules-local-by-default": "1.2.0",
-        "postcss-modules-scope": "1.1.0",
-        "postcss-modules-values": "1.3.0",
-        "postcss-value-parser": "3.3.0",
-        "source-list-map": "2.0.0"
+        "randombytes": "2.0.6",
+        "randomfill": "1.0.4"
       }
     },
     "css-parse": {
@@ -2199,56 +2542,6 @@
       "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=",
       "dev": true
     },
-    "cssnano": {
-      "version": "3.10.0",
-      "resolved": "http://registry.npm.taobao.org/cssnano/download/cssnano-3.10.0.tgz",
-      "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=",
-      "dev": true,
-      "requires": {
-        "autoprefixer": "6.7.7",
-        "decamelize": "1.2.0",
-        "defined": "1.0.0",
-        "has": "1.0.1",
-        "object-assign": "4.1.1",
-        "postcss": "5.2.18",
-        "postcss-calc": "5.3.1",
-        "postcss-colormin": "2.2.2",
-        "postcss-convert-values": "2.6.1",
-        "postcss-discard-comments": "2.0.4",
-        "postcss-discard-duplicates": "2.1.0",
-        "postcss-discard-empty": "2.1.0",
-        "postcss-discard-overridden": "0.1.1",
-        "postcss-discard-unused": "2.2.3",
-        "postcss-filter-plugins": "2.0.2",
-        "postcss-merge-idents": "2.1.7",
-        "postcss-merge-longhand": "2.0.2",
-        "postcss-merge-rules": "2.1.2",
-        "postcss-minify-font-values": "1.0.5",
-        "postcss-minify-gradients": "1.0.5",
-        "postcss-minify-params": "1.2.2",
-        "postcss-minify-selectors": "2.1.1",
-        "postcss-normalize-charset": "1.1.1",
-        "postcss-normalize-url": "3.0.8",
-        "postcss-ordered-values": "2.2.3",
-        "postcss-reduce-idents": "2.4.0",
-        "postcss-reduce-initial": "1.0.1",
-        "postcss-reduce-transforms": "1.0.4",
-        "postcss-svgo": "2.1.6",
-        "postcss-unique-selectors": "2.0.2",
-        "postcss-value-parser": "3.3.0",
-        "postcss-zindex": "2.2.0"
-      }
-    },
-    "csso": {
-      "version": "2.3.2",
-      "resolved": "http://registry.npm.taobao.org/csso/download/csso-2.3.2.tgz",
-      "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=",
-      "dev": true,
-      "requires": {
-        "clap": "1.2.3",
-        "source-map": "0.5.7"
-      }
-    },
     "cuint": {
       "version": "0.2.2",
       "resolved": "http://registry.npm.taobao.org/cuint/download/cuint-0.2.2.tgz",
@@ -2282,7 +2575,7 @@
       "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
       "dev": true,
       "requires": {
-        "es5-ext": "0.10.37"
+        "es5-ext": "0.10.39"
       }
     },
     "d3-array": {
@@ -2335,21 +2628,29 @@
       "integrity": "sha1-aL+8NJM4o4DETYrMT7wzBKotjA4="
     },
     "d3-geo": {
-      "version": "1.9.1",
-      "resolved": "http://registry.npm.taobao.org/d3-geo/download/d3-geo-1.9.1.tgz",
-      "integrity": "sha1-FX47D5FzedD3O+v/875Tf0n6c1Y=",
+      "version": "1.6.4",
+      "resolved": "http://registry.npm.taobao.org/d3-geo/download/d3-geo-1.6.4.tgz",
+      "integrity": "sha1-8g4eRhyxhF9ai+Vatvh2VCp+MZk=",
       "requires": {
         "d3-array": "1.2.1"
       }
     },
     "d3-geo-projection": {
-      "version": "2.3.2",
-      "resolved": "http://registry.npm.taobao.org/d3-geo-projection/download/d3-geo-projection-2.3.2.tgz",
-      "integrity": "sha1-cuVZ3AXZf6nyGMzJxTfTKfTPxHQ=",
+      "version": "2.1.2",
+      "resolved": "http://registry.npm.taobao.org/d3-geo-projection/download/d3-geo-projection-2.1.2.tgz",
+      "integrity": "sha1-ffjh6dBG1jHGUJ9+UxNX1K3CSqM=",
       "requires": {
         "commander": "2.12.2",
         "d3-array": "1.2.1",
-        "d3-geo": "1.9.1"
+        "d3-geo": "1.6.4"
+      }
+    },
+    "d3-hexjson": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/d3-hexjson/download/d3-hexjson-1.0.1.tgz",
+      "integrity": "sha1-aiMRHoNZ8eIU9dCvo3nAKytn3ws=",
+      "requires": {
+        "d3-array": "1.2.1"
       }
     },
     "d3-hierarchy": {
@@ -2452,6 +2753,12 @@
       "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
       "dev": true
     },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "http://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "dev": true
+    },
     "dedent": {
       "version": "0.7.0",
       "resolved": "http://registry.npm.taobao.org/dedent/download/dedent-0.7.0.tgz",
@@ -2489,11 +2796,15 @@
         "object-keys": "1.0.11"
       }
     },
-    "defined": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/defined/download/defined-1.0.0.tgz",
-      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
-      "dev": true
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz",
+      "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=",
+      "dev": true,
+      "requires": {
+        "is-descriptor": "1.0.2",
+        "isobject": "3.0.1"
+      }
     },
     "del": {
       "version": "3.0.0",
@@ -2607,7 +2918,7 @@
       "requires": {
         "bn.js": "4.11.8",
         "miller-rabin": "4.0.1",
-        "randombytes": "2.0.5"
+        "randombytes": "2.0.6"
       }
     },
     "dir-glob": {
@@ -2627,9 +2938,9 @@
       "dev": true
     },
     "dns-packet": {
-      "version": "1.2.2",
-      "resolved": "http://registry.npm.taobao.org/dns-packet/download/dns-packet-1.2.2.tgz",
-      "integrity": "sha1-qKJr7HZGQ4lj/Ibgb4+LFtbIv3o=",
+      "version": "1.3.1",
+      "resolved": "http://registry.npm.taobao.org/dns-packet/download/dns-packet-1.3.1.tgz",
+      "integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=",
       "dev": true,
       "requires": {
         "ip": "1.1.5",
@@ -2693,9 +3004,9 @@
       }
     },
     "domain-browser": {
-      "version": "1.1.7",
-      "resolved": "http://registry.npm.taobao.org/domain-browser/download/domain-browser-1.1.7.tgz",
-      "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=",
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz",
+      "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=",
       "dev": true
     },
     "domelementtype": {
@@ -2774,9 +3085,9 @@
       }
     },
     "duplexify": {
-      "version": "3.5.1",
-      "resolved": "http://registry.npm.taobao.org/duplexify/download/duplexify-3.5.1.tgz",
-      "integrity": "sha1-ThUWvmiDi8kKSZlPCzmm5ZYL780=",
+      "version": "3.5.3",
+      "resolved": "http://registry.npm.taobao.org/duplexify/download/duplexify-3.5.3.tgz",
+      "integrity": "sha1-i1gYgA35L9ASWyeriWSRkShYJD4=",
       "dev": true,
       "requires": {
         "end-of-stream": "1.4.0",
@@ -2793,6 +3104,14 @@
       "optional": true,
       "requires": {
         "jsbn": "0.1.1"
+      }
+    },
+    "echarts": {
+      "version": "3.8.5",
+      "resolved": "http://registry.npm.taobao.org/echarts/download/echarts-3.8.5.tgz",
+      "integrity": "sha1-WOSlHSdDxvt1JXsNwKnPn1N4rA4=",
+      "requires": {
+        "zrender": "3.7.4"
       }
     },
     "ee-first": {
@@ -2984,9 +3303,9 @@
       "dev": true
     },
     "errno": {
-      "version": "0.1.6",
-      "resolved": "http://registry.npm.taobao.org/errno/download/errno-0.1.6.tgz",
-      "integrity": "sha1-w4bOimKD8U/AlWO3FWCQjJv1MCY=",
+      "version": "0.1.7",
+      "resolved": "http://registry.npm.taobao.org/errno/download/errno-0.1.7.tgz",
+      "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=",
       "dev": true,
       "requires": {
         "prr": "1.0.1"
@@ -3026,9 +3345,9 @@
       }
     },
     "es5-ext": {
-      "version": "0.10.37",
-      "resolved": "http://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.37.tgz",
-      "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=",
+      "version": "0.10.39",
+      "resolved": "http://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.39.tgz",
+      "integrity": "sha1-/KIbZ1WSd8pKwaHtcEixB7b3bYc=",
       "dev": true,
       "requires": {
         "es6-iterator": "2.0.3",
@@ -3042,7 +3361,7 @@
       "dev": true,
       "requires": {
         "d": "1.0.0",
-        "es5-ext": "0.10.37",
+        "es5-ext": "0.10.39",
         "es6-symbol": "3.1.1"
       }
     },
@@ -3053,7 +3372,7 @@
       "dev": true,
       "requires": {
         "d": "1.0.0",
-        "es5-ext": "0.10.37",
+        "es5-ext": "0.10.39",
         "es6-iterator": "2.0.3",
         "es6-set": "0.1.5",
         "es6-symbol": "3.1.1",
@@ -3067,7 +3386,7 @@
       "dev": true,
       "requires": {
         "d": "1.0.0",
-        "es5-ext": "0.10.37",
+        "es5-ext": "0.10.39",
         "es6-iterator": "2.0.3",
         "es6-symbol": "3.1.1",
         "event-emitter": "0.3.5"
@@ -3080,7 +3399,7 @@
       "dev": true,
       "requires": {
         "d": "1.0.0",
-        "es5-ext": "0.10.37"
+        "es5-ext": "0.10.39"
       }
     },
     "es6-weak-map": {
@@ -3090,7 +3409,7 @@
       "dev": true,
       "requires": {
         "d": "1.0.0",
-        "es5-ext": "0.10.37",
+        "es5-ext": "0.10.39",
         "es6-iterator": "2.0.3",
         "es6-symbol": "3.1.1"
       }
@@ -3146,7 +3465,7 @@
       "requires": {
         "es6-map": "0.1.5",
         "es6-weak-map": "2.0.2",
-        "esrecurse": "4.2.0",
+        "esrecurse": "4.2.1",
         "estraverse": "4.2.0"
       }
     },
@@ -3157,13 +3476,12 @@
       "dev": true
     },
     "esrecurse": {
-      "version": "4.2.0",
-      "resolved": "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.0.tgz",
-      "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=",
+      "version": "4.2.1",
+      "resolved": "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz",
+      "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=",
       "dev": true,
       "requires": {
-        "estraverse": "4.2.0",
-        "object-assign": "4.1.1"
+        "estraverse": "4.2.0"
       }
     },
     "estraverse": {
@@ -3191,7 +3509,7 @@
       "dev": true,
       "requires": {
         "d": "1.0.0",
-        "es5-ext": "0.10.37"
+        "es5-ext": "0.10.39"
       }
     },
     "event-stream": {
@@ -3289,6 +3607,12 @@
       "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
       "dev": true
     },
+    "exit-on-epipe": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/exit-on-epipe/download/exit-on-epipe-1.0.1.tgz",
+      "integrity": "sha1-C92S6H1ShdJn2qgXHQ6wYVlolpI=",
+      "dev": true
+    },
     "expand-braces": {
       "version": "0.1.2",
       "resolved": "http://registry.npm.taobao.org/expand-braces/download/expand-braces-0.1.2.tgz",
@@ -3351,16 +3675,6 @@
         "fill-range": "2.2.3"
       }
     },
-    "exports-loader": {
-      "version": "0.6.4",
-      "resolved": "http://registry.npm.taobao.org/exports-loader/download/exports-loader-0.6.4.tgz",
-      "integrity": "sha1-1w/GEhl1s1/BKDDPUnVL4nQPyIY=",
-      "dev": true,
-      "requires": {
-        "loader-utils": "1.1.0",
-        "source-map": "0.5.7"
-      }
-    },
     "express": {
       "version": "4.16.2",
       "resolved": "http://registry.npm.taobao.org/express/download/express-4.16.2.tgz",
@@ -3419,6 +3733,27 @@
       "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
       "dev": true
     },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "dev": true,
+      "requires": {
+        "assign-symbols": "1.0.0",
+        "is-extendable": "1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz",
+          "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "2.0.4"
+          }
+        }
+      }
+    },
     "extglob": {
       "version": "0.3.2",
       "resolved": "http://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz",
@@ -3446,6 +3781,17 @@
         "loader-utils": "1.1.0",
         "schema-utils": "0.3.0",
         "webpack-sources": "1.1.0"
+      },
+      "dependencies": {
+        "schema-utils": {
+          "version": "0.3.0",
+          "resolved": "http://registry.npm.taobao.org/schema-utils/download/schema-utils-0.3.0.tgz",
+          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+          "dev": true,
+          "requires": {
+            "ajv": "5.5.1"
+          }
+        }
       }
     },
     "extsprintf": {
@@ -3507,9 +3853,9 @@
       }
     },
     "fecha": {
-      "version": "2.3.2",
-      "resolved": "http://registry.npm.taobao.org/fecha/download/fecha-2.3.2.tgz",
-      "integrity": "sha1-Ng8DXdbt2VS8lYH5XypKfyo1BcE="
+      "version": "2.3.3",
+      "resolved": "http://registry.npm.taobao.org/fecha/download/fecha-2.3.3.tgz",
+      "integrity": "sha1-lI50FX3xoy/RsSw6PDzctuydls0="
     },
     "figures": {
       "version": "1.7.0",
@@ -3532,13 +3878,13 @@
       }
     },
     "file-loader": {
-      "version": "1.1.5",
-      "resolved": "http://registry.npm.taobao.org/file-loader/download/file-loader-1.1.5.tgz",
-      "integrity": "sha1-kcJba2++VtrpnxCkJf1kkztcnao=",
+      "version": "1.1.10",
+      "resolved": "http://registry.npm.taobao.org/file-loader/download/file-loader-1.1.10.tgz",
+      "integrity": "sha1-d+l9/qsT2mTHCFqz44h+Ka5Yiuo=",
       "dev": true,
       "requires": {
         "loader-utils": "1.1.0",
-        "schema-utils": "0.3.0"
+        "schema-utils": "0.4.5"
       }
     },
     "file-saver": {
@@ -3614,7 +3960,7 @@
       "dev": true,
       "requires": {
         "commondir": "1.0.1",
-        "make-dir": "1.1.0",
+        "make-dir": "1.2.0",
         "pkg-dir": "2.0.0"
       }
     },
@@ -3682,12 +4028,6 @@
         }
       }
     },
-    "flatten": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/flatten/download/flatten-1.0.2.tgz",
-      "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=",
-      "dev": true
-    },
     "flush-write-stream": {
       "version": "1.0.2",
       "resolved": "http://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.0.2.tgz",
@@ -3746,6 +4086,24 @@
       "resolved": "http://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz",
       "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
       "dev": true
+    },
+    "frac": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/frac/download/frac-1.1.1.tgz",
+      "integrity": "sha1-X39cKuApFn2QFT7qS33SlY1D0fU=",
+      "dev": true,
+      "requires": {
+        "voc": "1.0.0"
+      }
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "http://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "dev": true,
+      "requires": {
+        "map-cache": "0.2.2"
+      }
     },
     "fresh": {
       "version": "0.5.2",
@@ -3820,13 +4178,15 @@
       "dependencies": {
         "abbrev": {
           "version": "1.1.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz",
+          "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=",
           "dev": true,
           "optional": true
         },
         "ajv": {
           "version": "4.11.8",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+          "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -3836,18 +4196,21 @@
         },
         "ansi-regex": {
           "version": "2.1.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
           "dev": true
         },
         "aproba": {
           "version": "1.1.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz",
+          "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=",
           "dev": true,
           "optional": true
         },
         "are-we-there-yet": {
           "version": "1.1.4",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
+          "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -3857,42 +4220,49 @@
         },
         "asn1": {
           "version": "0.2.3",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+          "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
           "dev": true,
           "optional": true
         },
         "assert-plus": {
           "version": "0.2.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+          "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
           "dev": true,
           "optional": true
         },
         "asynckit": {
           "version": "0.4.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+          "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
           "dev": true,
           "optional": true
         },
         "aws-sign2": {
           "version": "0.6.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+          "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
           "dev": true,
           "optional": true
         },
         "aws4": {
           "version": "1.6.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
+          "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
           "dev": true,
           "optional": true
         },
         "balanced-match": {
           "version": "0.4.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+          "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
           "dev": true
         },
         "bcrypt-pbkdf": {
           "version": "1.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+          "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -3901,7 +4271,8 @@
         },
         "block-stream": {
           "version": "0.0.9",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+          "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
           "dev": true,
           "requires": {
             "inherits": "2.0.3"
@@ -3909,7 +4280,8 @@
         },
         "boom": {
           "version": "2.10.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+          "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
           "dev": true,
           "requires": {
             "hoek": "2.16.3"
@@ -3917,7 +4289,8 @@
         },
         "brace-expansion": {
           "version": "1.1.7",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz",
+          "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=",
           "dev": true,
           "requires": {
             "balanced-match": "0.4.2",
@@ -3926,29 +4299,34 @@
         },
         "buffer-shims": {
           "version": "1.0.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
+          "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=",
           "dev": true
         },
         "caseless": {
           "version": "0.12.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+          "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
           "dev": true,
           "optional": true
         },
         "co": {
           "version": "4.6.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+          "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
           "dev": true,
           "optional": true
         },
         "code-point-at": {
           "version": "1.1.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+          "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
           "dev": true
         },
         "combined-stream": {
           "version": "1.0.5",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
+          "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
           "dev": true,
           "requires": {
             "delayed-stream": "1.0.0"
@@ -3956,22 +4334,26 @@
         },
         "concat-map": {
           "version": "0.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+          "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
           "dev": true
         },
         "console-control-strings": {
           "version": "1.1.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+          "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
           "dev": true
         },
         "core-util-is": {
           "version": "1.0.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+          "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
           "dev": true
         },
         "cryptiles": {
           "version": "2.0.5",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+          "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
           "dev": true,
           "requires": {
             "boom": "2.10.1"
@@ -3979,7 +4361,8 @@
         },
         "dashdash": {
           "version": "1.14.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+          "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -3988,7 +4371,8 @@
           "dependencies": {
             "assert-plus": {
               "version": "1.0.0",
-              "bundled": true,
+              "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
               "dev": true,
               "optional": true
             }
@@ -3996,7 +4380,8 @@
         },
         "debug": {
           "version": "2.6.8",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
+          "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4005,30 +4390,35 @@
         },
         "deep-extend": {
           "version": "0.4.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+          "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
           "dev": true,
           "optional": true
         },
         "delayed-stream": {
           "version": "1.0.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+          "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
           "dev": true
         },
         "delegates": {
           "version": "1.0.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+          "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
           "dev": true,
           "optional": true
         },
         "detect-libc": {
           "version": "1.0.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.2.tgz",
+          "integrity": "sha1-ca1dIEvxempsqPRQxhRUBm70YeE=",
           "dev": true,
           "optional": true
         },
         "ecc-jsbn": {
           "version": "0.1.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+          "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4037,24 +4427,28 @@
         },
         "extend": {
           "version": "3.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+          "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
           "dev": true,
           "optional": true
         },
         "extsprintf": {
           "version": "1.0.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz",
+          "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=",
           "dev": true
         },
         "forever-agent": {
           "version": "0.6.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+          "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
           "dev": true,
           "optional": true
         },
         "form-data": {
           "version": "2.1.4",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+          "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4065,12 +4459,14 @@
         },
         "fs.realpath": {
           "version": "1.0.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+          "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
           "dev": true
         },
         "fstream": {
           "version": "1.0.11",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
+          "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
           "dev": true,
           "requires": {
             "graceful-fs": "4.1.11",
@@ -4081,7 +4477,8 @@
         },
         "fstream-ignore": {
           "version": "1.0.5",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz",
+          "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4092,7 +4489,8 @@
         },
         "gauge": {
           "version": "2.7.4",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+          "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4108,7 +4506,8 @@
         },
         "getpass": {
           "version": "0.1.7",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+          "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4117,7 +4516,8 @@
           "dependencies": {
             "assert-plus": {
               "version": "1.0.0",
-              "bundled": true,
+              "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
               "dev": true,
               "optional": true
             }
@@ -4125,7 +4525,8 @@
         },
         "glob": {
           "version": "7.1.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+          "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
           "dev": true,
           "requires": {
             "fs.realpath": "1.0.0",
@@ -4138,18 +4539,21 @@
         },
         "graceful-fs": {
           "version": "4.1.11",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+          "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
           "dev": true
         },
         "har-schema": {
           "version": "1.0.5",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
+          "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
           "dev": true,
           "optional": true
         },
         "har-validator": {
           "version": "4.2.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
+          "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4159,13 +4563,15 @@
         },
         "has-unicode": {
           "version": "2.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+          "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
           "dev": true,
           "optional": true
         },
         "hawk": {
           "version": "3.1.3",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+          "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
           "dev": true,
           "requires": {
             "boom": "2.10.1",
@@ -4176,12 +4582,14 @@
         },
         "hoek": {
           "version": "2.16.3",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+          "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
           "dev": true
         },
         "http-signature": {
           "version": "1.1.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+          "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4192,7 +4600,8 @@
         },
         "inflight": {
           "version": "1.0.6",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+          "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
           "dev": true,
           "requires": {
             "once": "1.4.0",
@@ -4201,18 +4610,21 @@
         },
         "inherits": {
           "version": "2.0.3",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
           "dev": true
         },
         "ini": {
           "version": "1.3.4",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz",
+          "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=",
           "dev": true,
           "optional": true
         },
         "is-fullwidth-code-point": {
           "version": "1.0.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
           "dev": true,
           "requires": {
             "number-is-nan": "1.0.1"
@@ -4220,24 +4632,28 @@
         },
         "is-typedarray": {
           "version": "1.0.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+          "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
           "dev": true,
           "optional": true
         },
         "isarray": {
           "version": "1.0.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
           "dev": true
         },
         "isstream": {
           "version": "0.1.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+          "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
           "dev": true,
           "optional": true
         },
         "jodid25519": {
           "version": "1.0.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz",
+          "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4246,19 +4662,22 @@
         },
         "jsbn": {
           "version": "0.1.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+          "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
           "dev": true,
           "optional": true
         },
         "json-schema": {
           "version": "0.2.3",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+          "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
           "dev": true,
           "optional": true
         },
         "json-stable-stringify": {
           "version": "1.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+          "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4267,19 +4686,22 @@
         },
         "json-stringify-safe": {
           "version": "5.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+          "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
           "dev": true,
           "optional": true
         },
         "jsonify": {
           "version": "0.0.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+          "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
           "dev": true,
           "optional": true
         },
         "jsprim": {
           "version": "1.4.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz",
+          "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4291,7 +4713,8 @@
           "dependencies": {
             "assert-plus": {
               "version": "1.0.0",
-              "bundled": true,
+              "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
               "dev": true,
               "optional": true
             }
@@ -4299,12 +4722,14 @@
         },
         "mime-db": {
           "version": "1.27.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz",
+          "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=",
           "dev": true
         },
         "mime-types": {
           "version": "2.1.15",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz",
+          "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=",
           "dev": true,
           "requires": {
             "mime-db": "1.27.0"
@@ -4312,7 +4737,8 @@
         },
         "minimatch": {
           "version": "3.0.4",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+          "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
           "dev": true,
           "requires": {
             "brace-expansion": "1.1.7"
@@ -4320,12 +4746,14 @@
         },
         "minimist": {
           "version": "0.0.8",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
           "dev": true
         },
         "mkdirp": {
           "version": "0.5.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+          "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
           "dev": true,
           "requires": {
             "minimist": "0.0.8"
@@ -4333,13 +4761,15 @@
         },
         "ms": {
           "version": "2.0.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
           "dev": true,
           "optional": true
         },
         "node-pre-gyp": {
           "version": "0.6.39",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz",
+          "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4358,7 +4788,8 @@
         },
         "nopt": {
           "version": "4.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
+          "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4368,7 +4799,8 @@
         },
         "npmlog": {
           "version": "4.1.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz",
+          "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4380,24 +4812,28 @@
         },
         "number-is-nan": {
           "version": "1.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+          "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
           "dev": true
         },
         "oauth-sign": {
           "version": "0.8.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+          "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
           "dev": true,
           "optional": true
         },
         "object-assign": {
           "version": "4.1.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+          "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
           "dev": true,
           "optional": true
         },
         "once": {
           "version": "1.4.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+          "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
           "dev": true,
           "requires": {
             "wrappy": "1.0.2"
@@ -4405,19 +4841,22 @@
         },
         "os-homedir": {
           "version": "1.0.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+          "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
           "dev": true,
           "optional": true
         },
         "os-tmpdir": {
           "version": "1.0.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+          "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
           "dev": true,
           "optional": true
         },
         "osenv": {
           "version": "0.1.4",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz",
+          "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4427,35 +4866,41 @@
         },
         "path-is-absolute": {
           "version": "1.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+          "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
           "dev": true
         },
         "performance-now": {
           "version": "0.2.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
+          "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
           "dev": true,
           "optional": true
         },
         "process-nextick-args": {
           "version": "1.0.7",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+          "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
           "dev": true
         },
         "punycode": {
           "version": "1.4.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
           "dev": true,
           "optional": true
         },
         "qs": {
           "version": "6.4.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
+          "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
           "dev": true,
           "optional": true
         },
         "rc": {
           "version": "1.2.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz",
+          "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4467,7 +4912,8 @@
           "dependencies": {
             "minimist": {
               "version": "1.2.0",
-              "bundled": true,
+              "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+              "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
               "dev": true,
               "optional": true
             }
@@ -4475,7 +4921,8 @@
         },
         "readable-stream": {
           "version": "2.2.9",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz",
+          "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=",
           "dev": true,
           "requires": {
             "buffer-shims": "1.0.0",
@@ -4489,7 +4936,8 @@
         },
         "request": {
           "version": "2.81.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
+          "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4519,7 +4967,8 @@
         },
         "rimraf": {
           "version": "2.6.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz",
+          "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=",
           "dev": true,
           "requires": {
             "glob": "7.1.2"
@@ -4527,30 +4976,35 @@
         },
         "safe-buffer": {
           "version": "5.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
+          "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=",
           "dev": true
         },
         "semver": {
           "version": "5.3.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+          "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
           "dev": true,
           "optional": true
         },
         "set-blocking": {
           "version": "2.0.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+          "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
           "dev": true,
           "optional": true
         },
         "signal-exit": {
           "version": "3.0.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+          "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
           "dev": true,
           "optional": true
         },
         "sntp": {
           "version": "1.0.9",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+          "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
           "dev": true,
           "requires": {
             "hoek": "2.16.3"
@@ -4558,7 +5012,8 @@
         },
         "sshpk": {
           "version": "1.13.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz",
+          "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4575,7 +5030,8 @@
           "dependencies": {
             "assert-plus": {
               "version": "1.0.0",
-              "bundled": true,
+              "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+              "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
               "dev": true,
               "optional": true
             }
@@ -4583,7 +5039,8 @@
         },
         "string-width": {
           "version": "1.0.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
           "dev": true,
           "requires": {
             "code-point-at": "1.1.0",
@@ -4593,7 +5050,8 @@
         },
         "string_decoder": {
           "version": "1.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz",
+          "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=",
           "dev": true,
           "requires": {
             "safe-buffer": "5.0.1"
@@ -4601,13 +5059,15 @@
         },
         "stringstream": {
           "version": "0.0.5",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+          "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
           "dev": true,
           "optional": true
         },
         "strip-ansi": {
           "version": "3.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
           "dev": true,
           "requires": {
             "ansi-regex": "2.1.1"
@@ -4615,13 +5075,15 @@
         },
         "strip-json-comments": {
           "version": "2.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+          "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
           "dev": true,
           "optional": true
         },
         "tar": {
           "version": "2.2.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
+          "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
           "dev": true,
           "requires": {
             "block-stream": "0.0.9",
@@ -4631,7 +5093,8 @@
         },
         "tar-pack": {
           "version": "3.4.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz",
+          "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4647,7 +5110,8 @@
         },
         "tough-cookie": {
           "version": "2.3.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz",
+          "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4656,7 +5120,8 @@
         },
         "tunnel-agent": {
           "version": "0.6.0",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+          "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4665,30 +5130,35 @@
         },
         "tweetnacl": {
           "version": "0.14.5",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+          "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
           "dev": true,
           "optional": true
         },
         "uid-number": {
           "version": "0.0.6",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz",
+          "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=",
           "dev": true,
           "optional": true
         },
         "util-deprecate": {
           "version": "1.0.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+          "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
           "dev": true
         },
         "uuid": {
           "version": "3.0.1",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz",
+          "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=",
           "dev": true,
           "optional": true
         },
         "verror": {
           "version": "1.3.6",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz",
+          "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4697,7 +5167,8 @@
         },
         "wide-align": {
           "version": "1.1.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
+          "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
           "dev": true,
           "optional": true,
           "requires": {
@@ -4706,7 +5177,8 @@
         },
         "wrappy": {
           "version": "1.0.2",
-          "bundled": true,
+          "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+          "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
           "dev": true
         }
       }
@@ -4792,6 +5264,12 @@
       "version": "3.0.0",
       "resolved": "http://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz",
       "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+      "dev": true
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "http://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
       "dev": true
     },
     "getpass": {
@@ -5191,6 +5669,58 @@
       "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
       "dev": true
     },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "dev": true,
+      "requires": {
+        "get-value": "2.0.6",
+        "has-values": "1.0.0",
+        "isobject": "3.0.1"
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "dev": true,
+      "requires": {
+        "is-number": "3.0.0",
+        "kind-of": "4.0.0"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "1.1.6"
+          }
+        }
+      }
+    },
     "hash-base": {
       "version": "2.0.2",
       "resolved": "http://registry.npm.taobao.org/hash-base/download/hash-base-2.0.2.tgz",
@@ -5272,12 +5802,6 @@
         "wbuf": "1.7.2"
       }
     },
-    "html-comment-regex": {
-      "version": "1.1.1",
-      "resolved": "http://registry.npm.taobao.org/html-comment-regex/download/html-comment-regex-1.1.1.tgz",
-      "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=",
-      "dev": true
-    },
     "html-entities": {
       "version": "1.2.1",
       "resolved": "http://registry.npm.taobao.org/html-entities/download/html-entities-1.2.1.tgz",
@@ -5285,19 +5809,27 @@
       "dev": true
     },
     "html-minifier": {
-      "version": "3.5.7",
-      "resolved": "http://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.7.tgz",
-      "integrity": "sha1-UR5pu1qOdnfRAS6+A4GaoCygYgg=",
+      "version": "3.5.9",
+      "resolved": "http://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.9.tgz",
+      "integrity": "sha1-dEJAFLhyWY1LsOIKxCCSbsYQJLY=",
       "dev": true,
       "requires": {
         "camel-case": "3.0.0",
         "clean-css": "4.1.9",
-        "commander": "2.12.2",
+        "commander": "2.14.1",
         "he": "1.1.1",
         "ncname": "1.0.0",
         "param-case": "2.1.1",
         "relateurl": "0.2.7",
-        "uglify-js": "3.2.2"
+        "uglify-js": "3.3.12"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.14.1",
+          "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.14.1.tgz",
+          "integrity": "sha1-IjUSPjevjKPGXfRbAm29NXsBuao=",
+          "dev": true
+        }
       }
     },
     "html-tags": {
@@ -5313,7 +5845,7 @@
       "dev": true,
       "requires": {
         "bluebird": "3.5.1",
-        "html-minifier": "3.5.7",
+        "html-minifier": "3.5.9",
         "loader-utils": "0.2.17",
         "lodash": "4.17.4",
         "pretty-error": "2.1.1",
@@ -5408,9 +5940,9 @@
       }
     },
     "http-parser-js": {
-      "version": "0.4.9",
-      "resolved": "http://registry.npm.taobao.org/http-parser-js/download/http-parser-js-0.4.9.tgz",
-      "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=",
+      "version": "0.4.10",
+      "resolved": "http://registry.npm.taobao.org/http-parser-js/download/http-parser-js-0.4.10.tgz",
+      "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=",
       "dev": true
     },
     "http-proxy": {
@@ -5479,51 +6011,6 @@
       "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.19.tgz",
       "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs="
     },
-    "icss-replace-symbols": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/icss-replace-symbols/download/icss-replace-symbols-1.1.0.tgz",
-      "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
-      "dev": true
-    },
-    "icss-utils": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/icss-utils/download/icss-utils-2.1.0.tgz",
-      "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=",
-      "dev": true,
-      "requires": {
-        "postcss": "6.0.14"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "2.3.0",
-          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz",
-          "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "3.2.0",
-            "escape-string-regexp": "1.0.5",
-            "supports-color": "4.5.0"
-          }
-        },
-        "postcss": {
-          "version": "6.0.14",
-          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.14.tgz",
-          "integrity": "sha1-VTTHIRRznnXQr88BfbhTCZ9WKIU=",
-          "dev": true,
-          "requires": {
-            "chalk": "2.3.0",
-            "source-map": "0.6.1",
-            "supports-color": "4.5.0"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
-          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
-          "dev": true
-        }
-      }
-    },
     "ieee754": {
       "version": "1.1.8",
       "resolved": "http://registry.npm.taobao.org/ieee754/download/ieee754-1.1.8.tgz",
@@ -5550,9 +6037,9 @@
       "optional": true
     },
     "import-local": {
-      "version": "0.1.1",
-      "resolved": "http://registry.npm.taobao.org/import-local/download/import-local-0.1.1.tgz",
-      "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=",
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/import-local/download/import-local-1.0.0.tgz",
+      "integrity": "sha1-Xk/9wD9P5sAJxnKb6yljHC+CJ7w=",
       "dev": true,
       "requires": {
         "pkg-dir": "2.0.0",
@@ -5657,11 +6144,22 @@
       "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=",
       "dev": true
     },
-    "is-absolute-url": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/is-absolute-url/download/is-absolute-url-2.1.0.tgz",
-      "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
-      "dev": true
+    "is-accessor-descriptor": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+      "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+      "dev": true,
+      "requires": {
+        "kind-of": "6.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz",
+          "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=",
+          "dev": true
+        }
+      }
     },
     "is-alphabetical": {
       "version": "1.0.1",
@@ -5721,6 +6219,23 @@
       "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=",
       "dev": true
     },
+    "is-data-descriptor": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+      "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+      "dev": true,
+      "requires": {
+        "kind-of": "6.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz",
+          "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=",
+          "dev": true
+        }
+      }
+    },
     "is-date-object": {
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.1.tgz",
@@ -5732,6 +6247,25 @@
       "resolved": "http://registry.npm.taobao.org/is-decimal/download/is-decimal-1.0.1.tgz",
       "integrity": "sha1-9ftqlJlq2ejjdh+/vQkfH8qMToI=",
       "dev": true
+    },
+    "is-descriptor": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+      "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+      "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.2",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz",
+          "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=",
+          "dev": true
+        }
+      }
     },
     "is-directory": {
       "version": "0.3.1",
@@ -5843,6 +6377,23 @@
         }
       }
     },
+    "is-odd": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/is-odd/download/is-odd-2.0.0.tgz",
+      "integrity": "sha1-dkZiRnH9fqVYzNmieVGC8pWPGyQ=",
+      "dev": true,
+      "requires": {
+        "is-number": "4.0.0"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz",
+          "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=",
+          "dev": true
+        }
+      }
+    },
     "is-path-cwd": {
       "version": "1.0.0",
       "resolved": "http://registry.npm.taobao.org/is-path-cwd/download/is-path-cwd-1.0.0.tgz",
@@ -5933,15 +6484,6 @@
       "integrity": "sha1-i1IMhfrnolM4LUsCZS4EVXbhO7g=",
       "dev": true
     },
-    "is-svg": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/is-svg/download/is-svg-2.1.0.tgz",
-      "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=",
-      "dev": true,
-      "requires": {
-        "html-comment-regex": "1.1.1"
-      }
-    },
     "is-symbol": {
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.1.tgz",
@@ -5964,6 +6506,12 @@
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/is-whitespace-character/download/is-whitespace-character-1.0.1.tgz",
       "integrity": "sha1-muAXbzKCtlRXoZks2whPil+DPjs=",
+      "dev": true
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz",
+      "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=",
       "dev": true
     },
     "is-word-character": {
@@ -6113,27 +6661,24 @@
       }
     },
     "istanbul-instrumenter-loader": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/istanbul-instrumenter-loader/download/istanbul-instrumenter-loader-2.0.0.tgz",
-      "integrity": "sha1-5UkpAKsLuoNe+oAkywC+mz7qJwA=",
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/istanbul-instrumenter-loader/download/istanbul-instrumenter-loader-3.0.0.tgz",
+      "integrity": "sha1-n1U5I7IjYLrJXmF6q6Aa3R99sLI=",
       "dev": true,
       "requires": {
         "convert-source-map": "1.5.1",
         "istanbul-lib-instrument": "1.9.1",
-        "loader-utils": "0.2.17",
-        "object-assign": "4.1.1"
+        "loader-utils": "1.1.0",
+        "schema-utils": "0.3.0"
       },
       "dependencies": {
-        "loader-utils": {
-          "version": "0.2.17",
-          "resolved": "http://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz",
-          "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
+        "schema-utils": {
+          "version": "0.3.0",
+          "resolved": "http://registry.npm.taobao.org/schema-utils/download/schema-utils-0.3.0.tgz",
+          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
           "dev": true,
           "requires": {
-            "big.js": "3.2.0",
-            "emojis-list": "2.1.0",
-            "json5": "0.5.1",
-            "object-assign": "4.1.1"
+            "ajv": "5.5.1"
           }
         }
       }
@@ -6287,6 +6832,11 @@
         "leven": "2.1.0",
         "pretty-format": "21.2.1"
       }
+    },
+    "jquery": {
+      "version": "3.3.1",
+      "resolved": "http://registry.npm.taobao.org/jquery/download/jquery-3.3.1.tgz",
+      "integrity": "sha1-lYzinoHJeQ8xvneS311NlfxX+8o="
     },
     "js-base64": {
       "version": "2.4.0",
@@ -6595,7 +7145,7 @@
       "integrity": "sha1-zBJg9RyQCp7A2R+2mYE54CUHtjs=",
       "dev": true,
       "requires": {
-        "errno": "0.1.6",
+        "errno": "0.1.7",
         "graceful-fs": "4.1.11",
         "image-size": "0.5.5",
         "mime": "1.6.0",
@@ -6606,26 +7156,20 @@
       }
     },
     "less-loader": {
-      "version": "4.0.5",
-      "resolved": "http://registry.npm.taobao.org/less-loader/download/less-loader-4.0.5.tgz",
-      "integrity": "sha1-rhVadAbKxqzSk9eFWH/P8PR4xN0=",
+      "version": "4.0.6",
+      "resolved": "http://registry.npm.taobao.org/less-loader/download/less-loader-4.0.6.tgz",
+      "integrity": "sha1-e8+7kFMYHBjVfiE+hzRpWOArJ2k=",
       "dev": true,
       "requires": {
         "clone": "2.1.1",
         "loader-utils": "1.1.0",
-        "pify": "2.3.0"
+        "pify": "3.0.0"
       },
       "dependencies": {
         "clone": {
           "version": "2.1.1",
           "resolved": "http://registry.npm.taobao.org/clone/download/clone-2.1.1.tgz",
           "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
-          "dev": true
-        },
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
           "dev": true
         }
       }
@@ -6647,9 +7191,9 @@
       }
     },
     "license-webpack-plugin": {
-      "version": "1.1.1",
-      "resolved": "http://registry.npm.taobao.org/license-webpack-plugin/download/license-webpack-plugin-1.1.1.tgz",
-      "integrity": "sha1-drLO3Mx48Tn9eHfldvdWz8FBuMI=",
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/license-webpack-plugin/download/license-webpack-plugin-1.1.2.tgz",
+      "integrity": "sha1-KDUZx37zh49GfFD83Pm1dgv7zUs=",
       "dev": true,
       "requires": {
         "ejs": "2.5.7"
@@ -7031,12 +7575,6 @@
       "dev": true,
       "optional": true
     },
-    "lodash.camelcase": {
-      "version": "4.3.0",
-      "resolved": "http://registry.npm.taobao.org/lodash.camelcase/download/lodash.camelcase-4.3.0.tgz",
-      "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
-      "dev": true
-    },
     "lodash.clonedeep": {
       "version": "4.5.0",
       "resolved": "http://registry.npm.taobao.org/lodash.clonedeep/download/lodash.clonedeep-4.5.0.tgz",
@@ -7075,16 +7613,10 @@
         "lodash.isarray": "3.0.4"
       }
     },
-    "lodash.memoize": {
-      "version": "4.1.2",
-      "resolved": "http://registry.npm.taobao.org/lodash.memoize/download/lodash.memoize-4.1.2.tgz",
-      "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
-      "dev": true
-    },
     "lodash.mergewith": {
-      "version": "4.6.0",
-      "resolved": "http://registry.npm.taobao.org/lodash.mergewith/download/lodash.mergewith-4.6.0.tgz",
-      "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=",
+      "version": "4.6.1",
+      "resolved": "http://registry.npm.taobao.org/lodash.mergewith/download/lodash.mergewith-4.6.1.tgz",
+      "integrity": "sha1-Y5BX5ybDr72z59QnQcqo1uQzWSc=",
       "dev": true,
       "optional": true
     },
@@ -7126,12 +7658,6 @@
         "lodash._reinterpolate": "3.0.0",
         "lodash.escape": "3.2.0"
       }
-    },
-    "lodash.uniq": {
-      "version": "4.5.0",
-      "resolved": "http://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz",
-      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
-      "dev": true
     },
     "log-symbols": {
       "version": "2.1.0",
@@ -7195,9 +7721,9 @@
       }
     },
     "loglevel": {
-      "version": "1.6.0",
-      "resolved": "http://registry.npm.taobao.org/loglevel/download/loglevel-1.6.0.tgz",
-      "integrity": "sha1-rgyqVhERSYxboTcj1vtjHSQAOTQ=",
+      "version": "1.6.1",
+      "resolved": "http://registry.npm.taobao.org/loglevel/download/loglevel-1.6.1.tgz",
+      "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=",
       "dev": true
     },
     "longest": {
@@ -7247,12 +7773,6 @@
         "yallist": "2.1.2"
       }
     },
-    "macaddress": {
-      "version": "0.2.8",
-      "resolved": "http://registry.npm.taobao.org/macaddress/download/macaddress-0.2.8.tgz",
-      "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=",
-      "dev": true
-    },
     "magic-string": {
       "version": "0.22.4",
       "resolved": "http://registry.npm.taobao.org/magic-string/download/magic-string-0.22.4.tgz",
@@ -7263,9 +7783,9 @@
       }
     },
     "make-dir": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/make-dir/download/make-dir-1.1.0.tgz",
-      "integrity": "sha1-GbQ2n+SMEW9Twq+VrRAsDjnoXVE=",
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/make-dir/download/make-dir-1.2.0.tgz",
+      "integrity": "sha1-bWpJ7q1KrilsU7vzoaAIvWyJRps=",
       "dev": true,
       "requires": {
         "pify": "3.0.0"
@@ -7275,6 +7795,12 @@
       "version": "1.3.0",
       "resolved": "http://registry.npm.taobao.org/make-error/download/make-error-1.3.0.tgz",
       "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=",
+      "dev": true
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "http://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
       "dev": true
     },
     "map-obj": {
@@ -7289,6 +7815,15 @@
       "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
       "dev": true
     },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "dev": true,
+      "requires": {
+        "object-visit": "1.0.1"
+      }
+    },
     "markdown-escapes": {
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/markdown-escapes/download/markdown-escapes-1.0.1.tgz",
@@ -7301,28 +7836,11 @@
       "integrity": "sha1-Sz3ToTPRUYuO8NvHCb8qG0gkvIw=",
       "dev": true
     },
-    "math-expression-evaluator": {
-      "version": "1.2.17",
-      "resolved": "http://registry.npm.taobao.org/math-expression-evaluator/download/math-expression-evaluator-1.2.17.tgz",
-      "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=",
-      "dev": true
-    },
     "mathml-tag-names": {
       "version": "2.0.1",
       "resolved": "http://registry.npm.taobao.org/mathml-tag-names/download/mathml-tag-names-2.0.1.tgz",
       "integrity": "sha1-jUEmgWi/htEQK5gQnijlMeejRXg=",
       "dev": true
-    },
-    "md5": {
-      "version": "2.2.1",
-      "resolved": "http://registry.npm.taobao.org/md5/download/md5-2.2.1.tgz",
-      "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
-      "dev": true,
-      "requires": {
-        "charenc": "0.0.2",
-        "crypt": "0.0.2",
-        "is-buffer": "1.1.6"
-      }
     },
     "md5.js": {
       "version": "1.3.4",
@@ -7368,7 +7886,7 @@
       "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
       "dev": true,
       "requires": {
-        "mimic-fn": "1.1.0"
+        "mimic-fn": "1.2.0"
       }
     },
     "memory-fs": {
@@ -7377,7 +7895,7 @@
       "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
       "dev": true,
       "requires": {
-        "errno": "0.1.6",
+        "errno": "0.1.7",
         "readable-stream": "2.3.3"
       }
     },
@@ -7487,9 +8005,9 @@
       }
     },
     "mimic-fn": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.1.0.tgz",
-      "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=",
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz",
+      "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=",
       "dev": true
     },
     "minimalistic-assert": {
@@ -7520,21 +8038,42 @@
       "dev": true
     },
     "mississippi": {
-      "version": "1.3.0",
-      "resolved": "http://registry.npm.taobao.org/mississippi/download/mississippi-1.3.0.tgz",
-      "integrity": "sha1-0gFYPrEjJ+PFwWQqQEqcrPlONPU=",
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/mississippi/download/mississippi-2.0.0.tgz",
+      "integrity": "sha1-NEKlCPr8KFAEhv7qmUCWduTuWm8=",
       "dev": true,
       "requires": {
         "concat-stream": "1.6.0",
-        "duplexify": "3.5.1",
+        "duplexify": "3.5.3",
         "end-of-stream": "1.4.0",
         "flush-write-stream": "1.0.2",
         "from2": "2.3.0",
         "parallel-transform": "1.1.0",
-        "pump": "1.0.3",
-        "pumpify": "1.3.5",
+        "pump": "2.0.1",
+        "pumpify": "1.4.0",
         "stream-each": "1.2.2",
         "through2": "2.0.3"
+      }
+    },
+    "mixin-deep": {
+      "version": "1.3.1",
+      "resolved": "http://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.1.tgz",
+      "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=",
+      "dev": true,
+      "requires": {
+        "for-in": "1.0.2",
+        "is-extendable": "1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz",
+          "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "2.0.4"
+          }
+        }
       }
     },
     "mixin-object": {
@@ -7578,9 +8117,18 @@
       "integrity": "sha1-N6vl7ogtQBgo2fJsbBovR2FLu+8="
     },
     "mobx-angular": {
-      "version": "2.0.1",
-      "resolved": "http://registry.npm.taobao.org/mobx-angular/download/mobx-angular-2.0.1.tgz",
-      "integrity": "sha1-JjjQkWGAgGk7vtAsXfjNcUtSwWc="
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.taobao.org/mobx-angular/download/mobx-angular-2.1.1.tgz",
+      "integrity": "sha1-1eNlOayyABht1aEXCAa0d2uai4g="
+    },
+    "mockjs": {
+      "version": "1.0.1-beta3",
+      "resolved": "http://registry.npm.taobao.org/mockjs/download/mockjs-1.0.1-beta3.tgz",
+      "integrity": "sha1-0jTzwnJWOXVk8slVFC6JGQlTcgk=",
+      "dev": true,
+      "requires": {
+        "commander": "2.12.2"
+      }
     },
     "moment": {
       "version": "2.19.4",
@@ -7608,13 +8156,13 @@
       "dev": true
     },
     "multicast-dns": {
-      "version": "6.2.1",
-      "resolved": "http://registry.npm.taobao.org/multicast-dns/download/multicast-dns-6.2.1.tgz",
-      "integrity": "sha1-xQNd76khnTBkBVikkpgGc1IJgGA=",
+      "version": "6.2.3",
+      "resolved": "http://registry.npm.taobao.org/multicast-dns/download/multicast-dns-6.2.3.tgz",
+      "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=",
       "dev": true,
       "requires": {
-        "dns-packet": "1.2.2",
-        "thunky": "0.1.0"
+        "dns-packet": "1.3.1",
+        "thunky": "1.0.2"
       }
     },
     "multicast-dns-service-types": {
@@ -7639,6 +8187,46 @@
       "dev": true,
       "optional": true
     },
+    "nanomatch": {
+      "version": "1.2.9",
+      "resolved": "http://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.9.tgz",
+      "integrity": "sha1-h59xUMstq3pHElkGbBBO7m4Pp8I=",
+      "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-odd": "2.0.0",
+        "is-windows": "1.0.2",
+        "kind-of": "6.0.2",
+        "object.pick": "1.3.0",
+        "regex-not": "1.0.2",
+        "snapdragon": "0.8.1",
+        "to-regex": "3.0.2"
+      },
+      "dependencies": {
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+          "dev": true
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "http://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz",
+          "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=",
+          "dev": true
+        }
+      }
+    },
     "ncname": {
       "version": "1.0.0",
       "resolved": "http://registry.npm.taobao.org/ncname/download/ncname-1.0.0.tgz",
@@ -7654,18 +8242,63 @@
       "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
       "dev": true
     },
-    "ng-tree-antd": {
-      "version": "2.0.4",
-      "resolved": "http://registry.npm.taobao.org/ng-tree-antd/download/ng-tree-antd-2.0.4.tgz",
-      "integrity": "sha1-pegPPbuRulfHnKYi8OsBA+xYhN4=",
+    "ng-clipboard-antd": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.taobao.org/ng-clipboard-antd/download/ng-clipboard-antd-2.0.1.tgz",
+      "integrity": "sha1-LyALjSLsttU2BAjWmF3z9Rq9fPY=",
       "requires": {
-        "angular-tree-component": "6.1.0"
+        "@angular/animations": "5.1.1",
+        "@angular/common": "5.1.1",
+        "@angular/compiler": "5.1.1",
+        "@angular/core": "5.1.1",
+        "@angular/forms": "5.1.1",
+        "@angular/http": "5.1.1",
+        "@angular/platform-browser": "5.1.1",
+        "@angular/platform-browser-dynamic": "5.1.1",
+        "@angular/router": "5.1.1",
+        "core-js": "2.5.3",
+        "ng-zorro-antd": "0.6.12",
+        "ngx-highlight-js": "1.0.3",
+        "rxjs": "5.5.5",
+        "zone.js": "0.8.18"
+      },
+      "dependencies": {
+        "ng-zorro-antd": {
+          "version": "0.6.12",
+          "resolved": "http://registry.npm.taobao.org/ng-zorro-antd/download/ng-zorro-antd-0.6.12.tgz",
+          "integrity": "sha1-6f5y3IjO2Lu63LakYAQiDVyD6ak=",
+          "requires": {
+            "@angular/cdk": "5.0.0",
+            "moment": "2.19.4",
+            "tslib": "1.8.1"
+          }
+        }
+      }
+    },
+    "ng-tree-antd": {
+      "version": "2.2.2",
+      "resolved": "http://registry.npm.taobao.org/ng-tree-antd/download/ng-tree-antd-2.2.2.tgz",
+      "integrity": "sha1-oo7hraoZTDQp5JmZ2qqzL5cSQXU=",
+      "requires": {
+        "@angular/animations": "5.1.1",
+        "@angular/common": "5.1.1",
+        "@angular/compiler": "5.1.1",
+        "@angular/core": "5.1.1",
+        "@angular/forms": "5.1.1",
+        "@angular/http": "5.1.1",
+        "@angular/platform-browser": "5.1.1",
+        "@angular/platform-browser-dynamic": "5.1.1",
+        "@angular/router": "5.1.1",
+        "core-js": "2.5.3",
+        "ngx-highlight-js": "1.0.3",
+        "rxjs": "5.5.5",
+        "zone.js": "0.8.18"
       }
     },
     "ng-zorro-antd": {
-      "version": "0.6.6",
-      "resolved": "http://registry.npm.taobao.org/ng-zorro-antd/download/ng-zorro-antd-0.6.6.tgz",
-      "integrity": "sha1-M+kqIcXkArZjibMPSexq3tyPpdQ=",
+      "version": "0.6.15",
+      "resolved": "http://registry.npm.taobao.org/ng-zorro-antd/download/ng-zorro-antd-0.6.15.tgz",
+      "integrity": "sha1-rO9Bow/rzoNbhx1SzUfQQqwu1EM=",
       "requires": {
         "@angular/cdk": "5.0.0",
         "moment": "2.19.4",
@@ -7673,19 +8306,14 @@
       }
     },
     "ng-zorro-antd-extra": {
-      "version": "1.1.4",
-      "resolved": "http://registry.npm.taobao.org/ng-zorro-antd-extra/download/ng-zorro-antd-extra-1.1.4.tgz",
-      "integrity": "sha1-K3jTYVZ3tIgJD3SZiEFSl20ygu4="
+      "version": "1.1.7",
+      "resolved": "http://registry.npm.taobao.org/ng-zorro-antd-extra/download/ng-zorro-antd-extra-1.1.7.tgz",
+      "integrity": "sha1-DgV5ysLI3DrFZuH0mksMp/AYa1A="
     },
     "ng2-dnd": {
       "version": "5.0.2",
       "resolved": "http://registry.npm.taobao.org/ng2-dnd/download/ng2-dnd-5.0.2.tgz",
       "integrity": "sha1-hiJ4rH3t+hT1eDu/NAFNXXPf77Q="
-    },
-    "ng2-file-upload": {
-      "version": "1.3.0",
-      "resolved": "http://registry.npm.taobao.org/ng2-file-upload/download/ng2-file-upload-1.3.0.tgz",
-      "integrity": "sha1-2Q+PVo9iODRiF1+L36AJaxMfJ3o="
     },
     "ng2-img-cropper": {
       "version": "0.9.0",
@@ -7702,6 +8330,56 @@
       "resolved": "http://registry.npm.taobao.org/ngx-countdown/download/ngx-countdown-2.0.2.tgz",
       "integrity": "sha1-+q905dlnCQYvf7A18QW1+Pdr6S0="
     },
+    "ngx-echarts": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.taobao.org/ngx-echarts/download/ngx-echarts-2.0.2.tgz",
+      "integrity": "sha1-7A0IQiDmMxOnTMakDyomF6MkFTM="
+    },
+    "ngx-highlight-js": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.taobao.org/ngx-highlight-js/download/ngx-highlight-js-1.0.3.tgz",
+      "integrity": "sha1-tG75Bp1EO6rnpD5eQhfWT7gEkAM="
+    },
+    "ngx-tinymce": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/ngx-tinymce/download/ngx-tinymce-1.0.1.tgz",
+      "integrity": "sha1-pfBPcaajk6g2NpBTDE2DL8OfyfI=",
+      "requires": {
+        "@angular/animations": "5.1.1",
+        "@angular/common": "5.1.1",
+        "@angular/compiler": "5.1.1",
+        "@angular/core": "5.1.1",
+        "@angular/forms": "5.1.1",
+        "@angular/http": "5.1.1",
+        "@angular/platform-browser": "5.1.1",
+        "@angular/platform-browser-dynamic": "5.1.1",
+        "@angular/router": "5.1.1",
+        "core-js": "2.5.3",
+        "ngx-highlight-js": "1.0.3",
+        "rxjs": "5.5.5",
+        "zone.js": "0.8.18"
+      }
+    },
+    "ngx-ueditor": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/ngx-ueditor/download/ngx-ueditor-1.1.0.tgz",
+      "integrity": "sha1-B2asxqjoIFZhExyXvknB6ZHJfGw=",
+      "requires": {
+        "@angular/animations": "5.1.1",
+        "@angular/common": "5.1.1",
+        "@angular/compiler": "5.1.1",
+        "@angular/core": "5.1.1",
+        "@angular/forms": "5.1.1",
+        "@angular/http": "5.1.1",
+        "@angular/platform-browser": "5.1.1",
+        "@angular/platform-browser-dynamic": "5.1.1",
+        "@angular/router": "5.1.1",
+        "core-js": "2.5.3",
+        "ngx-highlight-js": "1.0.3",
+        "rxjs": "5.5.5",
+        "zone.js": "0.8.18"
+      }
+    },
     "no-case": {
       "version": "2.3.2",
       "resolved": "http://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz",
@@ -7712,9 +8390,9 @@
       }
     },
     "node-forge": {
-      "version": "0.6.33",
-      "resolved": "http://registry.npm.taobao.org/node-forge/download/node-forge-0.6.33.tgz",
-      "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=",
+      "version": "0.7.1",
+      "resolved": "http://registry.npm.taobao.org/node-forge/download/node-forge-0.7.1.tgz",
+      "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=",
       "dev": true
     },
     "node-gyp": {
@@ -7731,7 +8409,7 @@
         "mkdirp": "0.5.1",
         "nopt": "3.0.6",
         "npmlog": "4.1.2",
-        "osenv": "0.1.4",
+        "osenv": "0.1.5",
         "request": "2.81.0",
         "rimraf": "2.6.2",
         "semver": "5.3.0",
@@ -7770,7 +8448,7 @@
         "console-browserify": "1.1.0",
         "constants-browserify": "1.0.0",
         "crypto-browserify": "3.12.0",
-        "domain-browser": "1.1.7",
+        "domain-browser": "1.2.0",
         "events": "1.1.1",
         "https-browserify": "1.0.0",
         "os-browserify": "0.3.0",
@@ -7780,9 +8458,9 @@
         "querystring-es3": "0.2.1",
         "readable-stream": "2.3.3",
         "stream-browserify": "2.0.1",
-        "stream-http": "2.7.2",
+        "stream-http": "2.8.0",
         "string_decoder": "1.0.3",
-        "timers-browserify": "2.0.4",
+        "timers-browserify": "2.0.6",
         "tty-browserify": "0.0.0",
         "url": "0.11.0",
         "util": "0.10.3",
@@ -7811,7 +8489,7 @@
         "in-publish": "2.0.0",
         "lodash.assign": "4.2.0",
         "lodash.clonedeep": "4.5.0",
-        "lodash.mergewith": "4.6.0",
+        "lodash.mergewith": "4.6.1",
         "meow": "3.7.0",
         "mkdirp": "0.5.1",
         "nan": "2.8.0",
@@ -7920,7 +8598,7 @@
       "dev": true,
       "requires": {
         "abbrev": "1.1.1",
-        "osenv": "0.1.4"
+        "osenv": "0.1.5"
       }
     },
     "normalize-package-data": {
@@ -7955,18 +8633,6 @@
       "resolved": "http://registry.npm.taobao.org/normalize-selector/download/normalize-selector-0.2.0.tgz",
       "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=",
       "dev": true
-    },
-    "normalize-url": {
-      "version": "1.9.1",
-      "resolved": "http://registry.npm.taobao.org/normalize-url/download/normalize-url-1.9.1.tgz",
-      "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
-      "dev": true,
-      "requires": {
-        "object-assign": "4.1.1",
-        "prepend-http": "1.0.4",
-        "query-string": "4.3.4",
-        "sort-keys": "1.1.2"
-      }
     },
     "npm-path": {
       "version": "2.0.3",
@@ -8123,11 +8789,79 @@
       "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
       "dev": true
     },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "dev": true,
+      "requires": {
+        "copy-descriptor": "0.1.1",
+        "define-property": "0.2.5",
+        "kind-of": "3.2.2"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          }
+        },
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz",
+          "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "0.1.6",
+            "is-data-descriptor": "0.1.4",
+            "kind-of": "5.1.0"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz",
+              "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=",
+              "dev": true
+            }
+          }
+        }
+      }
+    },
     "object-keys": {
       "version": "1.0.11",
       "resolved": "http://registry.npm.taobao.org/object-keys/download/object-keys-1.0.11.tgz",
       "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=",
       "dev": true
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "dev": true,
+      "requires": {
+        "isobject": "3.0.1"
+      }
     },
     "object.omit": {
       "version": "2.0.1",
@@ -8148,6 +8882,15 @@
             "for-in": "1.0.2"
           }
         }
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
+      "requires": {
+        "isobject": "3.0.1"
       }
     },
     "obuf": {
@@ -8335,9 +9078,9 @@
       "dev": true
     },
     "osenv": {
-      "version": "0.1.4",
-      "resolved": "http://registry.npm.taobao.org/osenv/download/osenv-0.1.4.tgz",
-      "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=",
+      "version": "0.1.5",
+      "resolved": "http://registry.npm.taobao.org/osenv/download/osenv-0.1.5.tgz",
+      "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA=",
       "dev": true,
       "requires": {
         "os-homedir": "1.0.2",
@@ -8351,10 +9094,13 @@
       "dev": true
     },
     "p-limit": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-1.1.0.tgz",
-      "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=",
-      "dev": true
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-1.2.0.tgz",
+      "integrity": "sha1-DpK2vty1nwIsE9DxlJ3ILRWQnxw=",
+      "dev": true,
+      "requires": {
+        "p-try": "1.0.0"
+      }
     },
     "p-locate": {
       "version": "2.0.0",
@@ -8362,13 +9108,19 @@
       "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
       "dev": true,
       "requires": {
-        "p-limit": "1.1.0"
+        "p-limit": "1.2.0"
       }
     },
     "p-map": {
       "version": "1.2.0",
       "resolved": "http://registry.npm.taobao.org/p-map/download/p-map-1.2.0.tgz",
       "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=",
+      "dev": true
+    },
+    "p-try": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz",
+      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
       "dev": true
     },
     "pako": {
@@ -8403,7 +9155,7 @@
       "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=",
       "dev": true,
       "requires": {
-        "asn1.js": "4.9.2",
+        "asn1.js": "4.10.1",
         "browserify-aes": "1.1.1",
         "create-hash": "1.1.3",
         "evp_bytestokey": "1.0.3",
@@ -8506,10 +9258,22 @@
       "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
       "dev": true
     },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "dev": true
+    },
     "path-browserify": {
       "version": "0.0.0",
       "resolved": "http://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.0.tgz",
       "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+      "dev": true
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
       "dev": true
     },
     "path-exists": {
@@ -8576,7 +9340,7 @@
         "create-hmac": "1.1.6",
         "ripemd160": "2.0.1",
         "safe-buffer": "5.1.1",
-        "sha.js": "2.4.9"
+        "sha.js": "2.4.10"
       }
     },
     "performance-now": {
@@ -8616,9 +9380,9 @@
       }
     },
     "point-at-length": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/point-at-length/download/point-at-length-1.1.0.tgz",
-      "integrity": "sha1-CtcuvQmA1/WhqxIpbAVfnrazDlc=",
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/point-at-length/download/point-at-length-1.0.2.tgz",
+      "integrity": "sha1-kXbY1tfIFi8Stkb3B9ufDqcoEl4=",
       "requires": {
         "abs-svg-path": "0.1.1",
         "isarray": "0.0.1",
@@ -8650,6 +9414,12 @@
           "dev": true
         }
       }
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+      "dev": true
     },
     "postcss": {
       "version": "5.2.18",
@@ -8707,134 +9477,6 @@
         }
       }
     },
-    "postcss-calc": {
-      "version": "5.3.1",
-      "resolved": "http://registry.npm.taobao.org/postcss-calc/download/postcss-calc-5.3.1.tgz",
-      "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=",
-      "dev": true,
-      "requires": {
-        "postcss": "5.2.18",
-        "postcss-message-helpers": "2.0.0",
-        "reduce-css-calc": "1.3.0"
-      }
-    },
-    "postcss-colormin": {
-      "version": "2.2.2",
-      "resolved": "http://registry.npm.taobao.org/postcss-colormin/download/postcss-colormin-2.2.2.tgz",
-      "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=",
-      "dev": true,
-      "requires": {
-        "colormin": "1.1.2",
-        "postcss": "5.2.18",
-        "postcss-value-parser": "3.3.0"
-      }
-    },
-    "postcss-convert-values": {
-      "version": "2.6.1",
-      "resolved": "http://registry.npm.taobao.org/postcss-convert-values/download/postcss-convert-values-2.6.1.tgz",
-      "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=",
-      "dev": true,
-      "requires": {
-        "postcss": "5.2.18",
-        "postcss-value-parser": "3.3.0"
-      }
-    },
-    "postcss-custom-properties": {
-      "version": "6.2.0",
-      "resolved": "http://registry.npm.taobao.org/postcss-custom-properties/download/postcss-custom-properties-6.2.0.tgz",
-      "integrity": "sha1-XZKafwbpuE4PETNBlMC6mjCs++k=",
-      "dev": true,
-      "requires": {
-        "balanced-match": "1.0.0",
-        "postcss": "6.0.14"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "2.3.0",
-          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz",
-          "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "3.2.0",
-            "escape-string-regexp": "1.0.5",
-            "supports-color": "4.5.0"
-          }
-        },
-        "postcss": {
-          "version": "6.0.14",
-          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.14.tgz",
-          "integrity": "sha1-VTTHIRRznnXQr88BfbhTCZ9WKIU=",
-          "dev": true,
-          "requires": {
-            "chalk": "2.3.0",
-            "source-map": "0.6.1",
-            "supports-color": "4.5.0"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
-          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
-          "dev": true
-        }
-      }
-    },
-    "postcss-discard-comments": {
-      "version": "2.0.4",
-      "resolved": "http://registry.npm.taobao.org/postcss-discard-comments/download/postcss-discard-comments-2.0.4.tgz",
-      "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=",
-      "dev": true,
-      "requires": {
-        "postcss": "5.2.18"
-      }
-    },
-    "postcss-discard-duplicates": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/postcss-discard-duplicates/download/postcss-discard-duplicates-2.1.0.tgz",
-      "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=",
-      "dev": true,
-      "requires": {
-        "postcss": "5.2.18"
-      }
-    },
-    "postcss-discard-empty": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npm.taobao.org/postcss-discard-empty/download/postcss-discard-empty-2.1.0.tgz",
-      "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=",
-      "dev": true,
-      "requires": {
-        "postcss": "5.2.18"
-      }
-    },
-    "postcss-discard-overridden": {
-      "version": "0.1.1",
-      "resolved": "http://registry.npm.taobao.org/postcss-discard-overridden/download/postcss-discard-overridden-0.1.1.tgz",
-      "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=",
-      "dev": true,
-      "requires": {
-        "postcss": "5.2.18"
-      }
-    },
-    "postcss-discard-unused": {
-      "version": "2.2.3",
-      "resolved": "http://registry.npm.taobao.org/postcss-discard-unused/download/postcss-discard-unused-2.2.3.tgz",
-      "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=",
-      "dev": true,
-      "requires": {
-        "postcss": "5.2.18",
-        "uniqs": "2.0.0"
-      }
-    },
-    "postcss-filter-plugins": {
-      "version": "2.0.2",
-      "resolved": "http://registry.npm.taobao.org/postcss-filter-plugins/download/postcss-filter-plugins-2.0.2.tgz",
-      "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=",
-      "dev": true,
-      "requires": {
-        "postcss": "5.2.18",
-        "uniqid": "4.1.1"
-      }
-    },
     "postcss-html": {
       "version": "0.11.0",
       "resolved": "http://registry.npm.taobao.org/postcss-html/download/postcss-html-0.11.0.tgz",
@@ -8867,6 +9509,63 @@
             "entities": "1.1.1",
             "inherits": "2.0.3",
             "readable-stream": "2.3.3"
+          }
+        }
+      }
+    },
+    "postcss-import": {
+      "version": "11.1.0",
+      "resolved": "http://registry.npm.taobao.org/postcss-import/download/postcss-import-11.1.0.tgz",
+      "integrity": "sha1-Vck2LJGSmU7GiGXSJEGd8dspgfA=",
+      "dev": true,
+      "requires": {
+        "postcss": "6.0.19",
+        "postcss-value-parser": "3.3.0",
+        "read-cache": "1.0.0",
+        "resolve": "1.5.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.3.1",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.1.tgz",
+          "integrity": "sha1-Uj/iZ4rsewToBBkJKS/osXBZt5Y=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "3.2.0",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "5.2.0"
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "6.0.19",
+          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.19.tgz",
+          "integrity": "sha1-dqeDhvZwudlJSmVb8jrAEu/9FVU=",
+          "dev": true,
+          "requires": {
+            "chalk": "2.3.1",
+            "source-map": "0.6.1",
+            "supports-color": "5.2.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.2.0",
+          "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.2.0.tgz",
+          "integrity": "sha1-sNUzOxGE3TZmy+WqC0XFrHrBeko=",
+          "dev": true,
+          "requires": {
+            "has-flag": "3.0.0"
           }
         }
       }
@@ -8913,37 +9612,43 @@
       }
     },
     "postcss-loader": {
-      "version": "2.0.9",
-      "resolved": "http://registry.npm.taobao.org/postcss-loader/download/postcss-loader-2.0.9.tgz",
-      "integrity": "sha1-AB/fe/7rFZQF7mHRu45ZtSjb0wk=",
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.taobao.org/postcss-loader/download/postcss-loader-2.1.1.tgz",
+      "integrity": "sha1-IIk1rzsdZeGrsahwqRLdEuezaJU=",
       "dev": true,
       "requires": {
         "loader-utils": "1.1.0",
-        "postcss": "6.0.14",
+        "postcss": "6.0.19",
         "postcss-load-config": "1.2.0",
-        "schema-utils": "0.3.0"
+        "schema-utils": "0.4.5"
       },
       "dependencies": {
         "chalk": {
-          "version": "2.3.0",
-          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz",
-          "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
+          "version": "2.3.1",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.1.tgz",
+          "integrity": "sha1-Uj/iZ4rsewToBBkJKS/osXBZt5Y=",
           "dev": true,
           "requires": {
             "ansi-styles": "3.2.0",
             "escape-string-regexp": "1.0.5",
-            "supports-color": "4.5.0"
+            "supports-color": "5.2.0"
           }
         },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
         "postcss": {
-          "version": "6.0.14",
-          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.14.tgz",
-          "integrity": "sha1-VTTHIRRznnXQr88BfbhTCZ9WKIU=",
+          "version": "6.0.19",
+          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.19.tgz",
+          "integrity": "sha1-dqeDhvZwudlJSmVb8jrAEu/9FVU=",
           "dev": true,
           "requires": {
-            "chalk": "2.3.0",
+            "chalk": "2.3.1",
             "source-map": "0.6.1",
-            "supports-color": "4.5.0"
+            "supports-color": "5.2.0"
           }
         },
         "source-map": {
@@ -8951,6 +9656,15 @@
           "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
           "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
           "dev": true
+        },
+        "supports-color": {
+          "version": "5.2.0",
+          "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.2.0.tgz",
+          "integrity": "sha1-sNUzOxGE3TZmy+WqC0XFrHrBeko=",
+          "dev": true,
+          "requires": {
+            "has-flag": "3.0.0"
+          }
         }
       }
     },
@@ -8959,310 +9673,6 @@
       "resolved": "http://registry.npm.taobao.org/postcss-media-query-parser/download/postcss-media-query-parser-0.2.3.tgz",
       "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
       "dev": true
-    },
-    "postcss-merge-idents": {
-      "version": "2.1.7",
-      "resolved": "http://registry.npm.taobao.org/postcss-merge-idents/download/postcss-merge-idents-2.1.7.tgz",
-      "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=",
-      "dev": true,
-      "requires": {
-        "has": "1.0.1",
-        "postcss": "5.2.18",
-        "postcss-value-parser": "3.3.0"
-      }
-    },
-    "postcss-merge-longhand": {
-      "version": "2.0.2",
-      "resolved": "http://registry.npm.taobao.org/postcss-merge-longhand/download/postcss-merge-longhand-2.0.2.tgz",
-      "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=",
-      "dev": true,
-      "requires": {
-        "postcss": "5.2.18"
-      }
-    },
-    "postcss-merge-rules": {
-      "version": "2.1.2",
-      "resolved": "http://registry.npm.taobao.org/postcss-merge-rules/download/postcss-merge-rules-2.1.2.tgz",
-      "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=",
-      "dev": true,
-      "requires": {
-        "browserslist": "1.7.7",
-        "caniuse-api": "1.6.1",
-        "postcss": "5.2.18",
-        "postcss-selector-parser": "2.2.3",
-        "vendors": "1.0.1"
-      }
-    },
-    "postcss-message-helpers": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/postcss-message-helpers/download/postcss-message-helpers-2.0.0.tgz",
-      "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=",
-      "dev": true
-    },
-    "postcss-minify-font-values": {
-      "version": "1.0.5",
-      "resolved": "http://registry.npm.taobao.org/postcss-minify-font-values/download/postcss-minify-font-values-1.0.5.tgz",
-      "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=",
-      "dev": true,
-      "requires": {
-        "object-assign": "4.1.1",
-        "postcss": "5.2.18",
-        "postcss-value-parser": "3.3.0"
-      }
-    },
-    "postcss-minify-gradients": {
-      "version": "1.0.5",
-      "resolved": "http://registry.npm.taobao.org/postcss-minify-gradients/download/postcss-minify-gradients-1.0.5.tgz",
-      "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=",
-      "dev": true,
-      "requires": {
-        "postcss": "5.2.18",
-        "postcss-value-parser": "3.3.0"
-      }
-    },
-    "postcss-minify-params": {
-      "version": "1.2.2",
-      "resolved": "http://registry.npm.taobao.org/postcss-minify-params/download/postcss-minify-params-1.2.2.tgz",
-      "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=",
-      "dev": true,
-      "requires": {
-        "alphanum-sort": "1.0.2",
-        "postcss": "5.2.18",
-        "postcss-value-parser": "3.3.0",
-        "uniqs": "2.0.0"
-      }
-    },
-    "postcss-minify-selectors": {
-      "version": "2.1.1",
-      "resolved": "http://registry.npm.taobao.org/postcss-minify-selectors/download/postcss-minify-selectors-2.1.1.tgz",
-      "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=",
-      "dev": true,
-      "requires": {
-        "alphanum-sort": "1.0.2",
-        "has": "1.0.1",
-        "postcss": "5.2.18",
-        "postcss-selector-parser": "2.2.3"
-      }
-    },
-    "postcss-modules-extract-imports": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-1.1.0.tgz",
-      "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=",
-      "dev": true,
-      "requires": {
-        "postcss": "6.0.14"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "2.3.0",
-          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz",
-          "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "3.2.0",
-            "escape-string-regexp": "1.0.5",
-            "supports-color": "4.5.0"
-          }
-        },
-        "postcss": {
-          "version": "6.0.14",
-          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.14.tgz",
-          "integrity": "sha1-VTTHIRRznnXQr88BfbhTCZ9WKIU=",
-          "dev": true,
-          "requires": {
-            "chalk": "2.3.0",
-            "source-map": "0.6.1",
-            "supports-color": "4.5.0"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
-          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
-          "dev": true
-        }
-      }
-    },
-    "postcss-modules-local-by-default": {
-      "version": "1.2.0",
-      "resolved": "http://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-1.2.0.tgz",
-      "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
-      "dev": true,
-      "requires": {
-        "css-selector-tokenizer": "0.7.0",
-        "postcss": "6.0.14"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "2.3.0",
-          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz",
-          "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "3.2.0",
-            "escape-string-regexp": "1.0.5",
-            "supports-color": "4.5.0"
-          }
-        },
-        "postcss": {
-          "version": "6.0.14",
-          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.14.tgz",
-          "integrity": "sha1-VTTHIRRznnXQr88BfbhTCZ9WKIU=",
-          "dev": true,
-          "requires": {
-            "chalk": "2.3.0",
-            "source-map": "0.6.1",
-            "supports-color": "4.5.0"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
-          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
-          "dev": true
-        }
-      }
-    },
-    "postcss-modules-scope": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-1.1.0.tgz",
-      "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
-      "dev": true,
-      "requires": {
-        "css-selector-tokenizer": "0.7.0",
-        "postcss": "6.0.14"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "2.3.0",
-          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz",
-          "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "3.2.0",
-            "escape-string-regexp": "1.0.5",
-            "supports-color": "4.5.0"
-          }
-        },
-        "postcss": {
-          "version": "6.0.14",
-          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.14.tgz",
-          "integrity": "sha1-VTTHIRRznnXQr88BfbhTCZ9WKIU=",
-          "dev": true,
-          "requires": {
-            "chalk": "2.3.0",
-            "source-map": "0.6.1",
-            "supports-color": "4.5.0"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
-          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
-          "dev": true
-        }
-      }
-    },
-    "postcss-modules-values": {
-      "version": "1.3.0",
-      "resolved": "http://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-1.3.0.tgz",
-      "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=",
-      "dev": true,
-      "requires": {
-        "icss-replace-symbols": "1.1.0",
-        "postcss": "6.0.14"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "2.3.0",
-          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz",
-          "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "3.2.0",
-            "escape-string-regexp": "1.0.5",
-            "supports-color": "4.5.0"
-          }
-        },
-        "postcss": {
-          "version": "6.0.14",
-          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.14.tgz",
-          "integrity": "sha1-VTTHIRRznnXQr88BfbhTCZ9WKIU=",
-          "dev": true,
-          "requires": {
-            "chalk": "2.3.0",
-            "source-map": "0.6.1",
-            "supports-color": "4.5.0"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
-          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
-          "dev": true
-        }
-      }
-    },
-    "postcss-normalize-charset": {
-      "version": "1.1.1",
-      "resolved": "http://registry.npm.taobao.org/postcss-normalize-charset/download/postcss-normalize-charset-1.1.1.tgz",
-      "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=",
-      "dev": true,
-      "requires": {
-        "postcss": "5.2.18"
-      }
-    },
-    "postcss-normalize-url": {
-      "version": "3.0.8",
-      "resolved": "http://registry.npm.taobao.org/postcss-normalize-url/download/postcss-normalize-url-3.0.8.tgz",
-      "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=",
-      "dev": true,
-      "requires": {
-        "is-absolute-url": "2.1.0",
-        "normalize-url": "1.9.1",
-        "postcss": "5.2.18",
-        "postcss-value-parser": "3.3.0"
-      }
-    },
-    "postcss-ordered-values": {
-      "version": "2.2.3",
-      "resolved": "http://registry.npm.taobao.org/postcss-ordered-values/download/postcss-ordered-values-2.2.3.tgz",
-      "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=",
-      "dev": true,
-      "requires": {
-        "postcss": "5.2.18",
-        "postcss-value-parser": "3.3.0"
-      }
-    },
-    "postcss-reduce-idents": {
-      "version": "2.4.0",
-      "resolved": "http://registry.npm.taobao.org/postcss-reduce-idents/download/postcss-reduce-idents-2.4.0.tgz",
-      "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=",
-      "dev": true,
-      "requires": {
-        "postcss": "5.2.18",
-        "postcss-value-parser": "3.3.0"
-      }
-    },
-    "postcss-reduce-initial": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/postcss-reduce-initial/download/postcss-reduce-initial-1.0.1.tgz",
-      "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=",
-      "dev": true,
-      "requires": {
-        "postcss": "5.2.18"
-      }
-    },
-    "postcss-reduce-transforms": {
-      "version": "1.0.4",
-      "resolved": "http://registry.npm.taobao.org/postcss-reduce-transforms/download/postcss-reduce-transforms-1.0.4.tgz",
-      "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=",
-      "dev": true,
-      "requires": {
-        "has": "1.0.1",
-        "postcss": "5.2.18",
-        "postcss-value-parser": "3.3.0"
-      }
     },
     "postcss-reporter": {
       "version": "5.0.0",
@@ -9392,73 +9802,45 @@
         }
       }
     },
-    "postcss-selector-parser": {
-      "version": "2.2.3",
-      "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-2.2.3.tgz",
-      "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=",
-      "dev": true,
-      "requires": {
-        "flatten": "1.0.2",
-        "indexes-of": "1.0.1",
-        "uniq": "1.0.1"
-      }
-    },
-    "postcss-svgo": {
-      "version": "2.1.6",
-      "resolved": "http://registry.npm.taobao.org/postcss-svgo/download/postcss-svgo-2.1.6.tgz",
-      "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=",
-      "dev": true,
-      "requires": {
-        "is-svg": "2.1.0",
-        "postcss": "5.2.18",
-        "postcss-value-parser": "3.3.0",
-        "svgo": "0.7.2"
-      }
-    },
-    "postcss-unique-selectors": {
-      "version": "2.0.2",
-      "resolved": "http://registry.npm.taobao.org/postcss-unique-selectors/download/postcss-unique-selectors-2.0.2.tgz",
-      "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=",
-      "dev": true,
-      "requires": {
-        "alphanum-sort": "1.0.2",
-        "postcss": "5.2.18",
-        "uniqs": "2.0.0"
-      }
-    },
     "postcss-url": {
-      "version": "7.3.0",
-      "resolved": "http://registry.npm.taobao.org/postcss-url/download/postcss-url-7.3.0.tgz",
-      "integrity": "sha1-zy9F4GdDz0PP6iUwn4HLwAPceD8=",
+      "version": "7.3.1",
+      "resolved": "http://registry.npm.taobao.org/postcss-url/download/postcss-url-7.3.1.tgz",
+      "integrity": "sha1-tDrg8NrkzQbIMfo66sLXpbc3VO0=",
       "dev": true,
       "requires": {
         "mime": "1.6.0",
         "minimatch": "3.0.4",
         "mkdirp": "0.5.1",
-        "postcss": "6.0.14",
-        "xxhashjs": "0.2.1"
+        "postcss": "6.0.19",
+        "xxhashjs": "0.2.2"
       },
       "dependencies": {
         "chalk": {
-          "version": "2.3.0",
-          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz",
-          "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
+          "version": "2.3.1",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.1.tgz",
+          "integrity": "sha1-Uj/iZ4rsewToBBkJKS/osXBZt5Y=",
           "dev": true,
           "requires": {
             "ansi-styles": "3.2.0",
             "escape-string-regexp": "1.0.5",
-            "supports-color": "4.5.0"
+            "supports-color": "5.2.0"
           }
         },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
         "postcss": {
-          "version": "6.0.14",
-          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.14.tgz",
-          "integrity": "sha1-VTTHIRRznnXQr88BfbhTCZ9WKIU=",
+          "version": "6.0.19",
+          "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-6.0.19.tgz",
+          "integrity": "sha1-dqeDhvZwudlJSmVb8jrAEu/9FVU=",
           "dev": true,
           "requires": {
-            "chalk": "2.3.0",
+            "chalk": "2.3.1",
             "source-map": "0.6.1",
-            "supports-color": "4.5.0"
+            "supports-color": "5.2.0"
           }
         },
         "source-map": {
@@ -9466,6 +9848,15 @@
           "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
           "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
           "dev": true
+        },
+        "supports-color": {
+          "version": "5.2.0",
+          "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.2.0.tgz",
+          "integrity": "sha1-sNUzOxGE3TZmy+WqC0XFrHrBeko=",
+          "dev": true,
+          "requires": {
+            "has-flag": "3.0.0"
+          }
         }
       }
     },
@@ -9475,27 +9866,10 @@
       "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=",
       "dev": true
     },
-    "postcss-zindex": {
-      "version": "2.2.0",
-      "resolved": "http://registry.npm.taobao.org/postcss-zindex/download/postcss-zindex-2.2.0.tgz",
-      "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=",
-      "dev": true,
-      "requires": {
-        "has": "1.0.1",
-        "postcss": "5.2.18",
-        "uniqs": "2.0.0"
-      }
-    },
     "prelude-ls": {
       "version": "1.1.2",
       "resolved": "http://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz",
       "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
-      "dev": true
-    },
-    "prepend-http": {
-      "version": "1.0.4",
-      "resolved": "http://registry.npm.taobao.org/prepend-http/download/prepend-http-1.0.4.tgz",
-      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
       "dev": true
     },
     "preserve": {
@@ -9531,6 +9905,12 @@
           "dev": true
         }
       }
+    },
+    "printj": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/printj/download/printj-1.1.1.tgz",
+      "integrity": "sha1-N0k2AhWIjUYKNbaDrhPcwCxiC0c=",
+      "dev": true
     },
     "process": {
       "version": "0.11.10",
@@ -9711,13 +10091,13 @@
         "browserify-rsa": "4.0.1",
         "create-hash": "1.1.3",
         "parse-asn1": "5.1.0",
-        "randombytes": "2.0.5"
+        "randombytes": "2.0.6"
       }
     },
     "pump": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/pump/download/pump-1.0.3.tgz",
-      "integrity": "sha1-Xf6DEcM7v2/BgmH580cCxHwIqVQ=",
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz",
+      "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=",
       "dev": true,
       "requires": {
         "end-of-stream": "1.4.0",
@@ -9725,14 +10105,14 @@
       }
     },
     "pumpify": {
-      "version": "1.3.5",
-      "resolved": "http://registry.npm.taobao.org/pumpify/download/pumpify-1.3.5.tgz",
-      "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=",
+      "version": "1.4.0",
+      "resolved": "http://registry.npm.taobao.org/pumpify/download/pumpify-1.4.0.tgz",
+      "integrity": "sha1-gLfF334kFT0D8OesigWl0Gi9B/s=",
       "dev": true,
       "requires": {
-        "duplexify": "3.5.1",
+        "duplexify": "3.5.3",
         "inherits": "2.0.3",
-        "pump": "1.0.3"
+        "pump": "2.0.1"
       }
     },
     "punycode": {
@@ -9758,16 +10138,6 @@
       "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.4.0.tgz",
       "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
       "dev": true
-    },
-    "query-string": {
-      "version": "4.3.4",
-      "resolved": "http://registry.npm.taobao.org/query-string/download/query-string-4.3.4.tgz",
-      "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
-      "dev": true,
-      "requires": {
-        "object-assign": "4.1.1",
-        "strict-uri-encode": "1.1.0"
-      }
     },
     "querystring": {
       "version": "0.2.0",
@@ -9829,21 +10199,21 @@
       }
     },
     "randombytes": {
-      "version": "2.0.5",
-      "resolved": "http://registry.npm.taobao.org/randombytes/download/randombytes-2.0.5.tgz",
-      "integrity": "sha1-3ACaJGuNCaF3tLegrne8Vw9LG3k=",
+      "version": "2.0.6",
+      "resolved": "http://registry.npm.taobao.org/randombytes/download/randombytes-2.0.6.tgz",
+      "integrity": "sha1-0wLFIpSFiISKjTAMkytEwkIx2oA=",
       "dev": true,
       "requires": {
         "safe-buffer": "5.1.1"
       }
     },
     "randomfill": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/randomfill/download/randomfill-1.0.3.tgz",
-      "integrity": "sha1-uWt99YfwHdkXJsQY8wVTsUGOPWI=",
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/randomfill/download/randomfill-1.0.4.tgz",
+      "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=",
       "dev": true,
       "requires": {
-        "randombytes": "2.0.5",
+        "randombytes": "2.0.6",
         "safe-buffer": "5.1.1"
       }
     },
@@ -9870,6 +10240,23 @@
       "resolved": "http://registry.npm.taobao.org/raw-loader/download/raw-loader-0.5.1.tgz",
       "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=",
       "dev": true
+    },
+    "read-cache": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/read-cache/download/read-cache-1.0.0.tgz",
+      "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
+      "dev": true,
+      "requires": {
+        "pify": "2.3.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
     },
     "read-pkg": {
       "version": "1.1.0",
@@ -9969,42 +10356,6 @@
         "strip-indent": "1.0.1"
       }
     },
-    "reduce-css-calc": {
-      "version": "1.3.0",
-      "resolved": "http://registry.npm.taobao.org/reduce-css-calc/download/reduce-css-calc-1.3.0.tgz",
-      "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=",
-      "dev": true,
-      "requires": {
-        "balanced-match": "0.4.2",
-        "math-expression-evaluator": "1.2.17",
-        "reduce-function-call": "1.0.2"
-      },
-      "dependencies": {
-        "balanced-match": {
-          "version": "0.4.2",
-          "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-0.4.2.tgz",
-          "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
-          "dev": true
-        }
-      }
-    },
-    "reduce-function-call": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npm.taobao.org/reduce-function-call/download/reduce-function-call-1.0.2.tgz",
-      "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=",
-      "dev": true,
-      "requires": {
-        "balanced-match": "0.4.2"
-      },
-      "dependencies": {
-        "balanced-match": {
-          "version": "0.4.2",
-          "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-0.4.2.tgz",
-          "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
-          "dev": true
-        }
-      }
-    },
     "reflect-metadata": {
       "version": "0.1.10",
       "resolved": "http://registry.npm.taobao.org/reflect-metadata/download/reflect-metadata-0.1.10.tgz",
@@ -10030,6 +10381,16 @@
       "dev": true,
       "requires": {
         "is-equal-shallow": "0.1.3"
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz",
+      "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "3.0.2",
+        "safe-regex": "1.1.0"
       }
     },
     "regexpu-core": {
@@ -10303,6 +10664,12 @@
       "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
       "dev": true
     },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "http://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+      "dev": true
+    },
     "restore-cursor": {
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/restore-cursor/download/restore-cursor-1.0.1.tgz",
@@ -10312,6 +10679,12 @@
         "exit-hook": "1.1.1",
         "onetime": "1.1.0"
       }
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "http://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz",
+      "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=",
+      "dev": true
     },
     "right-align": {
       "version": "0.1.3",
@@ -10369,6 +10742,15 @@
       "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=",
       "dev": true
     },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "dev": true,
+      "requires": {
+        "ret": "0.1.15"
+      }
+    },
     "sass-graph": {
       "version": "2.2.4",
       "resolved": "http://registry.npm.taobao.org/sass-graph/download/sass-graph-2.2.4.tgz",
@@ -10424,12 +10806,32 @@
       "dev": true
     },
     "schema-utils": {
-      "version": "0.3.0",
-      "resolved": "http://registry.npm.taobao.org/schema-utils/download/schema-utils-0.3.0.tgz",
-      "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+      "version": "0.4.5",
+      "resolved": "http://registry.npm.taobao.org/schema-utils/download/schema-utils-0.4.5.tgz",
+      "integrity": "sha1-IYNvBgiqwXt4+ePiTa/xSlyhOj4=",
       "dev": true,
       "requires": {
-        "ajv": "5.5.1"
+        "ajv": "6.2.0",
+        "ajv-keywords": "3.1.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.2.0",
+          "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-6.2.0.tgz",
+          "integrity": "sha1-r6wpW7qgFSRJ5SJ0LkVHwa6TKNI=",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "1.0.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "ajv-keywords": {
+          "version": "3.1.0",
+          "resolved": "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.1.0.tgz",
+          "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=",
+          "dev": true
+        }
       }
     },
     "screenfull": {
@@ -10490,12 +10892,12 @@
       }
     },
     "selfsigned": {
-      "version": "1.10.1",
-      "resolved": "http://registry.npm.taobao.org/selfsigned/download/selfsigned-1.10.1.tgz",
-      "integrity": "sha1-v4y3uDJWxFUeMTR8YxF3jbme7FI=",
+      "version": "1.10.2",
+      "resolved": "http://registry.npm.taobao.org/selfsigned/download/selfsigned-1.10.2.tgz",
+      "integrity": "sha1-tESVgNmZKbZbEKSDiTAaZZIIh1g=",
       "dev": true,
       "requires": {
-        "node-forge": "0.6.33"
+        "node-forge": "0.7.1"
       }
     },
     "semver": {
@@ -10508,6 +10910,15 @@
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/semver-dsl/download/semver-dsl-1.0.1.tgz",
       "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=",
+      "dev": true,
+      "requires": {
+        "semver": "5.4.1"
+      }
+    },
+    "semver-intersect": {
+      "version": "1.3.1",
+      "resolved": "http://registry.npm.taobao.org/semver-intersect/download/semver-intersect-1.3.1.tgz",
+      "integrity": "sha1-j6hKnhAovSOeRTDRo+GB5pjYhLo=",
       "dev": true,
       "requires": {
         "semver": "5.4.1"
@@ -10581,11 +10992,43 @@
       "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
       "dev": true
     },
+    "set-getter": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.taobao.org/set-getter/download/set-getter-0.1.0.tgz",
+      "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
+      "dev": true,
+      "requires": {
+        "to-object-path": "0.3.0"
+      }
+    },
     "set-immediate-shim": {
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/set-immediate-shim/download/set-immediate-shim-1.0.1.tgz",
       "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
       "dev": true
+    },
+    "set-value": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/set-value/download/set-value-2.0.0.tgz",
+      "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "2.0.1",
+        "is-extendable": "0.1.1",
+        "is-plain-object": "2.0.4",
+        "split-string": "3.1.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "0.1.1"
+          }
+        }
+      }
     },
     "setimmediate": {
       "version": "1.0.5",
@@ -10600,9 +11043,9 @@
       "dev": true
     },
     "sha.js": {
-      "version": "2.4.9",
-      "resolved": "http://registry.npm.taobao.org/sha.js/download/sha.js-2.4.9.tgz",
-      "integrity": "sha1-mPZIgEdLdPSji42p08Dy0QRjPn0=",
+      "version": "2.4.10",
+      "resolved": "http://registry.npm.taobao.org/sha.js/download/sha.js-2.4.10.tgz",
+      "integrity": "sha1-sf3lzX0RpWJmOKB8YEq5Cc+jH5s=",
       "dev": true,
       "requires": {
         "inherits": "2.0.3",
@@ -10695,6 +11138,130 @@
       "resolved": "http://registry.npm.taobao.org/slice-ansi/download/slice-ansi-0.0.4.tgz",
       "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
       "dev": true
+    },
+    "snapdragon": {
+      "version": "0.8.1",
+      "resolved": "http://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.1.tgz",
+      "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=",
+      "dev": true,
+      "requires": {
+        "base": "0.11.2",
+        "debug": "2.6.9",
+        "define-property": "0.2.5",
+        "extend-shallow": "2.0.1",
+        "map-cache": "0.2.2",
+        "source-map": "0.5.7",
+        "source-map-resolve": "0.5.1",
+        "use": "2.0.2"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "0.1.1"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz",
+          "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "0.1.6",
+            "is-data-descriptor": "0.1.4",
+            "kind-of": "5.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz",
+          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=",
+          "dev": true
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=",
+      "dev": true,
+      "requires": {
+        "define-property": "1.0.0",
+        "isobject": "3.0.1",
+        "snapdragon-util": "3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "1.0.2"
+          }
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2"
+      }
     },
     "sntp": {
       "version": "1.0.9",
@@ -10848,21 +11415,13 @@
       }
     },
     "sockjs": {
-      "version": "0.3.18",
-      "resolved": "http://registry.npm.taobao.org/sockjs/download/sockjs-0.3.18.tgz",
-      "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=",
+      "version": "0.3.19",
+      "resolved": "http://registry.npm.taobao.org/sockjs/download/sockjs-0.3.19.tgz",
+      "integrity": "sha1-2Xa76ACve9IK4IWY1YI5NQiZPA0=",
       "dev": true,
       "requires": {
         "faye-websocket": "0.10.0",
-        "uuid": "2.0.3"
-      },
-      "dependencies": {
-        "uuid": {
-          "version": "2.0.3",
-          "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-2.0.3.tgz",
-          "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
-          "dev": true
-        }
+        "uuid": "3.1.0"
       }
     },
     "sockjs-client": {
@@ -10890,15 +11449,6 @@
         }
       }
     },
-    "sort-keys": {
-      "version": "1.1.2",
-      "resolved": "http://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz",
-      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
-      "dev": true,
-      "requires": {
-        "is-plain-obj": "1.1.0"
-      }
-    },
     "source-list-map": {
       "version": "2.0.0",
       "resolved": "http://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.0.tgz",
@@ -10911,35 +11461,17 @@
       "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
       "dev": true
     },
-    "source-map-loader": {
-      "version": "0.2.3",
-      "resolved": "http://registry.npm.taobao.org/source-map-loader/download/source-map-loader-0.2.3.tgz",
-      "integrity": "sha1-1LDIzUfVTtzj5r+g9SP0UrWw5SE=",
+    "source-map-resolve": {
+      "version": "0.5.1",
+      "resolved": "http://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.1.tgz",
+      "integrity": "sha1-etD1k/IoFZjoVN+A8ZquS5LXoRo=",
       "dev": true,
       "requires": {
-        "async": "2.6.0",
-        "loader-utils": "0.2.17",
-        "source-map": "0.6.1"
-      },
-      "dependencies": {
-        "loader-utils": {
-          "version": "0.2.17",
-          "resolved": "http://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz",
-          "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
-          "dev": true,
-          "requires": {
-            "big.js": "3.2.0",
-            "emojis-list": "2.1.0",
-            "json5": "0.5.1",
-            "object-assign": "4.1.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
-          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
-          "dev": true
-        }
+        "atob": "2.0.3",
+        "decode-uri-component": "0.2.0",
+        "resolve-url": "0.2.1",
+        "source-map-url": "0.4.0",
+        "urix": "0.1.0"
       }
     },
     "source-map-support": {
@@ -10950,6 +11482,12 @@
       "requires": {
         "source-map": "0.5.7"
       }
+    },
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "http://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+      "dev": true
     },
     "sparkles": {
       "version": "1.0.0",
@@ -11022,11 +11560,29 @@
         "through": "2.3.8"
       }
     },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "http://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz",
+      "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "3.0.2"
+      }
+    },
     "sprintf-js": {
       "version": "1.0.3",
       "resolved": "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz",
       "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
       "dev": true
+    },
+    "ssf": {
+      "version": "0.10.1",
+      "resolved": "http://registry.npm.taobao.org/ssf/download/ssf-0.10.1.tgz",
+      "integrity": "sha1-8j2CtjeS71YIkInBzQyEjpEc26Y=",
+      "dev": true,
+      "requires": {
+        "frac": "1.1.1"
+      }
     },
     "sshpk": {
       "version": "1.13.1",
@@ -11053,9 +11609,9 @@
       }
     },
     "ssri": {
-      "version": "5.0.0",
-      "resolved": "http://registry.npm.taobao.org/ssri/download/ssri-5.0.0.tgz",
-      "integrity": "sha1-E8GTkLYGyCHyoQ0Cs1HBcpuU2M8=",
+      "version": "5.2.4",
+      "resolved": "http://registry.npm.taobao.org/ssri/download/ssri-5.2.4.tgz",
+      "integrity": "sha1-mYXhQEHmX8OXr5ZUK+NXJKwR2lI=",
       "dev": true,
       "requires": {
         "safe-buffer": "5.1.1"
@@ -11072,6 +11628,84 @@
       "resolved": "http://registry.npm.taobao.org/state-toggle/download/state-toggle-1.0.0.tgz",
       "integrity": "sha1-0g+aYWu08MO5i5GSLSW2QKorxCU=",
       "dev": true
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "dev": true,
+      "requires": {
+        "define-property": "0.2.5",
+        "object-copy": "0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz",
+          "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "0.1.6",
+            "is-data-descriptor": "0.1.4",
+            "kind-of": "5.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz",
+          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=",
+          "dev": true
+        }
+      }
     },
     "statuses": {
       "version": "1.3.1",
@@ -11119,9 +11753,9 @@
       }
     },
     "stream-http": {
-      "version": "2.7.2",
-      "resolved": "http://registry.npm.taobao.org/stream-http/download/stream-http-2.7.2.tgz",
-      "integrity": "sha1-QKBQ7I3DtTsz2ZCUFcAsC/Gr+60=",
+      "version": "2.8.0",
+      "resolved": "http://registry.npm.taobao.org/stream-http/download/stream-http-2.8.0.tgz",
+      "integrity": "sha1-/YZUbaybHJGv+PxdKHuY+vtBvBA=",
       "dev": true,
       "requires": {
         "builtin-status-codes": "3.0.0",
@@ -11145,12 +11779,6 @@
       "requires": {
         "any-observable": "0.2.0"
       }
-    },
-    "strict-uri-encode": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz",
-      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
-      "dev": true
     },
     "string-width": {
       "version": "1.0.2",
@@ -11252,12 +11880,24 @@
       "dev": true
     },
     "style-loader": {
-      "version": "0.13.2",
-      "resolved": "http://registry.npm.taobao.org/style-loader/download/style-loader-0.13.2.tgz",
-      "integrity": "sha1-dFMzhM9pjHEEx5URULSXF63C87s=",
+      "version": "0.19.1",
+      "resolved": "http://registry.npm.taobao.org/style-loader/download/style-loader-0.19.1.tgz",
+      "integrity": "sha1-WR/8gLzv4mi3fF2evAUF13Jhn4U=",
       "dev": true,
       "requires": {
-        "loader-utils": "1.1.0"
+        "loader-utils": "1.1.0",
+        "schema-utils": "0.3.0"
+      },
+      "dependencies": {
+        "schema-utils": {
+          "version": "0.3.0",
+          "resolved": "http://registry.npm.taobao.org/schema-utils/download/schema-utils-0.3.0.tgz",
+          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+          "dev": true,
+          "requires": {
+            "ajv": "5.5.1"
+          }
+        }
       }
     },
     "style-search": {
@@ -11535,9 +12175,9 @@
       }
     },
     "stylus-loader": {
-      "version": "3.0.1",
-      "resolved": "http://registry.npm.taobao.org/stylus-loader/download/stylus-loader-3.0.1.tgz",
-      "integrity": "sha1-d/SzT9Aw0lsmF7z1UT21sHMMQIk=",
+      "version": "3.0.2",
+      "resolved": "http://registry.npm.taobao.org/stylus-loader/download/stylus-loader-3.0.2.tgz",
+      "integrity": "sha1-J6cGQgsFo44DjnyssVNXjUUFE8Y=",
       "dev": true,
       "requires": {
         "loader-utils": "1.1.0",
@@ -11598,21 +12238,6 @@
       "resolved": "http://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz",
       "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
       "dev": true
-    },
-    "svgo": {
-      "version": "0.7.2",
-      "resolved": "http://registry.npm.taobao.org/svgo/download/svgo-0.7.2.tgz",
-      "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=",
-      "dev": true,
-      "requires": {
-        "coa": "1.0.4",
-        "colors": "1.1.2",
-        "csso": "2.3.2",
-        "js-yaml": "3.7.0",
-        "mkdirp": "0.5.1",
-        "sax": "1.2.4",
-        "whet.extend": "0.9.9"
-      }
     },
     "sweetalert2": {
       "version": "7.0.10",
@@ -11727,9 +12352,9 @@
       }
     },
     "thunky": {
-      "version": "0.1.0",
-      "resolved": "http://registry.npm.taobao.org/thunky/download/thunky-0.1.0.tgz",
-      "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=",
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/thunky/download/thunky-1.0.2.tgz",
+      "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=",
       "dev": true
     },
     "time-stamp": {
@@ -11739,9 +12364,9 @@
       "dev": true
     },
     "timers-browserify": {
-      "version": "2.0.4",
-      "resolved": "http://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.4.tgz",
-      "integrity": "sha1-lspT9LeUpefA4b18yIo3Ipj6AeY=",
+      "version": "2.0.6",
+      "resolved": "http://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.6.tgz",
+      "integrity": "sha1-JB52kn2coF9NlZgZAi9bNmS2S64=",
       "dev": true,
       "requires": {
         "setimmediate": "1.0.5"
@@ -11773,6 +12398,48 @@
       "resolved": "http://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-1.0.3.tgz",
       "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
       "dev": true
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "http://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz",
+      "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=",
+      "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": "http://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "dev": true,
+      "requires": {
+        "is-number": "3.0.0",
+        "repeat-string": "1.6.1"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          }
+        }
+      }
     },
     "topojson-client": {
       "version": "3.0.0",
@@ -11993,15 +12660,21 @@
       "dev": true
     },
     "uglify-js": {
-      "version": "3.2.2",
-      "resolved": "http://registry.npm.taobao.org/uglify-js/download/uglify-js-3.2.2.tgz",
-      "integrity": "sha1-hw5LNO1zPReShPmZjv0yk/f9c/Y=",
+      "version": "3.3.12",
+      "resolved": "http://registry.npm.taobao.org/uglify-js/download/uglify-js-3.3.12.tgz",
+      "integrity": "sha1-79h8FqH0xnSope3lcQAe9jTcyIM=",
       "dev": true,
       "requires": {
-        "commander": "2.12.2",
+        "commander": "2.14.1",
         "source-map": "0.6.1"
       },
       "dependencies": {
+        "commander": {
+          "version": "2.14.1",
+          "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.14.1.tgz",
+          "integrity": "sha1-IjUSPjevjKPGXfRbAm29NXsBuao=",
+          "dev": true
+        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
@@ -12018,21 +12691,27 @@
       "optional": true
     },
     "uglifyjs-webpack-plugin": {
-      "version": "1.1.4",
-      "resolved": "http://registry.npm.taobao.org/uglifyjs-webpack-plugin/download/uglifyjs-webpack-plugin-1.1.4.tgz",
-      "integrity": "sha1-5DrW5zbDFQJOuZSBp8yTYtagZr4=",
+      "version": "1.2.2",
+      "resolved": "http://registry.npm.taobao.org/uglifyjs-webpack-plugin/download/uglifyjs-webpack-plugin-1.2.2.tgz",
+      "integrity": "sha1-51FtQ2ev23FcOEeEHrRvlMRcork=",
       "dev": true,
       "requires": {
-        "cacache": "10.0.1",
+        "cacache": "10.0.4",
         "find-cache-dir": "1.0.0",
-        "schema-utils": "0.3.0",
+        "schema-utils": "0.4.5",
         "serialize-javascript": "1.4.0",
         "source-map": "0.6.1",
-        "uglify-es": "3.2.2",
+        "uglify-es": "3.3.9",
         "webpack-sources": "1.1.0",
-        "worker-farm": "1.5.2"
+        "worker-farm": "1.5.4"
       },
       "dependencies": {
+        "commander": {
+          "version": "2.13.0",
+          "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.13.0.tgz",
+          "integrity": "sha1-aWS8pnaF33wfFDDFhPB9dZeIW5w=",
+          "dev": true
+        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
@@ -12040,12 +12719,12 @@
           "dev": true
         },
         "uglify-es": {
-          "version": "3.2.2",
-          "resolved": "http://registry.npm.taobao.org/uglify-es/download/uglify-es-3.2.2.tgz",
-          "integrity": "sha1-FcYrd3UALIG3mHocSezT8SbKznM=",
+          "version": "3.3.9",
+          "resolved": "http://registry.npm.taobao.org/uglify-es/download/uglify-es-3.3.9.tgz",
+          "integrity": "sha1-DBxPBwC+2NvBJM2zBNJZLKID5nc=",
           "dev": true,
           "requires": {
-            "commander": "2.12.2",
+            "commander": "2.13.0",
             "source-map": "0.6.1"
           }
         }
@@ -12092,25 +12771,45 @@
         "x-is-string": "0.1.0"
       }
     },
+    "union-value": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/union-value/download/union-value-1.0.0.tgz",
+      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+      "dev": true,
+      "requires": {
+        "arr-union": "3.1.0",
+        "get-value": "2.0.6",
+        "is-extendable": "0.1.1",
+        "set-value": "0.4.3"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "0.1.1"
+          }
+        },
+        "set-value": {
+          "version": "0.4.3",
+          "resolved": "http://registry.npm.taobao.org/set-value/download/set-value-0.4.3.tgz",
+          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "2.0.1",
+            "is-extendable": "0.1.1",
+            "is-plain-object": "2.0.4",
+            "to-object-path": "0.3.0"
+          }
+        }
+      }
+    },
     "uniq": {
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz",
       "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
-      "dev": true
-    },
-    "uniqid": {
-      "version": "4.1.1",
-      "resolved": "http://registry.npm.taobao.org/uniqid/download/uniqid-4.1.1.tgz",
-      "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=",
-      "dev": true,
-      "requires": {
-        "macaddress": "0.2.8"
-      }
-    },
-    "uniqs": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npm.taobao.org/uniqs/download/uniqs-2.0.0.tgz",
-      "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
       "dev": true
     },
     "unique-filename": {
@@ -12191,10 +12890,62 @@
       "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
       "dev": true
     },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "dev": true,
+      "requires": {
+        "has-value": "0.3.1",
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "dev": true,
+          "requires": {
+            "get-value": "2.0.6",
+            "has-values": "0.1.4",
+            "isobject": "2.1.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "dev": true,
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+          "dev": true
+        }
+      }
+    },
+    "upath": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/upath/download/upath-1.0.4.tgz",
+      "integrity": "sha1-7iMhugp4bFCXPbBDpQt7y6giNh0=",
+      "dev": true
+    },
     "upper-case": {
       "version": "1.1.3",
       "resolved": "http://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz",
       "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+      "dev": true
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
       "dev": true
     },
     "url": {
@@ -12224,6 +12975,17 @@
         "loader-utils": "1.1.0",
         "mime": "1.6.0",
         "schema-utils": "0.3.0"
+      },
+      "dependencies": {
+        "schema-utils": {
+          "version": "0.3.0",
+          "resolved": "http://registry.npm.taobao.org/schema-utils/download/schema-utils-0.3.0.tgz",
+          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+          "dev": true,
+          "requires": {
+            "ajv": "5.5.1"
+          }
+        }
       }
     },
     "url-parse": {
@@ -12249,6 +13011,94 @@
       "resolved": "http://registry.npm.taobao.org/urlgrey/download/urlgrey-0.4.4.tgz",
       "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=",
       "dev": true
+    },
+    "use": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.taobao.org/use/download/use-2.0.2.tgz",
+      "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=",
+      "dev": true,
+      "requires": {
+        "define-property": "0.2.5",
+        "isobject": "3.0.1",
+        "lazy-cache": "2.0.2"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz",
+          "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "0.1.6",
+            "is-data-descriptor": "0.1.4",
+            "kind-of": "5.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz",
+          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=",
+          "dev": true
+        },
+        "lazy-cache": {
+          "version": "2.0.2",
+          "resolved": "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-2.0.2.tgz",
+          "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
+          "dev": true,
+          "requires": {
+            "set-getter": "0.1.0"
+          }
+        }
+      }
     },
     "useragent": {
       "version": "2.2.1",
@@ -12340,12 +13190,6 @@
       "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
       "dev": true
     },
-    "vendors": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npm.taobao.org/vendors/download/vendors-1.0.1.tgz",
-      "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=",
-      "dev": true
-    },
     "verror": {
       "version": "1.10.0",
       "resolved": "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz",
@@ -12425,6 +13269,12 @@
       "requires": {
         "indexof": "0.0.1"
       }
+    },
+    "voc": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/voc/download/voc-1.0.0.tgz",
+      "integrity": "sha1-VGXAzhHQiB99jjbYylhwQ/M6Ja4=",
+      "dev": true
     },
     "void-elements": {
       "version": "2.0.1",
@@ -12639,15 +13489,15 @@
       }
     },
     "webpack": {
-      "version": "3.10.0",
-      "resolved": "http://registry.npm.taobao.org/webpack/download/webpack-3.10.0.tgz",
-      "integrity": "sha1-UpG4dQeM8qv0K90jr+P4+WwX1yU=",
+      "version": "3.11.0",
+      "resolved": "http://registry.npm.taobao.org/webpack/download/webpack-3.11.0.tgz",
+      "integrity": "sha1-d9pFGx17SxF62vQaGpO1dC8k2JQ=",
       "dev": true,
       "requires": {
         "acorn": "5.2.1",
         "acorn-dynamic-import": "2.0.2",
-        "ajv": "5.5.1",
-        "ajv-keywords": "2.1.1",
+        "ajv": "6.2.0",
+        "ajv-keywords": "3.1.0",
         "async": "2.6.0",
         "enhanced-resolve": "3.4.1",
         "escope": "3.6.0",
@@ -12668,6 +13518,23 @@
         "yargs": "8.0.2"
       },
       "dependencies": {
+        "ajv": {
+          "version": "6.2.0",
+          "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-6.2.0.tgz",
+          "integrity": "sha1-r6wpW7qgFSRJ5SJ0LkVHwa6TKNI=",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "1.0.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "ajv-keywords": {
+          "version": "3.1.0",
+          "resolved": "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.1.0.tgz",
+          "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=",
+          "dev": true
+        },
         "ansi-regex": {
           "version": "3.0.0",
           "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz",
@@ -12825,6 +13692,12 @@
           "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
           "dev": true
         },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
+        },
         "yargs": {
           "version": "8.0.2",
           "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-8.0.2.tgz",
@@ -12960,58 +13833,6 @@
         }
       }
     },
-    "webpack-concat-plugin": {
-      "version": "1.4.2",
-      "resolved": "http://registry.npm.taobao.org/webpack-concat-plugin/download/webpack-concat-plugin-1.4.2.tgz",
-      "integrity": "sha1-tgu7YmzlABkRgJ1uIyn6MvSXiog=",
-      "dev": true,
-      "requires": {
-        "md5": "2.2.1",
-        "uglify-js": "2.8.29"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "1.2.1",
-          "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz",
-          "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
-          "dev": true
-        },
-        "cliui": {
-          "version": "2.1.0",
-          "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz",
-          "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
-          "dev": true,
-          "requires": {
-            "center-align": "0.1.3",
-            "right-align": "0.1.3",
-            "wordwrap": "0.0.2"
-          }
-        },
-        "uglify-js": {
-          "version": "2.8.29",
-          "resolved": "http://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.29.tgz",
-          "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
-          "dev": true,
-          "requires": {
-            "source-map": "0.5.7",
-            "uglify-to-browserify": "1.0.2",
-            "yargs": "3.10.0"
-          }
-        },
-        "yargs": {
-          "version": "3.10.0",
-          "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz",
-          "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
-          "dev": true,
-          "requires": {
-            "camelcase": "1.2.1",
-            "cliui": "2.1.0",
-            "decamelize": "1.2.0",
-            "window-size": "0.1.0"
-          }
-        }
-      }
-    },
     "webpack-core": {
       "version": "0.6.9",
       "resolved": "http://registry.npm.taobao.org/webpack-core/download/webpack-core-0.6.9.tgz",
@@ -13053,45 +13874,127 @@
       }
     },
     "webpack-dev-server": {
-      "version": "2.9.7",
-      "resolved": "http://registry.npm.taobao.org/webpack-dev-server/download/webpack-dev-server-2.9.7.tgz",
-      "integrity": "sha1-EArWoUd1R4kk1BfKbc+51SqY+u0=",
+      "version": "2.11.2",
+      "resolved": "http://registry.npm.taobao.org/webpack-dev-server/download/webpack-dev-server-2.11.2.tgz",
+      "integrity": "sha1-H09MeL8YlTePN2gVkQgS2veaIW8=",
       "dev": true,
       "requires": {
         "ansi-html": "0.0.7",
         "array-includes": "3.0.3",
         "bonjour": "3.5.0",
-        "chokidar": "1.7.0",
-        "compression": "1.7.1",
+        "chokidar": "2.0.2",
+        "compression": "1.7.2",
         "connect-history-api-fallback": "1.5.0",
         "debug": "3.1.0",
         "del": "3.0.0",
         "express": "4.16.2",
         "html-entities": "1.2.1",
         "http-proxy-middleware": "0.17.4",
-        "import-local": "0.1.1",
+        "import-local": "1.0.0",
         "internal-ip": "1.2.0",
         "ip": "1.1.5",
         "killable": "1.0.0",
-        "loglevel": "1.6.0",
+        "loglevel": "1.6.1",
         "opn": "5.1.0",
         "portfinder": "1.0.13",
-        "selfsigned": "1.10.1",
+        "selfsigned": "1.10.2",
         "serve-index": "1.9.1",
-        "sockjs": "0.3.18",
+        "sockjs": "0.3.19",
         "sockjs-client": "1.1.4",
         "spdy": "3.4.7",
         "strip-ansi": "3.0.1",
-        "supports-color": "4.5.0",
+        "supports-color": "5.2.0",
         "webpack-dev-middleware": "1.12.2",
         "yargs": "6.6.0"
       },
       "dependencies": {
+        "anymatch": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz",
+          "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=",
+          "dev": true,
+          "requires": {
+            "micromatch": "3.1.9",
+            "normalize-path": "2.1.1"
+          }
+        },
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+          "dev": true
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "http://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+          "dev": true
+        },
+        "braces": {
+          "version": "2.3.1",
+          "resolved": "http://registry.npm.taobao.org/braces/download/braces-2.3.1.tgz",
+          "integrity": "sha1-cIbJE7TloI2+N6wO5qJQDEumkbs=",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "1.1.0",
+            "array-unique": "0.3.2",
+            "define-property": "1.0.0",
+            "extend-shallow": "2.0.1",
+            "fill-range": "4.0.0",
+            "isobject": "3.0.1",
+            "kind-of": "6.0.2",
+            "repeat-element": "1.1.2",
+            "snapdragon": "0.8.1",
+            "snapdragon-node": "2.1.1",
+            "split-string": "3.1.0",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "1.0.2"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
         "camelcase": {
           "version": "3.0.0",
           "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz",
           "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
           "dev": true
+        },
+        "chokidar": {
+          "version": "2.0.2",
+          "resolved": "http://registry.npm.taobao.org/chokidar/download/chokidar-2.0.2.tgz",
+          "integrity": "sha1-TcZROe6ycUl3c1tqNdBul7SU39c=",
+          "dev": true,
+          "requires": {
+            "anymatch": "2.0.0",
+            "async-each": "1.0.1",
+            "braces": "2.3.1",
+            "fsevents": "1.1.3",
+            "glob-parent": "3.1.0",
+            "inherits": "2.0.3",
+            "is-binary-path": "1.0.1",
+            "is-glob": "4.0.0",
+            "normalize-path": "2.1.1",
+            "path-is-absolute": "1.0.1",
+            "readdirp": "2.1.0",
+            "upath": "1.0.4"
+          }
         },
         "debug": {
           "version": "3.1.0",
@@ -13101,6 +14004,255 @@
           "requires": {
             "ms": "2.0.0"
           }
+        },
+        "expand-brackets": {
+          "version": "2.1.4",
+          "resolved": "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz",
+          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+          "dev": true,
+          "requires": {
+            "debug": "2.6.9",
+            "define-property": "0.2.5",
+            "extend-shallow": "2.0.1",
+            "posix-character-classes": "0.1.1",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.1",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "debug": {
+              "version": "2.6.9",
+              "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz",
+              "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+              "dev": true,
+              "requires": {
+                "ms": "2.0.0"
+              }
+            },
+            "define-property": {
+              "version": "0.2.5",
+              "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "0.1.6"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            },
+            "is-descriptor": {
+              "version": "0.1.6",
+              "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz",
+              "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+              "dev": true,
+              "requires": {
+                "is-accessor-descriptor": "0.1.6",
+                "is-data-descriptor": "0.1.4",
+                "kind-of": "5.1.0"
+              }
+            },
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz",
+              "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=",
+              "dev": true
+            }
+          }
+        },
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "http://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz",
+          "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=",
+          "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.2",
+            "snapdragon": "0.8.1",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "1.0.2"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "2.0.1",
+            "is-number": "3.0.0",
+            "repeat-string": "1.6.1",
+            "to-regex-range": "2.1.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "http://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "requires": {
+            "is-glob": "3.1.0",
+            "path-dirname": "1.0.2"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+              "dev": true,
+              "requires": {
+                "is-extglob": "2.1.1"
+              }
+            }
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz",
+          "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "3.1.9",
+          "resolved": "http://registry.npm.taobao.org/micromatch/download/micromatch-3.1.9.tgz",
+          "integrity": "sha1-FdyTF1rjnlLpMIeEcJbv/HPvz4k=",
+          "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.2",
+            "snapdragon": "0.8.1",
+            "to-regex": "3.0.2"
+          }
+        },
+        "supports-color": {
+          "version": "5.2.0",
+          "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.2.0.tgz",
+          "integrity": "sha1-sNUzOxGE3TZmy+WqC0XFrHrBeko=",
+          "dev": true,
+          "requires": {
+            "has-flag": "3.0.0"
+          }
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
         },
         "yargs": {
           "version": "6.6.0",
@@ -13135,12 +14287,20 @@
       }
     },
     "webpack-merge": {
-      "version": "4.1.1",
-      "resolved": "http://registry.npm.taobao.org/webpack-merge/download/webpack-merge-4.1.1.tgz",
-      "integrity": "sha1-8Rl6Cpc+acb77rbWWCGaqMDBNVU=",
+      "version": "4.1.2",
+      "resolved": "http://registry.npm.taobao.org/webpack-merge/download/webpack-merge-4.1.2.tgz",
+      "integrity": "sha1-XTct3dPh5fiHT1v1qOkp2wn+shY=",
       "dev": true,
       "requires": {
-        "lodash": "4.17.4"
+        "lodash": "4.17.5"
+      },
+      "dependencies": {
+        "lodash": {
+          "version": "4.17.5",
+          "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-4.17.5.tgz",
+          "integrity": "sha1-maktZcAnLevoyWtgV7yPv6O+1RE=",
+          "dev": true
+        }
       }
     },
     "webpack-sources": {
@@ -13162,9 +14322,9 @@
       }
     },
     "webpack-subresource-integrity": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npm.taobao.org/webpack-subresource-integrity/download/webpack-subresource-integrity-1.0.3.tgz",
-      "integrity": "sha1-wGBtQAkLBwzeQovsjfNgMhbkcus=",
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/webpack-subresource-integrity/download/webpack-subresource-integrity-1.0.4.tgz",
+      "integrity": "sha1-j6yKfo61n8ahZ2ioXJ2U7n+dDts=",
       "dev": true,
       "requires": {
         "webpack-core": "0.6.9"
@@ -13176,7 +14336,7 @@
       "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
       "dev": true,
       "requires": {
-        "http-parser-js": "0.4.9",
+        "http-parser-js": "0.4.10",
         "websocket-extensions": "0.1.3"
       }
     },
@@ -13190,12 +14350,6 @@
       "version": "3.6.4",
       "resolved": "http://registry.npm.taobao.org/when/download/when-3.6.4.tgz",
       "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=",
-      "dev": true
-    },
-    "whet.extend": {
-      "version": "0.9.9",
-      "resolved": "http://registry.npm.taobao.org/whet.extend/download/whet.extend-0.9.9.tgz",
-      "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=",
       "dev": true
     },
     "which": {
@@ -13240,12 +14394,12 @@
       "dev": true
     },
     "worker-farm": {
-      "version": "1.5.2",
-      "resolved": "http://registry.npm.taobao.org/worker-farm/download/worker-farm-1.5.2.tgz",
-      "integrity": "sha1-MrMS5dw9XUXXnvRKzCWHSRzXKa4=",
+      "version": "1.5.4",
+      "resolved": "http://registry.npm.taobao.org/worker-farm/download/worker-farm-1.5.4.tgz",
+      "integrity": "sha1-Teu+RrQO3vzHF+vedKkLGuHpCaE=",
       "dev": true,
       "requires": {
-        "errno": "0.1.6",
+        "errno": "0.1.7",
         "xtend": "4.0.1"
       }
     },
@@ -13302,6 +14456,29 @@
       "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
       "dev": true
     },
+    "xlsx": {
+      "version": "0.11.18",
+      "resolved": "http://registry.npm.taobao.org/xlsx/download/xlsx-0.11.18.tgz",
+      "integrity": "sha1-NjIBB8zuG8lrcCwarCoATtsiw9g=",
+      "dev": true,
+      "requires": {
+        "adler-32": "1.2.0",
+        "cfb": "1.0.2",
+        "codepage": "1.12.0",
+        "commander": "2.13.0",
+        "crc-32": "1.2.0",
+        "exit-on-epipe": "1.0.1",
+        "ssf": "0.10.1"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.13.0",
+          "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.13.0.tgz",
+          "integrity": "sha1-aWS8pnaF33wfFDDFhPB9dZeIW5w=",
+          "dev": true
+        }
+      }
+    },
     "xml-char-classes": {
       "version": "1.0.0",
       "resolved": "http://registry.npm.taobao.org/xml-char-classes/download/xml-char-classes-1.0.0.tgz",
@@ -13337,18 +14514,18 @@
       "dev": true
     },
     "xxhashjs": {
-      "version": "0.2.1",
-      "resolved": "http://registry.npm.taobao.org/xxhashjs/download/xxhashjs-0.2.1.tgz",
-      "integrity": "sha1-m76b6JYUKXbfo0wGGy0GjEPTDeA=",
+      "version": "0.2.2",
+      "resolved": "http://registry.npm.taobao.org/xxhashjs/download/xxhashjs-0.2.2.tgz",
+      "integrity": "sha1-imJRVnYhocRqWuIE2gJJx/jKqdg=",
       "dev": true,
       "requires": {
         "cuint": "0.2.2"
       }
     },
     "y18n": {
-      "version": "3.2.1",
-      "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz",
-      "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+      "version": "4.0.0",
+      "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz",
+      "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=",
       "dev": true
     },
     "yallist": {
@@ -13383,6 +14560,13 @@
           "version": "3.0.0",
           "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz",
           "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true,
+          "optional": true
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
           "dev": true,
           "optional": true
         }
@@ -13435,6 +14619,11 @@
       "version": "0.8.18",
       "resolved": "http://registry.npm.taobao.org/zone.js/download/zone.js-0.8.18.tgz",
       "integrity": "sha1-jOyzl3/NGzCQVi/0Vw4oR+dStI0="
+    },
+    "zrender": {
+      "version": "3.7.4",
+      "resolved": "http://registry.npm.taobao.org/zrender/download/zrender-3.7.4.tgz",
+      "integrity": "sha1-+EfVOUhIHvbUKQbR6prux6y+/fI="
     }
   }
 }
diff --git a/package.json b/package.json
index a51175e..0ca5c08 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
-  "name": "screen-frontend",
-  "version": "1.0.0",
+  "name": "ng-alain",
+  "version": "0.6.6",
   "description": "ng-zorro-antd admin panel front-end framework",
   "author": "cipchk",
   "homepage": "https://cipchk.github.io/ng-alain/",
@@ -13,19 +13,22 @@
   },
   "license": "MIT",
   "scripts": {
-    "precommit": "npm run lint-staged",
     "ng": "ng",
-    "start": "ng serve -o",
+    "start": "ng serve --host=0.0.0.0",
     "serve:hmr": "ng serve -o --hmr -e=hmr",
+    "start:dev": "ng serve --aot --dev --build-optimizer -o",
+    "start:prod": "ng serve --prod --build-optimizer -o",
     "build": "ng build --prod --build-optimizer",
+    "build-dev": "ng build --build-optimizer --aot --dev",
+    "build-prod": "ng build --build-optimizer --prod",
     "analyze": "ng build --prod --build-optimizer --stats-json",
     "lint": "run-s lint:ts lint:style",
     "lint:ts": "ng lint",
     "lint:style": "stylelint \"{src}/**/*.less\" --syntax less",
     "lint-staged": "lint-staged",
     "e2e": "ng e2e",
-    "test": "ng test -sr",
-    "test-coverage": "ng test -sr -cc"
+    "test": "ng test -sr -sm=false",
+    "test-coverage": "ng test -sr -cc -sm=false"
   },
   "dependencies": {
     "@angular/animations": "^5.0.0",
@@ -37,30 +40,38 @@
     "@angular/platform-browser": "^5.0.0",
     "@angular/platform-browser-dynamic": "^5.0.0",
     "@angular/router": "^5.0.0",
-    "@antv/data-set": "^0.7.0",
-    "@antv/g2": "^3.2.2",
-    "@antv/g2-plugin-slider": "^2.0.3",
-    "@delon/abc": "^0.3.0-rc.1",
-    "@delon/acl": "^0.3.0-rc.1",
-    "@delon/theme": "^0.3.0-rc.1",
-    "@delon/auth": "^0.3.0-rc.1",
+    "@antv/data-set": "^0.8.5",
+    "@antv/g2": "^3.0.5-beta.3",
+    "@antv/g2-plugin-slider": "^2.0.1",
+    "@delon/abc": "0.6.6",
+    "@delon/acl": "0.6.6",
+    "@delon/auth": "0.6.6",
+    "@delon/cache": "0.6.6",
+    "@delon/theme": "0.6.6",
     "@ngx-translate/core": "^9.0.0",
     "@ngx-translate/http-loader": "^2.0.0",
-    "angular-baidu-maps": "^1.0.1",
+    "@types/jquery": "^3.3.0",
     "angular-qq-maps": "^1.0.1",
-    "angular-tree-component": "^6.1.0",
+    "angular-split": "^1.0.0-rc.0",
+    "angular-tree-component": "^7.0.1",
+    "angular2-baidu-map": "^4.3.2",
     "core-js": "^2.5.1",
+    "echarts": "^4.0.4",
     "file-saver": "^1.3.3",
     "font-awesome": "^4.7.0",
+    "jquery": "^3.3.1",
     "moment": "^2.19.3",
-    "ng-tree-antd": "^2.0.0",
-    "ng-zorro-antd": "^0.6.5",
-    "ng-zorro-antd-extra": "^1.1.3",
+    "ng-clipboard-antd": "^2.0.1",
+    "ng-tree-antd": "^2.2.2",
+    "ng-zorro-antd": "^0.6.15",
+    "ng-zorro-antd-extra": "^1.1.7",
     "ng2-dnd": "^5.0.0",
-    "ng2-file-upload": "^1.2.1",
     "ng2-img-cropper": "^0.9.0",
     "ngx-color-picker": "^5.0.0",
     "ngx-countdown": "^2.0.0",
+    "ngx-echarts": "^2.0.2",
+    "ngx-tinymce": "^1.0.1",
+    "ngx-ueditor": "^1.1.0",
     "rxjs": "^5.5.5",
     "screenfull": "^3.3.1",
     "simple-line-icons": "^2.4.1",
@@ -69,14 +80,18 @@
     "zone.js": "^0.8.18"
   },
   "devDependencies": {
-    "@angular/cli": "^1.5.2",
+    "@angular/cli": "^1.7.1",
     "@angular/compiler-cli": "^5.0.0",
     "@angular/language-service": "^5.0.0",
     "@angularclass/hmr": "^2.1.3",
     "@angularclass/hmr-loader": "^3.0.4",
+    "@delon/cli": "^0.6.6",
     "@types/jasmine": "~2.6.0",
     "@types/jasminewd2": "~2.0.3",
+    "@types/jszip": "^3.1.2",
+    "@types/mockjs": "^1.0.0",
     "@types/node": "~6.0.60",
+    "angular2-cookie": "^1.2.6",
     "codecov": "^3.0.0",
     "codelyzer": "~4.0.1",
     "jasmine-core": "~2.8.0",
@@ -90,14 +105,16 @@
     "karma-remap-istanbul": "^0.6.0",
     "karma-sauce-launcher": "^1.2.0",
     "lint-staged": "^5.0.0",
+    "mockjs": "^1.0.1-beta3",
     "npm-run-all": "^4.1.1",
     "protractor": "~5.1.2",
     "stylelint": "^8.2.0",
     "stylelint-config-standard": "^17.0.0",
     "ts-node": "~3.2.0",
     "tslint": "~5.7.0",
-    "typescript": "~2.5.0",
-    "webpack-bundle-analyzer": "^2.9.0"
+    "typescript": "~2.5.3",
+    "webpack-bundle-analyzer": "^2.9.0",
+    "xlsx": "^0.11.16"
   },
   "lint-staged": {
     "src/**/*.ts": "lint:ts",
diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts
index 213e0e0..38f388f 100644
--- a/src/app/app.component.spec.ts
+++ b/src/app/app.component.spec.ts
@@ -1,15 +1,13 @@
 import { TestBed, TestModuleMetadata } from '@angular/core/testing';
-import { setUpTestBed } from '../testing/common.spec';
+import { APP_BASE_HREF } from '@angular/common';
+import { setUpTestBed } from '@testing/common.spec';
 
 import { AppComponent } from './app.component';
-import { APP_BASE_HREF } from '@angular/common';
-import { ThemesService, TitleService } from '@delon/theme';
 
 describe('Component: App', () => {
     setUpTestBed(<TestModuleMetadata>{
         declarations: [ AppComponent ],
         providers: [
-            ThemesService, TitleService,
             { provide: APP_BASE_HREF, useValue: '/' }
         ]
     });
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index acc7507..deb9587 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -1,9 +1,10 @@
-import { Component, HostBinding, OnInit, Inject } from '@angular/core';
-import { Router, NavigationEnd } from '@angular/router';
+import { element } from 'protractor';
+import { LoginService } from '@business/services/http/login.service';
+import { Component, HostBinding, OnInit } from '@angular/core';
+import { Router, NavigationEnd, NavigationStart } from '@angular/router';
 import { ThemesService, SettingsService, TitleService } from '@delon/theme';
-import { filter, map } from 'rxjs/operators';
-import { TokenService, DA_SERVICE_TOKEN } from '@delon/auth';
-
+import { filter } from 'rxjs/operators';
+import * as $ from 'jquery';
 @Component({
   selector: 'app-root',
   template: `<router-outlet></router-outlet>`
@@ -19,25 +20,39 @@
     private settings: SettingsService,
     private router: Router,
     private titleSrv: TitleService,
-    @Inject(DA_SERVICE_TOKEN) private tokenService: TokenService, 
-  ) {
+    private loginService: LoginService) {
   }
 
   ngOnInit() {
-    // ������Token������
-    this.tokenService.set({
-      token: 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsIm9pZCI6NSwibW9kZSI6IldlYiIsInNjb3BlcyI6WyJ0ZW1wIl0sImlzcyI6Imh0dHA6Ly9tb25pdG9yLjdkcmxiLmNvbSIsImlhdCI6MTUzMTMxNjU4MCwiZXhwIjoxNTM5MDkyNTgwfQ.tWE7AqGfLwwK-nO1FUveJ8xKqpxitqG1GdhKHp9JDyRPjNDYX7ocgkEw0W2G8hKL_tJIjjrQ1pc0zvCmLTJ-pg',
-      name: 'admin',
-      email: `admin@qq.com`,
-      id: 10000,
-      time: +new Date(),
-    });
+    this.router.events
+      .pipe(filter(evt => evt instanceof NavigationEnd))
+      .subscribe(() => this.titleSrv.setTitle());
     this.router.events.pipe(
-            filter(evt => evt instanceof NavigationEnd),
-            map(() => this.router.url)
-        )
-        .subscribe(url => {
-            this.titleSrv.setTitleByUrl(url);
-        });
+      filter(evt => evt instanceof NavigationStart)
+    )
+      .subscribe(() => {
+        // ������������������������
+        if ($('.ant-modal-close').length > 0) {
+          $('.ant-modal-close').click();
+        }
+        // ������������������������
+        if ($('.ant-select-open').length > 0) {
+          $('.ant-select-open').click();
+        }
+        // ���������������������������������
+        const cdkOverlayContainer = $('.cdk-overlay-container');
+        if (cdkOverlayContainer != null && cdkOverlayContainer.children().length > 2) {
+          cdkOverlayContainer.children('div:first-child').next().nextAll().each(
+            function (index, el) {
+              if ($(el).hasClass('cdk-overlay-backdrop-showing')) {
+                $(el).remove();
+              } else {
+                $(el).empty();
+              }
+            }
+          );
+        }
+
+      });
   }
 }
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 0968d3c..b3d93f0 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -1,26 +1,27 @@
-import { BrowserModule } from '@angular/platform-browser';
 import { NgModule, LOCALE_ID, APP_INITIALIZER, Injector } from '@angular/core';
+import { HttpClient, HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
+import { BrowserModule } from '@angular/platform-browser';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
-import { TranslateModule, TranslateLoader, TranslateService } from '@ngx-translate/core';
-import { TranslateHttpLoader } from '@ngx-translate/http-loader';
-import { HttpClient, HTTP_INTERCEPTORS } from '@angular/common/http';
 
+import { DelonModule } from './delon.module';
 import { CoreModule } from './core/core.module';
 import { SharedModule } from './shared/shared.module';
 import { AppComponent } from './app.component';
 import { RoutesModule } from './routes/routes.module';
 import { LayoutModule } from './layout/layout.module';
-import { StartupService } from './core/services/startup.service';
+import { StartupService } from '@core/startup/startup.service';
 import { DefaultInterceptor } from '@core/net/default.interceptor';
-import { AlainAuthModule, SimpleInterceptor, JWTInterceptor } from '@delon/auth';
-
-// i18n
-import { I18NService } from './core/i18n/i18n.service';
-import { ALAIN_I18N_TOKEN } from '@delon/theme';
-
+import { SimpleInterceptor } from '@delon/auth';
+// angular i18n
 import { registerLocaleData } from '@angular/common';
 import localeZhHans from '@angular/common/locales/zh-Hans';
 registerLocaleData(localeZhHans);
+// i18n
+import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
+import { TranslateHttpLoader } from '@ngx-translate/http-loader';
+import { ALAIN_I18N_TOKEN } from '@delon/theme';
+import { I18NService } from '@core/i18n/i18n.service';
+import { LoginService } from '@business/services/http/login.service';
 
 // AoT requires an exported function for factories
 export function HttpLoaderFactory(http: HttpClient) {
@@ -38,17 +39,12 @@
     imports: [
         BrowserModule,
         BrowserAnimationsModule,
-        SharedModule.forRoot(),
+        HttpClientModule,
+        DelonModule,
         CoreModule,
+        SharedModule,
         LayoutModule,
         RoutesModule,
-        // auth
-        AlainAuthModule.forRoot({
-            login_url: `/pro/user/login`,
-            token_send_key : 'X-Authorization',
-            token_send_place : 'header',
-            allow_anonymous_key: `_allow_anonymous`,
-        }),
         // i18n
         TranslateModule.forRoot({
             loader: {
@@ -59,9 +55,11 @@
         })
     ],
     providers: [
-        { provide: LOCALE_ID, useValue: 'zh-Hans' },
-        { provide: HTTP_INTERCEPTORS, useClass: SimpleInterceptor, multi: true},
-        { provide: HTTP_INTERCEPTORS, useClass: DefaultInterceptor, multi: true},
+        // loginservice ������������token���������������
+        LoginService,
+        { provide: LOCALE_ID, useValue: 'zh-Hans' }, 
+        { provide: HTTP_INTERCEPTORS, useClass: SimpleInterceptor, multi: true},    
+        { provide: HTTP_INTERCEPTORS, useClass: DefaultInterceptor, multi: true},    
         { provide: ALAIN_I18N_TOKEN, useClass: I18NService, multi: false },
         StartupService,
         {
diff --git a/src/app/business/business.module.ts b/src/app/business/business.module.ts
new file mode 100644
index 0000000..06a2eb0
--- /dev/null
+++ b/src/app/business/business.module.ts
@@ -0,0 +1,22 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+
+// Statics
+import 'rxjs/add/observable/throw';
+
+// Operators
+import 'rxjs/add/operator/catch';
+import 'rxjs/add/operator/debounceTime';
+import 'rxjs/add/operator/distinctUntilChanged';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/switchMap';
+import 'rxjs/add/operator/toPromise';
+import 'rxjs/add/operator/filter';
+import { LocalStorageStore } from '@delon/auth';
+
+@NgModule({
+  imports: [
+    CommonModule,    
+  ],
+})
+export class BusinessModule { }
diff --git a/src/app/business/entity/data.ts b/src/app/business/entity/data.ts
new file mode 100644
index 0000000..2cd044c
--- /dev/null
+++ b/src/app/business/entity/data.ts
@@ -0,0 +1,187 @@
+import { Column } from '@business/entity/grid';
+import { AlarmStyle, TimeUnits, AreaRange, DeviceDimension, Operator } from '@business/enum/types.enum';
+
+
+export interface AreaNames {
+    provinceName?: string;
+    cityName?: string;
+    areaName?: string;
+    townName?: string;
+    villageName?: string;
+}
+// ���������
+export interface Sensor {
+    description?: any|Column;
+    id?: any|Column;
+    sensorKey?: any|Column;
+    lower?: any|Column;
+    name?: any|Column;
+    unit?: any|Column;
+    upper?: any|Column;
+  }
+
+// ������ 
+export interface Organization {
+    address?: Column|any;
+    areaCode?: Column|any;
+    cityCode?: Column|any;
+    createTime?: Column|any;
+    description?: Column|any;
+    email?: Column|any;
+    expireTime?: Column|any;
+    id?: Column|any;
+    isDelete?: Column|any;
+    name?: Column|any;
+    provinceCode?: Column|any;
+    rank?: Column|any;
+    telephone?: Column|any;
+    areaNames?: AreaNames;
+  }
+
+  // ������������
+
+  export interface DeviceVersion {
+    createTime?: Column|any;
+    description?: Column|any;
+    id?: Column|any;
+    name?: Column|any;
+    version?: Column|any;
+  }
+
+  // ������������
+  export interface MonitorPoint {
+    address?: any|Column;
+    areaCode?: any|Column;
+    cityCode?: any|Column;
+    description?: any|Column;
+    id?: any|Column;
+    isDelete?: any|Column;
+    latitude?: any|Column;
+    longitude?: any|Column;
+    name?: any|Column;
+    organizationId?: any|Column;
+    provinceCode?: any|Column;
+    areaNames?: AreaNames|any ;
+    organization?: Organization;
+    townCode?: any|Column;
+    villageCode?: any|Column;
+
+  }
+
+ // ������������
+
+
+ export interface AlarmConfig {
+  id?: number;
+  organizationId?: number;
+  createTime?: number;
+  updateTime?: number;
+  value: AlarmConfigValue;
+}
+
+export interface AlarmConfigValue {
+  alarmMode: AlarmMode;
+  alarmLevels: {[key: string]: AlarmSensorLevel};
+}
+
+
+export interface AlarmSensorLevel {
+  enable: boolean|any [];
+  increment: number []|any[];
+  degressEnable: boolean|any [];
+  degression: number []|any [];
+}
+export interface Device {
+  address?: any|Column;
+  createTime?: any|Column;
+  deviceVersion?: any|Column;
+  deviceVersionId?: any|Column;
+  id?: any|Column;
+  installTime?: any|Column;
+  isDelete?: any|Column;
+  latitude?: any|Column;
+  longitude?: any|Column;
+  mac?: any|Column;
+  monitorPoint?: any|Column;
+  monitorPointId?: any|Column;
+  professionId?: any|Column;
+  name?: any|Column;
+  operateUser?: any|Column;
+  operateUserId?: any|Column;
+  state?: any|Column;
+}
+
+export interface AlarmMode {
+  enable: boolean|any[];
+  interval: number;
+  level1: AlarmStyle[]|any[];
+  level2: AlarmStyle[]|any[];
+  level3: AlarmStyle[]|any[];
+}
+export interface DeviceAdjustValue {
+  createTime?: number|any[];
+  deviceId?: number|any[];
+  id?: number|any[];
+  updateTime?: number|any[];
+  value?: {[s: string]: number}|any[];
+}
+
+export interface CoorPicker {
+  longitude: number; //  ������
+  latitude: number; // ������
+  address: string;
+  describe: string;
+  name: string;
+}
+
+export interface UserContext {
+  authorities: any[];
+  mode: string;
+  organizationId: number;
+  username: string;
+}
+
+
+export interface LineChartCriteria {
+  dataConditions?: DataCondition[];
+  sensorKeys?: string[];
+  timePeriod?: TimePeriod;
+}
+
+export interface TimePeriod {
+  endTime?: Date;
+  startTime?: Date;
+  timeUnits?: TimeUnits;
+}
+
+export interface DataCondition {
+  actualTime?: number;
+  areaRange?: AreaRange;
+  areaRangeId?: number;
+  timeUnits?: TimeUnits;
+  deviceDimension?: DeviceDimension;
+  dimensionValue?: any;
+}
+
+export interface PairData {
+  category: string;
+  value: number;
+}
+export interface OperatorRule {
+  operator: Operator;
+  value: number;
+}
+export interface SensorUnit {
+  id?: number|any;
+  originalUnitName?: string;
+  name?: string|any;
+  rules?: OperatorRule[]|any;
+  sensorId?: number|any;
+}
+export interface OrganizationSensorUnit {
+  id?: number|any;
+  sensorUnitId?: number|any;
+  sensorUnit?: SensorUnit|any;
+  sensor?: Sensor|any;
+  organizationId?: number|any;
+}
diff --git a/src/app/business/entity/grid.ts b/src/app/business/entity/grid.ts
new file mode 100644
index 0000000..b6f908c
--- /dev/null
+++ b/src/app/business/entity/grid.ts
@@ -0,0 +1,120 @@
+import { Types } from '@business/enum/types.enum';
+
+
+export interface Column {
+   text?: string;
+   name?: string;
+   width?: string;
+   sort?: string;
+   isSort?: boolean;
+   type?: DataType;
+   format?: (value: any, col: Column, row: any) => string;
+}
+export interface DataType {
+    name: Types;
+    format?: any;
+}
+// ������http������������������
+export interface PageBean {
+    pageIndex?: number ; // ������
+    pageSize?: number ; // ���������������
+    total?: number;
+    data?: any[];
+    queryParams?: string;
+    orderByClause?: string;
+    getOrderByClause ?(): string;
+}
+export class Grid<T> implements PageBean {
+    getOrderByClause(): string {
+        const orderby = this.sorts.map( (fn) => {
+          return this.columns.find( (col: Column) => {
+                 return fn === col.name;
+           } );
+        }).map( (col: Column) => {
+            const sort = col.sort.startsWith('asc') ? 'asc' : 'desc' ;
+            return col.name + '||' + sort;
+        }).join('|||');
+        return  encodeURI(orderby);
+    }
+    title = '';
+    pageIndex = 0; // ������
+    pageSize = 10; // ������������������
+    data: T[] = [];
+    total = 0;
+    queryParams = '';   
+    pages = 0; // ���������
+    size  = 0;  // ���������������������
+    sorts?: any[] = [];
+    loading = false;
+    indeterminate = false;
+    allChecked = false;
+    selectedIndexs?: number[] = []; // ������������������
+    columns?: Column[] = [];    
+
+    checkAll(value: boolean) {
+        this.data.forEach(
+            row => {row['checked'] = value; }
+        ); 
+        this.refreshStatus();
+    }
+    getData(): any [] {
+        return this.data;
+    }
+    initData(pageData: {data?: any[], total?: number}) {
+        if ( pageData != null && pageData.data != null) {
+            let index = 0;
+            this.data = pageData.data.map(row => {
+                row['index'] = index++;
+                return row;
+            });           
+            this.total = pageData.total;
+            const pages = Math.ceil(this.total / this.pageSize);
+            this.pageIndex = this.pageIndex >  pages ? pages : this.pageIndex;
+        }
+    }
+    refreshStatus() {
+        const data = this.data;
+        const allChecked =   data.every(value => value['checked']);
+        const allUnChecked = data.every(value => !value['checked']);
+        this.allChecked = allChecked;
+        this.indeterminate = (!allChecked) && (!allUnChecked);
+        this.selectedIndexs = data.filter(value => value['checked']).map(
+            row => {
+               return row['index'] != null ? row['index'] : 0;
+            }
+        );
+        this.selectedIndexs = this.selectedIndexs == null ? [] : this.selectedIndexs;
+      }
+    constructor(config?: object) {
+        if (config != null) {
+            const keys = Object.getOwnPropertyNames(config);
+            for (const index in keys) {
+                const key = keys[index];
+                if (this[key] != null) {
+                    this[key] = config[key];
+                }            
+            }
+        }
+    }
+    public setColumns(obj: Object) {
+        this.columns = this.objectToArray(obj);
+    }
+    private objectToArray(obj: Object): any[] {
+        const arr = [];
+        const keys = Object.getOwnPropertyNames(obj);
+        for (const index in keys) {
+            const key = keys[index];
+            const item = obj[key];
+            if ( item['name'] == null) {
+              item['name'] = key;
+            }
+            arr.push(item);
+        }
+        return arr;
+    }
+}
+export interface ResultBean<T> {
+  code?: number;
+  data?: T;
+  message?: string;
+}
diff --git a/src/app/business/entity/token.ts b/src/app/business/entity/token.ts
new file mode 100644
index 0000000..fb0e248
--- /dev/null
+++ b/src/app/business/entity/token.ts
@@ -0,0 +1,7 @@
+export interface Authorization {
+    name?: string;
+    token: string;
+    refreshToken?: string;
+    time?: Date;
+    expiredTime?: number;
+}
diff --git a/src/app/business/enum/patterns.enum.ts b/src/app/business/enum/patterns.enum.ts
new file mode 100644
index 0000000..fcce4b5
--- /dev/null
+++ b/src/app/business/enum/patterns.enum.ts
@@ -0,0 +1,3 @@
+export enum patterns {
+     num = '(\\-?)\\d+(\\.\\d+)?'
+} 
diff --git a/src/app/business/enum/types.enum.ts b/src/app/business/enum/types.enum.ts
new file mode 100644
index 0000000..36dd800
--- /dev/null
+++ b/src/app/business/enum/types.enum.ts
@@ -0,0 +1,33 @@
+export enum Types {
+    Date, Json
+}
+export enum AlarmStyle {
+    // ���������������������������������
+    weixin= 'weixin', email= 'email', sms= 'sms', voice= 'voice'
+}
+export enum TimeUnits {
+    YEAR= 'YEAR', MONTH= 'MONTH', DAY= 'DAY', HOUR= 'HOUR', MINUTE= 'MINUTE'
+}
+export enum AreaRange {
+    PROVINCE= 0, 
+    CITY= 1, 
+    AREA= 2, 
+    TOWN= 3, 
+    VILLAGE= 4, 
+    MONITORPOINT= 5, 
+    DEVICE= 6
+}
+export enum ResultCode {
+    SUCCESS= 1, FAIL= 0
+}
+export enum DeviceDimension {
+    MONITORPOINT= 'MONITORPOINT',  // ��������������� ������������������������������������
+    PROFESSION= 'PROFESSION',
+    NONE= 'NONE'
+}
+export enum Operator {
+    PLUS = 'PLUS', // ���
+    MINUS = 'MINUS', // ���
+    MULTIPLY = 'MULTIPLY', // ���
+    DIVIDE = 'DIVIDE' // ���
+ }
diff --git a/src/app/business/pipe/pipe.module.ts b/src/app/business/pipe/pipe.module.ts
new file mode 100644
index 0000000..c845221
--- /dev/null
+++ b/src/app/business/pipe/pipe.module.ts
@@ -0,0 +1,14 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { TyepHandlePipe } from './tyep-handle.pipe';
+import { DateService } from '@business/services/util/date.service';
+
+@NgModule({
+  imports: [
+    CommonModule
+  ],  
+  declarations: [TyepHandlePipe],
+  exports: [TyepHandlePipe],
+  providers: [DateService]
+})
+export class PipeModule { }
diff --git a/src/app/business/pipe/tyep-handle.pipe.ts b/src/app/business/pipe/tyep-handle.pipe.ts
new file mode 100644
index 0000000..6005cfc
--- /dev/null
+++ b/src/app/business/pipe/tyep-handle.pipe.ts
@@ -0,0 +1,36 @@
+import { DatePipe } from '@angular/common/src/pipes/date_pipe';
+import { Types } from './../enum/types.enum';
+
+import { Pipe, PipeTransform } from '@angular/core';
+import { TranslateService } from '@ngx-translate/core';
+import { NzDatePipe } from 'ng-zorro-antd/src/util/nz-date.pipe';
+import { DateService } from '@business/services/util/date.service';
+import { Column } from '@business/entity/grid';
+
+
+
+@Pipe({
+  name: 'tyepHandle'
+})
+export class TyepHandlePipe implements PipeTransform {
+  constructor(private dateService: DateService) {
+  }
+
+  transform(value: any, col?: Column, row?: any ): any {
+       const t = Types.Date;
+       const type  = col.type;
+       if ( value != null && value !== '' && type != null && type.name != null) {
+         value = this.transformHandle(value, type.name, type.format);
+       }
+       if (col.format !== null && col.format instanceof Function ) {
+            value = col.format(value, col, row);
+       }
+       return value;
+  }
+  private transformHandle(value: any, type: Types, format: any): any {
+        switch (type) {
+           case Types.Date:
+           return this.dateService.date_format(value, format);
+        }
+  }
+}
diff --git a/src/app/business/services/http/alarm-config.service.ts b/src/app/business/services/http/alarm-config.service.ts
new file mode 100644
index 0000000..620f69a
--- /dev/null
+++ b/src/app/business/services/http/alarm-config.service.ts
@@ -0,0 +1,56 @@
+import { _HttpClient } from '@delon/theme';
+import { Injectable } from '@angular/core';
+import { environment } from '@env/environment';
+import { Observable } from 'rxjs/Observable';
+import { ResultBean } from '@business/entity/grid';
+import { AlarmConfig, AlarmConfigValue, AlarmSensorLevel, AlarmMode } from '@business/entity/data';
+
+@Injectable()
+export class AlarmConfigService {
+  private urls = {
+    getByOid: environment.SERVER_BASH_URL + 'alarm-config/get-by-oid',
+    save: environment.SERVER_BASH_URL + 'alarm-config/add-or-modify',
+  };
+  constructor( private http: _HttpClient) {
+     
+  }
+  public generateAlarmConfig(sensors: {sensorKey: string} [], alarmConfig?: AlarmConfig): AlarmConfig {
+        const _alarmConfig: AlarmConfig = alarmConfig == null || alarmConfig.value == null ? {value: {
+            alarmLevels: null,
+            alarmMode: null
+        }} : alarmConfig;
+        let alarmLevels = _alarmConfig.value.alarmLevels;
+        alarmLevels = alarmLevels == null ? {} : alarmLevels;
+        sensors.forEach(
+          sensor => {
+                const key = sensor.sensorKey;
+                alarmLevels[key]  = 
+                alarmLevels[key] == null ?
+                {
+                  enable: false,
+                  increment: [0, 0, 0],
+                  degressEnable: false,
+                  degression:  [0, 0, 0]
+                } : alarmLevels[key];
+             }
+         );
+         _alarmConfig.value.alarmLevels = alarmLevels;
+         // ������������
+         let alarmMode = _alarmConfig.value.alarmMode;
+         alarmMode = alarmMode == null ? {
+          enable: false,
+          interval: 120,
+          level1: null,
+          level2: null,
+          level3: null
+        } : alarmMode;
+        _alarmConfig.value.alarmMode = alarmMode;
+        return _alarmConfig;
+  }
+  public getByOid(oid: number): Observable<ResultBean<AlarmConfig>> {
+     return this.http.get(this.urls.getByOid, {organizationId: oid});
+  }
+  public save(data: any): Observable<ResultBean<any>> {
+    return this.http.post(this.urls.save, data);
+  }
+}
diff --git a/src/app/business/services/http/areacode.service.ts b/src/app/business/services/http/areacode.service.ts
new file mode 100644
index 0000000..c6e9d7d
--- /dev/null
+++ b/src/app/business/services/http/areacode.service.ts
@@ -0,0 +1,77 @@
+import { Injectable } from '@angular/core';
+import { _HttpClient } from '@delon/theme/services/http/http.client';
+import { Observable } from 'rxjs/Observable';
+import { environment } from 'environments/environment';
+
+@Injectable()
+export class AreacodeService {
+  baseUrl = environment.SERVER_BASH_URL;
+  constructor(private http: _HttpClient) { }
+   getProvinces(): Observable<{label: string, value: string}[]> {
+      return this.http.get( this.baseUrl + '/area/get-provinces' ).map(
+         (res: {code: number, data: any}) => {
+            let provinces = [];
+            if (res !== null && res['code'] === 1 ) {
+                 provinces = res['data'].map((item) => {
+                   return {label: item.provinceName , value: item.provinceCode };
+                 });
+            }
+            return provinces;
+         }
+      );
+  }
+  
+  getCities(provinceCode: string): Observable<{label: string, value: string}[]> {
+    return this.http.get( this.baseUrl + '/area/get-cities', {provinceCode: provinceCode}).map(
+       (res: {code: number, data: any}) => {
+          let cities = [];
+          if (res !== null && res['code'] === 1 ) {
+            cities = res['data'].map((item) => {
+                 return {label: item.cityName , value: item.cityCode };
+               });
+          }
+          return cities;
+       }
+    );
+   }
+   getAreas(cityCode: string, isLeaf ?: Boolean): Observable<{label: string, value: string}[]> {
+    return this.http.get( this.baseUrl + '/area/get-areas', {cityCode: cityCode}).map(
+       (res: {code: number, data: any}) => {
+          let areas = [];
+          if (res !== null && res['code'] === 1 ) {
+            areas = res['data'].map((item) => {
+                 return {label: item.areaName , value: item.areaCode, isLeaf: isLeaf === undefined ? true : isLeaf};
+               });
+          }
+          return areas;
+       }
+    );
+   }
+   
+   getTowns(areaCode: string): Observable<{label: string, value: string}[]> {
+    return this.http.get( this.baseUrl + '/area/get-towns', {areaCode: areaCode}).map(
+       (res: {code: number, data: any}) => {
+          let towns = [];
+          if (res !== null && res['code'] === 1 ) {
+            towns = res['data'].map((item) => {
+                 return {label: item.townName , value: item.townCode};
+               });
+          }
+          return towns;
+       }
+    );
+   }
+   getVillages(townCode: string): Observable<{label: string, value: string}[]> {
+    return this.http.get( this.baseUrl + '/area/get-villages', {townCode: townCode}).map(
+       (res: {code: number, data: any}) => {
+          let villages = [];
+          if (res !== null && res['code'] === 1 ) {
+            villages = res['data'].map((item) => {
+                 return {label: item.villageName , value: item.villageCode , isLeaf: true};
+               });
+          }
+          return villages;
+       }
+    );
+   }
+}
diff --git a/src/app/business/services/http/device-adjust-value.service.ts b/src/app/business/services/http/device-adjust-value.service.ts
new file mode 100644
index 0000000..e18142a
--- /dev/null
+++ b/src/app/business/services/http/device-adjust-value.service.ts
@@ -0,0 +1,25 @@
+import { environment } from 'environments/environment';
+import { _HttpClient } from '@delon/theme';
+import { Injectable } from '@angular/core';
+import { Observable } from 'rxjs/Observable';
+import { ResultBean } from '@business/entity/grid';
+import { AlarmConfig, DeviceAdjustValue } from '@business/entity/data';
+
+@Injectable()
+export class DeviceAdjustValueService {
+  private urls = {
+    getByDid: environment.SERVER_BASH_URL + 'device-adjust/get-by-did',
+    save: environment.SERVER_BASH_URL + 'device-adjust/add-or-modify',
+  };
+  constructor(private http: _HttpClient) { }
+  /**
+   * 
+   * @param did ������ID
+   */
+  public getByDid(did: number): Observable<ResultBean<DeviceAdjustValue>> {
+    return this.http.get(this.urls.getByDid, {deviceId: did});
+  }
+  public save(data: DeviceAdjustValue): Observable<any> {
+    return this.http.post(this.urls.save, data);
+  }
+}
diff --git a/src/app/business/services/http/device.service.ts b/src/app/business/services/http/device.service.ts
new file mode 100644
index 0000000..31de514
--- /dev/null
+++ b/src/app/business/services/http/device.service.ts
@@ -0,0 +1,45 @@
+import { _HttpClient } from '@delon/theme';
+import { environment } from 'environments/environment';
+import { Injectable } from '@angular/core';
+import { ResultBean, PageBean } from '@business/entity/grid';
+import { Observable } from 'rxjs/Observable';
+import { ExampleService, Criteria } from '@business/services/util/example.service';
+import { Device } from '@business/entity/data';
+
+@Injectable()
+export class DeviceService {
+  private urls = {
+    list: environment.SERVER_BASH_URL + 'device/page-list',
+    save: environment.SERVER_BASH_URL + 'device/add-or-modify',
+    delete: environment.SERVER_BASH_URL + 'device/delete-by-ids',
+    count: environment.SERVER_BASH_URL + 'device/count-by-example'
+  };
+  public getListUrl () {
+    return this.urls.list;
+  }
+  
+  constructor(private http: _HttpClient) { }
+  delete(...ids: number[]): Observable< ResultBean<any> > {
+      return this.http.post(this.urls.delete, ids);
+  }
+  public save(data: Device): Observable<any> {
+    return this.http.post(this.urls.save, data);
+  }
+  public countByExample(example: ExampleService): Observable<ResultBean<number>> {
+    return this.http.get(this.urls.count, { queryParams: example.getSqlParam()});
+  }
+  public getPageByExample(page: PageBean, example: ExampleService): Observable<PageBean> {
+    let orderByClause = '';
+    const _queryParams = !!example ? example.getSqlParam() : '';
+    if (!!page) {
+       if ( page.getOrderByClause != null && page.getOrderByClause instanceof Function) {
+          orderByClause = page.getOrderByClause();
+          }
+    } else {
+          page =  {pageIndex: 0, pageSize: 20};
+    }
+    const param: PageBean = {pageSize: page.pageSize, pageIndex: page.pageIndex, 
+        queryParams: _queryParams, orderByClause: orderByClause};
+        return this.http.get(this.urls.list, param);
+ }
+}
diff --git a/src/app/business/services/http/login.service.ts b/src/app/business/services/http/login.service.ts
new file mode 100644
index 0000000..989d7d7
--- /dev/null
+++ b/src/app/business/services/http/login.service.ts
@@ -0,0 +1,112 @@
+import { Authorization } from '@business/entity/token';
+import { HttpClient } from '@angular/common/http';
+import { environment } from 'environments/environment';
+import { Observable } from 'rxjs/Observable';
+import { Injectable, Inject } from '@angular/core';
+import { UserContext } from '@business/entity/data';
+import { error } from 'selenium-webdriver';
+import { DA_SERVICE_TOKEN, ITokenService, LocalStorageStore } from '@delon/auth';
+import { Subject } from 'rxjs/Subject';
+
+@Injectable()
+export class LoginService {
+
+  public authorization: Authorization = {token: null};
+  public userContext: UserContext;
+  private urls = {
+    login: environment.SERVER_BASH_URL + 'auth/login',
+    refreshToken: environment.SERVER_BASH_URL + 'auth/token',
+    userContext: environment.SERVER_BASH_URL + 'user-context',
+  };
+  constructor(private http: HttpClient,
+    @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService) { 
+          // ���2���������������������token������������
+          setInterval(
+             () => {
+                 if (this.canRefreshToken()
+                     && this.needFreshFromLocal 
+                     && this.isReachRefreshTime()) {
+                        const _refreshToken =  this._refreshToken;    
+                        // ������������������
+                        this.setRefreshTime();
+                        // ������needfreshtoken
+                        localStorage.setItem('needRefreshToken', 'false');                                            
+                        if (!!_refreshToken) {
+                            this.http.get(this.urls.refreshToken, {headers: {'X-Refrsh-Token': 'Bearer ' + _refreshToken}} )
+                            .subscribe(
+                            res => {
+                              if (res['token'] != null) {
+                                  this.tokenService.set({'token': res ['token']});
+                                  console.log(new Date() + localStorage._token);
+                              }
+                            }
+                          );
+                      }
+                 }
+             }, 2000
+          );
+    }
+  public validate(username: string, password: string): Observable<Authorization> {
+      return this.http.post(this.urls.login, {username: username, password: password, mode: 'Web'}).map(
+           (res: any) => {
+               this.authorization = res;
+               const now = new Date();
+               // expiredTime,refreshToken,refreshTime ������������ token ������������
+               this.setRefreshTime();
+               localStorage.setItem('expiredTime', String(this.authorization.expiredTime));
+               localStorage.setItem('refreshToken', this.authorization.refreshToken);
+               return res;
+           }
+      );
+  }
+  public loadUserContext(): void {
+      this.http.get(this.urls.userContext).subscribe(
+        (res: UserContext) => {
+           this.userContext = res;
+           return res;
+        }
+      );
+  }
+  get _refreshToken() {
+    return !!this.authorization.refreshToken ? this.authorization.refreshToken : this.refreshTokenFromLocal;
+  }
+  get refreshTokenFromLocal(): string {
+      return localStorage.refreshToken;
+  }
+  get needFreshFromLocal(): boolean {
+     return localStorage.needRefreshToken === 'true';
+  }
+  private setRefreshTime() {
+    localStorage.setItem('refreshTime', new Date().getTime().toString());
+  }
+  private setNeedRefreshToken() {
+    localStorage.setItem('needRefreshToken', 'true');
+  }
+  private isReachRefreshTime(): boolean {
+        const expiredTime = Number(localStorage.expiredTime);
+        return !!this.refreshTime && !!expiredTime && this.refreshTime + (expiredTime / 2) * 60000 < new Date().getTime();
+  }
+  private get refreshTime(): number  {
+    return  Number(localStorage.refreshTime);
+  }
+  public clearRefreshToken() {
+    localStorage.expiredTime = null;
+    localStorage.refreshTime = null;
+    localStorage.refreshToken = null;
+    this.authorization = null;
+    localStorage.removeItem('expiredTime');
+    localStorage.removeItem('refreshTime');
+    localStorage.removeItem('refreshToken');
+  }
+  private canRefreshToken() {
+     return !!localStorage.getItem('expiredTime') 
+            && !!localStorage.getItem('refreshTime') 
+            && !!localStorage.getItem('refreshToken');
+  }
+  public refreshToken () {
+    if (this.canRefreshToken()) {
+      // ������������������token
+      this.setNeedRefreshToken();
+    }
+  }
+}
diff --git a/src/app/business/services/http/monitor-point.service.ts b/src/app/business/services/http/monitor-point.service.ts
new file mode 100644
index 0000000..a506840
--- /dev/null
+++ b/src/app/business/services/http/monitor-point.service.ts
@@ -0,0 +1,61 @@
+import { PageBean, ResultBean } from '@business/entity/grid';
+import { ExampleService } from '@business/services/util/example.service';
+import { _HttpClient } from '@delon/theme';
+import { environment } from 'environments/environment';
+import { RouteConfigLoadStart } from '@angular/router';
+import { Injectable } from '@angular/core';
+import { equal } from 'assert';
+import { Observable } from 'rxjs/Observable';
+import { MonitorPoint } from '@business/entity/data';
+
+@Injectable()
+export class MonitorPointService {
+
+  private urls = {
+    list: environment.SERVER_BASH_URL + '/monitor-point/page-list',
+    save: environment.SERVER_BASH_URL + '/monitor-point/add-or-modify',
+    delete: environment.SERVER_BASH_URL + '/monitor-point/delete-by-ids',
+    getOne: environment.SERVER_BASH_URL + '/monitor-point/get-by-id'
+};
+constructor(private http: _HttpClient) { }
+ public getPagingList(page: PageBean, queryText: string): Observable<PageBean> {
+  const example = new ExampleService();
+  if (queryText != null && queryText !== '') {
+    example.or().andLike({name: 'name', value: '%' + queryText + '%'});
+  }
+  let orderByClause = '';
+  if (!!page) {
+      if ( page.getOrderByClause != null && page.getOrderByClause instanceof Function) {
+         orderByClause = page.getOrderByClause();
+         }
+   } else {
+         page =  {pageIndex: 0, pageSize: 20};
+   }
+  const param: PageBean = {pageSize: page.pageSize, pageIndex: page.pageIndex, 
+      queryParams: example.getSqlParam(), orderByClause: orderByClause};
+      return this.http.get(this.urls.list, param);
+  }
+  public getPageByExample(page: PageBean, example: ExampleService): Observable<PageBean> {
+      let orderByClause = '';
+      const _queryParams = !!example ? example.getSqlParam() : '';
+      if (!!page) {
+         if ( page.getOrderByClause != null && page.getOrderByClause instanceof Function) {
+            orderByClause = page.getOrderByClause();
+            }
+      } else {
+            page =  {pageIndex: 0, pageSize: 20};
+      }
+      const param: PageBean = {pageSize: page.pageSize, pageIndex: page.pageIndex, 
+          queryParams: _queryParams, orderByClause: orderByClause};
+          return this.http.get(this.urls.list, param);
+   }
+public save(data: any): Observable<any> {
+      return this.http.post(this.urls.save, data);
+}
+public delete(...ids: number[]): Observable<any> {             
+      return this.http.post(this.urls.delete, ids);
+}
+public getEntity(id: number): Observable<ResultBean<MonitorPoint>> {
+      return this.http.get(this.urls.getOne, {id: id});
+}
+}
diff --git a/src/app/business/services/http/operate-user.service.ts b/src/app/business/services/http/operate-user.service.ts
new file mode 100644
index 0000000..9d13599
--- /dev/null
+++ b/src/app/business/services/http/operate-user.service.ts
@@ -0,0 +1,32 @@
+import { PageBean } from '@business/entity/grid';
+import { ExampleService } from '@business/services/util/example.service';
+import { _HttpClient } from '@delon/theme';
+import { environment } from 'environments/environment';
+import { RouteConfigLoadStart } from '@angular/router';
+import { Injectable } from '@angular/core';
+import { equal } from 'assert';
+import { Observable } from 'rxjs/Observable';
+
+@Injectable()
+export class OperateUserService {
+
+  private urls = {
+    list: environment.SERVER_BASH_URL + 'operateUser/page-list'
+};
+constructor(private http: _HttpClient) { }
+ public getPagingList(page: PageBean, queryText: string): Observable<PageBean> {
+  const example = new ExampleService();
+  if (queryText != null && queryText !== '') {
+    example.or().andLike({name: 'name', value: '%' + queryText + '%'});
+    example.or().andLike({name: 'jobNumber', value: '%' + queryText + '%'});
+  }
+  let orderByClause = '';
+  if ( page.getOrderByClause != null && page.getOrderByClause instanceof Function) {
+    orderByClause = page.getOrderByClause();
+  }
+  const param: PageBean = {pageSize: page.pageSize, pageIndex: page.pageIndex, 
+      queryParams: example.getSqlParam(), orderByClause: orderByClause};
+      return this.http.get(this.urls.list, param);
+}
+
+}
diff --git a/src/app/business/services/http/organization.service.ts b/src/app/business/services/http/organization.service.ts
new file mode 100644
index 0000000..ba9f9c1
--- /dev/null
+++ b/src/app/business/services/http/organization.service.ts
@@ -0,0 +1,52 @@
+import { Organization, AlarmConfig, OrganizationSensorUnit, SensorUnit } from '@business/entity/data';
+import { ExampleService } from '@business/services/util/example.service';
+import { _HttpClient } from '@delon/theme';
+import { environment } from 'environments/environment';
+import { RouteConfigLoadStart } from '@angular/router';
+import { Injectable } from '@angular/core';
+import { equal } from 'assert';
+import { Observable } from 'rxjs/Observable';
+import {  PageBean, ResultBean } from '@business/entity/grid';
+
+
+@Injectable()
+export class OrganizationService {
+  handle: 'list'|'config'|'unit'|'screen' = 'list';
+  config: {pageBean?: PageBean, resultBean?: ResultBean<AlarmConfig|any>} = {};
+  data: Organization;
+  title: '������������'|'������������������'|'������������������'|'������������������' = '������������';
+  private urls = {
+      list: environment.SERVER_BASH_URL + '/organization/page-list',
+      save: environment.SERVER_BASH_URL + '/organization/add-or-modify',
+      delete: environment.SERVER_BASH_URL + '/organization/delete-by-ids'
+  };
+  constructor(private http: _HttpClient) { }
+   public getPagingList(page: PageBean, queryText: string): Observable<PageBean> {
+    queryText = !!queryText && !!queryText.trim() ? queryText : null;
+    const example = new ExampleService();
+    if (queryText != null && queryText !== '') {
+      example.or().andLike({name: 'name', value: '%' + queryText + '%'});
+    }
+    let orderByClause = '';
+    if ( page.getOrderByClause != null && page.getOrderByClause instanceof Function) {
+      orderByClause = page.getOrderByClause();
+    }
+    const param: PageBean = {pageSize: page.pageSize, pageIndex: page.pageIndex, 
+        queryParams: example.getSqlParam(), orderByClause: orderByClause};
+        return this.http.get(this.urls.list, param);
+  }
+  public save(data: any): Observable<any> {
+        return this.http.post(this.urls.save, data);
+  }
+  public delete(...ids: number[]): Observable<any> {             
+        return this.http.post(this.urls.delete, ids);
+  }
+  public getResultBeanData(key: string) {
+        if (!!this.config.resultBean 
+          && !!this.config.resultBean.code 
+          && !!this.config.resultBean.data) {
+          return this.config.resultBean.data[key];
+       }
+       return null;
+  }
+}
diff --git a/src/app/business/services/http/sensor-unit.service.ts b/src/app/business/services/http/sensor-unit.service.ts
new file mode 100644
index 0000000..9e050f8
--- /dev/null
+++ b/src/app/business/services/http/sensor-unit.service.ts
@@ -0,0 +1,18 @@
+import { Injectable } from '@angular/core';
+import { Observable } from 'rxjs/Observable';
+import { SensorUnit } from '@business/entity/data';
+import { _HttpClient } from '@delon/theme';
+import { ResultBean } from '@business/entity/grid';
+
+@Injectable()
+export class SensorUnitService {
+  private urls = {
+    list: 'sensor-unit/gets-bysid',
+  };
+  constructor(
+    private http: _HttpClient
+  ) { }
+  public getListBySensorId(sensorId: number): Observable<ResultBean<SensorUnit[]>> {    
+    return this.http.get( this.urls.list, {  sensorId : sensorId });
+  }
+}
diff --git a/src/app/business/services/http/sensors.service.ts b/src/app/business/services/http/sensors.service.ts
new file mode 100644
index 0000000..1c18e3e
--- /dev/null
+++ b/src/app/business/services/http/sensors.service.ts
@@ -0,0 +1,47 @@
+import { ExampleService } from '@business/services/util/example.service';
+import { _HttpClient } from '@delon/theme';
+import { environment } from 'environments/environment';
+import { RouteConfigLoadStart } from '@angular/router';
+import { Injectable } from '@angular/core';
+import { equal } from 'assert';
+import { Observable } from 'rxjs/Observable';
+import {  PageBean } from '@business/entity/grid';
+
+@Injectable()
+export class SensorsService {
+  private urls = {
+    list: environment.SERVER_BASH_URL + '/sensor/page-list',
+    save: environment.SERVER_BASH_URL + '/sensor/add-or-modify',
+    delete: environment.SERVER_BASH_URL + '/sensor/delete-by-ids',
+    listByVersionId: environment.SERVER_BASH_URL + '/sensor/list-by-vid',
+};
+constructor(private http: _HttpClient) { }
+ public getPagingList(page: PageBean, queryText: string): Observable<PageBean> {
+  const example = new ExampleService();
+  if (queryText != null && queryText !== '') {
+    example.or().andLike({name: 'name', value: '%' + queryText + '%'});
+    example.or().andEqualTo({name: 'version', value: queryText});
+  }
+  let orderByClause = '';
+  if (!!page) {
+    if (page.getOrderByClause != null && page.getOrderByClause instanceof Function) {
+      orderByClause = page.getOrderByClause();
+    }
+  } else {
+      page = {pageSize: 0, pageIndex: 0};
+  }
+  const param: PageBean = {pageSize: page.pageSize, pageIndex: page.pageIndex, 
+      queryParams: example.getSqlParam(), orderByClause: orderByClause};
+      return this.http.get(this.urls.list, param);
+}
+public getPageByVersionId(versionId: number): Observable<PageBean> {
+       return this.http.get(this.urls.listByVersionId, {versionId: versionId});
+}
+public save(data: any): Observable<any> {
+      return this.http.post(this.urls.save, data);
+}
+public delete(...ids: number[]): Observable<any> {             
+      return this.http.post(this.urls.delete, ids);
+}
+
+}
diff --git a/src/app/business/services/http/version.service.ts b/src/app/business/services/http/version.service.ts
new file mode 100644
index 0000000..8a5861a
--- /dev/null
+++ b/src/app/business/services/http/version.service.ts
@@ -0,0 +1,48 @@
+import { ExampleService } from '@business/services/util/example.service';
+import { PageBean } from '@business/entity/grid';
+import { _HttpClient } from '@delon/theme';
+import { environment } from 'environments/environment';
+import { RouteConfigLoadStart } from '@angular/router';
+import { Injectable } from '@angular/core';
+import { equal } from 'assert';
+import { Observable } from 'rxjs/Observable';
+
+
+@Injectable()
+export class VersionService {
+  private urls = {
+      list: environment.SERVER_BASH_URL + '/device-version/page-list',
+      save: environment.SERVER_BASH_URL + '/device-version/add-or-modify',
+      delete: environment.SERVER_BASH_URL + '/device-version/delete-by-ids',
+      getSensorIds: environment.SERVER_BASH_URL + '/device-version/get-sensor-ids',
+      versionSensorConfig: environment.SERVER_BASH_URL + '/device-version/version-sensor-config'
+  };
+  constructor(private http: _HttpClient) { }
+   public getPagingList(page: PageBean, queryText: string): Observable<PageBean> {
+    const example = new ExampleService();
+    if (queryText != null && queryText !== '') {
+      example.or().andLike({name: 'name', value: '%' + queryText + '%'});
+      example.or().andEqualTo({name: 'version', value: queryText});
+    }
+    let orderByClause = '';
+    if ( page.getOrderByClause != null && page.getOrderByClause instanceof Function) {
+      orderByClause = page.getOrderByClause();
+    }
+    const param: PageBean = {pageSize: page.pageSize, pageIndex: page.pageIndex, 
+      queryParams: example.getSqlParam(), orderByClause: orderByClause};
+    return this.http.get(this.urls.list, param);
+  }
+  public save(data: any): Observable<any> {
+        return this.http.post(this.urls.save, data);
+  }
+  public delete(...ids: number[]): Observable<any> {             
+        return this.http.post(this.urls.delete, ids);
+  }
+  public getSensorIds(deviceVersionId: number): Observable< number []> {
+      return this.http.get(this.urls.getSensorIds, {deviceVersionId: deviceVersionId});
+  }
+  public versionSensorConfig(deviceVersionId: number, sensorIds: number[]): Observable<any> {
+    const url = this.urls.versionSensorConfig + '/' + deviceVersionId;
+    return this.http.post(url, sensorIds);
+  }
+}
diff --git a/src/app/business/services/util/date.service.ts b/src/app/business/services/util/date.service.ts
new file mode 100644
index 0000000..da31118
--- /dev/null
+++ b/src/app/business/services/util/date.service.ts
@@ -0,0 +1,58 @@
+import {Injectable} from '@angular/core';
+
+import * as moment from 'moment';
+import { TimePeriod } from '@business/entity/data';
+import { TimeUnits } from '@business/enum/types.enum';
+
+
+type baseUnitOfMoment = moment.unitOfTime.Base;
+@Injectable()
+export class DateService {
+  date_format(date: string, format: string) {
+    return moment(date).format(format);
+  }
+
+  today(format: string) {
+    return moment().format(format);
+  }
+  /**
+   *  ������������������,������������
+   */   
+   countTimeRange(timePeriod: TimePeriod): number {
+      let timeUnit: baseUnitOfMoment = 'day';
+      timeUnit = <baseUnitOfMoment>timePeriod.timeUnits.toLowerCase();
+      const start = moment(timePeriod.startTime);
+      const end = moment(timePeriod.endTime);
+      return end.diff(start, timeUnit) + 1;
+   }
+   makeTimeList(timePeriod: TimePeriod): string [] {
+    const start = moment(timePeriod.startTime);
+    const end = moment(timePeriod.endTime);
+    const timeList: string[] = [];
+    let timeUnit: baseUnitOfMoment = 'day';
+    let formatStyle = '';
+    switch (timePeriod.timeUnits) {
+      case TimeUnits.YEAR: 
+      formatStyle = 'YYYY';
+      timeUnit = 'year'; break;
+      case TimeUnits.MONTH: 
+      formatStyle = 'YYYY-MM';
+      timeUnit = 'month'; break;
+      case TimeUnits.DAY: 
+      formatStyle = 'YYYY-MM-DD';
+      timeUnit = 'day'; break;
+      case TimeUnits.HOUR: 
+      formatStyle = 'YYYY-MM-DD HH';
+      timeUnit = 'hour'; break;
+      case TimeUnits.MINUTE: 
+      formatStyle = 'YYYY-MM-DD HH:mm';
+      timeUnit = 'minute'; break;
+    }
+    while (start.valueOf() < end.valueOf()) {
+     const outTime = start.format(formatStyle);
+     timeList.push(outTime);
+     start.add(1, timeUnit);
+    }
+    return timeList;
+   }
+}
diff --git a/src/app/business/services/util/example.service.ts b/src/app/business/services/util/example.service.ts
new file mode 100644
index 0000000..fdcb472
--- /dev/null
+++ b/src/app/business/services/util/example.service.ts
@@ -0,0 +1,62 @@
+
+import { Injectable } from '@angular/core';
+
+export class  Criteria {
+    private static CONDITION_SPLIT = '||';
+     private conditions: string[] = [];
+     public getConditions(): string[] {
+       return this.conditions;
+     }
+
+     private addCondition(condition: string, colName: string, ...values: any[]) {
+        const split = Criteria.CONDITION_SPLIT; // '||'
+        let conditionStr = condition + split + colName;
+        if (!!values && values.length > 0) {
+            conditionStr += split + values.join(split);
+        }
+        this.conditions.push(conditionStr);
+     }
+     public andCondition(condition: string) {
+        this.addCondition('andCondition', condition);
+     }
+     public andLike(col: { name: string, value: any}): Criteria {
+         this.addCondition('andLike', col.name, col.value);
+         return this;
+     }
+     public andEqualTo(col: { name: string, value: any}): Criteria {
+        this.addCondition('andEqualTo', col.name, col.value);
+        return this;
+     }
+     public andNotEqualTo(col: { name: string, value: any}): Criteria {
+        this.addCondition('andNotEqualTo', col.name, col.value);
+        return this;
+     }
+     public andGreaterThanOrEqualTo(col: { name: string, value: any}): Criteria {
+        this.addCondition('andGreaterThanOrEqualTo', col.name, col.value);
+        return this;
+     }
+}
+
+@Injectable()
+export class ExampleService {
+  private static OR_SPLIT = 'or|';
+  private static  CRITERIA_SPLIT = '|||';
+  private criterion: Criteria[] = [];
+  public clear(): void {
+      this.criterion = [];
+  }
+  public getSqlParam(): string {
+      let whereSql = '';
+     for (const cri of this.criterion) {
+            const conditions = cri.getConditions();
+            whereSql += ExampleService.OR_SPLIT + conditions.join(ExampleService.CRITERIA_SPLIT);
+     }
+     return encodeURI(whereSql);
+  }
+  constructor() { }
+    public or(): Criteria {
+        const cri = new Criteria();
+        this.criterion.push(cri);
+        return cri;
+    }
+}
diff --git a/src/app/business/services/util/tools.service.ts b/src/app/business/services/util/tools.service.ts
new file mode 100644
index 0000000..3841b8f
--- /dev/null
+++ b/src/app/business/services/util/tools.service.ts
@@ -0,0 +1,50 @@
+import { FormGroup, FormArray, AbstractControl } from '@angular/forms';
+import { Injectable } from '@angular/core';
+
+@Injectable()
+export class ToolsService {
+      public static markAsDirty(controlSet: FormGroup|FormArray) {
+         const controls = controlSet.controls;
+         Object.values(controls).forEach(
+             (control: AbstractControl) => {
+                    if (control instanceof FormGroup || control instanceof FormArray) {
+                        ToolsService.markAsDirty(control);
+                    } else {
+                          control.markAsDirty();
+                    }
+             }
+         );
+      }
+      public static getValueFormControl(controlSet: FormGroup, name: string) {
+        return controlSet.controls[name].value;
+      }
+      public static setValueToControl(controlSet: FormGroup, name: string, value: any) {
+         controlSet.controls[name].setValue(value);
+         controlSet.controls[name].updateValueAndValidity();
+      }
+      public static removePrivate(obj: object) {
+            Object.keys(obj).forEach(
+                 (key: string) => {
+                        if (key.startsWith('_')) {
+                            delete obj[key];
+                        } else {
+                            if (obj[key] instanceof Object) {
+                                ToolsService.removePrivate(obj[key]);
+                            }
+                        }
+                 }
+                );
+      }
+      public static toThousands(number: string): string {
+        let num = (number || 0).toString(), result = '';
+        while (num.length > 3) {
+            result = ',' + num.slice(-3) + result;
+            num = num.slice(0, num.length - 3);
+        }
+        if (num) { result = num + result; }
+        return result;
+    }
+    public static getObjById<T>(id: number, list: T[]): T {
+        return list.find(item => item['id'] === id);
+    }
+}
diff --git a/src/app/core/README.md b/src/app/core/README.md
new file mode 100644
index 0000000..2d98e12
--- /dev/null
+++ b/src/app/core/README.md
@@ -0,0 +1,5 @@
+### CoreModule
+
+**���** ��������� `providers` ���������
+
+**���������**  ���������������������������������������������HTTP���������������
diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts
index 80ceb6c..29760e9 100644
--- a/src/app/core/core.module.ts
+++ b/src/app/core/core.module.ts
@@ -1,13 +1,9 @@
 import { NgModule, Optional, SkipSelf } from '@angular/core';
 import { throwIfAlreadyLoaded } from './module-import-guard';
-import { AlainThemeModule } from '@delon/theme';
 
 import { I18NService } from './i18n/i18n.service';
 
 @NgModule({
-    imports: [
-       AlainThemeModule.forRoot()
-    ],
     providers: [
         I18NService
     ]
diff --git a/src/app/core/i18n/i18n.service.spec.ts b/src/app/core/i18n/i18n.service.spec.ts
index 926da94..9b75a0a 100644
--- a/src/app/core/i18n/i18n.service.spec.ts
+++ b/src/app/core/i18n/i18n.service.spec.ts
@@ -1,4 +1,3 @@
-import { SharedModule } from '@shared/shared.module';
 import { TestBed, async, inject } from '@angular/core/testing';
 import { TranslateService, TranslateModule, TranslateLoader } from '@ngx-translate/core';
 import { HttpClient, HttpClientModule } from '@angular/common/http';
@@ -6,13 +5,16 @@
 import { I18NService } from './i18n.service';
 import { HttpLoaderFactory } from '../../app.module';
 import { SettingsService } from '@delon/theme';
+import { DelonModule } from '../../delon.module';
+import { SharedModule } from '@shared/shared.module';
 
 describe('Service: I18n', () => {
     beforeEach(() => {
         TestBed.configureTestingModule({
             imports: [
                 HttpClientModule,
-                SharedModule.forRoot(),
+                DelonModule,
+                SharedModule,
                 TranslateModule.forRoot({
                     loader: {
                         provide: TranslateLoader,
diff --git a/src/app/core/i18n/i18n.service.ts b/src/app/core/i18n/i18n.service.ts
index e046d53..cf17dd2 100644
--- a/src/app/core/i18n/i18n.service.ts
+++ b/src/app/core/i18n/i18n.service.ts
@@ -8,24 +8,26 @@
 @Injectable()
 export class I18NService implements AlainI18NService {
 
-    private _default = 'en';
+    private _default = 'zh-CN';
 
+    // ������������������ ��������� by fx
     private _langs = [
-        { code: 'en', text: 'English' },
-        { code: 'zh-CN', text: '������' }
+        { code: 'zh-CN', text: '������' },
+        { code: 'en', text: 'English' }
     ];
 
-    constructor(settings: SettingsService,
+    constructor(
+        settings: SettingsService,
         private nzLocalService: NzLocaleService,
         private translate: TranslateService,
-        private injector: Injector) {
+        private injector: Injector
+    ) {
         this._default = settings.layout.lang || translate.getBrowserLang();
         const lans = this._langs.map(item => item.code);
         if (!lans.includes(this._default)) {
             this._default = lans[0];
         }
         translate.addLangs(lans);
-        translate.setDefaultLang(this._default);
     }
 
     use(lang: string = null, firstLoad = true): Observable<any> {
@@ -35,13 +37,20 @@
         if (!firstLoad) this.injector.get(Router).navigate([ '/' ]);
         return this.translate.use(lang);
     }
-
+    /** ������������������ */
     getLangs() {
         return this._langs;
     }
-
+    /** ������ */
     fanyi(key: string) {
         return this.translate.instant(key);
     }
-
+    /** ������������ */
+    get defaultLang() {
+        return this._default;
+    }
+    /** ������������ */
+    get currentLang() {
+        return this.translate.currentLang || this.translate.getDefaultLang() || this._default;
+    }
 }
diff --git a/src/app/core/net/default.interceptor.ts b/src/app/core/net/default.interceptor.ts
index 6233402..982d562 100644
--- a/src/app/core/net/default.interceptor.ts
+++ b/src/app/core/net/default.interceptor.ts
@@ -1,68 +1,142 @@
 import { Injectable, Injector } from '@angular/core';
 import { Router } from '@angular/router';
-import { HttpInterceptor, HttpRequest, HttpHandler,
+import { HttpInterceptor, HttpRequest, HttpHandler, HttpErrorResponse,
          HttpSentEvent, HttpHeaderResponse, HttpProgressEvent, HttpResponse, HttpUserEvent,
        } from '@angular/common/http';
 import { Observable } from 'rxjs/Observable';
+import { of } from 'rxjs/observable/of';
 import { ErrorObservable } from 'rxjs/observable/ErrorObservable';
-import { catchError } from 'rxjs/operators';
-import { map, mergeMap } from 'rxjs/operators';
-
-import { environment } from '../../../environments/environment';
+import { mergeMap, catchError } from 'rxjs/operators';
+import { NzMessageService, NzModalService } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+import { environment } from '@env/environment';
+import { LoginService } from '@business/services/http/login.service';
+import { Subject } from 'rxjs/Subject';
+import { error } from 'protractor';
+import { debug } from 'util';
+import {Location} from '@angular/common';
 
 /**
  * ������HTTP������������������������������ `app.module.ts`
  */
 @Injectable()
 export class DefaultInterceptor implements HttpInterceptor {
-    constructor(private injector: Injector) {}
-
-    private goLogin() {
-        const router = this.injector.get(Router);
-        this.injector.get(Router).navigate([ '/login' ]);
+    private unLoginHandle: Subject<HttpErrorResponse> = new Subject<HttpErrorResponse>();
+    
+    constructor(private injector: Injector) {
+         let isExpireModelShow = false;
+         this.unLoginHandle.debounceTime(1000).delay(1000).filter(
+             () => !isExpireModelShow
+         ).subscribe( (event: HttpErrorResponse) => {
+                isExpireModelShow = true;
+                let errorMsg = '';
+                if (!!event && !!event.error) {
+                    const erroCode =  !!event.error['errorCode'] ? Number.parseInt(event.error['errorCode']) : 0;
+                    switch (erroCode) {
+                    case 10: errorMsg = '���������,���������'; break;
+                    case 11: errorMsg = '������������,���������������'; break;
+                    case 12: errorMsg = '������������,������������������'; break;
+                    case 0: errorMsg  = '���������������������������'; break;
+                    default: errorMsg = '������������,���������������'; break;
+                    }
+                }else {
+                    errorMsg = '���������������������������';
+                }
+                // ������refresh���������������������
+                this.loginService.clearRefreshToken();
+                this.model.info({
+                maskClosable: false,
+                title: errorMsg,
+                onOk: () => {
+                    isExpireModelShow = false;
+                    this.goTo('/passport/login');
+                }
+                });
+         });
+    }
+    get loginService(): LoginService {
+        return this.injector.get<LoginService>(LoginService);
+    }
+    get msg(): NzMessageService {
+        return this.injector.get(NzMessageService);
+    }
+    get model(): NzModalService {
+        return this.injector.get(NzModalService);
+    }
+    private goTo(url: string) {
+        setTimeout(() => this.injector.get(Router).navigateByUrl(url));
     }
 
-    intercept(req: HttpRequest<any>, next: HttpHandler):
-        Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {
+    private handleData(event: HttpResponse<any> | HttpErrorResponse): Observable<any> {
+        // ��������������� `throw` ������������������ `_HttpClient` ��� `end()` ������
+        // this.injector.get(_HttpClient).end();
+        // ���������������������������������
+        const status = !!event.status ? event.status : 401;
+        switch (status) {
+            case 200:
+                // ��������������������������������������������������� `status` ��������� `0` ���������������������
+                // ��������� `error_message` ������
 
-        // TIPS������TOKEN��������������� `@delon/auth` ������
-        // Document: http://ng-alain.com/docs/auth
+                // const body: any = event instanceof HttpResponse && event.body;
+                // if (body && body.status !== 0) {
+                //     this.msg.error(body.error_message);
+                //     // ������������������������������������ Pipe���subscribe ������������������
+                //     // this.http.get('/').subscribe() ���������������
+                //     return ErrorObservable.throw(event);
+                // }
+                break;
+            case 401: // ������������������
+            // this.goTo('/passport/login');
+                if (!this.isLoginPage) {
+                    this.unLoginHandle.next(<HttpErrorResponse>event);
+                }
+                break;
+            case 403:
+            case 404:
+            case 500:
+                this.goTo(`/${event.status}`);
+                break;
+        }
+        // ��������������������� httpclient ������������
+        if (event instanceof HttpErrorResponse) {
+            return ErrorObservable.create(event);
+        } else {
+            return of(event);
+        }       
+    }
+    private get isLoginPage(): boolean {
+        return !!location && !!location.hash && location.hash.endsWith('login');
+    }
+    intercept(req: HttpRequest<any>, next: HttpHandler):
+        Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {       
         // ���������������������������
         let url = req.url;
         if (!url.startsWith('https://') && !url.startsWith('http://') && !url.startsWith('assets')) {
-        url = environment.SERVER_URL + url;
+            // url = environment.SERVER_URL + url;
+            url = environment.SERVER_BASH_URL + url;
         }
 
         const newReq = req.clone({
             url: url
         });
-
         return next.handle(newReq).pipe(
-                    mergeMap((event: any) => {
+                    mergeMap((event: any) => {                        
                         // ������������������������������������������������������������������������������������������������HTTP������������������200������������������
-                        if (event instanceof HttpResponse && event.status !== 200) {
-                            // ���������������observer.error ��������������������� `catch`
-                            // return ErrorObservable.create(event);
-                        }
+                        if (event instanceof HttpResponse && event.status === 200) {
+                                // ������token���������������������������
+                                if (!this.isLoginPage 
+                                    && !!newReq.headers 
+                                    && !newReq.headers.get('X-Refrsh-Token')
+                                    && !url.startsWith('assets')) {                                    
+                                    this.loginService.refreshToken();
+                                } 
+                                return this.handleData(event);
+                            }
                         // ������������������������������������
-                        return Observable.create(observer => observer.next(event));
+                        return of(event);
                     }),
-                    catchError((res: HttpResponse<any>) => {
-                        // ���������������������������������
-                        switch (res.status) {
-                            case 401: // ������������������
-                                this.goLogin();
-                                break;
-                            case 200:
-                                // ������������������������
-                                console.log('������������');
-                                break;
-                            case 404:
-                                // 404
-                                break;
-                        }
-                        // ������������������������������������
-                        return ErrorObservable.create(event);
+                    catchError((err: HttpErrorResponse) => {
+                        return this.handleData(err);
                     })
                 );
     }
diff --git a/src/app/core/services/startup.service.ts b/src/app/core/services/startup.service.ts
deleted file mode 100644
index f5e4bb7..0000000
--- a/src/app/core/services/startup.service.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { Router } from '@angular/router';
-import { Injectable, Injector } from '@angular/core';
-import { HttpClient, HttpErrorResponse } from '@angular/common/http';
-import { MenuService, SettingsService, TitleService } from '@delon/theme';
-import { ACLService } from '@delon/acl';
-import { I18NService } from '../i18n/i18n.service';
-
-/**
- * ���������������������
- * ���������������������������������������������������
- */
-@Injectable()
-export class StartupService {
-    constructor(
-        private menuService: MenuService,
-        private i18n: I18NService,
-        private settingService: SettingsService,
-        private aclService: ACLService,
-        private titleService: TitleService,
-        private httpClient: HttpClient,
-        private injector: Injector) { }
-
-    load(): Promise<any> {
-        // only works with promises
-        // https://github.com/angular/angular/issues/15088
-        return new Promise((resolve, reject) => {
-            this.httpClient.get('assets/app-data.json')
-                           .subscribe((res: any) => {
-                               // ������������������������������������������������
-                                this.settingService.setApp(res.app);
-                                // ���������������������������������������������������
-                                this.settingService.setUser(res.user);
-                                // ACL������������������������
-                                this.aclService.setFull(true);
-                                // ���������������
-                                this.menuService.add(res.menu);
-                                // i18n���������������������
-                                this.i18n.use(this.settingService.layout.lang);
-                                // ���������������������������
-                                this.titleService.suffix = res.app.name;
-
-                                resolve(res);
-                            }, (err: HttpErrorResponse) => {
-                                resolve(null);
-                            });
-        });
-    }
-}
diff --git a/src/app/core/startup/startup.service.ts b/src/app/core/startup/startup.service.ts
new file mode 100644
index 0000000..1cb67ee
--- /dev/null
+++ b/src/app/core/startup/startup.service.ts
@@ -0,0 +1,57 @@
+import { Injectable, Injector } from '@angular/core';
+import { Router } from '@angular/router';
+import { HttpClient, HttpErrorResponse } from '@angular/common/http';
+import { zip } from 'rxjs/observable/zip';
+import { TranslateService } from '@ngx-translate/core';
+import { MenuService, SettingsService, TitleService } from '@delon/theme';
+import { ACLService } from '@delon/acl';
+import { I18NService } from '../i18n/i18n.service';
+
+/**
+ * ���������������������
+ * ���������������������������������������������������
+ */
+@Injectable()
+export class StartupService {
+    constructor(
+        private menuService: MenuService,
+        private translate: TranslateService,
+        private i18n: I18NService,
+        private settingService: SettingsService,
+        private aclService: ACLService,
+        private titleService: TitleService,
+        private httpClient: HttpClient,
+        private injector: Injector) { }
+
+    load(): Promise<any> {
+        // only works with promises
+        // https://github.com/angular/angular/issues/15088
+        return new Promise((resolve, reject) => {
+            zip(
+                this.httpClient.get(`assets/i18n/${this.i18n.defaultLang}.json`),
+                this.httpClient.get('assets/app-data.json'),
+            ).subscribe(([langData, appData]) => {
+                // setting language data
+                this.translate.setTranslation(this.i18n.defaultLang, langData);
+                this.translate.setDefaultLang(this.i18n.defaultLang);
+
+                // application data
+                const res: any = appData;
+                // ������������������������������������������������
+                this.settingService.setApp(res.app);
+                // ���������������������������������������������������
+                this.settingService.setUser(res.user);
+                // ACL������������������������
+                this.aclService.setFull(true);
+                // ���������������
+                this.menuService.add(res.menu);
+                // ���������������������������
+                this.titleService.suffix = res.app.name;
+
+                resolve(res);
+            }, (err: HttpErrorResponse) => {
+                resolve(null);
+            });
+        });
+    }
+}
diff --git a/src/app/delon.module.ts b/src/app/delon.module.ts
new file mode 100644
index 0000000..0305521
--- /dev/null
+++ b/src/app/delon.module.ts
@@ -0,0 +1,236 @@
+/**
+ * ���������������������������������������
+ * ������������������������������������������https://github.com/cipchk/ng-alain/issues/180
+ */
+import { NgModule, Optional, SkipSelf, ModuleWithProviders } from '@angular/core';
+import { throwIfAlreadyLoaded } from '@core/module-import-guard';
+
+// region: zorro modules
+
+import {
+    // LoggerModule,
+    // NzLocaleModule,
+    NzButtonModule,
+    NzAlertModule,
+    NzBadgeModule,
+    // NzCalendarModule,
+    NzCascaderModule,
+    NzCheckboxModule,
+    NzDatePickerModule,
+    NzFormModule,
+    NzInputModule,
+    NzInputNumberModule,
+    NzGridModule,
+    NzMessageModule,
+    NzModalModule,
+    NzNotificationModule,
+    NzPaginationModule,
+    NzPopconfirmModule,
+    NzPopoverModule,
+    NzRadioModule,
+    NzRateModule,
+    NzSelectModule,
+    NzSpinModule,
+    NzSliderModule,
+    NzSwitchModule,
+    NzProgressModule,
+    NzTableModule,
+    NzTabsModule,
+    NzTagModule,
+    NzTimePickerModule,
+    NzUtilModule,
+    NzStepsModule,
+    NzDropDownModule,
+    NzMenuModule,
+    NzBreadCrumbModule,
+    NzLayoutModule,
+    NzRootModule,
+    NzCarouselModule,
+    // NzCardModule,
+    NzCollapseModule,
+    NzTimelineModule,
+    NzToolTipModule,
+    // NzBackTopModule,
+    // NzAffixModule,
+    // NzAnchorModule,
+    NzAvatarModule,
+    NzUploadModule,
+    // SERVICES
+    NzNotificationService,
+    NzMessageService
+} from 'ng-zorro-antd';
+export const ZORROMODULES = [
+    // LoggerModule,
+    // NzLocaleModule,
+    NzButtonModule,
+    NzAlertModule,
+    NzBadgeModule,
+    // NzCalendarModule,
+    NzCascaderModule,
+    NzCheckboxModule,
+    NzDatePickerModule,
+    NzFormModule,
+    NzInputModule,
+    NzInputNumberModule,
+    NzGridModule,
+    NzMessageModule,
+    NzModalModule,
+    NzNotificationModule,
+    NzPaginationModule,
+    NzPopconfirmModule,
+    NzPopoverModule,
+    NzRadioModule,
+    NzRateModule,
+    NzSelectModule,
+    NzSpinModule,
+    NzSliderModule,
+    NzSwitchModule,
+    NzProgressModule,
+    NzTableModule,
+    NzTabsModule,
+    NzTagModule,
+    NzTimePickerModule,
+    NzUtilModule,
+    NzStepsModule,
+    NzDropDownModule,
+    NzMenuModule,
+    NzBreadCrumbModule,
+    NzLayoutModule,
+    NzRootModule,
+    NzCarouselModule,
+    // NzCardModule,
+    NzCollapseModule,
+    NzTimelineModule,
+    NzToolTipModule,
+    // NzBackTopModule,
+    // NzAffixModule,
+    // NzAnchorModule,
+    NzAvatarModule,
+    NzUploadModule
+];
+// endregion
+
+// region: @delon/abc modules
+import {
+    AdSimpleTableModule,
+    AdReuseTabModule,
+    AdAvatarListModule,
+    AdChartsModule,
+    AdCountDownModule,
+    AdDescListModule,
+    AdEllipsisModule,
+    AdErrorCollectModule,
+    AdExceptionModule,
+    AdFooterToolbarModule,
+    AdGlobalFooterModule,
+    AdNoticeIconModule,
+    AdNumberInfoModule,
+    AdProHeaderModule,
+    AdResultModule,
+    AdSidebarNavModule,
+    AdStandardFormRowModule,
+    AdTagSelectModule,
+    AdTrendModule,
+    AdDownFileModule,
+    AdImageModule,
+    AdUtilsModule,
+    AdFullContentModule,
+    AdXlsxModule,
+    AdZipModule
+} from '@delon/abc';
+export const ABCMODULES = [
+    AdSimpleTableModule,
+    AdReuseTabModule,
+    AdAvatarListModule,
+    AdChartsModule,
+    AdCountDownModule,
+    AdDescListModule,
+    AdEllipsisModule,
+    AdErrorCollectModule,
+    AdExceptionModule,
+    AdFooterToolbarModule,
+    AdGlobalFooterModule,
+    AdNoticeIconModule,
+    AdNumberInfoModule,
+    AdProHeaderModule,
+    AdResultModule,
+    AdSidebarNavModule,
+    AdStandardFormRowModule,
+    AdTagSelectModule,
+    AdTrendModule,
+    AdDownFileModule,
+    AdImageModule,
+    AdUtilsModule,
+    AdFullContentModule,
+    AdXlsxModule,
+    AdZipModule
+];
+// endregion
+
+import { NgZorroAntdModule } from 'ng-zorro-antd';
+import { NgZorroAntdExtraModule } from 'ng-zorro-antd-extra';
+import { AlainThemeModule } from '@delon/theme';
+import { AlainABCModule } from '@delon/abc';
+import { AlainAuthModule } from '@delon/auth';
+import { AlainACLModule } from '@delon/acl';
+import { DelonCacheModule } from '@delon/cache';
+// mock
+// import { DelonMockModule } from '@delon/mock';
+// import * as MOCKDATA from '../../_mock';
+// import { environment } from '@env/environment';
+// const MOCKMODULE = !environment.production || environment.chore === true ?
+//                     [ DelonMockModule.forRoot({ data: MOCKDATA }) ] : [];
+
+// region: global config functions
+
+// import { SimpleTableConfig } from '@delon/abc';
+// export function simpleTableConfig(): SimpleTableConfig {
+//     return { ps: 20 };
+// }
+
+// endregion
+
+@NgModule({
+    imports: [
+        NgZorroAntdModule.forRoot(),
+        NgZorroAntdExtraModule.forRoot(),
+        // theme
+        AlainThemeModule.forRoot(),
+        // abc
+        AdErrorCollectModule.forRoot(), AdFooterToolbarModule.forRoot(), AdSidebarNavModule.forRoot(), AdDownFileModule.forRoot(), AdImageModule.forRoot(),
+        AdAvatarListModule.forRoot(), AdDescListModule.forRoot(), AdEllipsisModule.forRoot(), AdExceptionModule.forRoot(), AdExceptionModule.forRoot(),
+        AdNoticeIconModule.forRoot(), AdNumberInfoModule.forRoot(), AdProHeaderModule.forRoot(), AdResultModule.forRoot(), AdStandardFormRowModule.forRoot(),
+        AdTagSelectModule.forRoot(), AdTrendModule.forRoot(), AdUtilsModule.forRoot(), AdChartsModule.forRoot(), AdCountDownModule.forRoot(), AdSimpleTableModule.forRoot(),
+        AdReuseTabModule.forRoot(), AdFullContentModule.forRoot(), AdXlsxModule.forRoot(), AdZipModule.forRoot(),
+        // auth
+        AlainAuthModule.forRoot({
+            // ignores: [ `\\/login`, `assets\\/` ],
+            token_send_key : 'X-Authorization',
+            token_send_template : 'Bearer ${token}',
+            token_send_place : 'header',
+            login_url: `/passport/login`,
+            allow_anonymous_key: `_allow_anonymous`
+        }),
+        // acl
+        AlainACLModule.forRoot(),
+        // cache
+        DelonCacheModule.forRoot(),
+        // mock
+        // ...MOCKMODULE
+    ]
+})
+export class DelonModule {
+  constructor( @Optional() @SkipSelf() parentModule: DelonModule) {
+    throwIfAlreadyLoaded(parentModule, 'DelonModule');
+  }
+
+  static forRoot(): ModuleWithProviders {
+      return {
+          ngModule: DelonModule,
+          providers: [
+              // TIPS���@delon/abc ��������������������������������������������������� `simple-table` ������������������ `20` ���
+              // { provide: SimpleTableConfig, useFactory: simpleTableConfig }
+          ]
+      };
+  }
+}
diff --git a/src/app/layout/layout.component.html b/src/app/layout/default/default.component.html
similarity index 60%
rename from src/app/layout/layout.component.html
rename to src/app/layout/default/default.component.html
index 796d712..89fde65 100644
--- a/src/app/layout/layout.component.html
+++ b/src/app/layout/default/default.component.html
@@ -2,5 +2,8 @@
     <div class="router-progress-bar" *ngIf="isFetching"></div>
     <app-header class="header"></app-header>
     <app-sidebar class="aside"></app-sidebar>
-    <section class="content"><router-outlet></router-outlet></section>
+    <section class="content">
+        <reuse-tab></reuse-tab>
+        <router-outlet></router-outlet>
+    </section>
 </div>
diff --git a/src/app/layout/default/default.component.spec.ts b/src/app/layout/default/default.component.spec.ts
new file mode 100644
index 0000000..cd26602
--- /dev/null
+++ b/src/app/layout/default/default.component.spec.ts
@@ -0,0 +1,17 @@
+import { TestBed, TestModuleMetadata } from '@angular/core/testing';
+
+import { setUpTestBed } from '@testing/common.spec';
+
+import { LayoutDefaultComponent } from './default.component';
+
+describe('Layout', () => {
+    setUpTestBed(<TestModuleMetadata>{
+        declarations: [LayoutDefaultComponent]
+    });
+
+    it('should create an instance', () => {
+        const fixture = TestBed.createComponent(LayoutDefaultComponent);
+        const comp = fixture.debugElement.componentInstance;
+        expect(comp).toBeTruthy();
+    });
+});
diff --git a/src/app/layout/layout.component.ts b/src/app/layout/default/default.component.ts
similarity index 90%
rename from src/app/layout/layout.component.ts
rename to src/app/layout/default/default.component.ts
index 79c0624..2055b6c 100644
--- a/src/app/layout/layout.component.ts
+++ b/src/app/layout/default/default.component.ts
@@ -4,10 +4,10 @@
 import { ScrollService, MenuService, SettingsService } from '@delon/theme';
 
 @Component({
-    selector: 'app-layout',
-    templateUrl: './layout.component.html'
+    selector: 'layout-default',
+    templateUrl: './default.component.html'
 })
-export class LayoutComponent {
+export class LayoutDefaultComponent {
     isFetching = false;
 
     constructor(
diff --git a/src/app/layout/header/components/fullscreen.component.ts b/src/app/layout/default/header/components/fullscreen.component.ts
similarity index 87%
rename from src/app/layout/header/components/fullscreen.component.ts
rename to src/app/layout/default/header/components/fullscreen.component.ts
index 4a0d8c4..58138f4 100644
--- a/src/app/layout/header/components/fullscreen.component.ts
+++ b/src/app/layout/default/header/components/fullscreen.component.ts
@@ -5,7 +5,7 @@
     selector: 'header-fullscreen',
     template: `
     <i class="anticon anticon-{{status ? 'shrink' : 'arrows-alt'}}"></i>
-    {{status ? 'fullscreen-exit' : 'fullscreen' | translate }}
+    {{(status ? 'fullscreen-exit' : 'fullscreen') | translate }}
     `
 })
 export class HeaderFullScreenComponent {
diff --git a/src/app/layout/header/components/langs.component.ts b/src/app/layout/default/header/components/i18n.component.ts
similarity index 93%
rename from src/app/layout/header/components/langs.component.ts
rename to src/app/layout/default/header/components/i18n.component.ts
index 59cd4a4..2f037f7 100644
--- a/src/app/layout/header/components/langs.component.ts
+++ b/src/app/layout/default/header/components/i18n.component.ts
@@ -3,7 +3,7 @@
 import { I18NService } from '@core/i18n/i18n.service';
 
 @Component({
-    selector: 'header-langs',
+    selector: 'header-i18n',
     template: `
     <nz-dropdown>
         <div nz-dropdown>
@@ -19,7 +19,7 @@
     </nz-dropdown>
     `
 })
-export class HeaderLangsComponent {
+export class HeaderI18nComponent {
 
     langs: any[];
 
diff --git a/src/app/layout/header/components/icon.component.ts b/src/app/layout/default/header/components/icon.component.ts
similarity index 100%
rename from src/app/layout/header/components/icon.component.ts
rename to src/app/layout/default/header/components/icon.component.ts
diff --git a/src/app/layout/header/components/notify.component.ts b/src/app/layout/default/header/components/notify.component.ts
similarity index 100%
rename from src/app/layout/header/components/notify.component.ts
rename to src/app/layout/default/header/components/notify.component.ts
diff --git a/src/app/layout/header/components/search.component.ts b/src/app/layout/default/header/components/search.component.ts
similarity index 100%
rename from src/app/layout/header/components/search.component.ts
rename to src/app/layout/default/header/components/search.component.ts
diff --git a/src/app/layout/header/components/storage.component.ts b/src/app/layout/default/header/components/storage.component.ts
similarity index 100%
rename from src/app/layout/header/components/storage.component.ts
rename to src/app/layout/default/header/components/storage.component.ts
diff --git a/src/app/layout/header/components/task.component.ts b/src/app/layout/default/header/components/task.component.ts
similarity index 100%
rename from src/app/layout/header/components/task.component.ts
rename to src/app/layout/default/header/components/task.component.ts
diff --git a/src/app/layout/header/components/theme.component.ts b/src/app/layout/default/header/components/theme.component.ts
similarity index 100%
rename from src/app/layout/header/components/theme.component.ts
rename to src/app/layout/default/header/components/theme.component.ts
diff --git a/src/app/layout/header/components/user.component.ts b/src/app/layout/default/header/components/user.component.ts
similarity index 93%
rename from src/app/layout/header/components/user.component.ts
rename to src/app/layout/default/header/components/user.component.ts
index f8a2271..c4acd0d 100644
--- a/src/app/layout/header/components/user.component.ts
+++ b/src/app/layout/default/header/components/user.component.ts
@@ -30,17 +30,18 @@
         this.tokenService.change().subscribe((res: any) => {
             this.settings.setUser(res);
         });
+        // mock
         const token = this.tokenService.get() || {
             token: 'nothing',
             name: 'Admin',
             avatar: './assets/img/zorro.svg',
-            email: 'cipchk@qq.com'
+            email: 'admin@qq.com'
         };
         this.tokenService.set(token);
     }
 
     logout() {
         this.tokenService.clear();
-        this.router.navigateByUrl('/pro/user/login');
+        this.router.navigateByUrl(this.tokenService.login_url);
     }
 }
diff --git a/src/app/layout/header/header.component.html b/src/app/layout/default/header/header.component.html
similarity index 90%
rename from src/app/layout/header/header.component.html
rename to src/app/layout/default/header/header.component.html
index 907e9d4..1c81766 100644
--- a/src/app/layout/header/header.component.html
+++ b/src/app/layout/default/header/header.component.html
@@ -21,19 +21,19 @@
         </li>
         -->
         <!-- Lock Page -->
-        <!-- <li class="hidden-xs">
+        <li class="hidden-xs">
             <div class="item" [routerLink]="['/pages/lock']">
                 <i class="anticon anticon-lock"></i>
             </div>
-        </li> -->
+        </li>
         <!-- Search Button -->
-        <!-- <li class="header-search__btn" (click)="searchToggleChange()">
+        <li class="header-search__btn" (click)="searchToggleChange()">
             <div class="item">
                 <i class="anticon anticon-search"></i>
             </div>
-        </li> -->
+        </li>
     </ul>
-    <!-- <header-search class="header-search" [toggleChange]="searchToggleStatus"></header-search> -->
+    <header-search class="header-search" [toggleChange]="searchToggleStatus"></header-search>
     <ul class="top-nav">
         <!-- Notify -->
         <!--
diff --git a/src/app/layout/header/header.component.spec.ts b/src/app/layout/default/header/header.component.spec.ts
similarity index 89%
rename from src/app/layout/header/header.component.spec.ts
rename to src/app/layout/default/header/header.component.spec.ts
index 5999222..4305fe5 100644
--- a/src/app/layout/header/header.component.spec.ts
+++ b/src/app/layout/default/header/header.component.spec.ts
@@ -1,6 +1,5 @@
 import { TestBed, TestModuleMetadata } from '@angular/core/testing';
-
-import { setUpTestBed } from 'testing/common.spec';
+import { setUpTestBed } from '@testing/common.spec';
 
 import { HeaderComponent } from './header.component';
 
diff --git a/src/app/layout/header/header.component.ts b/src/app/layout/default/header/header.component.ts
similarity index 100%
rename from src/app/layout/header/header.component.ts
rename to src/app/layout/default/header/header.component.ts
diff --git a/src/app/layout/header/index.md b/src/app/layout/default/header/index.md
similarity index 100%
rename from src/app/layout/header/index.md
rename to src/app/layout/default/header/index.md
diff --git a/src/app/layout/sidebar/sidebar.component.html b/src/app/layout/default/sidebar/sidebar.component.html
similarity index 64%
rename from src/app/layout/sidebar/sidebar.component.html
rename to src/app/layout/default/sidebar/sidebar.component.html
index f66e350..3410b1c 100644
--- a/src/app/layout/sidebar/sidebar.component.html
+++ b/src/app/layout/default/sidebar/sidebar.component.html
@@ -8,9 +8,9 @@
             </div>
         </div>
         <ul nz-menu>
-            <li nz-menu-item (click)="msgSrv.success('profile')">{{ 'profile' | translate }}</li>
-            <li nz-menu-item (click)="msgSrv.success('settings')">{{ 'settings' | translate }}</li>
-            <li nz-menu-item (click)="msgSrv.success('logout')">{{ 'logout' | translate }}</li>
+            <li nz-menu-item [nzDisable]="true">{{ 'profile' | translate }}</li>
+            <li nz-menu-item [nzDisable]="true">{{ 'settings' | translate }}</li>
+            <li nz-menu-item (click)="logout()">{{ 'logout' | translate }}</li>
         </ul>
     </nz-dropdown>
     <sidebar-nav class="d-block py-lg"></sidebar-nav>
diff --git a/src/app/layout/sidebar/sidebar.component.spec.ts b/src/app/layout/default/sidebar/sidebar.component.spec.ts
similarity index 88%
rename from src/app/layout/sidebar/sidebar.component.spec.ts
rename to src/app/layout/default/sidebar/sidebar.component.spec.ts
index 0f07032..1afa67e 100644
--- a/src/app/layout/sidebar/sidebar.component.spec.ts
+++ b/src/app/layout/default/sidebar/sidebar.component.spec.ts
@@ -1,5 +1,5 @@
 import { TestBed, TestModuleMetadata } from '@angular/core/testing';
-import { setUpTestBed } from '../../../testing/common.spec';
+import { setUpTestBed } from '@testing/common.spec';
 
 import { SidebarComponent } from './sidebar.component';
 
diff --git a/src/app/layout/default/sidebar/sidebar.component.ts b/src/app/layout/default/sidebar/sidebar.component.ts
new file mode 100644
index 0000000..76eed2f
--- /dev/null
+++ b/src/app/layout/default/sidebar/sidebar.component.ts
@@ -0,0 +1,20 @@
+import { Component } from '@angular/core';
+import { NzMessageService } from 'ng-zorro-antd';
+import { SettingsService } from '@delon/theme';
+import {Router} from '@angular/router';
+
+@Component({
+  selector   : 'app-sidebar',
+  templateUrl: './sidebar.component.html'
+})
+export class SidebarComponent {
+    constructor(
+        private router: Router,
+        public settings: SettingsService,
+        public msgSrv: NzMessageService) {
+    }
+
+    logout() {
+        this.router.navigateByUrl('/passport/login');
+    }
+}
diff --git a/src/app/layout/fullscreen/fullscreen.component.ts b/src/app/layout/fullscreen/fullscreen.component.ts
index bae241a..0da593b 100644
--- a/src/app/layout/fullscreen/fullscreen.component.ts
+++ b/src/app/layout/fullscreen/fullscreen.component.ts
@@ -1,7 +1,7 @@
 import { Component } from '@angular/core';
 
 @Component({
-    selector: 'app-layout-fullscreen',
+    selector: 'layout-fullscreen',
     templateUrl: './fullscreen.component.html'
 })
 export class LayoutFullScreenComponent {
diff --git a/src/app/layout/layout.component.spec.ts b/src/app/layout/layout.component.spec.ts
deleted file mode 100644
index 03facd8..0000000
--- a/src/app/layout/layout.component.spec.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { TestBed, TestModuleMetadata } from '@angular/core/testing';
-
-import { setUpTestBed } from 'testing/common.spec';
-
-import { LayoutComponent } from './layout.component';
-
-describe('Layout', () => {
-    setUpTestBed(<TestModuleMetadata>{
-        declarations: [LayoutComponent]
-    });
-
-    it('should create an instance', () => {
-        const fixture = TestBed.createComponent(LayoutComponent);
-        const comp = fixture.debugElement.componentInstance;
-        expect(comp).toBeTruthy();
-    });
-});
diff --git a/src/app/layout/layout.module.ts b/src/app/layout/layout.module.ts
index 5c6b9c6..f9b4d58 100644
--- a/src/app/layout/layout.module.ts
+++ b/src/app/layout/layout.module.ts
@@ -1,22 +1,22 @@
 import { NgModule } from '@angular/core';
-
 import { SharedModule } from '@shared/shared.module';
-import { LayoutComponent } from './layout.component';
+
+import { LayoutDefaultComponent } from './default/default.component';
 import { LayoutFullScreenComponent } from './fullscreen/fullscreen.component';
-import { HeaderComponent } from './header/header.component';
-import { SidebarComponent } from './sidebar/sidebar.component';
-import { HeaderSearchComponent } from './header/components/search.component';
-import { HeaderThemeComponent } from './header/components/theme.component';
-import { HeaderNotifyComponent } from './header/components/notify.component';
-import { HeaderTaskComponent } from './header/components/task.component';
-import { HeaderIconComponent } from './header/components/icon.component';
-import { HeaderFullScreenComponent } from './header/components/fullscreen.component';
-import { HeaderLangsComponent } from './header/components/langs.component';
-import { HeaderStorageComponent } from './header/components/storage.component';
-import { HeaderUserComponent } from './header/components/user.component';
+import { HeaderComponent } from './default/header/header.component';
+import { SidebarComponent } from './default/sidebar/sidebar.component';
+import { HeaderSearchComponent } from './default/header/components/search.component';
+import { HeaderThemeComponent } from './default/header/components/theme.component';
+import { HeaderNotifyComponent } from './default/header/components/notify.component';
+import { HeaderTaskComponent } from './default/header/components/task.component';
+import { HeaderIconComponent } from './default/header/components/icon.component';
+import { HeaderFullScreenComponent } from './default/header/components/fullscreen.component';
+import { HeaderI18nComponent } from './default/header/components/i18n.component';
+import { HeaderStorageComponent } from './default/header/components/storage.component';
+import { HeaderUserComponent } from './default/header/components/user.component';
 
 const COMPONENTS = [
-    LayoutComponent,
+    LayoutDefaultComponent,
     LayoutFullScreenComponent,
     HeaderComponent,
     SidebarComponent
@@ -29,15 +29,15 @@
     HeaderIconComponent,
     HeaderFullScreenComponent,
     HeaderThemeComponent,
-    HeaderLangsComponent,
+    HeaderI18nComponent,
     HeaderStorageComponent,
     HeaderUserComponent
 ];
 
-// pro
-import { ProUserLayoutComponent } from './pro/user/user.component';
-const PRO = [
-    ProUserLayoutComponent
+// passport
+import { LayoutPassportComponent } from './passport/passport.component';
+const PASSPORT = [
+    LayoutPassportComponent
 ];
 
 @NgModule({
@@ -46,11 +46,11 @@
     declarations: [
         ...COMPONENTS,
         ...HEADERCOMPONENTS,
-        ...PRO
+        ...PASSPORT
     ],
     exports: [
         ...COMPONENTS,
-        ...PRO
+        ...PASSPORT
     ]
 })
 export class LayoutModule { }
diff --git a/src/app/layout/passport/passport.component.html b/src/app/layout/passport/passport.component.html
new file mode 100644
index 0000000..4094310
--- /dev/null
+++ b/src/app/layout/passport/passport.component.html
@@ -0,0 +1,17 @@
+<div class="container">
+    <div class="top">
+        <div class="head">
+            <a [routerLink]="['/']">
+                <img class="logo" src="./assets/img/logo_44x44.png">
+                <span class="title">������������������������������������</span>
+            </a>
+        </div>
+        <p class="desc"></p>
+    </div>
+    <router-outlet></router-outlet>
+    <global-footer>
+        <ng-template #copyright>
+            Copyright <nz-icon nzType="copyright"></nz-icon> 2018 <a href="http://www.7drlb.com/" target="_blank">������������������������</a>
+        </ng-template>
+    </global-footer>
+</div>
diff --git a/src/app/layout/pro/user/user.component.less b/src/app/layout/passport/passport.component.less
similarity index 100%
rename from src/app/layout/pro/user/user.component.less
rename to src/app/layout/passport/passport.component.less
diff --git a/src/app/layout/pro/user/user.component.ts b/src/app/layout/passport/passport.component.ts
similarity index 64%
rename from src/app/layout/pro/user/user.component.ts
rename to src/app/layout/passport/passport.component.ts
index 46819db..f16be06 100644
--- a/src/app/layout/pro/user/user.component.ts
+++ b/src/app/layout/passport/passport.component.ts
@@ -1,11 +1,11 @@
 import { Component } from '@angular/core';
 
 @Component({
-    selector: 'pro-user-layout',
-    templateUrl: './user.component.html',
-    styleUrls: ['./user.component.less']
+    selector: 'layout-passport',
+    templateUrl: './passport.component.html',
+    styleUrls: ['./passport.component.less']
 })
-export class ProUserLayoutComponent {
+export class LayoutPassportComponent {
     links = [
         {
             title: '������',
diff --git a/src/app/layout/pro/user/user.component.html b/src/app/layout/pro/user/user.component.html
deleted file mode 100644
index 187cf13..0000000
--- a/src/app/layout/pro/user/user.component.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<div class="container">
-    <div class="top">
-        <div class="head">
-            <a [routerLink]="['/']">
-                <img class="logo" src="./assets/img/logo-color.svg">
-                <span class="title">ng-alain</span>
-            </a>
-        </div>
-        <p class="desc">���������������������������������������������������������������������������</p>
-    </div>
-    <router-outlet></router-outlet>
-    <global-footer [links]="links">
-        <ng-template #copyright>
-            Copyright <nz-icon nzType="copyright"></nz-icon> 2017 <a href="//github.com/cipchk" target="_blank">������</a>������
-        </ng-template>
-    </global-footer>
-</div>
diff --git a/src/app/layout/sidebar/sidebar.component.ts b/src/app/layout/sidebar/sidebar.component.ts
deleted file mode 100644
index 92182e9..0000000
--- a/src/app/layout/sidebar/sidebar.component.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Component } from '@angular/core';
-import { NzMessageService } from 'ng-zorro-antd';
-import { SettingsService } from '@delon/theme';
-
-@Component({
-  selector   : 'app-sidebar',
-  templateUrl: './sidebar.component.html'
-})
-export class SidebarComponent {
-    constructor(public settings: SettingsService, public msgSrv: NzMessageService) {
-    }
-}
diff --git a/src/app/routes/dashboard/analysis/analysis.component.html b/src/app/routes/dashboard/analysis/analysis.component.html
new file mode 100644
index 0000000..69cf79f
--- /dev/null
+++ b/src/app/routes/dashboard/analysis/analysis.component.html
@@ -0,0 +1,288 @@
+<div nz-row [nzGutter]="24" class="pt-lg">
+    <div nz-col nzXs="24" nzSm="12" nzMd="12" nzLg="6">
+        <chart-card
+            [title]="'������������'"
+            total="�� 126,560"
+            contentHeight="46px"
+            [action]="action1"
+            [footer]="footer1">
+            <ng-template #action1>
+                <nz-tooltip [nzTitle]="'������������'">
+                    <nz-icon nz-tooltip nzType="info-circle-o"></nz-icon>
+                </nz-tooltip>
+            </ng-template>
+            <trend flag="up" style="display:block; margin-top:2px;">���������<span class="pl-sm">12%</span></trend>
+            <trend flag="down">���������<span class="pl-sm">11%</span></trend>
+            <ng-template #footer1>
+                <p class="text-truncate">���������������<span class="ml-sm">���12,423</span></p>
+            </ng-template>
+        </chart-card>
+    </div>
+    <div nz-col nzXs="24" nzSm="12" nzMd="12" nzLg="6">
+        <chart-card [title]="'���������'"
+            total="8,848"
+            contentHeight="46px"
+            [action]="action2"
+            [footer]="footer2">
+            <ng-template #action2>
+                <nz-tooltip [nzTitle]="'������������'">
+                    <nz-icon nz-tooltip nzType="info-circle-o"></nz-icon>
+                </nz-tooltip>
+            </ng-template>
+            <mini-area
+                color="#975FE4"
+                height="46"
+                [data]="data.visitData"></mini-area>
+            <ng-template #footer2>
+                <p class="text-truncate">������������<span class="ml-sm">1,234</span></p>
+            </ng-template>
+        </chart-card>
+    </div>
+    <div nz-col nzXs="24" nzSm="12" nzMd="12" nzLg="6">
+        <chart-card [title]="'������������'"
+            total="6,560"
+            contentHeight="46px"
+            [action]="action3"
+            [footer]="footer3">
+            <ng-template #action3>
+                <nz-tooltip [nzTitle]="'������������'">
+                    <nz-icon nz-tooltip nzType="info-circle-o"></nz-icon>
+                </nz-tooltip>
+            </ng-template>
+            <mini-bar
+                height="46"
+                [data]="data.visitData"></mini-bar>
+            <ng-template #footer3>
+                <p class="text-truncate">���������<span class="ml-sm">60%</span></p>
+            </ng-template>
+        </chart-card>
+    </div>
+    <div nz-col nzXs="24" nzSm="12" nzMd="12" nzLg="6">
+        <chart-card [title]="'������������������'"
+            total="78%"
+            contentHeight="46px"
+            [action]="action4"
+            [footer]="footer4">
+            <ng-template #action4>
+                <nz-tooltip [nzTitle]="'������������'">
+                    <nz-icon nz-tooltip nzType="info-circle-o"></nz-icon>
+                </nz-tooltip>
+            </ng-template>
+            <mini-progress
+                height="46"
+                percent="78"
+                strokeWidth="8"
+                target="80"
+                color="#13C2C2"></mini-progress>
+            <ng-template #footer4>
+                <div class="d-flex justify-content-between">
+                    <trend flag="up">���������<span class="pl-sm">12%</span></trend>
+                    <trend flag="down">���������<span class="pl-sm">11%</span></trend>
+                </div>
+            </ng-template>
+        </chart-card>
+    </div>
+</div>
+<nz-card [nzLoading]="loading" [nzBordered]="false" nzNoPadding class="sales-card">
+    <ng-template #body>
+        <nz-tabset>
+            <nz-tab>
+                <ng-template #nzTabHeading>���������</ng-template>
+                <div nz-row>
+                    <div nz-col nzXs="24" nzSm="24" nzMd="12" nzLg="16">
+                        <div class="bar">
+                            <bar
+                                height="295"
+                                [title]="'���������������'"
+                                [data]="data.salesData"></bar>
+                        </div>
+                    </div>
+                    <div nz-col nzXs="24" nzSm="24" nzMd="12" nzLg="8">
+                        <div class="rank-list">
+                            <h4 class="rank-title">���������������������</h4>
+                            <ul>
+                                <li *ngFor="let i of rankingListData; let idx = index">
+                                    <div>
+                                        <span class="icon" [ngClass]="{'active': idx < 3}">{{idx+1}}</span>
+                                        {{i.title}}
+                                    </div>
+                                    <span>{{i.total | number: '3.0'}}</span>
+                                </li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </nz-tab>
+            <nz-tab>
+                <ng-template #nzTabHeading>���������</ng-template>
+                <div nz-row>
+                    <div nz-col nzXs="24" nzSm="24" nzMd="12" nzLg="16">
+                        <div class="bar">
+                            <bar
+                                height="295"
+                                [title]="'���������������'"
+                                [data]="data.salesData"></bar>
+                        </div>
+                    </div>
+                    <div nz-col nzXs="24" nzSm="24" nzMd="12" nzLg="8">
+                        <div class="rank-list">
+                            <h4 class="rank-title">���������������������</h4>
+                            <ul>
+                                <li *ngFor="let i of rankingListData; let idx = index">
+                                    <div>
+                                        <span class="icon" [ngClass]="{'active': idx < 3}">{{idx+1}}</span>
+                                        {{i.title}}
+                                    </div>
+                                    <span>{{i.total | number: '3.0'}}</span>
+                                </li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </nz-tab>
+            <ng-template #nzTabBarExtraContent>
+                <div class="sales-extra-wrap">
+                    <div class="sales-extra">
+                        <a (click)="setDate('today')">������</a>
+                        <a (click)="setDate('week')">������</a>
+                        <a (click)="setDate('month')">������</a>
+                        <a (click)="setDate('year')">������</a>
+                    </div>
+                    <nz-datepicker style="width:120px" class="mr-md" [(ngModel)]="q.start" [nzFormat]="'YYYY-MM-DD'" [nzPlaceHolder]="'������������'"></nz-datepicker>
+                    <nz-datepicker style="width:120px" [(ngModel)]="q.end" [nzFormat]="'YYYY-MM-DD'" [nzPlaceHolder]="'������������'"></nz-datepicker>
+                </div>
+            </ng-template>
+        </nz-tabset>
+    </ng-template>
+</nz-card>
+<div nz-row [nzGutter]="24">
+    <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="12">
+        <nz-card [nzLoading]="loading" [nzBordered]="false" nzTitle="������������������">
+            <ng-template #extra>
+                <nz-dropdown>
+                    <nz-icon class="icon-group" nz-dropdown nzType="ellipsis"></nz-icon>
+                    <ul nz-menu>
+                        <li nz-menu-item>���������</li>
+                        <li nz-menu-item>���������</li>
+                    </ul>
+                </nz-dropdown>
+            </ng-template>
+            <ng-template #body>
+                <div nz-row [nzGutter]="64">
+                    <div nz-col nzXs="24" nzSm="12" class="mb-md">
+                        <number-info total="12,321" subTotal="17.1" status="up" [subTitle]="subTitle">
+                            <ng-template #subTitle>
+                                ���������������
+                                <nz-tooltip [nzTitle]="'������������'">
+                                    <nz-icon nz-tooltip nzType="info-circle-o" class="ml-sm"></nz-icon>
+                                </nz-tooltip>
+                            </ng-template>
+                        </number-info>
+                        <mini-area [line]="true" height="45" [data]="data.visitData2"></mini-area>
+                    </div>
+                    <div nz-col nzXs="24" nzSm="12" class="mb-md">
+                        <number-info subTitle="������������������" total="2.7" subTotal="26.2" status="down"></number-info>
+                        <mini-area [line]="true" height="45" [data]="data.visitData2"></mini-area>
+                    </div>
+                </div>
+                <nz-table #keyTable [nzDataSource]="data.searchData" [nzPageSize]="5" nzSize="small">
+                    <thead nz-thead>
+                        <tr>
+                            <th nz-th><span>������</span></th>
+                            <th nz-th><span>���������������</span></th>
+                            <th nz-th class="text-right">
+                                <span>���������</span>
+                                <nz-table-sort (nzValueChange)="sort('count',$event)"></nz-table-sort>
+                            </th>
+                            <th nz-th class="text-right">
+                                <span>���������</span>
+                                <nz-table-sort (nzValueChange)="sort('range',$event)"></nz-table-sort>
+                            </th>
+                        </tr>
+                    </thead>
+                    <tbody nz-tbody>
+                        <tr nz-tbody-tr *ngFor="let i of keyTable.data">
+                            <td nz-td>{{i.index}}</td>
+                            <td nz-td><a (click)="msg.success(i.keyword)">{{i.keyword}}</a></td>
+                            <td nz-td class="text-right">{{i.count}}</td>
+                            <td nz-td class="text-right">
+                                <trend [flag]="i.status === 1 ? 'down' : 'up'">
+                                    <span>{{i.range}}%</span>
+                                </trend>
+                            </td>
+                        </tr>
+                    </tbody>
+                </nz-table>
+            </ng-template>
+        </nz-card>
+    </div>
+    <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="12">
+        <nz-card [nzLoading]="loading" [nzBordered]="false" nzTitle="���������������������" [nzBodyStyle]="{'padding.px': 24}" class="sales-card" style="min-height: 482px;">
+            <ng-template #extra>
+                <div class="sales-card-extra">
+                    <nz-dropdown>
+                        <nz-icon class="icon-group" nz-dropdown nzType="ellipsis"></nz-icon>
+                        <ul nz-menu>
+                            <li nz-menu-item>���������</li>
+                            <li nz-menu-item>���������</li>
+                        </ul>
+                    </nz-dropdown>
+                    <div class="sales-type-radio">
+                        <nz-radio-group [(ngModel)]="salesType" (ngModelChange)="changeSaleType()" [nzSize]="'large'">
+                            <label nz-radio-button [nzValue]="'all'"><span>������������</span></label>
+                            <label nz-radio-button [nzValue]="'online'"><span>������</span></label>
+                            <label nz-radio-button [nzValue]="'offline'"><span>������</span></label>
+                        </nz-radio-group>
+                    </div>
+                </div>
+            </ng-template>
+            <ng-template #body>
+                <h4 class="margin:8px 0 32px 0;">���������</h4>
+                <pie
+                    [hasLegend]="true"
+                    subTitle="���������"
+                    [height]="248"
+                    [lineWidth]="4"
+                    [total]="salesTotal"
+                    [data]="salesPieData"
+                    [valueFormat]="handlePieValueFormat">
+                </pie>
+            </ng-template>
+        </nz-card>
+    </div>
+</div>
+<nz-card [nzLoading]="loading" [nzBordered]="false" [nzBodyStyle]="{'padding': '0 0 32px'}" class="offline-card mt-lg">
+    <ng-template #body>
+        <nz-tabset [(nzSelectedIndex)]="_activeTab" (nzSelectChange)="_tabChange($event)">
+            <nz-tab *ngFor="let tab of data.offlineData; let i = index;">
+                <ng-template #nzTabHeading>
+                    <div nz-row [nzGutter]="8" style="width: 138px; margin: 8px 0">
+                        <div nz-col [nzSpan]="12">
+                            <number-info
+                                [title]="tab.name"
+                                subTitle="���������"
+                                gap="2"
+                                [total]="(tab.cvr * 100) + '%'"
+                                [theme]="i !== _activeTab && 'light'"></number-info>
+                        </div>
+                        <div nz-col [nzSpan]="12" style="padding-top: 36px">
+                            <pie
+                                [animate]="false"
+                                [color]="i !== _activeTab && '#BDE4FF'"
+                                [inner]="0.55"
+                                [tooltip]="false"
+                                [padding]="[0, 0, 0, 0]"
+                                [percent]="tab.cvr * 100"
+                                [height]="64">
+                            </pie>
+                        </div>
+                    </div>
+                </ng-template>
+                <div class="px-lg">
+                    <timeline [data]="tab.chart"
+                              [titleMap]="{ y1: '���������', y2: '������������' }"></timeline>
+                </div>
+            </nz-tab>
+        </nz-tabset>
+    </ng-template>
+</nz-card>
diff --git a/src/app/routes/dashboard/analysis/analysis.component.less b/src/app/routes/dashboard/analysis/analysis.component.less
new file mode 100644
index 0000000..1cf0646
--- /dev/null
+++ b/src/app/routes/dashboard/analysis/analysis.component.less
@@ -0,0 +1,149 @@
+@import '~@delon/theme/styles/antd/themes/default.less';
+
+:host ::ng-deep {
+	.icon-group {
+		transition: color 0.32s;
+		color: @text-color-secondary;
+		cursor: pointer;
+		margin-left: 16px;
+		&:hover {
+			color: @text-color;
+		}
+	}
+
+	.rank-list {
+		padding: 0px 32px 32px 72px;
+		ul {
+			margin-top: 25px;
+		}
+		li {
+			zoom: 1;
+			margin-top: 16px;
+			display: flex;
+			justify-content: space-between;
+			.icon {
+				background-color: #f5f5f5;
+				border-radius: 20px;
+				display: inline-block;
+				font-size: 12px;
+				font-weight: 600;
+				margin-right: 24px;
+				height: 20px;
+				line-height: 20px;
+				width: 20px;
+				text-align: center;
+			}
+			.active {
+				background-color: #314659;
+				color: #fff;
+			}
+		}
+	}
+
+	.sales-extra {
+		display: inline-block;
+		margin-right: 24px;
+		a {
+			margin-left: 24px;
+        }
+	}
+
+	.sales-card {
+        .bar {
+            padding: 0px 0px 32px 32px;
+        }
+        .rank {
+            padding: 0 32px 32px 72px;
+        }
+		.ant-tabs-tab {
+			padding-top: 16px;
+            padding-bottom: 14px;
+            line-height: 24px;
+        }
+
+        .ant-tabs-extra-content {
+            padding-right: 24px;
+            line-height: 55px;
+        }
+
+		.ant-card-head {
+			position: relative;
+		}
+    }
+
+    .sales-card-extra {
+        height: 68px;
+    }
+
+    .sales-type-radio {
+        position: absolute;
+        left: 24px;
+        bottom: 15px;
+    }
+
+    .offline-card {
+        .ant-tabs-ink-bar {
+            bottom: auto;
+        }
+        .ant-tabs-bar {
+            border-bottom: none;
+        }
+        .ant-tabs-nav-container-scrolling {
+            padding-left: 40px;
+            padding-right: 40px;
+        }
+        .ant-tabs-tab-prev-icon:before {
+            position: relative;
+            left: 6px;
+        }
+        .ant-tabs-tab-next-icon:before {
+            position: relative;
+            right: 6px;
+        }
+    }
+
+    .trend-text {
+        margin-left: 8px;
+        color: @heading-color;
+    }
+
+    @media screen and (max-width: @screen-lg) {
+        .sales-extra {
+            display: none;
+        }
+
+        .rank-list {
+            li {
+                span:first-child {
+                    margin-right: 8px;
+                }
+            }
+        }
+    }
+
+    @media screen and (max-width: @screen-md) {
+        .rank-title {
+            margin-top: 16px;
+        }
+
+        .sales-card .bar {
+            padding: 16px;
+        }
+    }
+
+    @media screen and (max-width: @screen-sm) {
+        .sales-extra-wrap {
+            display: none;
+        }
+
+        .sales-card {
+            .ant-tabs-content {
+              padding-top: 30px;
+            }
+        }
+    }
+
+	.ant-table-pagination {
+		margin-bottom: 0;
+	}
+}
diff --git a/src/app/routes/dashboard/analysis/analysis.component.ts b/src/app/routes/dashboard/analysis/analysis.component.ts
new file mode 100644
index 0000000..0bc230f
--- /dev/null
+++ b/src/app/routes/dashboard/analysis/analysis.component.ts
@@ -0,0 +1,82 @@
+import { HttpClient } from '@angular/common/http';
+import { Component, OnInit } from '@angular/core';
+import { NzMessageService } from 'ng-zorro-antd';
+import { getTimeDistance, yuan } from '@delon/abc';
+import { _HttpClient } from '@delon/theme';
+
+@Component({
+    selector: 'app-dashboard-analysis',
+    templateUrl: './analysis.component.html',
+    styleUrls: ['./analysis.component.less']
+})
+export class DashboardAnalysisComponent implements OnInit {
+    
+    data: any = {
+        salesData: [],
+        offlineData: []
+    };
+    loading = true;
+    q: any = {
+        start: null,
+        end: null
+    };
+    rankingListData: any[] = Array(7).fill({}).map((item, i) => {
+        return {
+            title: `��������� ${i} ������`,
+            total: 323234
+        };
+    });
+
+    constructor(private http: _HttpClient, public msg: NzMessageService,
+    private http2: HttpClient) {}
+
+    ngOnInit() {
+        // this.http.get('/chart').subscribe((res: any) => {
+        //     res.offlineData.forEach((item: any) => {
+        //         item.chart = Object.assign([], res.offlineChartData);
+        //     });
+        //     this.data = res;
+        //     this.loading = false;
+        //     this.changeSaleType();
+        // });
+    }
+
+    setDate(type: any) {
+        const rank = getTimeDistance(type);
+        this.q.start = rank[0];
+        this.q.end = rank[1];
+    }
+
+    sort(sortName, sortValue) {
+        this.data.searchData = [
+            ...(<any[]>this.data.searchData).sort((a, b) => {
+                if (a[ sortName ] > b[ sortName ]) {
+                    return (sortValue === 'ascend') ? 1 : -1;
+                } else if (a[ sortName ] < b[ sortName ]) {
+                    return (sortValue === 'ascend') ? -1 : 1;
+                } else {
+                    return 0;
+                }
+            })
+        ];
+    }
+
+    salesType = 'all';
+    salesPieData: any;
+    salesTotal = 0;
+    changeSaleType() {
+        this.salesPieData = this.salesType === 'all' ? this.data.salesTypeData : (
+            this.salesType === 'online' ? this.data.salesTypeDataOnline : this.data.salesTypeDataOffline
+        );
+        if (this.salesPieData) this.salesTotal = this.salesPieData.reduce((pre, now) => now.y + pre, 0);
+    }
+
+    handlePieValueFormat(value: any) {
+        return yuan(value);
+    }
+
+    _activeTab = 0;
+    _tabChange(value: any) {
+        console.log('tab', this._activeTab, value);
+    }
+}
diff --git a/src/app/routes/dashboard/monitor/monitor.component.html b/src/app/routes/dashboard/monitor/monitor.component.html
new file mode 100644
index 0000000..9b8223c
--- /dev/null
+++ b/src/app/routes/dashboard/monitor/monitor.component.html
@@ -0,0 +1,98 @@
+<div nz-row [nzGutter]="24" class="pt-lg">
+    <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="18">
+        <nz-card nzTitle="������������������������" [nzBordered]="false" class="mb-lg">
+            <div nz-row>
+                <div nz-col nzXs="24" nzSm="12" nzMd="6">
+                    <number-info subTitle="������������������" [total]="'124,543,233'" suffix="���"></number-info>
+                </div>
+                <div nz-col nzXs="24" nzSm="12" nzMd="6">
+                    <number-info subTitle="���������������������" [total]="'92%'"></number-info>
+                </div>
+                <div nz-col nzXs="24" nzSm="12" nzMd="6">
+                    <number-info subTitle="������������������" [total]="lastTotalTime">
+                        <ng-template #lastTotalTime><count-down [target]="30"></count-down></ng-template>
+                    </number-info>
+                </div>
+                <div nz-col nzXs="24" nzSm="12" nzMd="6">
+                    <number-info subTitle="������������������" [total]="234" suffix="���"></number-info>
+                </div>
+            </div>
+            <div class="map-chart">
+                <nz-tooltip [nzTitle]="'������������������'">
+                    <img nz-tooltip src="https://gw.alipayobjects.com/zos/rmsportal/HBWnDEUXCnGnGrRfrpKa.png" alt="map" />
+                </nz-tooltip>
+            </div>
+        </nz-card>
+    </div>
+    <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="6">
+        <nz-card nzTitle="������������������" [nzBordered]="false" class="mb-lg">
+            <div class="active-chart">
+                <number-info subTitle="������������" total="������������������"></number-info>
+                <mini-area [animate]="false"
+                        [line]="true"
+                        [borderWidth]="2"
+                        [height]="84"
+                        [yAxis]="activeYAxis"
+                        [data]="activeData"></mini-area>
+                <ng-container *ngIf="activeData?.length > 0">
+                    <div class="active-grid">
+                        <p>{{activeStat.max}} ������</p>
+                        <p>{{activeStat.min}} ������</p>
+                    </div>
+                    <div class="active-legend">
+                        <span>00:00</span>
+                        <span>{{activeStat.t1}}</span>
+                        <span>{{activeStat.t2}}</span>
+                    </div>
+                </ng-container>
+            </div>
+        </nz-card>
+        <nz-card nzTitle="������������" [nzBordered]="false" [nzBodyStyle]="{'text-align': 'center'}" class="mb-lg">
+            <gauge [title]="'���������'" [height]="180" [percent]="87" [format]="couponFormat"></gauge>
+        </nz-card>
+    </div>
+</div>
+<div nz-row [nzGutter]="24">
+    <div nz-col nzXs="24" nzSm="24" nzLg="12" class="mb-lg">
+        <nz-card nzTitle="���������������" [nzBordered]="false" class="pie-card">
+            <div nz-row [nzGutter]="4" style="padding:16px 0">
+                <div nz-col [nzSpan]="8">
+                    <pie [animate]="false"
+                         [percent]="28"
+                         subTitle="������������"
+                         total="28%"
+                         [height]="128"
+                         [lineWidth]="2"></pie>
+                </div>
+                <div nz-col [nzSpan]="8">
+                    <pie [animate]="false"
+                         color="#5DDECF"
+                         [percent]="22"
+                         subTitle="������"
+                         total="22%"
+                         [height]="128"
+                         [lineWidth]="2"></pie>
+                </div>
+                <div nz-col [nzSpan]="8">
+                    <pie [animate]="false"
+                         color="#2FC25B"
+                         [percent]="32"
+                         subTitle="������"
+                         total="32%"
+                         [height]="128"
+                         [lineWidth]="2"></pie>
+                </div>
+            </div>
+        </nz-card>
+    </div>
+    <div nz-col nzXs="24" nzSm="24" nzLg="6" class="mb-lg">
+        <nz-card nzTitle="������������" [nzBordered]="false" [nzBodyStyle]="{'overflow': 'hidden'}">
+            <tag-cloud [data]="tags" [height]="165"></tag-cloud>
+        </nz-card>
+    </div>
+    <div nz-col nzXs="24" nzSm="24" nzLg="6" class="mb-lg">
+        <nz-card nzTitle="������������" [nzBordered]="false" [nzBodyStyle]="{'overflow': 'hidden'}">
+            <water-wave [title]="'������������������'" [percent]="34" [height]="165"></water-wave>
+        </nz-card>
+    </div>
+</div>
diff --git a/src/app/routes/dashboard/monitor/monitor.component.less b/src/app/routes/dashboard/monitor/monitor.component.less
new file mode 100644
index 0000000..0486ca6
--- /dev/null
+++ b/src/app/routes/dashboard/monitor/monitor.component.less
@@ -0,0 +1,60 @@
+@import '~@delon/theme/styles/antd/themes/default.less';
+
+:host ::ng-deep {
+    .map-chart {
+        padding-top: 24px;
+        height: 457px;
+        text-align: center;
+        img {
+            display: inline-block;
+            max-width: 100%;
+            max-height: 437px;
+        }
+    }
+    .pie-card {
+        .pie-stat {
+            font-size: 24px !important;
+        }
+    }
+
+    .active-chart {
+        position: relative;
+        mini-area {
+            margin-top: 32px;
+        }
+        .active-grid {
+            p {
+                position: absolute;
+                top: 80px;
+            }
+            p:last-child {
+                top: 115px;
+            }
+        }
+        .active-legend {
+            position: relative;
+            font-size: 0;
+            margin-top: 8px;
+            height: 20px;
+            line-height: 20px;
+            span {
+                display: inline-block;
+                font-size: 12px;
+                text-align: center;
+                width: 33.33%;
+            }
+            span:first-child {
+                text-align: left;
+            }
+            span:last-child {
+                text-align: right;
+            }
+        }
+    }
+
+    @media screen and (max-width: @screen-lg) {
+        .map-chart {
+            height: auto;
+        }
+    }
+}
diff --git a/src/app/routes/dashboard/monitor/monitor.component.ts b/src/app/routes/dashboard/monitor/monitor.component.ts
new file mode 100644
index 0000000..7cc09d2
--- /dev/null
+++ b/src/app/routes/dashboard/monitor/monitor.component.ts
@@ -0,0 +1,96 @@
+import { Component, OnInit, OnDestroy } from '@angular/core';
+import { NzMessageService } from 'ng-zorro-antd';
+import { zip } from 'rxjs/observable/zip';
+import { getTimeDistance, yuan, fixedZero } from '@delon/abc';
+import { _HttpClient } from '@delon/theme';
+
+@Component({
+    selector: 'app-dashboard-monitor',
+    templateUrl: './monitor.component.html',
+    styleUrls: ['./monitor.component.less']
+})
+export class DashboardMonitorComponent implements OnInit, OnDestroy {
+    data: any = { };
+    tags = [];
+    loading = true;
+    q: any = {
+        start: null,
+        end: null
+    };
+
+    constructor(private http: _HttpClient, public msg: NzMessageService) {}
+
+    ngOnInit() {
+        // zip(
+        //     this.http.get('/chart'),
+        //     this.http.get('/chart/tags')
+        // ).subscribe(([ res, tags ]) => {
+        //     this.data = res;
+        //     tags['list'][Math.floor(Math.random() *  tags['list'].length) + 1].value = 1000;
+        //     this.tags =  tags['list'];
+        //     this.loading = false;
+        // });
+
+        // // active chart
+        // this.genActiveData();
+        // this.activeTime$ = setInterval(() => this.genActiveData(), 1000);
+    }
+
+    // region: active chart
+
+    activeTime$: any;
+
+    activeYAxis = {
+        tickCount: 3,
+        tickLine: false,
+        labels: false,
+        title: false,
+        line: false
+    };
+
+    activeData: any[] = [];
+
+    activeStat = {
+        max: 0,
+        min: 0,
+        t1: '',
+        t2: ''
+    };
+
+    genActiveData() {
+        const activeData = [];
+        for (let i = 0; i < 24; i += 1) {
+            activeData.push({
+                x: `${fixedZero(i)}:00`,
+                y: (i * 50) + (Math.floor(Math.random() * 200)),
+            });
+        }
+        this.activeData = activeData;
+        // stat
+        this.activeStat.max = [...activeData].sort()[activeData.length - 1].y + 200;
+        this.activeStat.min = [...activeData].sort()[Math.floor(activeData.length / 2)].y;
+        this.activeStat.t1 = activeData[Math.floor(activeData.length / 2)].x;
+        this.activeStat.t2 = activeData[activeData.length - 1].x;
+    }
+
+    // endregion
+
+    couponFormat(val: any) {
+        switch (parseInt(val, 10)) {
+            case 20:
+              return '���';
+            case 40:
+              return '���';
+            case 60:
+              return '���';
+            case 80:
+              return '���';
+            default:
+              return '';
+        }
+    }
+
+    ngOnDestroy(): void {
+        if (this.activeTime$) clearInterval(this.activeTime$);
+    }
+}
diff --git a/src/app/routes/dashboard/v1/v1.component.html b/src/app/routes/dashboard/v1/v1.component.html
new file mode 100644
index 0000000..21cb2f0
--- /dev/null
+++ b/src/app/routes/dashboard/v1/v1.component.html
@@ -0,0 +1,150 @@
+<div class="content__title">
+    <h1>
+        Dashboard
+        <small class="text-sm hidden-xs">Welcome !</small>
+    </h1>
+</div>
+<div class="quick-menu" [class.show]="quickMenu" (click)="quickMenu=!quickMenu">
+    <div class="quick-menu-inner">
+        <div class="settings-ctrl">
+            <i class="anticon anticon-question-circle-o"></i>
+        </div>
+        <div class="list-group list-group-flush">
+            <a (click)="msg.info('item 1')" class="list-group-item">How do i create account?</a>
+            <a (click)="msg.info('item 2')" class="list-group-item">How do i create account?</a>
+            <a (click)="msg.info('item 3')" class="list-group-item">How do i create account?</a>
+            <a (click)="msg.info('item 4')" class="list-group-item">How do i create account?</a>
+            <a (click)="msg.info('item 5')" class="list-group-item">How do i create account?</a>
+        </div>
+    </div>
+</div>
+<div nz-row nzGutter="16">
+    <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
+        <div nz-row nzType="flex" nzAlign="middle" class="bg-primary rounded-md">
+            <div nz-col nzSpan="12" class="p-md text-white">
+                <div class="h2 mt0">123,456</div>
+                <p class="text-nowrap">Website Traffics</p>
+            </div>
+            <div nz-col nzSpan="12">
+                <mini-bar height="35" color="#fff" borderWidth="3" [padding]="[36, 30, 30, 30]" [data]="webSite"></mini-bar>
+            </div>
+        </div>
+    </div>
+    <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
+        <div nz-row nzType="flex" nzAlign="middle" class="bg-success rounded-md">
+            <div nz-col nzSpan="12" class="p-md text-white">
+                <div class="h2 mt0">234,567K</div>
+                <p class="text-nowrap">Website Impressions</p>
+            </div>
+            <div nz-col nzSpan="12">
+                <mini-bar height="35" color="#fff" borderWidth="3" [padding]="[36, 30, 30, 30]" [data]="webSite"></mini-bar>
+            </div>
+        </div>
+    </div>
+    <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
+        <div nz-row nzType="flex" nzAlign="middle" class="bg-orange rounded-md">
+            <div nz-col nzSpan="12" class="p-md text-white">
+                <div class="h2 mt0">$458,778</div>
+                <p class="text-nowrap">Total Sales</p>
+            </div>
+            <div nz-col nzSpan="12">
+                <mini-bar height="35" color="#fff" borderWidth="3" [padding]="[36, 30, 30, 30]" [data]="webSite"></mini-bar>
+            </div>
+        </div>
+    </div>
+    <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
+        <div nz-row nzType="flex" nzAlign="middle" class="bg-pink rounded-md">
+            <div nz-col nzSpan="12" class="p-md text-white">
+                <div class="h2 mt0">456</div>
+                <p class="text-nowrap">Support Tickets</p>
+            </div>
+            <div nz-col nzSpan="12">
+                <mini-bar height="35" color="#fff" borderWidth="3" [padding]="[36, 30, 30, 30]" [data]="webSite"></mini-bar>
+            </div>
+        </div>
+    </div>
+</div>
+<div nz-row nzGutter="16">
+    <div nz-col nzXs="24" nzMd="12">
+        <nz-card [nzBordered]="false">
+            <ng-template #title>
+                Sales Statistics
+                <small class="text-sm font-weight-normal">Business Expectations & Retail Sales Statistics</small>
+            </ng-template>
+            <bar
+                height="275"
+                [data]="salesData"></bar>
+        </nz-card>
+    </div>
+    <div nz-col nzXs="24" nzMd="12">
+        <nz-card [nzTitle]="nzTitle" [nzBordered]="false">
+            <ng-template #nzTitle>
+                Growth Rate
+                <small class="text-sm font-weight-normal">Business Expectations & Retail Sales Statistics</small>
+            </ng-template>
+            <timeline [data]="offlineChartData" [height]="239" [padding]="[0, 0, 0, 0]"
+                      [titleMap]="{ y1: '���������', y2: '������������' }"></timeline>
+        </nz-card>
+    </div>
+</div>
+<div nz-row nzGutter="16">
+    <div nz-col nzXs="24" nzMd="12">
+        <nz-card [nzBordered]="false" class="ant-card__img">
+            <img class="img" src="//os.alipayobjects.com/rmsportal/GhjqstwSgxBXrZS.png">
+            <div class="p-md">
+                <h3>ANT DESIGN</h3>
+                <p class="text-grey">A UI Design Language</p>
+                <ol class="list-styled text-lg pt-md">
+                    <li>Designed by experienced team, and showcase dozens of inspiring projects.</li>
+                    <li>Provide solutions for usual problems that may be encountered while developing enterprise-like complex UIs.</li>
+                    <li>Dozens of flexible and practical reusable components that increase your productivity.</li>
+                </ol>
+                <p class="pt-md">
+                    <a class="text-grey" href="//ng.ant.design" target="_blank">View Site...</a>
+                </p>
+            </div>
+        </nz-card>
+    </div>
+    <div nz-col nzXs="24" nzMd="12">
+        <nz-card [nzTitle]="nzTitle" [nzBordered]="false" nzNoPadding>
+            <ng-template #nzTitle>
+                Recent Posts
+                <small class="text-sm font-weight-normal">Venenatis portauam Inceptos ameteiam</small>
+            </ng-template>
+            <div nz-row [nzType]="'flex'" [nzJustify]="'center'" [nzAlign]="'middle'" class="py-sm bg-grey-lighter-h point"
+                *ngFor="let item of todoData">
+                <div nz-col [nzSpan]="4" class="text-center">
+                    <nz-avatar [nzSrc]="'./assets/img/' + item.avatar + '.png'" [nzSize]="'large'"></nz-avatar>
+                </div>
+                <div nz-col [nzSpan]="20">
+                    <strong>{{item.name}}</strong>
+                    <p>{{item.content}}</p>
+                </div>
+            </div>
+        </nz-card>
+    </div>
+    <div nz-col nzXs="24" nzMd="12">
+        <nz-card nzTitle="Todo lists" [nzBordered]="false" nzNoPadding>
+            <div nz-row [nzType]="'flex'" [nzJustify]="'center'" [nzAlign]="'middle'" class="py-sm bg-grey-lighter-h point"
+                *ngFor="let item of todoData">
+                <div nz-col [nzSpan]="4" class="text-center">
+                    <nz-avatar [nzSrc]="'./assets/img/' + item.avatar + '.png'" [nzSize]="'large'"></nz-avatar>
+                </div>
+                <div nz-col [nzSpan]="18">
+                    <strong>{{item.name}}</strong>
+                    <p [class.text-deleted]="item.completed">{{item.content}}</p>
+                </div>
+                <div nz-col [nzSpan]="2" class="text-right pr-md">
+                    <nz-dropdown [nzPlacement]="'topRight'">
+                        <i nz-dropdown class="icon-options-vertical"></i>
+                        <ul nz-menu>
+                            <li nz-menu-item *ngIf="item.completed" (click)="item.completed=false">Active</li>
+                            <li nz-menu-item *ngIf="!item.completed" (click)="item.completed=true">Completed</li>
+                            <li nz-menu-item (click)="todoData.splice(todoData.indexOf(item), 1)">Delted</li>
+                        </ul>
+                    </nz-dropdown>
+                </div>
+            </div>
+        </nz-card>
+    </div>
+</div>
diff --git a/src/app/routes/dashboard/v1/v1.component.spec.ts b/src/app/routes/dashboard/v1/v1.component.spec.ts
new file mode 100644
index 0000000..906dd4e
--- /dev/null
+++ b/src/app/routes/dashboard/v1/v1.component.spec.ts
@@ -0,0 +1,16 @@
+import { TestBed, TestModuleMetadata } from '@angular/core/testing';
+import { setUpTestBed } from '../../../../testing/common.spec';
+
+import { DashboardV1Component } from './v1.component';
+
+describe('Comoponent: DashboardV1', () => {
+    setUpTestBed(<TestModuleMetadata>{
+        declarations: [ DashboardV1Component ]
+    });
+
+    it('should create an instance', () => {
+        const fixture = TestBed.createComponent(DashboardV1Component);
+        const comp = fixture.debugElement.componentInstance;
+        expect(comp).toBeTruthy();
+    });
+});
diff --git a/src/app/routes/dashboard/v1/v1.component.ts b/src/app/routes/dashboard/v1/v1.component.ts
new file mode 100644
index 0000000..860fbe8
--- /dev/null
+++ b/src/app/routes/dashboard/v1/v1.component.ts
@@ -0,0 +1,41 @@
+import { LoginService } from '@business/services/http/login.service';
+import { NzMessageService } from 'ng-zorro-antd';
+import { Component, OnInit } from '@angular/core';
+import { _HttpClient } from '@delon/theme';
+
+@Component({
+    selector: 'app-dashboard-v1',
+    templateUrl: './v1.component.html'
+})
+export class DashboardV1Component implements OnInit {
+
+    constructor(private http: _HttpClient, public msg: NzMessageService,
+    public loginService: LoginService) { }
+
+    todoData: any[] = [
+        { completed: true, avatar: '1', name: '���������', content: `������������������������������������������` },
+        { completed: false, avatar: '2', name: '������������', content: `���������������������������������������` },
+        { completed: false, avatar: '3', name: 'cipchk', content: `this world was never meant for one as beautiful as you.` },
+        { completed: false, avatar: '4', name: 'Kent', content: `my heart is beating with hers` },
+        { completed: false, avatar: '5', name: 'Are you', content: `They always said that I love beautiful girl than my friends` },
+        { completed: false, avatar: '6', name: 'Forever', content: `Walking through green fields ���sunshine in my eyes.` }
+    ];
+
+    quickMenu = false;
+
+    webSite: any[] = [ ];
+    salesData: any[] =  [ ];
+    offlineChartData: any[] = [];
+
+    ngOnInit() {
+                // ������������������,������������������������
+                setTimeout(() => {
+                    this.loginService.loadUserContext();
+                }, 1);
+        // this.http.get('/chart').subscribe((res: any) => {
+        //     this.webSite = res.visitData.slice(0, 10);
+        //     this.salesData = res.salesData;
+        //     this.offlineChartData = res.offlineChartData;
+        // });
+    }
+}
diff --git a/src/app/routes/dashboard/workplace/workplace.component.html b/src/app/routes/dashboard/workplace/workplace.component.html
new file mode 100644
index 0000000..5566b14
--- /dev/null
+++ b/src/app/routes/dashboard/workplace/workplace.component.html
@@ -0,0 +1,262 @@
+<pro-header>
+    <ng-template #breadcrumb>
+        <nz-breadcrumb>
+            <nz-breadcrumb-item><a [routerLink]="['/']">������</a></nz-breadcrumb-item>
+            <nz-breadcrumb-item>���������</nz-breadcrumb-item>
+        </nz-breadcrumb>
+    </ng-template>
+    <ng-template #content>
+        <div class="page-header">
+            <div class="avatar"><nz-avatar nzSize="large" nzSrc="https://gw.alipayobjects.com/zos/rmsportal/lctvVCLfRpYCkYxAsiVQ.png"></nz-avatar></div>
+            <div class="desc">
+                <div class="desc-title">���������admin���</div>
+                <p>��������������� | ������������������������������������������������������������</p>
+            </div>
+        </div>
+    </ng-template>
+    <ng-template #extra>
+        <div class="page-extra">
+            <div>
+                <p>������</p>
+                <p>8<span> / 24</span></p>
+            </div>
+            <div>
+                <p>������������</p>
+                <p>20</p>
+            </div>
+        <!--
+            <div>
+                <p>���������</p>
+                <p>1532</p>
+            </div>
+            <div>
+                <p>������������</p>
+                <p>2,223</p>
+            </div>
+        -->
+        </div>
+    </ng-template>
+</pro-header>
+
+<div nz-row [nzGutter]="24" class="pt-lg" style="margin-top: -24px;">
+    <div nz-col nzXs="24" nzSm="12" nzMd="12" nzLg="6">
+        <chart-card [title]="'���������������'" total="{{totalDeviceCount | number: '1.0'}}" contentHeight="46px" [action]="action1" [footer]="footer1"
+        [loading]="deviceCountLoading">
+            <ng-template #action1>
+                <nz-tooltip [nzTitle]="'���������������������������������������������������������'">
+                    <nz-icon nz-tooltip nzType="info-circle-o"></nz-icon>
+                </nz-tooltip>
+            </ng-template>
+            <!--
+            <trend flag="up" style="display:block; margin-top:2px;">���������<span class="pl-sm">12%</span></trend>
+            <trend flag="down">���������<span class="pl-sm">11%</span></trend>
+            -->
+            <mini-bar height="46" [data]="totalDeviceCountList"></mini-bar>
+            <ng-template #footer1>
+                <p class="text-truncate">������������������:<span class="ml-sm">{{avgDeviceCount}}</span></p>
+            </ng-template>
+        </chart-card>
+    </div>
+    <div nz-col nzXs="24" nzSm="12" nzMd="12" nzLg="6">
+        <chart-card [title]="'������������������'" [total]="operNormalPercent + '%'" contentHeight="46px" [action]="action2" [footer]="footer2"
+        [loading] = "operationLoading">
+            <ng-template #action2>
+                <nz-tooltip [nzTitle]="'������������������������������������������������������'">
+                    <nz-icon nz-tooltip nzType="info-circle-o"></nz-icon>
+                </nz-tooltip>
+            </ng-template>
+            <mini-progress height="46" [percent]="operNormalPercent" strokeWidth="8" target="80" color="#13C2C2"></mini-progress>
+            <ng-template #footer2>
+                <div class="d-flex justify-content-between">
+                    <trend flag="up">������������<span class="pl-sm">8%</span></trend>
+                    <trend flag="down">������������<span class="pl-sm">2%</span></trend>
+                </div>
+            </ng-template>
+        </chart-card>
+    </div>
+    <div nz-col nzXs="24" nzSm="12" nzMd="12" nzLg="6">
+        <chart-card [title]="'������������������'" [total]="alarmCountCurrMonth" [loading]="alarmCountLoading" contentHeight="46px" [action]="action3" [footer]="footer3">
+            <ng-template #action3>
+                <nz-tooltip [nzTitle]="'���������������������������������������������'">
+                    <nz-icon nz-tooltip nzType="info-circle-o"></nz-icon>
+                </nz-tooltip>
+            </ng-template>
+            <mini-area
+                color="#975FE4"
+                height="46"
+                [data]="alarmCountList"></mini-area>
+            <ng-template #footer3>
+                <p class="text-truncate">������������������:<span class="ml-sm">{{ alarmCountCurrDay }}</span></p>
+            </ng-template>
+        </chart-card>
+    </div>
+    <div nz-col nzXs="24" nzSm="12" nzMd="12" nzLg="6">
+        <chart-card [title]="'������������������'" total="1,260" contentHeight="46px" [action]="action4" [footer]="footer4">
+            <ng-template #action4>
+                <nz-tooltip [nzTitle]="'������������������������������������������������'">
+                    <nz-icon nz-tooltip nzType="info-circle-o"></nz-icon>
+                </nz-tooltip>
+            </ng-template>
+            <mini-bar
+                height="46"
+                color="gray"
+                [data]="data.visitData"></mini-bar>
+            <ng-template #footer4>
+                <p class="text-truncate">������������������:<span class="ml-sm">60</span></p>
+            </ng-template>
+        </chart-card>
+    </div>
+</div>
+<nz-card [nzLoading]="loading" [nzBordered]="false" nzNoPadding class="sales-card">
+    <ng-template #body>
+        <nz-tabset (nzSelectedIndexChange)=selectedIndexChange($event) >
+            <nz-tab *ngFor="let alarmData of alarmDatas">
+                <ng-template #nzTabHeading>{{alarmData.title}}������</ng-template>
+                <div nz-row>
+                    <div nz-col nzXs="24" nzSm="24" nzMd="12" nzLg="16">
+                        <div class="bar">
+                            <bar height="295" [title]="alarmData.title+'������������������'" [data]="alarmData.data" color="{{alarmData.color}}"></bar>
+                        </div>
+                    </div>
+                    <div nz-col nzXs="24" nzSm="24" nzMd="12" nzLg="8">
+                        <div class="rank-list">
+                            <h4 class="rank-title">������������������</h4>
+                            <ul>
+                                <li *ngFor="let i of rankingListData; let idx = index">
+                                    <div *ngIf="idx < 7">
+                                        <span class="icon" [ngClass]="{'active': idx < 3}">{{idx+1}}</span>
+                                        {{i.title}}
+                                    </div>
+                                    <span *ngIf="idx < 7">{{i.total | number: '1.0'}}</span>
+                                </li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </nz-tab>
+        </nz-tabset>
+    </ng-template>
+</nz-card>
+<div nz-row [nzGutter]="24">
+    <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="12">
+        <nz-card [nzLoading]="loading" [nzBordered]="false" nzTitle="������������������">
+            <ng-template #extra>
+                <nz-dropdown>
+                    <nz-icon class="icon-group" nz-dropdown nzType="ellipsis"></nz-icon>
+                    <ul nz-menu>
+                        <li nz-menu-item>���������</li>
+                        <li nz-menu-item>���������</li>
+                    </ul>
+                </nz-dropdown>
+            </ng-template>
+            <ng-template #body>
+                <div nz-row [nzGutter]="64">
+                    <div nz-col nzXs="24" nzSm="12" class="mb-md">
+                        <number-info total="12,321" subTotal="17.1" status="up" [subTitle]="subTitle">
+                            <ng-template #subTitle>
+                                ���������������
+                                <nz-tooltip [nzTitle]="'������������'">
+                                    <nz-icon nz-tooltip nzType="info-circle-o" class="ml-sm"></nz-icon>
+                                </nz-tooltip>
+                            </ng-template>
+                        </number-info>
+                        <mini-area [line]="true" height="45" [data]="data.visitData2"></mini-area>
+                    </div>
+                    <div nz-col nzXs="24" nzSm="12" class="mb-md">
+                        <number-info subTitle="������������������" total="2.7" subTotal="26.2" status="down"></number-info>
+                        <mini-area [line]="true" height="45" [data]="data.visitData2"></mini-area>
+                    </div>
+                </div>
+                <nz-table #keyTable [nzDataSource]="data.searchData" [nzPageSize]="5" nzSize="small">
+                    <thead nz-thead>
+                    <tr>
+                        <th nz-th><span>������</span></th>
+                        <th nz-th><span>���������������</span></th>
+                        <th nz-th class="text-right">
+                            <span>���������</span>
+                            <nz-table-sort (nzValueChange)="sort('count',$event)"></nz-table-sort>
+                        </th>
+                        <th nz-th class="text-right">
+                            <span>���������</span>
+                            <nz-table-sort (nzValueChange)="sort('range',$event)"></nz-table-sort>
+                        </th>
+                    </tr>
+                    </thead>
+                    <tbody nz-tbody>
+                    <tr nz-tbody-tr *ngFor="let i of keyTable.data">
+                        <td nz-td>{{i.index}}</td>
+                        <td nz-td><a (click)="msg.success(i.keyword)">{{i.keyword}}</a></td>
+                        <td nz-td class="text-right">{{i.count}}</td>
+                        <td nz-td class="text-right">
+                            <trend [flag]="i.status === 1 ? 'down' : 'up'">
+                                <span>{{i.range}}%</span>
+                            </trend>
+                        </td>
+                    </tr>
+                    </tbody>
+                </nz-table>
+            </ng-template>
+        </nz-card>
+    </div>
+    <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="12">
+        <nz-card [nzLoading]="loading" [nzBordered]="false" nzTitle="������������������" [nzBodyStyle]="{'padding.px': 24}" class="sales-card" style="min-height: 482px;">
+            <ng-template #extra>
+                <div class="sales-card-extra">
+                    <div class="sales-type-radio">
+                        <nz-radio-group [(ngModel)]="salesType" (ngModelChange)="changeSaleType()" [nzSize]="'large'">
+                            <label nz-radio-button [nzValue]="'0'"><span>������</span></label>
+                            <label nz-radio-button [nzValue]="'1'"><span>������</span></label>
+                            <label nz-radio-button [nzValue]="'2'"><span>������</span></label>
+                            <label nz-radio-button [nzValue]="'3'"><span>������</span></label>
+                        </nz-radio-group>
+                    </div>
+                </div>
+            </ng-template>
+            <ng-template #body>
+                <h4 class="margin:8px 0 32px 0;">������������</h4>
+                <pie [hasLegend]="true" subTitle="������������" [height]="248" [lineWidth]="4" [total]="salesTotal" [data]="salesPieData" [valueFormat]="handlePieValueFormat"></pie>
+            </ng-template>
+        </nz-card>
+    </div>
+</div>
+
+<div nz-row [nzGutter]="24">
+    <div nz-col nzXs="24" nzSm="24" nzMd="16">
+        <nz-card nzTitle="������" [nzBordered]="false" [nzLoading]="loading" nzNoPadding class="mb-lg active-card">
+            <nz-list nzSize="large">
+                <nz-list-item *ngFor="let item of activities" class="activities">
+                    <nz-list-item-meta
+                        [nzAvatar]="item.user.avatar"
+                        [nzTitle]="activeTitle"
+                        [nzDescription]="activeDescription">
+                        <ng-template #activeTitle>
+                            <a (click)="msg.success(item.user.name)" class="username">{{item.user.name}}</a>
+                            &nbsp;
+                            <span class="event" [innerHTML]="item.template"></span>
+                        </ng-template>
+                        <ng-template #activeDescription>
+                            <span class="datetime" title="{{item.updatedAt}}">{{item.updatedAt | _date: 'fn'}}</span>
+                        </ng-template>
+                    </nz-list-item-meta>
+                </nz-list-item>
+            </nz-list>
+        </nz-card>
+    </div>
+    <div nz-col nzXs="24" nzSm="24" nzMd="8">
+        <nz-card nzTitle="XX ������" [nzBordered]="false" [nzLoading]="loading" class="mb-lg">
+            <ng-template #body><radar [data]="radarData" [height]="343" [hasLegend]="true"></radar></ng-template>
+        </nz-card>
+        <nz-card nzTitle="������" [nzBordered]="false" [nzBodyStyle]="{'padding-top.px': 12, 'padding-bottom.px': 12 }" class="mb-lg">
+            <div class="members">
+                <div nz-row [nzGutter]="48">
+                    <div nz-col [nzSpan]="12" *ngFor="let i of members">
+                        <a (click)="msg.success(i.title)">
+                            <nz-avatar [nzSrc]="i.logo" [nzSize]="'small'"></nz-avatar>
+                            <span class="member">{{i.title}}</span>
+                        </a>
+                    </div>
+                </div>
+            </div>
+        </nz-card>
+    </div>
+</div>
diff --git a/src/app/routes/dashboard/workplace/workplace.component.less b/src/app/routes/dashboard/workplace/workplace.component.less
new file mode 100644
index 0000000..c732176
--- /dev/null
+++ b/src/app/routes/dashboard/workplace/workplace.component.less
@@ -0,0 +1,389 @@
+@import '~@delon/theme/styles/antd/themes/default.less';
+@import '~@delon/abc/utils/utils.less';
+
+:host ::ng-deep {
+	.page-header {
+		display: flex;
+		.avatar {
+			flex: 0 1 72px;
+			margin-bottom: 8px;
+			.ant-avatar {
+				border-radius: 72px;
+				display: block;
+				width: 72px;
+				height: 72px;
+			}
+		}
+		.desc {
+			position: relative;
+			top: 4px;
+			margin-left: 24px;
+			flex: 1 1 auto;
+			color: @text-color-secondary;
+			line-height: 22px;
+			.desc-title {
+				font-size: 20px;
+				line-height: 28px;
+				font-weight: 500;
+				color: @heading-color;
+				margin-bottom: 12px;
+			}
+		}
+	}
+
+	.page-extra {
+        .clearfix();
+		float: right;
+		& > div {
+			padding: 0 32px;
+			position: relative;
+			float: left;
+			& > p:first-child {
+				color: @text-color-secondary;
+				font-size: @font-size-base;
+				line-height: 22px;
+				margin-bottom: 4px;
+			}
+			& > p {
+				color: @heading-color;
+				font-size: 30px;
+				line-height: 38px;
+				margin: 0;
+				& > span {
+					color: @text-color-secondary;
+					font-size: 20px;
+				}
+			}
+			&:after {
+				background-color: @border-color-split;
+				position: absolute;
+				top: 8px;
+				right: 0;
+				width: 1px;
+				height: 40px;
+				content: "";
+			}
+		}
+		& > div:last-child {
+			padding-right: 0;
+			&:after {
+				display: none;
+			}
+		}
+    }
+
+    .project-list {
+        .ant-card-meta-description {
+            color: @text-color-secondary;
+            height: 44px;
+            line-height: 22px;
+            overflow: hidden;
+        }
+        .card-title {
+            font-size: 0;
+            a {
+                color: @heading-color;
+                margin-left: 12px;
+                line-height: 24px;
+                height: 24px;
+                display: inline-block;
+                vertical-align: top;
+                font-size: @font-size-base;
+                &:hover {
+                    color: @primary-color;
+                }
+            }
+        }
+
+        .project-grid {
+            width: 33.33%;
+        }
+
+        .project-item {
+            display: flex;
+            margin-top: 8px;
+            overflow: hidden;
+            font-size: 12px;
+            height: 20px;
+            line-height: 20px;
+            .textOverflow();
+            a {
+                color: @text-color-secondary;
+                display: inline-block;
+                flex: 1 1 0;
+                .textOverflow();
+                &:hover {
+                    color: @primary-color;
+                }
+            }
+            .datetime {
+                color: @disabled-color;
+                flex: 0 0 auto;
+                float: right;
+            }
+        }
+    }
+
+    .activities {
+        padding: 0 24px 8px;
+        .username {
+            color: @text-color;
+        }
+        .event {
+            font-weight: normal;
+        }
+    }
+
+    .members {
+        a {
+          display: block;
+          margin: 12px 0;
+          line-height: 24px;
+          height: 24px;
+          .textOverflow();
+          .member {
+            font-size: @font-size-base;
+            color: @text-color;
+            line-height: 24px;
+            max-width: 100px;
+            vertical-align: top;
+            margin-left: 12px;
+            transition: all .3s;
+            display: inline-block;
+            .textOverflow();
+          }
+          &:hover {
+            span {
+              color: @primary-color;
+            }
+          }
+        }
+    }
+
+    .datetime {
+        color: @disabled-color;
+    }
+
+    .links {
+        padding: 20px 0 8px 24px;
+        font-size: 0;
+        > a {
+            color: rgba(0, 0, 0, 0.65);
+            display: inline-block;
+            font-size: 14px;
+            margin-bottom: 13px;
+            width: 25%;
+        }
+    }
+
+	@media screen and (max-width: @screen-xl) and (min-width: @screen-lg) {
+        .active-card {
+            margin-bottom: 24px;
+        }
+        .members {
+            margin-bottom: 0;
+        }
+		.page-extra {
+			margin-left: -44px;
+			& > div {
+				padding: 0 16px;
+			}
+		}
+	}
+
+	@media screen and (max-width: @screen-lg) {
+        .active-card {
+            margin-bottom: 24px;
+        }
+        .members {
+            margin-bottom: 0;
+        }
+		.page-extra {
+			float: none;
+			margin-right: 0;
+			& > div {
+				padding: 0 16px;
+				text-align: left;
+				&:after {
+					display: none;
+				}
+			}
+		}
+	}
+
+	@media screen and (max-width: @screen-md) {
+		.page-extra {
+			margin-left: -16px;
+		}
+	}
+
+	@media screen and (max-width: @screen-sm) {
+		.page-header {
+			display: block;
+			.desc {
+				margin-left: 0;
+			}
+		}
+		.page-extra {
+			& > div {
+				float: none;
+			}
+		}
+	}
+
+	@media screen and (max-width: @screen-xs) {
+        .project-list {
+            .project-grid {
+                width: 100%;
+            }
+        }
+	}
+
+
+
+    .icon-group {
+        transition: color 0.32s;
+        color: @text-color-secondary;
+        cursor: pointer;
+        margin-left: 16px;
+        &:hover {
+            color: @text-color;
+        }
+    }
+
+    .rank-list {
+        padding: 0px 32px 32px 72px;
+        ul {
+            margin-top: 25px;
+        }
+        li {
+            zoom: 1;
+            margin-top: 16px;
+            display: flex;
+            justify-content: space-between;
+            .icon {
+                background-color: #f5f5f5;
+                border-radius: 20px;
+                display: inline-block;
+                font-size: 12px;
+                font-weight: 600;
+                margin-right: 24px;
+                height: 20px;
+                line-height: 20px;
+                width: 20px;
+                text-align: center;
+            }
+            .active {
+                background-color: #314659;
+                color: #fff;
+            }
+        }
+    }
+
+    .sales-extra {
+        display: inline-block;
+        margin-right: 24px;
+        a {
+            margin-left: 24px;
+        }
+    }
+
+    .sales-card {
+        .bar {
+            padding: 0px 0px 32px 32px;
+        }
+        .rank {
+            padding: 0 32px 32px 72px;
+        }
+        .ant-tabs-tab {
+            padding-top: 16px;
+            padding-bottom: 14px;
+            line-height: 24px;
+        }
+
+        .ant-tabs-extra-content {
+            padding-right: 24px;
+            line-height: 55px;
+        }
+
+        .ant-card-head {
+            position: relative;
+        }
+    }
+
+    .sales-card-extra {
+        height: 68px;
+    }
+
+    .sales-type-radio {
+        position: absolute;
+        left: 24px;
+        bottom: 15px;
+    }
+
+    .offline-card {
+        .ant-tabs-ink-bar {
+            bottom: auto;
+        }
+        .ant-tabs-bar {
+            border-bottom: none;
+        }
+        .ant-tabs-nav-container-scrolling {
+            padding-left: 40px;
+            padding-right: 40px;
+        }
+        .ant-tabs-tab-prev-icon:before {
+            position: relative;
+            left: 6px;
+        }
+        .ant-tabs-tab-next-icon:before {
+            position: relative;
+            right: 6px;
+        }
+    }
+
+    .trend-text {
+        margin-left: 8px;
+        color: @heading-color;
+    }
+
+    @media screen and (max-width: @screen-lg) {
+        .sales-extra {
+            display: none;
+        }
+
+        .rank-list {
+            li {
+                span:first-child {
+                    margin-right: 8px;
+                }
+            }
+        }
+    }
+
+    @media screen and (max-width: @screen-md) {
+        .rank-title {
+            margin-top: 16px;
+        }
+
+        .sales-card .bar {
+            padding: 16px;
+        }
+    }
+
+    @media screen and (max-width: @screen-sm) {
+        .sales-extra-wrap {
+            display: none;
+        }
+
+        .sales-card {
+            .ant-tabs-content {
+                padding-top: 30px;
+            }
+        }
+    }
+
+    .ant-table-pagination {
+        margin-bottom: 0;
+    }
+}
diff --git a/src/app/routes/dashboard/workplace/workplace.component.ts b/src/app/routes/dashboard/workplace/workplace.component.ts
new file mode 100644
index 0000000..a3ede59
--- /dev/null
+++ b/src/app/routes/dashboard/workplace/workplace.component.ts
@@ -0,0 +1,459 @@
+import { environment } from '../../../../environments/environment';
+import { zip } from 'rxjs/observable/zip';
+import { Component, OnInit, OnDestroy } from '@angular/core';
+import { NzMessageService } from 'ng-zorro-antd';
+import { getTimeDistance, yuan, fixedZero } from '@delon/abc';
+import { _HttpClient } from '@delon/theme';
+import { HttpClient } from '@angular/common/http';
+import * as moment from 'moment';
+import { DeviceService } from '@business/services/http/device.service';
+import { ExampleService } from '@business/services/util/example.service';
+import { ResultBean } from '@business/entity/grid';
+import { TimeUnits } from '@business/enum/types.enum';
+import { ToolsService } from '@business/services/util/tools.service';
+
+@Component({
+    selector: 'app-dashboard-workplace',
+    templateUrl: './workplace.component.html',
+    styleUrls: ['./workplace.component.less'],
+    providers: [DeviceService]
+})
+export class DashboardWorkplaceComponent implements OnInit, OnDestroy {
+
+    totalDeviceCountList = null;
+    totalDeviceCount = '';
+    avgDeviceCount = '';
+    deviceCountLoading = true;
+    // ������������
+    alarmCountList: {x: string, y: number}[] = null;
+    alarmCountCurrMonth = '';
+    alarmCountCurrDay = ''; // ������������������
+    alarmCountLoading = true;
+    operationLoading = true;
+    operNormalPercent = 0;
+    activities: any[] = [];
+    radarData: any[] = [];
+    loading = true;
+    public alarmData: any = {};
+    public alarmDatas = [
+        { title: '������', color: 'purple', data: [] },
+        { title: '������', color: 'yellow', data: [] },
+        { title: '������', color: 'orange', data: [] },
+        { title: '������', color: 'red', data: [] }
+    ];
+    public alertData = [[], [], [], []];
+    salesType = '0';
+    salesTotal = 0;
+    salesPieData: any;
+    members = [
+        {
+            id: 'members-1',
+            title: '������������',
+            logo: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png',
+            link: '',
+        },
+        {
+            id: 'members-2',
+            title: '������������',
+            logo: 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png',
+            link: '',
+        },
+        {
+            id: 'members-3',
+            title: '���������',
+            logo: 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png',
+            link: '',
+        },
+        {
+            id: 'members-4',
+            title: '���������',
+            logo: 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png',
+            link: '',
+        }
+    ];
+
+    data: any = {};
+
+    q: any = {
+        start: null,
+        end: null
+    };
+
+    rankingListData: any[] = [];
+
+    constructor(
+        private deviceService: DeviceService,
+        private http: _HttpClient,
+        public msg: NzMessageService,
+        private http2: HttpClient) {
+    }
+
+    selectedIndexChange(index) {
+        this.rankingListData = [];
+        if (this.alarmDatas[index].data.length < 1) {
+            this.http2.get(environment.SERVER_BASH_URL + 'report/alarm-year', { params: { state: index > 0 ? index : null } }).subscribe((res: any) => {
+                const data = [];
+                for (let i = 0; i < res.data.length; i += 1) {
+                    data.push({ x: `${i + 1}���`, y: !!res.data[i] ? res.data[i] : 0 });
+                }
+                this.alarmDatas[index].data = data;
+            });
+        }
+        if (this.alertData[index].length > 0) {
+            this.alertData[index].forEach(item => {
+                this.rankingListData.push(
+                    {
+                        title: item.x,
+                        total: item.y
+                    }
+                );
+            });
+        } else {
+            this.http2.get(environment.SERVER_BASH_URL + 'report/alarm-month', { params: { state: index > 0 ? index : null } }).subscribe((res: any) => {
+                const data = [];
+                for (let i = 0; i < res.data.length; i += 1) {
+                    for (const key in res.data[i]) {
+                        data.push({ x: key, y: res.data[i][key] });
+                        this.rankingListData.push(
+                            {
+                                title: key,
+                                total: res.data[i][key]
+                            }
+                        );
+                    }
+                }
+                this.alertData[index] = data;
+            });
+        }
+    }
+
+    changeSaleType() {
+        if (this.alertData[this.salesType].length > 0) {
+            this.salesPieData = this.alertData[this.salesType];
+            this.salesTotal = this.salesPieData.reduce((pre, now) => now.y + pre, 0);
+        } else {
+            this.http2.get(environment.SERVER_BASH_URL + 'report/alarm-month', { params: { state: this.salesType === '0' ? null : this.salesType } }).subscribe((res: any) => {
+                const data = [];
+                for (let i = 0; i < res.data.length; i += 1) {
+                    for (const key in res.data[i]) {
+                        data.push({ x: key, y: res.data[i][key] });
+                    }
+                }
+                this.salesPieData = this.alertData[this.salesType] = data;
+                this.salesTotal = this.salesPieData.reduce((pre, now) => now.y + pre, 0);
+            });
+        }
+    }
+
+    ngOnInit() {
+        this.selectedIndexChange(0);
+        this.changeSaleType();
+
+        // const today = new Date().getTime();
+        // const fakeDC = [60, 135, 70, 112, 80, 170, 200, 140, 52, 119, 164, 230];
+        // for (let i = 0; i < 12; i += 1) {
+        //     this.totalDeviceCountList.push({
+        //         x: moment(today).subtract(-1 * i, 'months').format(
+        //             "YYYY-MM"
+        //         ),
+        //         y: fakeDC[i]
+        //     });
+        //     this.totalDeviceCount += fakeDC[i];
+        // }
+        const example1 = new ExampleService();
+        const mo = moment();
+        example1.or().andGreaterThanOrEqualTo({ name: 'createTime', value: mo.format('YYYY-MM-01 00:00:00') });
+        const example2 = new ExampleService();
+        const example3 = new ExampleService();
+        example3.or().andNotEqualTo({name: 'state', value: 4});
+        zip(this.deviceService.countByExample(example1),
+            this.deviceService.countByExample(example2),
+            this.http.get<ResultBean<{time: string, count: number}[]>>('device/count-by-times', {start: mo.format('YYYY-01-01 00:00:00'), end: mo.format('YYYY-12-31 23:59:59')}),
+            this.deviceService.countByExample(example3)).subscribe(
+                ([rWtihAvg, rWithToltal, rWithList, rWithNormal]) => {
+                    if (!!rWtihAvg.code && !!rWithToltal && !!rWithList.code) {
+                        this.avgDeviceCount = ToolsService.toThousands(rWtihAvg.data.toString());
+                        this.totalDeviceCount = ToolsService.toThousands(rWithToltal.data.toString());
+                        this.totalDeviceCountList = rWithList.data.map(item => {
+                            return {x: item.time, y: item.count};
+                        });
+                        this.operNormalPercent = Math.round(rWithNormal.data / rWithToltal.data * 100);
+                        this.deviceCountLoading = false;
+                        this.operationLoading = false;
+                    }
+                }
+            );
+        zip(
+            this.http.get<ResultBean<{time: string, count: number}[]>>('alarm/count-by-times', {start: mo.format('YYYY-MM-01 00:00:00'), end: null, timeUnits: TimeUnits.DAY}),
+            this.http.get<ResultBean<{time: string, count: number}[]>>('alarm/count-by-times', {start: mo.format('YYYY-MM-01 00:00:00'), end: null}),
+            this.http.get<ResultBean<{time: string, count: number}[]>>('alarm/count-by-times', {start: mo.format('YYYY-MM-DD 00:00:00'), end: null})
+        ).subscribe(
+            ([rWithList, rWithMonth, rWithDay]) => {
+                 if (!!rWithList.code && !!rWithMonth.code && !!rWithDay.code) {
+                    this.alarmCountList = rWithList.data.map(
+                        item => {
+                            return {x: item.time, y: item.count};
+                        }
+                    );
+                    if (!!rWithMonth.data && rWithMonth.data.length > 0) {
+                        this.alarmCountCurrMonth = ToolsService.toThousands(rWithMonth.data[0].count.toString());
+                    }    
+                    if (!!rWithDay.data && rWithDay.data.length > 0) {
+                        this.alarmCountCurrDay =  ToolsService.toThousands(rWithDay.data[0].count.toString());
+                    }
+                    this.alarmCountLoading = false;
+                 }
+            }
+        );
+        // this.avgDeviceCount = (this.totalDeviceCount / 12).toFixed(0);
+
+
+        const visitData = [];
+        const beginDay = new Date().getTime();
+
+        const fakeY = [7, 5, 4, 2, 4, 7, 5, 6, 5, 9, 6, 3, 1, 5, 3, 6, 5];
+        for (let i = 0; i < fakeY.length; i += 1) {
+            visitData.push({
+                x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format(
+                    'YYYY-MM-DD'
+                ),
+                y: fakeY[i]
+            });
+        }
+        const visitData2 = [];
+        const fakeY2 = [1, 6, 4, 8, 3, 7, 2];
+        for (let i = 0; i < fakeY2.length; i += 1) {
+            visitData2.push({
+                x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format(
+                    'YYYY-MM-DD'
+                ),
+                y: fakeY2[i]
+            });
+        }
+
+        const radarOriginData = [
+            {
+                name: '������',
+                ref: 10,
+                koubei: 8,
+                output: 4,
+                contribute: 5,
+                hot: 7
+            },
+            {
+                name: '������',
+                ref: 3,
+                koubei: 9,
+                output: 6,
+                contribute: 3,
+                hot: 1
+            },
+            {
+                name: '������',
+                ref: 4,
+                koubei: 1,
+                output: 6,
+                contribute: 5,
+                hot: 7
+            }
+        ];
+
+        const radarData = [];
+        const radarTitleMap = {
+            ref: '������',
+            koubei: '������',
+            output: '������',
+            contribute: '������',
+            hot: '������'
+        };
+        radarOriginData.forEach(item => {
+            Object.keys(item).forEach(key => {
+                if (key !== 'name') {
+                    radarData.push({
+                        name: item.name,
+                        label: radarTitleMap[key],
+                        value: item[key]
+                    });
+                }
+            });
+        });
+        const searchData = [];
+        for (let i = 0; i < 50; i += 1) {
+            searchData.push({
+                index: i + 1,
+                keyword: `���������������-${i}`,
+                count: Math.floor(Math.random() * 1000),
+                range: Math.floor(Math.random() * 100),
+                status: Math.floor((Math.random() * 10) % 2)
+            });
+        }
+        const res = {
+
+            visitData: visitData,
+            visitData2: visitData2,
+
+            radarOriginData: radarOriginData,
+            radarData: radarData,
+            searchData: searchData
+        };
+
+        this.data = res;
+        this.loading = false;
+
+        this.radarData = res.radarData;
+
+
+        const avatars = [
+            'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', // Alipay
+            'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', // Angular
+            'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', // Ant Design
+            'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', // Ant Design Pro
+            'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', // Bootstrap
+            'https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png', // React
+            'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', // Vue
+            'https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png'  // Webpack
+        ];
+
+        const activities = [
+            {
+                id: 'trend-1',
+                updatedAt: new Date(),
+                user: {
+                    name: '���������',
+                    avatar: avatars[0],
+                },
+                group: {
+                    name: '���������������������',
+                    link: 'http://github.com/',
+                },
+                project: {
+                    name: '������������',
+                    link: 'http://github.com/',
+                },
+                template: '��� @{group} ������������ @{project}',
+            },
+            {
+                id: 'trend-2',
+                updatedAt: new Date(),
+                user: {
+                    name: '���������',
+                    avatar: avatars[1],
+                },
+                group: {
+                    name: '���������������������',
+                    link: 'http://github.com/',
+                },
+                project: {
+                    name: '������������',
+                    link: 'http://github.com/',
+                },
+                template: '��� @{group} ������������ @{project}',
+            },
+            {
+                id: 'trend-3',
+                updatedAt: new Date(),
+                user: {
+                    name: '���������',
+                    avatar: avatars[2],
+                },
+                group: {
+                    name: '���������������',
+                    link: 'http://github.com/',
+                },
+                project: {
+                    name: '������������',
+                    link: 'http://github.com/',
+                },
+                template: '��� @{group} ������������ @{project}',
+            },
+            {
+                id: 'trend-4',
+                updatedAt: new Date(),
+                user: {
+                    name: '���������',
+                    avatar: avatars[3],
+                },
+                project: {
+                    name: '5 ���������������',
+                    link: 'http://github.com/',
+                },
+                template: '��� @{project} ������������������������',
+            },
+            {
+                id: 'trend-5',
+                updatedAt: new Date(),
+                user: {
+                    name: '���������',
+                    avatar: avatars[4],
+                },
+                project: {
+                    name: '������������',
+                    link: 'http://github.com/',
+                },
+                comment: {
+                    name: '������',
+                    link: 'http://github.com/',
+                },
+                template: '��� @{project} ��������� @{comment}',
+            },
+            {
+                id: 'trend-6',
+                updatedAt: new Date(),
+                user: {
+                    name: '������',
+                    avatar: avatars[5],
+                },
+                group: {
+                    name: '���������������',
+                    link: 'http://github.com/',
+                },
+                project: {
+                    name: '������������',
+                    link: 'http://github.com/',
+                },
+                template: '��� @{group} ������������ @{project}',
+            },
+            {
+                id: 'trend-7',
+                updatedAt: new Date(),
+                user: {
+                    name: '���������',
+                    avatar: avatars[3],
+                },
+                project: {
+                    name: '���������������',
+                    link: 'http://github.com/',
+                },
+                template: '��� @{project} ���������������������',
+            }
+        ];
+        this.activities = activities.map((item: any) => {
+            item.template = item.template.split(/@\{([^{}]*)\}/gi).map((key: string) => {
+                if (item[key]) return `<a>${item[key].name}</a>`;
+                return key;
+            });
+            return item;
+        });
+    }
+
+    ngOnDestroy(): void {
+    }
+
+    sort(sortName, sortValue) {
+        this.data.searchData = [
+            ...(<any[]>this.data.searchData).sort((a, b) => {
+                if (a[sortName] > b[sortName]) {
+                    return (sortValue === 'ascend') ? 1 : -1;
+                } else if (a[sortName] < b[sortName]) {
+                    return (sortValue === 'ascend') ? -1 : 1;
+                } else {
+                    return 0;
+                }
+            })
+        ];
+    }
+
+    handlePieValueFormat(value: any) {
+        return value + '���';
+    }
+}
diff --git a/src/app/routes/devices/basic-info/adjust-config/adjust-config.component.html b/src/app/routes/devices/basic-info/adjust-config/adjust-config.component.html
new file mode 100644
index 0000000..f3ef7f7
--- /dev/null
+++ b/src/app/routes/devices/basic-info/adjust-config/adjust-config.component.html
@@ -0,0 +1,45 @@
+  <div class="modal-header">
+    <div class="modal-title">���������������</div>
+  </div>
+  <nz-table #nzTable [nzDataSource]="grid.data"  [nzPageSize]="8"
+    [nzLoading]="grid.loading" [nzShowTotal]="true">
+    <thead nz-thead>
+      <tr>
+        <th nz-th style="width:45px;">
+            <label>������</label>
+        </th>
+        <th nz-th *ngFor="let col of grid.columns" [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
+          <span>{{ col.text }}</span>
+          <nz-table-sort *ngIf="col.isSort" [(nzValue)]="col.sort" (nzValueChange)="sort(col.name,$event)"></nz-table-sort>
+        </th>
+        <th nz-th>
+             <span>���������</span>
+        </th>
+      </tr>
+    </thead>
+    <tbody nz-tbody>
+      <tr nz-tbody-tr *ngFor="let row of nzTable.data,index as i">
+        <td nz-td  [ngClass]="{'bg-grey-1':true}" style="text-align:center;">
+            {{ i }}
+        </td>
+        <td nz-td *ngFor="let col of grid.columns" [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
+          <span [ngSwitch]="col.type">
+            <!-- ������������������������������������ -->
+            <span *ngSwitchDefault> {{ row[col.name]|tyepHandle:col:row }} </span>
+            <!-- ������������������������������������ -->
+          </span>
+        </td>
+         <td>
+             <nz-input-number [(ngModel)]="data.value[row.sensorKey]" [nzStep]="0.1"></nz-input-number>
+         </td>
+      </tr>
+    </tbody>
+  </nz-table>
+  <div class="modal-footer">
+    <button nz-button type="button" (click)="close()">������</button>
+    <button nz-button [nzType]="'primary'" (click)="save($event)" [nzLoading]="isSaving">               
+           <span >
+              ������<span *ngIf="isSaving" >���</span>
+           </span>
+    </button>
+  </div>
diff --git a/src/app/routes/devices/basic-info/adjust-config/adjust-config.component.ts b/src/app/routes/devices/basic-info/adjust-config/adjust-config.component.ts
new file mode 100644
index 0000000..f0ea62c
--- /dev/null
+++ b/src/app/routes/devices/basic-info/adjust-config/adjust-config.component.ts
@@ -0,0 +1,129 @@
+import { zip } from 'rxjs/observable/zip';
+import { DeviceAdjustValueService } from '@business/services/http/device-adjust-value.service';
+import { NzModalSubject, NzMessageService } from 'ng-zorro-antd';
+import { SensorsService } from '@business/services/http/sensors.service';
+import { Component, OnInit } from '@angular/core';
+import { DeviceAdjustValue, Sensor, Device } from '@business/entity/data';
+import { Grid, PageBean, ResultBean } from '@business/entity/grid';
+import { ContentChild } from '@angular/core/src/metadata/di';
+import swal, { SweetAlertType } from 'sweetalert2';
+
+@Component({
+  selector: 'app-adjust-config',
+  templateUrl: './adjust-config.component.html',
+  styles: []
+})
+export class AdjustConfigComponent implements OnInit {
+  record: Device;
+  _dataValue: {[s: string]: number} = {};
+  data: DeviceAdjustValue;
+  deviceVersionId: number;
+  isSaving = false;
+  grid: Grid<Sensor> = new Grid();
+  private initPage() {
+    const sensor: Sensor = {
+      name: {
+        text: '������',
+        width: '200px'
+      },
+      sensorKey: {
+        text: '������',
+        width: '60px'
+      },
+      lower: {
+        text: '���������',
+        width: '90px'
+      },
+      upper: {
+        text: '���������',
+        width: '90px'
+      },
+      unit: {
+        text: '������',
+        width: '100px'
+      },
+      description: {
+        text: '������'
+      }
+    };
+    this.grid.title = '���������';
+    this.grid.setColumns(sensor);
+    this.grid.pageSize = 0;
+  }
+  constructor(
+    private subject: NzModalSubject,
+    private sensorsService: SensorsService,
+    private adjustValueService: DeviceAdjustValueService,
+    public msgSrv: NzMessageService,
+  ) { }
+
+  ngOnInit() {
+    if (this.record.deviceVersionId == null) {
+      swal(`������������������������`, '������������������������������������������������������������', 'info');
+      this.subject.destroy();    
+    }
+    this.initPage();
+    this.load();
+  }
+  load() {
+    // ������������������ExpressionChangedAfterItHasBeenCheckedError
+    setTimeout(() => {
+      this.grid.loading = true;
+    }, 1);
+    zip(
+      this.adjustValueService.getByDid(this.record.id),
+      this.sensorsService.getPageByVersionId(this.record.deviceVersionId)
+    ).subscribe(
+        ([adjustRes, sensorsRes]) => {
+            if (adjustRes != null && adjustRes.code === 1 && sensorsRes != null && sensorsRes.data != null) {
+                this.data = {
+                  deviceId: this.record.id,
+                  value: {}
+                };
+                if (adjustRes.data != null) {
+                  // ���������������������
+                  Object.assign(this._dataValue, adjustRes.data.value);
+                  this.data['id'] = adjustRes.data.id;
+                }                
+               this.grid.initData(sensorsRes);
+               sensorsRes.data.forEach(
+                (item: Sensor) => {
+                  this.data.value[item.sensorKey] = this._dataValue[item.sensorKey] == null ? 0 : this._dataValue[item.sensorKey];                
+                  }
+              );
+              this.grid.refreshStatus();
+              setTimeout(() => {
+                this.grid.loading = false;
+              }, 1);
+            }
+        }
+    );
+  }
+  close() {
+    this.subject.destroy();
+  }
+  save($event) {
+    // $event.preventDefault();
+    let isModify = Object.keys(this._dataValue).length !== Object.keys(this.data.value).length;
+    if (!isModify) {
+      isModify = Object.keys(this.data.value).some(
+        key => {
+            return this.data.value[key] !== this._dataValue[key];
+        }
+      );
+    }
+    if (isModify) {
+      this.adjustValueService.save(this.data).subscribe(
+        (res: ResultBean<any>) => {
+               if (res != null && res.code === 1) {
+                   this.subject.destroy();                   
+                   this.msgSrv.success('���������������������');
+               }
+        }
+    );
+    } else {
+        this.subject.destroy();
+        this.msgSrv.success('������������������������');
+    }
+  }
+}
diff --git a/src/app/routes/devices/basic-info/basic-info.component.html b/src/app/routes/devices/basic-info/basic-info.component.html
new file mode 100644
index 0000000..3c5a796
--- /dev/null
+++ b/src/app/routes/devices/basic-info/basic-info.component.html
@@ -0,0 +1,51 @@
+<div class="content__title">
+    <h1>
+        ������������
+        <small>���������������������������������������������������������</small>
+    </h1>
+</div>
+<nz-card [nzBordered]="false">
+    <div nz-row class="mb-sm">
+        <div  nz-col [nzSpan]="4">
+                <button nz-button (click)="addOrModify($event)" [nzType]="'primary'" [nzSize]="'large'">
+                    <i class="anticon anticon-plus"></i><span>������</span>
+                </button>
+                <ng-container *ngIf="selectedRows.length > 0">
+                <button nz-button [nzSize]="'large'" (click)="deleteSelected()">������������</button>
+                </ng-container>
+        </div>
+        <div  nz-col [nzSpan]="7">
+              <span style="padding: 5px 10px;">
+                ������:                  
+              </span>
+              <nz-select style="width: 79%;" [(ngModel)]="queryMap.orgId" (ngModelChange)="setOrgId($event)" [nzPlaceHolder]="'������ ������(������������������)'"
+                nzAllowClear [nzFilter]="false" nzShowSearch  (nzSearchChange)="orgSelectChange($event)" [nzNotFoundContent]="'������������'" >
+                <nz-option *ngFor="let option of orgOptions" [nzLabel]="option.name" [nzValue]="option.id" [nzDisabled]="option.disabled">
+                </nz-option>
+              </nz-select>
+        </div>
+        <div  nz-col [nzSpan]="7">
+                <span style="padding: 5px 10px;">
+                        ���������:                  
+                      </span>
+                      <nz-select style="width: 75%;" [(ngModel)]="queryMap.mpointId" (ngModelChange)="setMpointId($event)" [nzPlaceHolder]="'������ ���������������(������������������)'"
+                      nzAllowClear [nzFilter]="false" nzShowSearch (nzSearchChange)="monitorPointChange($event)" [nzNotFoundContent]="'������������'" >
+                        <nz-option *ngFor="let option of monitorPoints" [nzLabel]="option.name" [nzValue]="option.id" [nzDisabled]="option.disabled">
+                        </nz-option>
+                      </nz-select>
+        </div>
+        <div  nz-col [nzSpan]="6">
+                <nz-input [ngStyle]="{'width': '240px','float':'right'}" [(ngModel)]="queryText" name=""  [nzPlaceHolder]="'������������������������������mac'"
+                (keyup)="queryTextChanged($event)" (change)="queryTextChanged($event)" ></nz-input>
+        </div>
+    </div>
+    <div class="mb-md">
+            <nz-alert *ngIf="selectedRows.length > 0" [nzType]="'info'" [nzShowIcon]="true"> 
+                <span alert-body>
+                    ���������<strong class="text-primary">{{selectedRows.length}}</strong>���
+                </span> 
+            </nz-alert>
+    </div>
+<simple-table #simpleTable  [data]="listUrl" [extraParams]="extraParams"  [columns]="columns" [showTotal]="true"
+[reqReName]="{pi: 'pageIndex',ps: 'pageSize'}"  (checkboxChange)="checkboxChange($event)" [ps]="10" [resReName]="{list: 'data',total: 'total'}"></simple-table>
+</nz-card>
diff --git a/src/app/routes/devices/basic-info/basic-info.component.ts b/src/app/routes/devices/basic-info/basic-info.component.ts
new file mode 100644
index 0000000..3833c79
--- /dev/null
+++ b/src/app/routes/devices/basic-info/basic-info.component.ts
@@ -0,0 +1,307 @@
+import { MonitorPointService } from '@business/services/http/monitor-point.service';
+import { CoorPicker, Device } from '@business/entity/data';
+import { AdjustConfigComponent } from './adjust-config/adjust-config.component';
+import { DeviceEditComponent } from './device-edit/device-edit.component';
+import { ModalHelper, _HttpClient } from '@delon/theme';
+import { NzModalService, NzMessageService } from 'ng-zorro-antd';
+import { PageBean, ResultBean } from '@business/entity/grid';
+import { DeviceService } from '@business/services/http/device.service';
+import { Component, OnInit, ElementRef, ViewChild } from '@angular/core';
+import { SimpleTableColumn, SimpleTableComponent } from '@delon/abc';
+import { Subject } from 'rxjs/Subject';
+import { CoordinatesPickerComponent } from 'app/routes/map/coordinates-picker/coordinates-picker.component';
+import { CoorPickerService } from 'app/routes/map/coordinates-picker/coordinates-picker.service';
+import { OrganizationService } from '@business/services/http/organization.service';
+import { ExampleService, Criteria } from '@business/services/util/example.service';
+
+@Component({
+  selector: 'app-basic-info',
+  templateUrl: './basic-info.component.html',
+  styles: []
+})
+export class BasicInfoComponent implements OnInit {
+  columns: SimpleTableColumn[] = [
+    { title: '������', index: 'id', type: 'checkbox' },
+    { title: '������', index: 'name' },
+    { title: 'mac', index: 'mac' },
+    { title: '������', index: 'deviceVersion.name' },
+    { title: '������������', index: 'monitorPoint.name' },
+    { title: '���������', index: 'operateUser.name' },
+    { title: '������������', width: '100px', type: 'date', index: 'createTime' },
+    { title: '������������', width: '100px', type: 'date', index: 'installTime' },
+    {
+      title: '���������',
+      buttons: [
+        {
+          text: '������',
+          type: 'none',
+          click: (record: any) => this.addOrModify(record)
+        },
+        {
+          text: '������',
+          type: 'del',
+          click: (record: any) => this.delete(record.id)
+        },
+        {
+            text: '������',
+            children: [
+                {
+                    text: `���������������`,
+                    type: 'static',
+                    component: AdjustConfigComponent,
+                    format: (record: any) => `<i class="anticon anticon-setting"></i>���������������`
+                },
+                {
+                  text: `������������`,
+                  type: 'none',
+                  click: (record: any) => this.configCoord(record),
+                  format: (record: any) => `<i class="anticon anticon-environment-o"></i>������������`
+              }
+            ]
+        }
+      ]
+    }
+  ];
+  queryTextStream: Subject<string> = new Subject<string>();
+  public queryMap: {orgId?: number, mpointId?: number, devMacOrName?: string}
+  = {orgId: null, mpointId: null, devMacOrName: ''};
+  extraParams = { queryParams: null };
+  public orgOptions = [];
+  public monitorPoints = [];
+  constructor(
+    private monitorPointService: MonitorPointService,
+    private deviceService: DeviceService,
+    private confirmServ: NzModalService,
+    public msgSrv: NzMessageService,
+    private modalHelper: ModalHelper,
+    private coorPickerService: CoorPickerService,
+    private organizationService: OrganizationService,
+    private http: _HttpClient
+  ) { }
+
+  ngOnInit() {
+    this.queryTextStream
+      .debounceTime(900)
+      .distinctUntilChanged()
+      .subscribe(value => {
+        this.queryMap.devMacOrName = value;
+        this.load();
+      });
+      this.orgSelectChange();
+  }
+  get listUrl() {
+    return this.deviceService.getListUrl();
+  }
+  queryText: string;
+  selectedRows: any[] = [];
+  checkboxChange(list: any[]) {
+    this.selectedRows = list;
+  }
+  deleteSelected() {
+    this.confirmServ.confirm({
+      title: '������������',
+      content: '������������������������������������������������',
+      okText: '������',
+      cancelText: '������'
+    }).on('onOk', () => {
+      if (this.selectedRows != null && this.selectedRows.length > 0) {
+        const ids = this.selectedRows.map(
+          (row: any) => {
+
+            return Number.parseInt(row.id);
+          }
+        );
+        this.delete(...ids);
+      }
+    });
+  }
+  load() {
+    const example  = this.initQueryExample();
+    this.extraParams.queryParams = example.getSqlParam();
+    this.selectedRows = [];
+    this.deviceService.countByExample(example).subscribe(
+      res => {
+           if (!!res && !!res.code) {
+                const count = res.data;
+                const pages = Math.ceil(count / this.simpleTable.ps);
+                const pi = this.simpleTable.pi > pages ? pages : this.simpleTable.pi;
+                this.simpleTable.load(pi);
+           }
+      }
+    );
+    
+  }
+  private initQueryExample() {
+    const example = new ExampleService();
+    const orgId = !!this.queryMap.orgId ? this.queryMap.orgId : null;
+    const mpointId = !!this.queryMap.mpointId ? this.queryMap.mpointId : null;
+    const devMacOrName = !!this.queryMap.devMacOrName && !!(<string>this.queryMap.devMacOrName).trim() ? this.queryMap.devMacOrName : null;
+    let  criWithMac: Criteria = null;
+    let  criWithName: Criteria  = null;
+    if (!!devMacOrName) {
+      criWithName = example.or().andLike({name: 'name', value: '%' + devMacOrName + '%'});
+      criWithMac = example.or().andLike({name: 'mac', value: '%' + devMacOrName + '%'});
+    }
+    if (!!mpointId) {
+        if (!!devMacOrName) {
+          criWithName.andEqualTo({name: 'monitorPointId', value: mpointId});
+          criWithMac.andEqualTo({name: 'monitorPointId', value: mpointId});
+        }else {
+          example.or().andEqualTo({name: 'monitorPointId', value: mpointId});
+        }
+    } else if (!!orgId) {
+      if (!!devMacOrName) {
+        criWithName.andCondition(`monitor_point_id in (select id from monitor_point where organization_id = ${orgId})`);
+        criWithMac.andCondition(`monitor_point_id in (select id from monitor_point where organization_id = ${orgId})`);
+      }else {
+        example.or().andCondition(`monitor_point_id in (select id from monitor_point where organization_id = ${orgId})`);
+      }
+    }
+    return example;
+  }
+  delete(...id: number[]) {
+    this.deviceService.delete(...id).subscribe(
+      (res: any) => {
+        if (res.code === 1) {
+          this.load();
+          this.msgSrv.success('���������������');
+        }
+      }
+    );
+  }
+  @ViewChild('simpleTable') simpleTable: SimpleTableComponent;
+  queryTextChanged(event) {
+    this.queryTextStream.next(this.queryText);
+  }
+  addOrModify(d) {
+    const data = {};
+    if (d != null) {  
+      Object.assign(data, d);
+    }
+    let configMap = {};
+    configMap = Object.assign(configMap, this.queryMap);
+    // Object.assign(configMap, this.queryMap);
+    if (!!configMap['mpointId'] && !d['monitorPoint']) {
+      data['monitorPoint'] = this.getMonitorPoint(configMap['mpointId']);
+    }
+    this.modalHelper.static(DeviceEditComponent, { data, configMap }).subscribe(
+      (ret: { data: any, close: Function }) => {
+        // ������������
+        if (ret.data['id'] != null) {
+          const origData = d;
+          const isModified = Object.keys(ret.data).some(
+            (key: string) => {
+              return ret.data[key] !== origData[key];
+            }
+          );
+          // ������������
+          if (!isModified) {
+            ret.close();
+            this.msgSrv.success('���������������������������');
+            return;
+          }
+        }
+        this.deviceService.save(ret.data).subscribe(
+          (res: any) => {
+            if (res.code === 1) {
+              this.load();
+              ret.close();
+              this.msgSrv.success('���������������������');
+            }
+          }
+        );
+      });
+  }
+  private getMonitorPoint(mpointId: number) {
+     return this.monitorPoints.find(
+        mpoint => mpoint.id === mpointId
+     );
+  }
+  configCoord(record: Device): void {
+     // ������������������������������������������adress������������
+     Object.assign(this.coorPickerService.data, record);
+     this.coorPickerService.data['describe'] = '������������';
+      // ������ ��������������� ������������������
+      if ((!record.latitude || !record.longitude) && !!record.monitorPointId) {
+            this.monitorPointService.getEntity(record.monitorPointId).subscribe(
+              res => {
+                if (res != null && res.code === 1 && res.data != null) {
+                    const areaNames = res.data.areaNames;
+                    let adress = '';
+                    if (areaNames != null) {
+                      adress += !!areaNames.provinceName ? areaNames.provinceName : '';
+                      adress += ' ';
+                      adress += !!areaNames.cityName ? areaNames.cityName : '';
+                      adress += ' ';
+                      adress += !!areaNames.areaName ? areaNames.areaName : '';
+                      adress += ' ';
+                      adress += !!res.data.address ? res.data.address : '';                  
+                    }
+                    this.coorPickerService.data.address = adress;
+                    this.openMap(record);              
+                }
+              }
+        );
+      } else {
+        this.openMap(record);
+      }
+  }
+  private openMap(record: Device) {
+    const _data = this.coorPickerService.data;    
+    this.modalHelper.static(CoordinatesPickerComponent).subscribe(
+      (staticComp) => {
+             const data: Device = {
+                id: record.id,
+                mac: record.mac,
+                longitude: _data.longitude,
+                latitude: _data.latitude,
+             };
+             this.deviceService.save(data).subscribe(
+              (resp: any) => {
+                if (resp.code === 1) {
+                  this.load();
+                  this.msgSrv.success('���������������������');
+                }
+              }
+             );                     
+      }
+   );
+  }
+  public setOrgId(orgId) {
+    this.queryMap.orgId = orgId;
+    this.queryMap.mpointId = null;
+    // this.queryMap.devMacOrName = null;
+    this.monitorPointChange();
+    this.load();
+  }
+  public setMpointId(mpointId) {
+    this.queryMap.mpointId = mpointId;
+    this.load();
+  }
+  orgSelectChange(text?: string) {
+    const pageBean: PageBean = {pageIndex: 0, pageSize: 20};
+    this.organizationService.getPagingList(pageBean, text).subscribe(
+      (res: PageBean) => {
+           if (res != null && res.data != null) {               
+               this.orgOptions = res.data;
+           }
+      }
+   );
+  }
+    monitorPointChange(text?: string) {
+      const pageBean: PageBean = {pageIndex: 0, pageSize: 20};
+      const example = new ExampleService();
+      const organizationId = !!this.queryMap.orgId ? this.queryMap.orgId : null;
+      const mpointName = !!text ? '%' + text + '%' : null;
+      example.or()
+      .andEqualTo({name: 'organizationId', value: organizationId })
+      .andLike({name: 'name', value: mpointName  });
+      this.monitorPointService.getPageByExample(pageBean, example).subscribe(
+        (res: PageBean) => {
+            if (res != null && res.data != null) {
+                this.monitorPoints = res.data;
+            }
+        }
+    );
+    }
+}
diff --git a/src/app/routes/devices/basic-info/device-edit/device-edit.component.html b/src/app/routes/devices/basic-info/device-edit/device-edit.component.html
new file mode 100644
index 0000000..fa89a42
--- /dev/null
+++ b/src/app/routes/devices/basic-info/device-edit/device-edit.component.html
@@ -0,0 +1,126 @@
+  <div class="modal-header">
+    <div class="modal-title">{{ data.id != null ? '������' : '������'}} - ������</div>
+  </div>
+  <form [formGroup]="validateForm" (ngSubmit)="save($event,validateForm.value,validateForm.valid)" nz-form [nzType]="'horizontal'">
+      <div nz-form-item nz-row class="mb-sm">
+          <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+            <label nz-form-item-required>������</label>
+          </div>
+          <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+            <nz-input formControlName="name" maxlength="20" [nzPlaceHolder]="'������������'">
+            </nz-input>
+          </div>
+          <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+            <label nz-form-item-required>mac</label>
+          </div>
+          <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+                <nz-input formControlName="mac" maxlength="20" [nzPlaceHolder]="'mac������'">
+                </nz-input>
+          </div>
+        </div>
+        <div nz-form-item nz-row class="mb-sm">
+            <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+              <label>������</label>
+            </div>
+            <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+              <nz-input-number [ngStyle]="{'width': '100%' }" formControlName="longitude"  [nzMin]="-180" [nzMax]="180" [nzStep]="0.000001"
+              [nzPlaceHolder]="'-180~180������'">
+              </nz-input-number>
+            </div>
+            <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+              <label>������</label>
+            </div>
+            <div nz-form-control nz-col [nzSpan]="6" nzHasFeedback>
+              <nz-input-number [ngStyle]="{'width': '100%' }" formControlName="latitude" [nzMin]="-90" [nzMax]="90" [nzStep]="0.000001"
+              [nzPlaceHolder]="'-90~90������'">
+              </nz-input-number>
+            </div>
+          </div>
+          <div nz-form-item  nz-row class="mb-sm">
+              <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+                <label nz-form-item-required>������������</label>
+              </div>
+              <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+                  <nz-select formControlName="deviceVersionId" [nzPlaceHolder]="'������ ������(������������������)'"
+                  nzAllowClear [nzFilter]="false" nzShowSearch (nzSearchChange)="deviceVersionChange($event)" [nzNotFoundContent]="'������������'" >
+                    <nz-option *ngFor="let option of deviceVersions" [nzLabel]="option.name" [nzValue]="option.id" [nzDisabled]="option.disabled">
+                    </nz-option>
+                  </nz-select>
+              </div>
+              <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+                <label>���������</label>
+              </div>
+              <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+                  <nz-select formControlName="operateUserId" [nzPlaceHolder]="'������ ���������(������������������)'"
+                  nzAllowClear [nzFilter]="false" nzShowSearch (nzSearchChange)="operateUserChange($event)" [nzNotFoundContent]="'������������'" >
+                    <nz-option *ngFor="let option of operateUsers" [nzLabel]="option.name" [nzValue]="option.id" [nzDisabled]="option.disabled">
+                    </nz-option>
+                  </nz-select>
+              </div>
+          </div>
+          <div nz-form-item  nz-row class="mb-sm">
+            <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+              <label>������������</label>
+            </div>
+            <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+                <nz-datepicker nzSize="large"  style="width: 100%;" formControlName="createTime" nzShowTime  [nzPlaceHolder]="'������������'"
+                [nzFormat]="'YYYY-MM-DD HH:mm:ss'" ></nz-datepicker>
+            </div>
+            <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+              <label>������������</label>
+            </div>
+            <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+                <nz-datepicker nzSize="large"  style="width: 100%;" formControlName="installTime" nzShowTime  [nzPlaceHolder]="'������������'"
+                [nzFormat]="'YYYY-MM-DD HH:mm:ss'" ></nz-datepicker>
+            </div>
+          </div>
+          <div nz-form-item  nz-row class="mb-sm">
+            <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+              <label nz-form-item-required>������������</label>
+            </div>
+            <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+                <nz-select formControlName="monitorPointId" [nzPlaceHolder]="'������ ������������(������������������)'" nzAllowClear [nzFilter]="false" nzShowSearch (nzSearchChange)="monitorPointChange($event)" [nzNotFoundContent]="'������������'" >
+                  <nz-option *ngFor="let option of monitorPoints" [nzLabel]="option.name" [nzValue]="option.id" [nzDisabled]="option.disabled">
+                  </nz-option>
+                </nz-select>
+            </div>
+            <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+              <label>������</label>
+            </div>
+            <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+                <nz-select formControlName="professionId" [nzPlaceHolder]="'������ ������������'"
+                nzAllowClear [nzFilter]="false" nzShowSearch (nzSearchChange)="monitorPointChange($event)" [nzNotFoundContent]="'������������'" >
+                  <nz-option *ngFor="let option of professions" [nzLabel]="option.name" [nzValue]="option.id" [nzDisabled]="option.disabled">
+                  </nz-option>
+                </nz-select>
+            </div>
+          </div>
+          <div nz-form-item  nz-row class="mb-sm">
+            <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+              <label>������������</label>
+            </div>
+            <div nz-form-control nz-col [nzSpan]="10" nzHasFeedback>
+                <nz-input formControlName="address" maxlength="20" [nzPlaceHolder]="'���������������������������'">
+                </nz-input>
+            </div>
+          </div>
+  </form>   
+    <div class="modal-footer">
+         <span style="padding: 5px 10px;">
+            ������:                  
+          </span>
+          <nz-select style="width: 240px;" [(ngModel)]="configMap.orgId" (ngModelChange)="setOrgId($event)" [nzPlaceHolder]="'������ ������(������������������)'"
+            nzAllowClear [nzFilter]="false" nzShowSearch  (nzSearchChange)="orgSelectChange($event)" [nzNotFoundContent]="'������������'" >
+            <nz-option *ngFor="let option of orgOptions" [nzLabel]="option.name" [nzValue]="option.id" [nzDisabled]="option.disabled">
+            </nz-option>
+          </nz-select>
+          &nbsp;
+        <button nz-button type="button" (click)="close()">������</button>
+        <button nz-button [nzType]="'primary'" (click)="save(null,validateForm.value,validateForm.valid)" [nzLoading]="isSaving">
+          <span>
+            ������
+            <span *ngIf="isSaving">���</span>
+          </span>
+        </button>
+    </div>
+
diff --git a/src/app/routes/devices/basic-info/device-edit/device-edit.component.ts b/src/app/routes/devices/basic-info/device-edit/device-edit.component.ts
new file mode 100644
index 0000000..2c35a62
--- /dev/null
+++ b/src/app/routes/devices/basic-info/device-edit/device-edit.component.ts
@@ -0,0 +1,229 @@
+import { ToolsService } from '@business/services/util/tools.service';
+import { OperateUserService } from '@business/services/http/operate-user.service';
+import { VersionService } from '@business/services/http/version.service';
+import { MonitorPointService } from '@business/services/http/monitor-point.service';
+import { NzModalSubject } from 'ng-zorro-antd';
+import { FormBuilder, FormGroup, Validators, FormControl } from '@angular/forms';
+import { DeviceService } from '@business/services/http/device.service';
+import { Component, OnInit } from '@angular/core';
+import { Device, MonitorPoint} from '@business/entity/data';
+import { PageBean, ResultBean } from '@business/entity/grid';
+import { _HttpClient } from '@delon/theme';
+import { environment } from '@env/environment';
+import { ExampleService } from '@business/services/util/example.service';
+import { Observable } from 'rxjs/Observable';
+import { OrganizationService } from '@business/services/http/organization.service';
+
+@Component({
+  selector: 'app-device-edit',
+  templateUrl: './device-edit.component.html',
+  styles: []
+})
+export class DeviceEditComponent implements OnInit {
+  public monitorPoints: any [] = [];
+  public professions: any [] = [];
+  public deviceVersions: any [] = [];
+  public operateUsers: any [] = [];
+  public isSaving = false;
+  public configMap: {orgId?: number, mpointId?: number, mpoint?: MonitorPoint} = {orgId: null};
+  public orgOptions = [];
+  constructor(
+    private subject: NzModalSubject,
+    private formBuilder: FormBuilder,
+    private monitorPointService: MonitorPointService,
+    private versionService: VersionService,
+    private operateUserService: OperateUserService,
+    private deviceService: DeviceService,
+    private  http: _HttpClient,
+    private organizationService: OrganizationService
+  ) { }
+  data: Device;
+  // ������������������
+  originalData: Device = {};
+  orgId: number = null;
+  validateForm: FormGroup;
+  ngOnInit() {
+    //   console.log(this.configMap);
+    if (!!this.data) {
+        Object.assign(this.originalData, this.data);
+    }    
+    const data = this.data;
+    this.monitorPointChange(null);
+    this.deviceVersionChange(null);
+    this.operateUserChange(null);
+    this.professionChange();
+    if (this.data.createTime == null) {
+        this.data.createTime = new Date().getTime();
+    }
+    if (!!this.configMap.mpointId 
+        && !!this.data.monitorPoint
+        && !data.longitude
+        && !data.latitude) {
+            data.longitude = this.data.monitorPoint.longitude;
+            data.latitude = this.data.monitorPoint.latitude;
+    }
+    data.monitorPointId = !!data.monitorPointId ? data.monitorPointId : this.configMap.mpointId;
+    const validates: Device = {
+         name: [data.name, [Validators.required]],
+         mac: [data.mac, [Validators.required], [this.macAsyncValidator]],
+         deviceVersionId: [data.deviceVersionId, [Validators.required]],
+         monitorPointId: [data.monitorPointId, [Validators.required]],
+         professionId: [data.professionId],
+         operateUserId: [data.operateUserId],
+         address: [data.address],
+         id: [data.id],
+         longitude: [data.longitude],
+         latitude: [data.latitude],
+         createTime: [data.createTime],
+         installTime: [data.installTime]
+    };
+    this.validateForm = this.formBuilder.group(
+      validates
+    );
+    this.orgSelectChange();
+    const control = this.validateForm.controls['monitorPointId'];
+    control.valueChanges.subscribe(value => {
+        const mpoint = ToolsService.getObjById<MonitorPoint>(value, this.monitorPoints);
+        this.resetCoor(mpoint);
+    });
+  }
+  macAsyncValidator = (control: FormControl): any => {
+    return Observable.create(observer => {
+        // ���������������mac���������
+        if (!!this.originalData && this.originalData.mac === control.value) {
+            observer.next(null);
+            observer.complete();
+        } else {
+            const exampleService = new ExampleService();
+            exampleService.or().andEqualTo({name: 'mac', value: control.value});
+            this.deviceService.countByExample(exampleService).subscribe(
+                res => {
+                     if (!!res.code && !!res.data) {
+                         observer.next({ error: true, duplicated: true });
+                     } else {
+                        observer.next(null);
+                     }
+                     observer.complete();
+                }
+            );
+        }
+        
+    });
+  }
+  close() {
+     this.subject.destroy();
+   }
+   save($event, value, valid) {
+    const _prevent =  !!$event ? $event.preventDefault() : null ;
+    if (valid) {
+      this.isSaving = true;
+      this.data = value;
+      this.subject.next( this );
+    } else {
+        ToolsService.markAsDirty(this.validateForm);
+    }
+   }
+   professionChange() {
+     this.http.get<ResultBean<any[]>>(environment.SERVER_BASH_URL + 'profession/getall').subscribe(
+         result => {
+             if (!!result.code) {
+                 this.professions = result.data;
+             }
+         }
+     );
+   }
+   monitorPointChange(text?: string) {
+    const pageBean: PageBean = {pageIndex: 0, pageSize: 100};
+    const orgId = this.configMap.orgId;
+    const example = new ExampleService();
+    text = !!text && !!text.trim() ? '%' + text + '%' : null;
+    example.or()
+    .andEqualTo({name: 'organizationId', value: this.configMap.orgId})
+    .andLike({name: 'name', value: text});
+    this.monitorPointService.getPageByExample(pageBean, example).subscribe(
+      (res: PageBean) => {
+           if (res != null && res.data != null) {
+               this.monitorPoints = res.data;
+           }
+           const monitorPoint = this.data.monitorPoint;
+           if (monitorPoint != null && text == null) {
+               const hasSelectedValue = this.monitorPoints.some(
+                   (item: any) => {
+                      return item.id === monitorPoint.id;
+                   }
+               );
+               if ( !hasSelectedValue ) {
+                  this.monitorPoints.push(monitorPoint);
+               }
+           }
+      }
+   );
+   }
+   deviceVersionChange(text) {
+    const pageBean: PageBean = {pageIndex: 0, pageSize: 20};
+    this.versionService.getPagingList(pageBean, text).subscribe(
+      (res: PageBean) => {
+           if (res != null && res.data != null) {
+               this.deviceVersions = res.data;
+           }
+           const deviceVersion = this.data.deviceVersion;
+           if (deviceVersion != null && text == null) {
+               const hasSelectedValue = this.deviceVersions.some(
+                   (item: any) => {
+                      return item.id === deviceVersion.id;
+                   }
+               );
+               if ( !hasSelectedValue ) {
+                  this.deviceVersions.push(deviceVersion);
+               }
+           }
+      }
+   );
+   }
+   operateUserChange(text) {
+    const pageBean: PageBean = {pageIndex: 0, pageSize: 20};
+    this.operateUserService.getPagingList(pageBean, text).subscribe(
+      (res: PageBean) => {
+           if (res != null && res.data != null) {
+               this.operateUsers = res.data;
+           }
+           const operateUser = this.data.operateUser;
+           if (operateUser != null && text == null) {
+               const hasSelectedValue = this.operateUsers.some(
+                   (item: any) => {
+                      return item.id === operateUser.id;
+                   }
+               );
+               if ( !hasSelectedValue ) {
+                  this.operateUsers.push(operateUser);
+               }
+           }
+      }
+   );
+   }
+   orgSelectChange(text?: string) {
+    const pageBean: PageBean = {pageIndex: 0, pageSize: 20};
+    this.organizationService.getPagingList(pageBean, text).subscribe(
+      (res: PageBean) => {
+           if (res != null && res.data != null) {               
+               this.orgOptions = res.data;
+           }
+      }
+   );
+  }
+  setOrgId(orgId: number) {
+        this.configMap.mpointId = null;
+        this.monitorPointChange();
+        this.clearMpoint(); 
+  }
+  clearMpoint() {
+     ToolsService.setValueToControl(this.validateForm, 'monitorPointId', null);
+     this.resetCoor();
+  }
+  resetCoor(mpoint?: MonitorPoint) {
+    const longitude =  !!mpoint ?  mpoint.longitude : null;
+    const latitude =  !!mpoint ?  mpoint.latitude : null;
+    ToolsService.setValueToControl(this.validateForm, 'longitude', longitude);
+    ToolsService.setValueToControl(this.validateForm, 'latitude', latitude);
+  }
+}
diff --git a/src/app/routes/devices/devices.module.ts b/src/app/routes/devices/devices.module.ts
new file mode 100644
index 0000000..7a0a12d
--- /dev/null
+++ b/src/app/routes/devices/devices.module.ts
@@ -0,0 +1,62 @@
+import { DeviceAdjustValueService } from '@business/services/http/device-adjust-value.service';
+import { ToolsService } from '@business/services/util/tools.service';
+import { SensorsService } from '@business/services/http/sensors.service';
+import { OrganizationService } from '@business/services/http/organization.service';
+import { MonitorPointService } from '@business/services/http/monitor-point.service';
+import { VersionService } from '@business/services/http/version.service';
+import { AreacodeService } from '@business/services/http/areacode.service';
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { BasicInfoComponent } from './basic-info/basic-info.component';
+import { VersionComponent } from './version/version.component';
+import { MonitorPointComponent } from './monitor-point/monitor-point.component';
+import {RouterModule, Routes} from '@angular/router';
+import { SharedModule } from '@shared/shared.module';
+import { Version } from '@angular/compiler/src/util';
+import { _HttpClient } from '@delon/theme/services/http/http.client';
+import { PipeModule } from '@business/pipe/pipe.module';
+import { FormBuilder } from '@angular/forms';
+import { VersionEditComponent } from './version/version-edit/version-edit.component';
+import { MonitorPointEditComponent } from './monitor-point/monitor-point-edit/monitor-point-edit.component';
+import { VersionSensorConfigComponent } from './version/version-sensor-config/version-sensor-config.component';
+import { DeviceService } from '@business/services/http/device.service';
+import { DeviceEditComponent } from './basic-info/device-edit/device-edit.component';
+import { OperateUserService } from '@business/services/http/operate-user.service';
+import { AdjustConfigComponent } from './basic-info/adjust-config/adjust-config.component';
+import { CoordinatesPickerComponent } from 'app/routes/map/coordinates-picker/coordinates-picker.component';
+import { MapModule } from 'app/routes/map/map.module';
+import { CoorPickerService } from 'app/routes/map/coordinates-picker/coordinates-picker.service';
+const COMPONENTS_NOROUNT = [AdjustConfigComponent, DeviceEditComponent, VersionEditComponent, MonitorPointEditComponent, VersionSensorConfigComponent  ];
+
+const routes: Routes = [
+  {
+    path: '',
+    children: [
+      { path: 'basic', component: BasicInfoComponent },
+      { path: 'version', component: VersionComponent },
+      { path: 'monitor-point', component: MonitorPointComponent }
+    ]
+  }
+];
+
+@NgModule({
+  imports: [
+    // ������������������������������������
+    PipeModule,
+    CommonModule,
+    SharedModule,
+    MapModule,
+    RouterModule.forChild(routes)
+  ],
+  declarations: [
+    BasicInfoComponent,
+    VersionComponent,
+    MonitorPointComponent,
+        ...COMPONENTS_NOROUNT     
+  ],
+  providers: [CoorPickerService, DeviceAdjustValueService, OrganizationService, VersionService, 
+    SensorsService, AreacodeService, MonitorPointService,
+    _HttpClient, FormBuilder, DeviceService, OperateUserService, ToolsService],
+  entryComponents: [CoordinatesPickerComponent, ...COMPONENTS_NOROUNT]
+})
+export class DevicesModule { }
diff --git a/src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.html b/src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.html
new file mode 100644
index 0000000..e8b6eff
--- /dev/null
+++ b/src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.html
@@ -0,0 +1,76 @@
+<div class="modal-header">
+  <div class="modal-title">{{ data.id != null ? '������' : '������'}} - ������������</div>
+</div>
+<form [formGroup]="validateForm" (ngSubmit)="save($event,validateForm.value,validateForm.valid)" nz-form [nzType]="'horizontal'">
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label nz-form-item-required>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+      <nz-input formControlName="name" maxlength="20" [nzPlaceHolder]="'������������������'">
+      </nz-input>
+    </div>
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label nz-form-item-required>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="6" nzHasFeedback>
+      <nz-select formControlName="organizationId" [nzPlaceHolder]="'������ ������(������������������)'"
+	    nzAllowClear [nzFilter]="false" nzShowSearch  (nzSearchChange)="orgSelectChange($event)" [nzNotFoundContent]="'������������'" >
+        <nz-option *ngFor="let option of orgOptions" [nzLabel]="option.name" [nzValue]="option.id" [nzDisabled]="option.disabled">
+        </nz-option>
+      </nz-select>
+    </div>
+  </div>
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label nz-form-item-required>���/���/���</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+      <nz-cascader [class.class123]="true" (nzChange)="setAreaCodes($event)" formControlName="_areas" (nzLoad)="areaLazyLoad($event)" [nzChangeOnSelect]="true"
+      [nzPlaceHolder]="'������ ���/���/���'" >
+      </nz-cascader>
+    </div>
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="9" nzHasFeedback>
+      <nz-input formControlName="address" maxlength="20" 
+      [nzPlaceHolder]="'������������(���)������������120���'">
+      </nz-input>
+    </div>
+  </div>
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="5" nzHasFeedback>
+        <nz-input-number [ngStyle]="{'width': '100%' }" formControlName="longitude"  [nzMin]="-180" [nzMax]="180" [nzStep]="0.000001">
+        </nz-input-number>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="2" nzHasFeedback></div>
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="5" nzHasFeedback>
+          <nz-input-number [ngStyle]="{'width': '100%' }" formControlName="latitude" [nzMin]="-90" [nzMax]="90" [nzStep]="0.000001">
+          </nz-input-number>
+    </div>
+  </div>
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="16" nzHasFeedback>
+      <nz-input formControlName="description" maxlength="100"></nz-input>
+    </div>
+  </div>
+  <div class="modal-footer">
+    <button nz-button type="button" (click)="close()">������</button>
+    <button nz-button [nzType]="'primary'" [nzLoading]="isSaving">
+      <span>
+        ������
+        <span *ngIf="isSaving">���</span>
+      </span>
+    </button>
+  </div>
+</form>
diff --git a/src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.ts b/src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.ts
new file mode 100644
index 0000000..669a144
--- /dev/null
+++ b/src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.ts
@@ -0,0 +1,153 @@
+import { MonitorPoint } from '@business/entity/data';
+import { PageBean } from '@business/entity/grid';
+import { OrganizationService } from '@business/services/http//organization.service';
+import { AreacodeService } from '@business/services/http/areacode.service';
+import { Component, OnInit } from '@angular/core';
+import { NzMessageService, NzModalSubject } from 'ng-zorro-antd';
+import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms';
+import { CascaderOption } from 'ng-zorro-antd/src/cascader/nz-cascader.component';
+
+@Component({
+  selector: 'app-monitor-point-edit',
+  templateUrl: './monitor-point-edit.component.html',
+  styles: []
+})
+export class MonitorPointEditComponent implements OnInit {
+
+  orgOptions = [];
+  configMap: {organizationId: number};
+  data: MonitorPoint;
+  isSaving = false;
+  validateForm: FormGroup;
+  constructor(    
+    private subject: NzModalSubject,
+    private formBuilder: FormBuilder,
+    private areacodeService: AreacodeService,
+    private organizationService: OrganizationService
+    ) { }
+
+  ngOnInit() {
+    const data = this.data;
+    const areaNames = data.areaNames;   
+    let _areas = null;
+    if (areaNames != null) {
+      _areas = {
+       label: Object.values(areaNames).filter(d => d).join('/'),
+       value: data.areaCode
+      };
+    }
+     this.orgSelectChange(null);
+     if (!!this.configMap.organizationId && !data.organizationId) {
+          data.organizationId = this.configMap.organizationId;
+     }
+     const validates: MonitorPoint|object  = {
+          name: [data.name, [Validators.required] ],
+          organizationId: [data.organizationId, [Validators.required]],
+          longitude: [data.longitude],
+          latitude: [data.latitude],
+          address: [data.address ],
+          _areas: [_areas,  [Validators.required]],
+          description: [data.description ]
+     };
+     this.validateForm = this.formBuilder.group(
+         validates
+     );
+     this.validateForm.controls['organizationId'].valueChanges.subscribe(
+       value => {
+        this.configMap.organizationId = value;
+       }
+     );
+  }
+  close() {
+       this.subject.destroy();
+  }
+  save($event, value, valid) {
+      $event.preventDefault();
+      if (valid) {
+        for (const i in this.validateForm.controls) {
+          this.validateForm.controls[ i ].disable();
+        } 
+        this.isSaving = true;
+        Object.keys(value).forEach( (key: string) => {
+              // '_'������������������������������
+              if (!key.startsWith('_') && value[key] != null) {
+                   this.data[key] = value[key];
+              }
+        } );
+        this.subject.next( this );
+      } else {
+        this.validate(); 
+      }
+  }
+  validate() {
+     for (const i in this.validateForm.controls) {
+       this.validateForm.controls[ i ].markAsDirty();
+     }
+  }
+  areaLazyLoad(event: { option: CascaderOption, index: number, resolve: (children: CascaderOption[]) => void, reject: () => void }) {
+    // console.info(event);
+    const index = event['index'];
+    const option = event.option;  
+    switch (index) {
+       case -1:
+       this.areacodeService.getProvinces().subscribe(
+         (res: {label: string, value: string}[]) => {
+             event.resolve( res );
+         }
+       ); break;
+       case 0:
+       this.areacodeService.getCities(option.value).subscribe(
+         (res: {label: string, value: string}[]) => {
+             event.resolve( res );
+         }
+       ); break;
+       case 1:
+       // ������������������ ���������������
+       this.areacodeService.getAreas(option.value , false).subscribe(
+         (res: {label: string, value: string}[]) => {
+             event.resolve( res );
+         }
+       ); break;
+       case 2:
+       this.areacodeService.getTowns(option.value).subscribe(
+         (res: {label: string, value: string}[]) => {
+             event.resolve( res );
+         }
+       ); break;
+       case 3:
+       this.areacodeService.getVillages(option.value).subscribe(
+         (res: {label: string, value: string}[]) => {
+             event.resolve( res );
+         }
+       ); break;
+    }
+  }
+  setAreaCodes(codes: string[]) {
+      this.data.provinceCode = codes[0];
+      this.data.cityCode = codes[1];
+      this.data.areaCode = codes[2];
+      this.data.townCode = codes[3];
+      this.data.villageCode = codes[4];
+  }
+  orgSelectChange(text) {
+      const pageBean: PageBean = {pageIndex: 0, pageSize: 20};
+      this.organizationService.getPagingList(pageBean, text).subscribe(
+        (res: PageBean) => {
+             if (res != null && res.data != null) {               
+                 this.orgOptions = res.data;
+             }
+             const organization = this.data.organization;
+             if (organization != null && text == null) {
+                 const num: number = this.orgOptions.filter(
+                     (item: any) => {
+                        return item.id === organization.id;
+                     }
+                 ).length;
+                 if ( num === 0 ) {
+                    this.orgOptions.push(organization);
+                 }                     
+             }
+        }
+     );
+  }
+}
diff --git a/src/app/routes/devices/monitor-point/monitor-point.component.html b/src/app/routes/devices/monitor-point/monitor-point.component.html
new file mode 100644
index 0000000..bf46e24
--- /dev/null
+++ b/src/app/routes/devices/monitor-point/monitor-point.component.html
@@ -0,0 +1,82 @@
+<pro-header [title]="grid.title"></pro-header>
+<nz-card [nzBordered]="false">
+    <div nz-row class="mb-sm">
+               <div nz-col [nzSpan]="6">
+                <button nz-button (click)="addOrModify($event)" [nzType]="'primary'" [nzSize]="'large'">
+                    <i class="anticon anticon-plus"></i><span>������</span>
+                </button>
+                <ng-container *ngIf="grid.selectedIndexs.length > 0"> &nbsp;
+                <button nz-button [nzSize]="'large'" (click)="deleteSelected()">������������</button>
+                </ng-container>
+                </div>
+                <div nz-col style="text-align:right;padding: 5px 10px;" [nzSm]="6" [nzXs]="24">
+                    <label>���������</label>
+                </div>
+                <div nz-col [nzSpan]="6">
+                    <nz-select style="width: 90%;" [(ngModel)]="queryMap.organizationId" (ngModelChange)="setOrganizationId($event)" [nzPlaceHolder]="'������ ������(������������������)'"
+                      nzAllowClear [nzFilter]="false" nzShowSearch  (nzSearchChange)="orgSelectChange($event)" [nzNotFoundContent]="'������������'" >
+                      <nz-option *ngFor="let option of orgOptions" [nzLabel]="option.name" [nzValue]="option.id" [nzDisabled]="option.disabled">
+                      </nz-option>
+                    </nz-select>
+                </div>
+                <div nz-col [nzSpan]="6">
+                    <nz-input  [(ngModel)]="queryMap.mpointName" name=""  [nzPlaceHolder]="'������������������������'"
+                    (keyup)="queryTextChanged($event)" (change)="queryTextChanged($event)" ></nz-input>
+                </div>
+        </div>
+    	<div class="mb-md">
+                <nz-alert *ngIf="grid.selectedIndexs.length > 0" [nzType]="'info'" [nzShowIcon]="true"> 
+                    <span alert-body>
+                         ���������<strong class="text-primary">{{grid.selectedIndexs.length}}</strong>���
+                    </span> 
+                </nz-alert>
+    </div>
+    <nz-table #nzTable
+              [nzAjaxData]="grid.data"              
+              [nzTotal]="grid.total"
+              [(nzPageIndex)]="grid.pageIndex"
+              [(nzPageSize)]="grid.pageSize"
+              [nzLoading]="grid.loading"
+              [nzShowTotal]="true"
+              (nzPageIndexChange)="load()">
+              <thead nz-thead>
+                  <tr>
+                    <th nz-th [nzCheckbox]="true">
+                        <label nz-checkbox [(ngModel)]="grid.allChecked" [nzIndeterminate]="grid.indeterminate" (ngModelChange)="grid.checkAll($event)"></label>
+                    </th>
+                    <th nz-th *ngFor="let col of grid.columns"
+                     [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}" >
+                           <span>{{ col.text }}</span>
+                           <nz-table-sort *ngIf="col.isSort"   [(nzValue)]="col.sort" (nzValueChange)="sort(col.name,$event)"></nz-table-sort>
+                    </th>
+                    <th nz-th><span>������</span></th>
+                  </tr>
+              </thead>
+              <tbody nz-tbody>
+                <tr nz-tbody-tr *ngFor="let row of nzTable.data">
+                    <td nz-td [nzCheckbox]="true">
+                       <label nz-checkbox [(ngModel)]="row.checked" (ngModelChange)="grid.refreshStatus($event)"></label>
+                    </td>
+                    <td nz-td *ngFor="let col of grid.columns"
+                    [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
+                        <span [ngSwitch]="col.type">
+                             <!-- ������������������������������������ -->
+                            <span *ngSwitchDefault> {{ row[col.name]|tyepHandle:col:row }} </span>
+                             <!-- ������������������������������������ -->        
+                        </span>
+                    </td>
+                    <td nz-td>
+                            <a (click)="addOrModify(row)">������</a>
+                            <span nz-table-divider></span>
+                            <nz-popconfirm [nzTitle]="'������������������'+grid.title+'���?'" [nzOkText]="'Yes'" [nzCancelText]="'No'" (nzOnConfirm)="delete(row.id)" >
+                                <a nz-popconfirm>������</a>
+                            </nz-popconfirm>
+                            <span nz-table-divider></span>
+                            <a (click)="configCoord(row)">������������</a>                            
+                     </td>
+                </tr>
+              </tbody>
+              </nz-table>
+  </nz-card>
+  
+
diff --git a/src/app/routes/devices/monitor-point/monitor-point.component.ts b/src/app/routes/devices/monitor-point/monitor-point.component.ts
new file mode 100644
index 0000000..b24c84c
--- /dev/null
+++ b/src/app/routes/devices/monitor-point/monitor-point.component.ts
@@ -0,0 +1,245 @@
+import { CoorPickerService } from 'app/routes/map/coordinates-picker/coordinates-picker.service';
+import { AreaNames, MonitorPoint } from '@business/entity/data';
+import { Version, ValueTransformer } from '@angular/compiler/src/util';
+import { Subject } from 'rxjs/Subject';
+import { Component, OnInit } from '@angular/core';
+import { NzMessageService, NzModalService } from 'ng-zorro-antd';
+import { ModalHelper } from '@delon/theme';
+import { HttpClient } from '@angular/common/http';
+import { environment } from 'environments/environment';
+import { VersionService } from '@business/services/http/version.service';
+import { Types } from '@business/enum/types.enum';
+import { Column, Grid, PageBean, DataType } from '@business/entity/grid';
+import { filter } from 'rxjs/operators/filter';
+import { MonitorPointEditComponent } from 'app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component';
+import { MonitorPointService } from '@business/services/http/monitor-point.service';
+import { CoordinatesPickerComponent } from 'app/routes/map/coordinates-picker/coordinates-picker.component';
+import { OrganizationService } from '@business/services/http/organization.service';
+import { ExampleService } from '@business/services/util/example.service';
+
+
+@Component({
+  selector: 'app-monitor-point',
+  templateUrl: './monitor-point.component.html',
+  styles: []
+})
+export class MonitorPointComponent implements OnInit {
+
+  public orgOptions = [];
+  private monitorPoint: MonitorPoint;
+  grid: Grid<MonitorPoint> = new Grid(null);
+  queryMap: { mpointName?: string, organizationId?: number } = { mpointName: null, organizationId: null };
+  queryTextStream: Subject<string> = new Subject<string>();
+  private initPage() {
+    this.monitorPoint = {
+      name: {
+        text: '������',
+        width: '300px'
+      },
+      address: {
+        text: '������',
+        width: '300px',
+        format: (value: any, col: Column, row: any) => {
+          value = value == null ? '' : value;
+          if (row['areaNames'] != null) {
+            return row['areaNames']['provinceName'] 
+              + (!!row['areaNames']['cityName'] ? row['areaNames']['cityName'] : '')
+              + (!!row['areaNames']['areaName'] ? row['areaNames']['areaName'] : '')
+              + (!!row['areaNames']['townName'] ? row['areaNames']['townName'] : '')
+              + (!!row['areaNames']['villageName'] ? row['areaNames']['villageName'] : '')
+              + value;
+          } else {
+            return value;
+          }
+
+        }
+      },
+      description: {
+        text: '������',
+        width: '300px'
+      }
+    };
+    this.grid.title = '������������';
+    this.grid.setColumns(this.monitorPoint);
+    this.grid.pageSize = 10;
+  }
+  constructor(
+    private coorPickerService: CoorPickerService,
+    private monitorPointService: MonitorPointService,
+    private confirmServ: NzModalService,
+    public msgSrv: NzMessageService,
+    private modalHelper: ModalHelper,
+    private organizationService: OrganizationService
+  ) { }
+
+  ngOnInit() {
+    this.initPage();
+    this.queryTextStream
+      .debounceTime(500)
+      .distinctUntilChanged()
+      .subscribe(queryText => {
+        this.load();
+      });
+    this.orgSelectChange();
+  }
+ public setOrganizationId(orgId) {
+    this.queryMap.organizationId = orgId;
+    this.load();
+  }
+  queryTextChanged($event) {
+    this.queryTextStream.next(this.queryMap.mpointName);
+  }
+  load(reload: boolean = false) {
+    if (reload) {
+      this.grid.pageIndex = 1;
+    }
+    // ������������������ExpressionChangedAfterItHasBeenCheckedError
+    setTimeout(() => {
+      this.grid.loading = true;
+    }, 1);
+    const example = new ExampleService();
+    const organizationId = !!this.queryMap.organizationId ? this.queryMap.organizationId : null;
+    const mpointName = !!this.queryMap.mpointName ? '%' + this.queryMap.mpointName + '%' : null;
+    example.or()
+    .andEqualTo({name: 'organizationId', value: organizationId })
+    .andLike({name: 'name', value: mpointName  });
+    this.monitorPointService.getPageByExample(this.grid, example).subscribe(
+      (res: PageBean) => {
+        this.grid.loading = true;
+        if (res != null && res.data != null) {
+          this.grid.initData(res);
+          this.grid.refreshStatus();
+          setTimeout(() => {
+            this.grid.loading = false;
+          }, 1);
+        }
+      }
+    );
+  }
+
+  // rowData���null���������������
+  addOrModify(d) {
+    const data = {};
+    if (d != null) {
+      Object.assign(data, d);
+    }
+    let configMap = {};
+    configMap = Object.assign(configMap, this.queryMap);
+    this.modalHelper.static(MonitorPointEditComponent, { data, configMap }).subscribe(
+      (ret: { data: any, close: Function }) => {
+        // ������������
+        if (ret.data['index'] != null) {
+          const index: number = ret.data['index'];
+          const origData = this.grid.data[index];
+          const isModified = Object.keys(origData).some(
+            (key: string) => {
+              return ret.data[key] !== origData[key];
+            }
+          );
+          // ������������
+          if (!isModified) {
+            ret.close();
+            this.msgSrv.success(this.grid.title + '���������������������');
+            return;
+          }
+        }
+        this.monitorPointService.save(ret.data).subscribe(
+          (res: any) => {
+            if (res.code === 1) {
+              this.load();
+              ret.close();
+              this.msgSrv.success(this.grid.title + '���������������');
+            }
+          }
+        );
+      });
+  }
+
+  delete(...id: number[]) {
+    this.monitorPointService.delete(...id).subscribe(
+      (res: any) => {
+        if (res.code === 1) {
+          this.load();
+          this.msgSrv.success(this.grid.title + '���������������');
+        }
+      }
+    );
+  }
+
+  deleteSelected() {
+    this.confirmServ.confirm({
+      title: '������������',
+      content: '������������������������������������������������',
+      okText: '������',
+      cancelText: '������'
+    }).on('onOk', () => {
+      if (this.grid.selectedIndexs != null && this.grid.selectedIndexs.length > 0) {
+        const ids = this.grid.selectedIndexs.map(
+          (index: number) => {
+            const id = this.grid.data[index].id;
+            return Number.parseInt(id);
+          }
+        );
+        this.delete(...ids);
+      }
+    });
+  }
+  sort(field: string, value: string) {
+    // ������������field
+    this.grid.sorts = this.grid.sorts.filter(
+      (fn: string) => {
+        return fn !== field;
+      }
+    );
+    // ������value������null������������������������������filed
+    if (value != null) {
+      this.grid.sorts.push(field);
+    }
+    this.load();
+  }
+  configCoord(record: MonitorPoint): void {
+    Object.assign(this.coorPickerService.data, record);
+    const _data = this.coorPickerService.data;
+    const areaNames = record.areaNames;
+    let adress = '';
+    if (areaNames != null) {
+      adress += !!areaNames.provinceName ? areaNames.provinceName : '';
+      adress += ' ';
+      adress += !!areaNames.cityName ? areaNames.cityName : '';
+      adress += ' ';
+      adress += !!areaNames.areaName ? areaNames.areaName : '';
+      adress += ' ';
+      adress += !!record.address ? record.address : '';
+    }
+    this.coorPickerService.data.address = adress;
+    this.coorPickerService.data['describe'] = '������������������';
+    this.modalHelper.static(CoordinatesPickerComponent).subscribe(
+      (staticComp) => {
+        const data: MonitorPoint = {
+          id: record.id,
+          longitude: _data.longitude,
+          latitude: _data.latitude,
+        };
+        this.monitorPointService.save(data).subscribe(
+          (res: any) => {
+            if (res.code === 1) {
+              this.load();
+              this.msgSrv.success('���������������������');
+            }
+          }
+        );
+
+      }
+    );
+  }
+  orgSelectChange(text?: string) {    
+    const pageBean: PageBean = {pageIndex: 0, pageSize: 20};
+    this.organizationService.getPagingList(pageBean, text).subscribe(
+      (res: PageBean) => {
+           if (res != null && res.data != null) {               
+               this.orgOptions = res.data;
+           }
+      }
+   );
+  }
+}
diff --git a/src/app/routes/devices/version/version-edit/version-edit.component.html b/src/app/routes/devices/version/version-edit/version-edit.component.html
new file mode 100644
index 0000000..0d95bd3
--- /dev/null
+++ b/src/app/routes/devices/version/version-edit/version-edit.component.html
@@ -0,0 +1,46 @@
+<div class="modal-header">
+  <div class="modal-title">{{ data.id != null ? '������' : '������'}} - ������������</div>
+</div>
+<form [formGroup]="validateForm"  (ngSubmit)="save($event,validateForm.value,validateForm.valid)" nz-form [nzType]="'horizontal'">
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+          <label nz-form-item-required>{{ cols.name.text }}</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+      <input nz-input formControlName="{{ cols.name.name }}" maxlength="20" />
+    </div>
+    <div nz-form-label nz-col [nzSpan]="4">
+      <label nz-form-item-required>
+        {{ cols.version.text }}
+      </label>
+    </div>
+     <div nz-form-control nz-col [nzSpan]="3" nzHasFeedback>
+         <nz-input-number style="width: 100%;" formControlName="{{ cols.version.name }}" [nzMin]="1" [nzMax]="100" [nzStep]="1">
+         </nz-input-number>
+    </div>
+  </div> 
+  <div nz-form-item nz-row class="mb-sm">
+      <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+            <label nz-form-item-required>{{ cols.createTime.text }}</label>
+      </div>
+      <div nz-form-control nz-col [nzSpan]="6" nzHasFeedback>
+        <nz-datepicker nzSize="large"  style="width: 100%;" formControlName="{{ cols.createTime.name }}" nzShowTime  [nzPlaceHolder]="'������������'"
+        [nzFormat]="'YYYY-MM-DD HH:mm:ss'" ></nz-datepicker>
+      </div>
+      <div nz-form-control nz-col [nzSpan]="1" nzHasFeedback></div>
+      <div nz-form-label nz-col [nzSpan]="4">
+        <label>{{ cols.description.text }}</label>
+      </div>
+       <div nz-form-control nz-col [nzSpan]="8" nzHasFeedback>
+        <input nz-input formControlName="{{ cols.description.name }}" maxlength="20" />
+      </div>
+    </div>
+    <div class="modal-footer">
+        <button nz-button type="button" (click)="close()">������</button>
+        <button nz-button [nzType]="'primary'" [nzLoading]="isSaving">               
+               <span >
+                  ������<span *ngIf="isSaving" >���</span>
+               </span>
+        </button>
+    </div>
+</form>
\ No newline at end of file
diff --git a/src/app/routes/devices/version/version-edit/version-edit.component.ts b/src/app/routes/devices/version/version-edit/version-edit.component.ts
new file mode 100644
index 0000000..273b62f
--- /dev/null
+++ b/src/app/routes/devices/version/version-edit/version-edit.component.ts
@@ -0,0 +1,120 @@
+import { DeviceVersion } from '@business/entity/data';
+import { Component, OnInit } from '@angular/core';
+import { NzMessageService, NzModalSubject } from 'ng-zorro-antd';
+import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms';
+import { _HttpClient } from '@delon/theme';
+import { ResultBean } from '@business/entity/grid';
+import { Observable } from 'rxjs/Observable';
+import { ToolsService } from '@business/services/util/tools.service';
+@Component({
+  selector: 'app-version-edit',
+  templateUrl: './version-edit.component.html',
+  styles: []
+})
+export class VersionEditComponent implements OnInit {
+ 
+  private originalData: DeviceVersion = {};
+  cols: DeviceVersion;
+  data: DeviceVersion;
+  isSaving = false;
+  validateForm: FormGroup;
+  constructor(    
+    private subject: NzModalSubject,
+    private formBuilder: FormBuilder,
+    private http: _HttpClient
+    ) { }
+
+  ngOnInit() {
+     if (this.data.createTime == null) {
+      this.data.createTime = new Date().getTime();
+     }
+     if (!this.data.version) { 
+       this.setMaxVersionNo();
+     }
+     const validates: DeviceVersion = {
+          name: [this.data.name, [Validators.required] ],
+          version: [this.data.version, [Validators.required], [this.versionAsyncValidator] ],
+          createTime: [this.data.createTime, [Validators.required] ],
+          description: [this.data.description]
+     };
+     Object.assign(this.originalData, this.data);
+     this.validateForm = this.formBuilder.group(
+      validates
+     );
+  }
+  private setMaxVersionNo() {
+      this.isSaving = true;
+      this.http.get('device-version/get-maxverno').subscribe(
+         (res: ResultBean<number>) => {
+              if (!!res.code && res.data) {
+                 ToolsService.setValueToControl(this.validateForm, 'version', res.data + 1);
+              }else {
+                this.data.version = 1;
+              }
+          this.isSaving = false;
+         }
+      );
+  }
+  close() {
+       this.subject.destroy();
+  }
+  save($event, value, valid) {
+      $event.preventDefault();
+      if (valid) {
+        for (const i in this.validateForm.controls) {
+          this.validateForm.controls[ i ].disable();
+        } 
+       const isModified =  Object.keys(value).some(
+          (key: string) => {
+              return this.data[key] !== value[key];    
+          } 
+        );
+        // ������������
+        if (!isModified) { 
+          this.close();
+          return;
+        }
+        this.isSaving = true;
+        Object.keys(value).forEach( (key: string) => {
+              if ( value[key] != null ) {
+                   this.data[key] = value[key];
+              }
+        } );
+        this.subject.next( this );
+      } else {
+        this.validate(); 
+      }
+  }
+  versionAsyncValidator = (control: FormControl): any => {
+    return Observable.create(observer => {
+        if (!!control && !!control.value) {
+              // ���������������version���������
+              if (!!this.originalData && this.originalData.version === control.value) {
+                observer.next(null);
+                observer.complete();
+            } else {
+                this.isSaving = true;
+                this.http.get('device-version/get-byversion', {version: control.value} ).subscribe(
+                  (res: ResultBean<any>) => {
+                      if (!!res.code && !!res.data) {
+                        observer.next({ error: true, duplicated: true });
+                      } else {
+                        observer.next(null);
+                      }
+                      observer.complete();
+                      this.isSaving = false;
+                  }
+                );
+            }
+        }else {
+          observer.next(null);
+          observer.complete();
+        }        
+    });
+  }
+  validate() {
+     for (const i in this.validateForm.controls) {
+       this.validateForm.controls[ i ].markAsDirty();
+     }
+  }
+}
diff --git a/src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.html b/src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.html
new file mode 100644
index 0000000..39170e9
--- /dev/null
+++ b/src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.html
@@ -0,0 +1,55 @@
+<div class="modal-header">
+    <div class="modal-title">���������������</div>
+</div>
+<nz-row nzGutter="0">
+    <nz-col nzSpan="24" style="height: 520px;">
+        <nz-table #nzTable [nzDataSource]="gridDataImage" [nzPageSize]="8" [nzLoading]="grid.loading" [nzShowTotal]="true">
+            <thead nz-thead>
+                <tr>
+                    <th nz-th>
+                    </th>
+                    <th nz-th *ngFor="let col of grid.columns;let i = index;" [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
+                        <span>{{ col.text }}</span>
+                        <ng-container *ngIf="i === 0">
+                            <span>
+                                {{ '('+selectedCount+'/'+grid.data.length+')' }}
+                            </span>
+                            <nz-table-sort [(nzValue)]="col.sort" (nzValueChange)="sort(col.name,$event)"></nz-table-sort>
+                            <nz-dropdown [nzTrigger]="'click'" [nzClickHide]="false">
+                                <i class="anticon anticon-search ant-table-filter-icon" nz-dropdown></i>
+                                <div nz-dropdown-custom class="custom-filter-dropdown">
+                                    <nz-input [nzPlaceHolder]="'������������'" [ngModel]="searchValue" (ngModelChange)="setSearchValue($event)"></nz-input>
+                                </div>
+                            </nz-dropdown>
+                        </ng-container>
+                    </th>
+                </tr>
+            </thead>
+            <tbody nz-tbody>
+                <ng-container *ngFor="let row of nzTable.data">
+                <tr nz-tbody-tr>
+                    <td nz-td [nzCheckbox]="true">
+                        <label nz-checkbox [(ngModel)]="row.checked" (ngModelChange)="grid.refreshStatus($event)"></label>
+                    </td>
+                    <td nz-td *ngFor="let col of grid.columns" [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
+                        <span [ngSwitch]="col.type">
+                            <!-- ������������������������������������ -->
+                            <span *ngSwitchDefault> {{ row[col.name]|tyepHandle:col:row }} </span>
+                            <!-- ������������������������������������ -->
+                        </span>
+                    </td>
+                </tr>
+              </ng-container>
+            </tbody>
+        </nz-table>
+    </nz-col>
+</nz-row>
+<div class="modal-footer">
+    <button nz-button type="button" (click)="close()">������</button>
+    <button nz-button [nzType]="'primary'" (click)="save($event,null,null)" [nzLoading]="isSaving">
+        <span>
+            ������
+            <span *ngIf="isSaving">���</span>
+        </span>
+    </button>
+</div>
diff --git a/src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.ts b/src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.ts
new file mode 100644
index 0000000..793d971
--- /dev/null
+++ b/src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.ts
@@ -0,0 +1,167 @@
+import { NzModalSubject } from 'ng-zorro-antd';
+import { Component, OnInit } from '@angular/core';
+import { SensorsService } from '@business/services/http/sensors.service';
+import { PageBean,  Grid } from '@business/entity/grid';
+import { Sensor } from '@business/entity/data';
+import { Subject } from 'rxjs/Subject';
+import { count } from 'rxjs/operator/count';
+import { debounce } from 'rxjs/operators';
+
+@Component({
+  selector: 'app-version-sensor-config',
+  templateUrl: './version-sensor-config.component.html',
+  styles: []
+})
+export class VersionSensorConfigComponent implements OnInit {
+  deviceVersionId: number;
+  selectedSensorIds: number[];
+  originalOrder: { [key: string]: number} = {};
+  isSaving = false;
+  grid: Grid<Sensor> = new Grid(null);
+  public searchValue = '';
+  private initPage() {
+    const sensor: Sensor = {
+      name: {
+        text: '������',
+        width: '200px'
+      },
+      sensorKey: {
+        text: '������',
+        width: '60px'
+      },
+      lower: {
+        text: '���������',
+        width: '90px'
+      },
+      upper: {
+        text: '���������',
+        width: '90px'
+      },
+      unit: {
+        text: '������',
+        width: '100px'
+      },
+      description: {
+        text: '������'
+      }
+    };
+    this.grid.title = '���������';
+    this.grid.setColumns(sensor);
+    this.grid.pageSize = 0;
+    this.subjectStream.debounceTime(500).distinctUntilChanged().subscribe(
+      name => {
+          if (!name || !name.trim()) {
+            this.gridDataImage = this.grid.data;
+          } else {
+            this.gridDataImage =  this.grid.data.filter(
+              item => {
+                    name = name.trim().toLowerCase();
+                    if (!!item.name.toLowerCase().match(name)) {
+                      return true;
+                    } else {
+                      return false;
+                    }
+              }
+            );
+          }
+      }
+    );
+  }
+  constructor(
+    private subject: NzModalSubject,
+    private sensorsService: SensorsService,
+  ) { }
+
+  ngOnInit() {
+    this.initPage();
+    this.load();
+  }
+  public gridDataImage = [];
+  load() {
+    // ������������������ExpressionChangedAfterItHasBeenCheckedError
+    setTimeout(() => {
+      this.grid.loading = true;
+    }, 1);
+    this.sensorsService.getPagingList(this.grid, null).subscribe(
+      (res: PageBean) => {
+        this.grid.loading = true;
+        if (res != null && res.data != null) {
+          this.grid.initData(res);
+          this.gridDataImage = this.grid.data;
+          this.grid.data.map(
+            (row: any) => {
+               row['checked'] = this.selectedSensorIds.filter(
+                (id: number) => {
+                  return row.id === id;
+                }
+              ).length > 0;
+            }
+          );
+          this.grid.refreshStatus();
+          setTimeout(() => {
+            this.grid.loading = false;
+          }, 1);
+          this.grid.data.forEach((item, index) => {
+             this.originalOrder[item.id] = index;
+          });
+        }
+      }
+    );
+  }
+  close() {
+    this.subject.destroy();
+  }
+  save($event, value, valid) {
+    $event.preventDefault();
+    this.subject.next( this );
+  }
+  public get selectedCount(): number {
+     let selectedCount = 0;
+     this.grid.data.forEach(
+       item => {
+         if (item['checked']) {
+          selectedCount++;
+         }
+       }
+     );
+     return selectedCount;
+  }
+  sort(field: string, value: string) {
+       const data = this.grid.data.sort(
+           (a, b) => {
+              let aWeight = 0;
+              let bWeight = 0;
+              // debugger;
+             if (!!value) {
+               if (value === 'ascend') {
+                aWeight = a['checked'] ? 1 : 0;
+                bWeight = b['checked'] ? 1 : 0;
+               } else {
+                aWeight = a['checked'] ? 0 : 1;
+                bWeight = b['checked'] ? 0 : 1;
+               }
+             } else {
+                const idMap = this.originalOrder;
+                aWeight = idMap[a.id];
+                bWeight = idMap[b.id];
+             }
+             return aWeight - bWeight;
+           }
+       );
+       this.grid.data = data;
+       this.gridDataImage = [];
+       setTimeout(() => {
+         this.gridDataImage = data;
+       }, 1);
+      //  this.subjectStream.next(null);
+      //  setTimeout(() => {
+      //   this.grid.data = data;
+      //   this.grid.refreshStatus();
+      //  }, 1);
+    }
+    private subjectStream: Subject<string> = new Subject<string> ();
+    public setSearchValue(name) {
+        this.searchValue = name;
+        this.subjectStream.next(name);
+    }
+}
diff --git a/src/app/routes/devices/version/version.component.html b/src/app/routes/devices/version/version.component.html
new file mode 100644
index 0000000..507b190
--- /dev/null
+++ b/src/app/routes/devices/version/version.component.html
@@ -0,0 +1,67 @@
+<pro-header [title]="grid.title"></pro-header>
+<nz-card [nzBordered]="false">
+    	<div class="mb-md">
+                <button nz-button (click)="addOrModify($event)" [nzType]="'primary'" [nzSize]="'large'">
+                    <i class="anticon anticon-plus"></i><span>������</span>
+                </button>
+                <ng-container *ngIf="grid.selectedIndexs.length > 0"> &nbsp;
+                <button nz-button [nzSize]="'large'" (click)="deleteSelected()">������������</button>
+                </ng-container>
+                <nz-input [ngStyle]="{'width': '280px','float':'right'}" [(ngModel)]="queryMap.value" name=""  [nzPlaceHolder]="queryMap.text"
+                (keyup)="queryTextChanged($event)" (change)="queryTextChanged($event)" ></nz-input>
+        </div>
+    	<div class="mb-md">
+                <nz-alert *ngIf="grid.selectedIndexs.length > 0" [nzType]="'info'" [nzShowIcon]="true"> 
+                    <span alert-body>
+                         ���������<strong class="text-primary">{{grid.selectedIndexs.length}}</strong>���
+                    </span> 
+                </nz-alert>
+    </div>
+    <nz-table #nzTable
+              [nzAjaxData]="grid.data"              
+              [nzTotal]="grid.total"
+              [(nzPageIndex)]="grid.pageIndex"
+              [(nzPageSize)]="grid.pageSize"
+              [nzLoading]="grid.loading"
+              [nzShowTotal]="true"
+              (nzPageIndexChange)="load()">
+              <thead nz-thead>
+                  <tr>
+                    <th nz-th [nzCheckbox]="true">
+                        <label nz-checkbox [(ngModel)]="grid.allChecked" [nzIndeterminate]="grid.indeterminate" (ngModelChange)="grid.checkAll($event)"></label>
+                    </th>
+                    <th nz-th *ngFor="let col of grid.columns"
+                     [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}" >
+                           <span>{{ col.text }}</span>
+                           <nz-table-sort *ngIf="col.isSort"   [(nzValue)]="col.sort" (nzValueChange)="sort(col.name,$event)"></nz-table-sort>
+                    </th>
+                    <th nz-th><span>������</span></th>
+                  </tr>
+              </thead>
+              <tbody nz-tbody>
+                <tr nz-tbody-tr *ngFor="let row of nzTable.data">
+                    <td nz-td [nzCheckbox]="true">
+                       <label nz-checkbox [(ngModel)]="row.checked" (ngModelChange)="grid.refreshStatus($event)"></label>
+                    </td>
+                    <td nz-td *ngFor="let col of grid.columns"
+                    [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
+                        <span [ngSwitch]="col.type">
+                             <!-- ������������������������������������ -->
+                            <span *ngSwitchDefault> {{ row[col.name]|tyepHandle:col:row}} </span>
+                             <!-- ������������������������������������ -->        
+                        </span>
+                    </td>
+                    <td nz-td>
+                            <a (click)="addOrModify(row)">������</a>
+                            <span nz-table-divider></span>
+                              <nz-popconfirm [nzTitle]="'������������������'+grid.title+'���?'" [nzOkText]="'Yes'" [nzCancelText]="'No'" (nzOnConfirm)="delete(row.id)" >
+                                <a nz-popconfirm>������</a>
+                              </nz-popconfirm>
+                              <span nz-table-divider></span>
+                              <a (click)="configSensor(row)">���������������</a>
+                     </td>
+                </tr>
+              </tbody>
+              </nz-table>
+  </nz-card>
+  
diff --git a/src/app/routes/devices/version/version.component.ts b/src/app/routes/devices/version/version.component.ts
new file mode 100644
index 0000000..6e970b7
--- /dev/null
+++ b/src/app/routes/devices/version/version.component.ts
@@ -0,0 +1,212 @@
+import { VersionSensorConfigComponent } from './version-sensor-config/version-sensor-config.component';
+import { DataType } from '@business/entity/grid';
+import { DeviceVersion, Sensor } from '@business/entity/data';
+import { Version } from '@angular/compiler/src/util';
+import { Subject } from 'rxjs/Subject';
+import { ToolsService } from '@business/services/util/tools.service';
+import { Component, OnInit } from '@angular/core';
+import { NzMessageService, NzModalService } from 'ng-zorro-antd';
+import { ModalHelper } from '@delon/theme';
+import { HttpClient } from '@angular/common/http';
+import { DateService } from '@business/services/util/date.service';
+import { VersionService } from '@business/services/http/version.service';
+import { Types } from '@business/enum/types.enum';
+import { Column, Grid, PageBean } from '@business/entity/grid';
+import { VersionEditComponent } from 'app/routes/devices/version/version-edit/version-edit.component';
+
+
+@Component({
+  selector: 'app-version',
+  templateUrl: './version.component.html',
+  styles: []
+})
+export class VersionComponent implements OnInit {
+  private version: DeviceVersion;
+  grid: Grid<DeviceVersion> = new Grid(null);
+  queryMap = { text: '������������������������', value: ''};
+  queryTextStream: Subject<string> = new Subject<string>();
+    private initPage() {
+    this.version = {
+       name: {
+        text: '������',
+        width: '18%'
+       },
+       version: {
+        text: '������',
+        width: '18%',
+        isSort: true
+      },
+      createTime: {
+          text: '������������',
+          width: '18%',
+          type: {
+            name: Types.Date,
+            format: 'YYYY-MM-DD HH:mm:ss'
+          },
+          isSort: true
+      },
+      description: {
+          text: '������',
+          width: '18%'
+      }
+    };
+    this.grid.title = '������������';
+    this.grid.setColumns(this.version);
+    this.grid.pageSize = 10;
+  }
+  constructor(
+    private versionService: VersionService,
+    
+    private confirmServ: NzModalService,
+    public msgSrv: NzMessageService,
+    private modalHelper: ModalHelper,
+  ) {}
+
+  ngOnInit() {
+    this.initPage();
+    this.queryTextStream
+    .debounceTime(500)
+    .distinctUntilChanged()
+    .subscribe(queryText => {
+        this.load();
+    });
+  }
+  queryTextChanged($event) {
+      this.queryTextStream.next(this.queryMap.value);
+  }
+  load(reload: boolean = false) {   
+    if (reload) {
+      this.grid.pageIndex = 1 ;
+    }
+    // ������������������ExpressionChangedAfterItHasBeenCheckedError
+    setTimeout(() => {
+      this.grid.loading = true;
+     }, 1);
+    this.versionService.getPagingList(this.grid, this.queryMap.value).subscribe(
+       (res: PageBean) => {
+            this.grid.loading = true;
+            if (res != null && res.data != null) {
+              this.grid.initData(res);
+              this.grid.refreshStatus();
+              setTimeout(() => {
+                this.grid.loading = false;
+               }, 1);
+            }
+       }
+    );
+  }
+
+// rowData���null���������������
+  addOrModify(data) {
+    if ( data == null) {
+       data = {};
+    }
+    const cols = this.version;
+    this.modalHelper.static(VersionEditComponent, { cols , data }).subscribe( 
+      ( ret: { data: any, close: Function} ) => {
+      this.versionService.save(ret.data).subscribe(
+         ( res: any) => {
+            if (res.code === 1) {
+              this.load();
+              ret.close();
+              this.msgSrv.success(this.grid.title + '���������������');
+            }
+         }
+      );
+    });
+  }
+
+  delete(...id: number[]) {
+    this.versionService.delete( ...id ).subscribe(
+      ( res: any) => {
+         if (res.code === 1) {
+           this.load();
+           this.msgSrv.success(this.grid.title + '���������������');
+         }
+      }
+   );
+  }
+
+   deleteSelected() {
+    this.confirmServ.confirm({
+      title: '������������',
+      content: '������������������������������������������������',
+      okText: '������',
+      cancelText: '������'
+    }).on('onOk', () => {
+       if (this.grid.selectedIndexs != null && this.grid.selectedIndexs.length > 0) {
+          const ids = this.grid.selectedIndexs.map(
+              (index: number) => {
+                  const id = this.grid.data[index].id;
+                  return Number.parseInt(id);
+              }
+          );
+          this.delete( ...ids );
+       }
+    });
+  }
+  sort(field: string, value: string) {
+    // ������������field
+    this.grid.sorts = this.grid.sorts.filter(
+       (fn: string) => {
+          return fn !== field;
+       }
+     );
+     // ������value������null������������������������������filed
+     if ( value != null ) {
+        this.grid.sorts.push(field);
+     }
+     this.load();
+  }
+    configSensor(data) {
+     const deviceVersionId = data.id;
+     this.versionService.getSensorIds(deviceVersionId).subscribe(
+        (selectedSensorIds: number[]) => {
+          this.modalHelper.static(VersionSensorConfigComponent, { deviceVersionId, selectedSensorIds }).subscribe( 
+            ( ret: { grid: Grid<Sensor>, close: Function} ) => {
+            // ������������id
+            const selectedIds = ret.grid.data.filter(
+              (r: any) => {
+                 return r['checked'] === true;
+              }
+            ).map(
+              (r: any) => {
+                return r['id'];
+             }
+            );
+            // ������������������������������
+            let isModified = selectedIds.length !== selectedSensorIds.length;
+            // ���������������������������
+            if (!isModified) {
+              isModified = !selectedIds.every(
+                (id: number) => {
+                    // console.log('id:' + id);                   
+                    const result = selectedSensorIds.some(
+                      (sid: number) => {
+                          return id === sid ;
+                      }
+                     );
+                    // console.log('result:' + result);
+                    return result;
+                }
+               );
+            }
+            if ( !isModified ) {
+              this.msgSrv.success(this.grid.title + '������������������');
+              ret.close();
+              return ;
+            }
+            this.versionService.versionSensorConfig(deviceVersionId, selectedIds).subscribe(
+               ( res: any) => {
+                  if (res.code === 1) {
+                    ret.close();
+                    this.msgSrv.success(this.grid.title + '���������������');
+                  }
+               }
+            );
+          });
+        }
+     );
+
+    }
+}
diff --git a/src/app/routes/home-page/home-page-routing.module.ts b/src/app/routes/home-page/home-page-routing.module.ts
deleted file mode 100644
index 5601a76..0000000
--- a/src/app/routes/home-page/home-page-routing.module.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { NgModule } from "@angular/core";
-import { HomePageComponent } from "./home-page/home-page.component";
-import { Routes, RouterModule } from "@angular/router";
-
-const routes: Routes = [{ path: "", component: HomePageComponent }];
-
-@NgModule({
-  imports: [RouterModule.forChild(routes)],
-  exports: [RouterModule]
-})
-export class HomePageRoutingModule {}
diff --git a/src/app/routes/home-page/home-page.module.ts b/src/app/routes/home-page/home-page.module.ts
deleted file mode 100644
index a3adbbb..0000000
--- a/src/app/routes/home-page/home-page.module.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { NgModule } from "@angular/core";
-import { Routes, RouterModule } from "@angular/router";
-import { SharedModule } from "@shared/shared.module";
-import { HomePageRoutingModule } from "./home-page-routing.module";
-import { HomePageComponent } from "./home-page/home-page.component";
-
-@NgModule({
-  imports: [SharedModule, HomePageRoutingModule],
-  declarations: [HomePageComponent]
-})
-export class HomePageModule {}
diff --git a/src/app/routes/home-page/home-page/home-page.component.html b/src/app/routes/home-page/home-page/home-page.component.html
deleted file mode 100644
index b4d5ddb..0000000
--- a/src/app/routes/home-page/home-page/home-page.component.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<div class="content__title">
-  <h1>������������������</h1>
-</div>
-<div nz-row [nzGutter]="24" class="pt-lg">
-  <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
-    <div nz-row nzType="flex" nzAlign="middle" class="bg-primary rounded-md">
-      <div nz-col nzSpan="24" class="p-md text-white" style="height: 90px;text-align: center;">
-        <div style="height: 40px;" class="h2 mt0">{{ cardData.api }}</div>
-        <p class="text-nowrap mb0">AQI</p>
-      </div>
-    </div>
-  </div>
-  <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
-    <div nz-row nzType="flex" nzAlign="middle" class="bg-success rounded-md">
-      <div nz-col nzSpan="24" class="p-md text-white" style="height: 90px;text-align: center;">
-        <div style="height: 40px;" class="h2 mt0">{{ cardData.temperature }} ���</div>
-        <p class="text-nowrap mb0">������</p>
-      </div>
-    </div>
-  </div>
-  <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
-    <div nz-row nzType="flex" nzAlign="middle" class="bg-orange rounded-md">
-      <div nz-col nzSpan="24" class="p-md text-white" style="height: 90px;text-align: center;">
-        <div style="height: 40px;" class="h2 mt0">{{ cardData.windDirection }}</div>
-        <p class="text-nowrap mb0">������</p>
-      </div>
-    </div>
-  </div>
-  <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
-    <div nz-row nzType="flex" nzAlign="middle" class="bg-pink rounded-md">
-      <div nz-col nzSpan="24" class="p-md text-white" style="height: 90px;text-align: center;">
-        <div style="height: 40px;" class="h2 mt0">{{ cardData.pm25 }} mg/m��</div>
-        <p class="text-nowrap">PM2.5</p>
-      </div>
-    </div>
-  </div>
-</div>
-<div nz-row [nzGutter]="24" class="pt-lg">
-  <div nz-col nzXs="24" nzSm="12" nzMd="12" nzLg="8">
-    <chart-card [title]="'������������������'"
-        total="78%"
-        contentHeight="46px"
-        [action]="action4"
-        [footer]="footer4">
-        <ng-template #action4>
-            <nz-tooltip [nzTitle]="'������������'">
-                <nz-icon nz-tooltip nzType="info-circle-o"></nz-icon>
-            </nz-tooltip>
-        </ng-template>
-        <mini-progress
-            height="46"
-            percent="78"
-            strokeWidth="8"
-            target="80"
-            color="#13C2C2"></mini-progress>
-        <ng-template #footer4>
-            <div class="d-flex justify-content-between">
-                <trend flag="up">���������<span class="pl-sm">12%</span></trend>
-                <trend flag="down">���������<span class="pl-sm">11%</span></trend>
-            </div>
-        </ng-template>
-    </chart-card>
-</div>
-</div>
diff --git a/src/app/routes/home-page/home-page/home-page.component.less b/src/app/routes/home-page/home-page/home-page.component.less
deleted file mode 100644
index e69de29..0000000
--- a/src/app/routes/home-page/home-page/home-page.component.less
+++ /dev/null
diff --git a/src/app/routes/home-page/home-page/home-page.component.ts b/src/app/routes/home-page/home-page/home-page.component.ts
deleted file mode 100644
index 08b5c83..0000000
--- a/src/app/routes/home-page/home-page/home-page.component.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { Component, OnInit } from "@angular/core";
-import { _HttpClient } from "@delon/theme";
-import { zip } from 'rxjs/observable/zip';
-
-@Component({
-  selector: "app-home-page",
-  templateUrl: "./home-page.component.html",
-  styleUrls: ["./home-page.component.less"]
-})
-export class HomePageComponent implements OnInit {
-  public cardData: {'api'?:number,'temperature'?:number,'windDirection'?: string,'pm25'?: number}
-          = {};
-  constructor(
-    private http:_HttpClient,
-  ) {
-  }
-
-  ngOnInit() {
-    zip(
-       this.http.get('http://sapi.7drlb.com/api/mj?cityID=1102&apiKey=condition'),
-       this.http.get('http://sapi.7drlb.com/api/mj?cityID=1102&apiKey=aqi')
-
-     ).subscribe(
-        ([conRes,aqiRes]) => {
-          console.log(conRes);
-          console.log(aqiRes);
-          if( conRes.code == 0 && aqiRes.code == 0 ) {
-            this.cardData.windDirection =conRes.data.condition.windDir;
-            this.cardData.temperature =conRes.data.condition.temp;
-            this.cardData.api = aqiRes.data.aqi.value;
-            this.cardData.pm25 = aqiRes.data.aqi.pm25;
-          }
-        }
-     )
-  }
-}
diff --git a/src/app/routes/map/coordinates-picker/coordinates-picker.component.css b/src/app/routes/map/coordinates-picker/coordinates-picker.component.css
new file mode 100644
index 0000000..871f89b
--- /dev/null
+++ b/src/app/routes/map/coordinates-picker/coordinates-picker.component.css
@@ -0,0 +1,19 @@
+.anchorBL {
+	display: none;
+}
+.top_transparent {
+	width: 98%;
+	height: 40px;
+	background: #fff;
+	position: absolute;
+    margin-top: 0;
+	opacity: 0.6;
+	z-index: 1;
+}
+
+.coordinate_title {
+	width: 90%;
+	position: absolute;
+	top: 4%;
+	z-index: 2;
+}
diff --git a/src/app/routes/map/coordinates-picker/coordinates-picker.component.html b/src/app/routes/map/coordinates-picker/coordinates-picker.component.html
new file mode 100644
index 0000000..1619375
--- /dev/null
+++ b/src/app/routes/map/coordinates-picker/coordinates-picker.component.html
@@ -0,0 +1,44 @@
+          <div class="top_transparent">
+          </div>
+          <div class="coordinate_title">
+              <div nz-row class="mb-sm">
+                    <div nz-col [nzSm]="1">
+                      <span></span>
+                    </div>
+                    <div  nz-col [nzSpan]="7">
+                        <nz-input #queryText maxlength="20" [nzPlaceHolder]="'���������������(��� ��� ��� ��� ���������)'">
+                        </nz-input>
+                    </div>
+                    <div nz-col [nzSpan]="1">
+                        <button nz-button [nzType]="'primary'"  (click)="mapSearch(queryText._value,true)" class="mr-sm">
+                            <i class="anticon anticon-search"></i><span>������</span>
+                        </button>
+                    </div>
+                    <div nz-col [nzSpan]="4">
+                         <span></span>
+                    </div>
+                    <div nz-col [nzSpan]="11">
+                            <label>
+                                ���������
+                            </label>
+                            <span>
+                               ( {{markerOption.point.lng}} <strong>,</strong> {{markerOption.point.lat}} )
+                            </span>
+                    </div>
+              </div>
+          </div>
+          <baidu-map #map [options]="options"  (loaded)="loadMap($event)" (clicked)="clickMap($event)"  style="display: block;height:400px;">
+              <control type="navigation" [options]="navigationOpts"></control>
+              <marker #marker  [point]="markerOption.point" [options]="markerOption.options" (loaded)="loadMarker($event)"></marker>
+          </baidu-map>
+<div class="modal-footer">
+        <label>{{data.describe}}���</label>
+  <span [ngStyle]="{'font-size': '16px','font-weight': 'bold','margin-right':'30px'}">{{data.name}}</span>
+  <button nz-button type="button" (click)="close()">������</button>
+  <button nz-button [nzType]="'primary'" (click)="save()" [nzLoading]="isSaving">
+    <span>
+      ������
+      <span *ngIf="isSaving">���</span>
+    </span>
+  </button>
+</div>
diff --git a/src/app/routes/map/coordinates-picker/coordinates-picker.component.ts b/src/app/routes/map/coordinates-picker/coordinates-picker.component.ts
new file mode 100644
index 0000000..1a787bd
--- /dev/null
+++ b/src/app/routes/map/coordinates-picker/coordinates-picker.component.ts
@@ -0,0 +1,172 @@
+import { NzModalSubject } from 'ng-zorro-antd';
+import { ReactiveFormsModule } from '@angular/forms';
+import { ViewEncapsulation, Component,  ViewChild, ElementRef, NgZone, OnInit } from '@angular/core';
+import { MapOptions, Point, MarkerOptions, ControlAnchor, NavigationControlOptions, NavigationControlType, BMapInstance } from 'angular2-baidu-map';
+import { CoorPicker } from '@business/entity/data';
+import { CoorPickerService } from 'app/routes/map/coordinates-picker/coordinates-picker.service';
+
+
+
+@Component({
+  encapsulation: ViewEncapsulation.None,
+  selector: 'app-coordinates-picker',
+  templateUrl: './coordinates-picker.component.html',
+  styleUrls: [ './coordinates-picker.component.css' ],
+})
+export class CoordinatesPickerComponent implements OnInit {
+    Default_LNG = 121;
+    Default_LAT = 31.4;
+    showZoom = 19;
+    isSaving = false;
+    markerOption: {
+      point: Point,
+      options: MarkerOptions
+    } = {
+      point: null,
+      options: null
+    };
+    data: CoorPicker;
+    navigationOpts: NavigationControlOptions;
+    options: MapOptions;
+    _BMap: any = null;
+
+  constructor(private subject: NzModalSubject, private coorPickerService: CoorPickerService) {
+   
+  }
+  ngOnInit(): void {
+    this.data = this.coorPickerService.data;
+    let lng = this.data.longitude;
+    lng = !lng ? this.Default_LNG : lng;
+    this.data.longitude = lng;
+    let lat = this.data.latitude;
+    lat = !lat ? this.Default_LAT : lat;
+    this.data.latitude = lat;
+    this.options = {
+        minZoom: 3,
+        maxZoom: 19,
+        cursor: 'default',
+        centerAndZoom: { 
+          lng: this.data.longitude, 
+          lat: this.data.latitude,
+          zoom: this.showZoom
+        },
+        enableKeyboard: true
+      };  
+      this.navigationOpts = {
+        anchor: ControlAnchor.BMAP_ANCHOR_BOTTOM_RIGHT,
+        type: NavigationControlType.BMAP_NAVIGATION_CONTROL_LARGE
+      };
+      this.markerOption.point = {
+        lng: lng,
+        lat: lat
+      };
+      this.markerOption.options = {
+        icon: {
+          imageUrl: './assets/img/map_coordinates.png',
+          size: {
+            height: 30,
+            width: 30
+          }
+        },
+        offset: {
+           height: -30,
+           width: -15
+        }
+       };
+  }
+  private _marker: any = null;
+  loadMarker(marker) {
+    if (this._marker == null) {
+      this._marker = marker;      
+    }
+  }
+  private _map: any;
+  private _localSearch;
+  loadMap(map: any) {      
+      this._map = map;
+      this._BMap = window.BMap;  
+      this._map.addEventListener(
+        'tilesloaded',
+        (type, fn) => {
+          //  this._map.clearOverlays();
+           this._map.addOverlay(this._marker);          
+        }
+      ); 
+      this._localSearch = new  this._BMap.LocalSearch(map, {
+        renderOptions: {map: map}
+      });
+      if (this.data.latitude === this.Default_LAT 
+          && this.data.longitude === this.Default_LNG
+          && !!this.data.address
+          && !!this.data.address.trim()) {
+          this.mapSearch(this.data.address);
+      }
+  }
+  city: string;
+  // queryText: string;
+   mapSearch(queryText: string, isSearch?: boolean) {
+  
+      if (!!queryText && !!queryText.trim()) {
+        this.city = !!this.city ? this.city : '���������';
+        const end = queryText.indexOf('���') + 1;
+        if (end > 0) {
+          let start = queryText.indexOf('���') + 1;
+          start = start > 0 ? start : queryText.indexOf('���') + 1;
+          start = start > end ? 0 : start;
+          if (start < end) {
+             this.city = queryText.slice(start, end).trim();
+             if (!!this.city) {
+                this._map.setCurrentCity(this.city); 
+             }
+          }
+        }
+        console.log(this.city);
+        const myGeo = new this._BMap.Geocoder();
+        const that = this;
+        that._map.setCurrentCity(that.city);
+        myGeo.getPoint(queryText, function(point){
+            let getPoint = false;
+            if (point) {
+              that.data.latitude = point.lat;
+              that.data.longitude = point.lng;
+              getPoint = true;
+            }else {
+                console.log('������������������������������������!');
+            }
+            that.markerOption.point = {
+              lng:  that.data.longitude,
+              lat:  that.data.latitude
+            };
+            that.options.centerAndZoom = { 
+                lng: that.data.longitude, 
+                lat: that.data.latitude,
+                zoom: that.showZoom
+            };
+            // setTimeout(() => {
+            if (getPoint && !isSearch) {
+              that._map.centerAndZoom(point, that.showZoom);
+              
+            } else {
+              that._localSearch.search(queryText);              
+            }
+            // }, 3000);
+        }, that.city);
+      }
+  }
+  clickMap(e: any) {
+       this.markerOption.point = {
+         lng: e.point.lng,
+         lat: e.point.lat
+       };
+       this.coorPickerService.data.longitude = e.point.lng;
+       this.coorPickerService.data.latitude = e.point.lat;
+  }
+  close() {
+      this.subject.destroy();
+  }
+  save() {
+      this.isSaving = true;
+      this.subject.next();
+      this.subject.destroy();
+  }
+}
diff --git a/src/app/routes/map/coordinates-picker/coordinates-picker.service.ts b/src/app/routes/map/coordinates-picker/coordinates-picker.service.ts
new file mode 100644
index 0000000..6ecd950
--- /dev/null
+++ b/src/app/routes/map/coordinates-picker/coordinates-picker.service.ts
@@ -0,0 +1,15 @@
+import { CoorPicker } from '@business/entity/data';
+import { Injectable } from '@angular/core';
+
+@Injectable()
+export class CoorPickerService {
+  public data: CoorPicker = {
+    longitude: 0,
+    latitude: 0,
+    name: '',
+    describe: '',
+    address: ''
+  };
+  constructor() { }
+
+}
diff --git a/src/app/routes/map/map.module.ts b/src/app/routes/map/map.module.ts
new file mode 100644
index 0000000..eea6ff3
--- /dev/null
+++ b/src/app/routes/map/map.module.ts
@@ -0,0 +1,21 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { CoordinatesPickerComponent } from './coordinates-picker/coordinates-picker.component';
+import { Routes, RouterModule } from '@angular/router';
+import { BaiduMapModule  } from 'angular2-baidu-map';
+import { AqmModule } from 'angular-qq-maps';
+import { SharedModule } from '@shared/shared.module';
+
+
+@NgModule({
+    imports: [
+      CommonModule,
+      SharedModule,
+        BaiduMapModule.forRoot({
+          ak: 'rER1sgBIcQxkfNSlm2wmBGZGgEERrooM'
+        })
+    ],
+  declarations: [CoordinatesPickerComponent],
+  exports: [CoordinatesPickerComponent]
+})
+export class MapModule { }
diff --git a/src/app/routes/passport/login/login.component.html b/src/app/routes/passport/login/login.component.html
new file mode 100644
index 0000000..5e7e684
--- /dev/null
+++ b/src/app/routes/passport/login/login.component.html
@@ -0,0 +1,44 @@
+<form nz-form [formGroup]="form" (ngSubmit)="submit()" role="form">
+    <nz-alert *ngIf="error" [nzType]="'error'" [nzMessage]="error" [nzShowIcon]="true" class="mb-lg"></nz-alert>
+    <div nz-form-item>
+        <div nz-form-control [nzValidateStatus]="userName">
+            <nz-input formControlName="userName" [nzSize]="'large'">
+                <ng-template #prefix>
+                    <i class="anticon anticon-user"></i>
+                </ng-template>
+            </nz-input>
+            <ng-container *ngIf="userName.dirty || userName.touched">
+                <p nz-form-explain *ngIf="userName.errors?.required">���������������������</p>
+                <p nz-form-explain *ngIf="userName.errors?.minlength">������������������</p>
+            </ng-container>
+        </div>
+    </div>
+    <div nz-form-item>
+        <div nz-form-control [nzValidateStatus]="password">
+            <nz-input formControlName="password" [nzType]="'password'" [nzSize]="'large'">
+                <ng-template #prefix>
+                    <i class="anticon anticon-lock"></i>
+                </ng-template>
+            </nz-input>
+            <div nz-form-explain *ngIf="(password.dirty || password.touched) && password.errors?.required">������������������</div>
+            <p nz-form-explain [ngStyle]="{'color': 'red'}" *ngIf="validateError.password_incorrect">������������������������������������</p>
+            <p nz-form-explain [ngStyle]="{'color': 'red'}" *ngIf="validateError.account_expired">������������������������������������������</p>
+            <p nz-form-explain [ngStyle]="{'color': 'red'}" *ngIf="validateError.server_offline">������������������������������</p>
+        </div>
+    </div>
+    <div nz-form-item nz-row>
+        <div nz-col [nzSpan]="12">
+            <label nz-checkbox formControlName="remember">
+                <span>������������</span>
+            </label>
+        </div>
+        <div nz-col [nzSpan]="12" class="text-right">
+            <a class="forgot" (click)="msg.error('������������������������')">���������������</a>
+        </div>
+    </div>
+    <div nz-form-item>
+        <button nz-button [nzType]="'primary'" [nzLoading]="loading" [nzSize]="'large'" class="ant-btn__block">
+            <span>������</span>
+        </button>
+    </div>
+</form>
diff --git a/src/app/routes/passport/login/login.component.less b/src/app/routes/passport/login/login.component.less
new file mode 100644
index 0000000..601a0a3
--- /dev/null
+++ b/src/app/routes/passport/login/login.component.less
@@ -0,0 +1,75 @@
+@import '~@delon/theme/styles/antd/themes/default.less';
+
+:host {
+	display: block;
+	width: 368px;
+	margin: 0 auto;
+
+	::ng-deep {
+		.tabs {
+			padding: 0 2px;
+			margin: 0 -2px;
+			.ant-tabs-tab {
+				font-size: 16px;
+				line-height: 24px;
+			}
+			.ant-input-affix-wrapper .ant-input:not(:first-child) {
+				padding-left: 34px;
+			}
+		}
+
+		.ant-tabs .ant-tabs-bar {
+			border-bottom: 0;
+			margin-bottom: 24px;
+			text-align: center;
+		}
+
+		.ant-form-item {
+			margin-bottom: 24px;
+        }
+
+        .icon-alipay, .icon-taobao, .icon-weibo {
+            display: inline-block;
+            width: 24px;
+            height: 24px;
+            background: url('https://gw.alipayobjects.com/zos/rmsportal/itDzjUnkelhQNsycranf.svg');
+            margin-left: 16px;
+            vertical-align: middle;
+            cursor: pointer;
+        }
+
+        .icon-alipay {
+            background-position: -24px 0;
+
+            &:hover {
+                background-position: 0 0;
+            }
+        }
+
+        .icon-taobao {
+            background-position: -24px -24px;
+
+            &:hover {
+                background-position: 0 -24px;
+            }
+        }
+
+        .icon-weibo {
+            background-position: -24px -48px;
+
+            &:hover {
+                background-position: 0 -48px;
+            }
+        }
+
+        .other {
+            text-align: left;
+            margin-top: 24px;
+            line-height: 22px;
+
+            .register {
+            float: right;
+            }
+        }
+	}
+}
diff --git a/src/app/routes/passport/login/login.component.ts b/src/app/routes/passport/login/login.component.ts
new file mode 100644
index 0000000..f0ee060
--- /dev/null
+++ b/src/app/routes/passport/login/login.component.ts
@@ -0,0 +1,167 @@
+import { error } from 'selenium-webdriver';
+import { HttpErrorResponse } from '@angular/common/http';
+import { Authorization } from '@business/entity/token';
+import { LoginService } from '@business/services/http/login.service';
+import { SettingsService } from '@delon/theme';
+import { Component, OnDestroy, Inject, Optional } from '@angular/core';
+import { Router } from '@angular/router';
+import { FormGroup, FormBuilder, Validators } from '@angular/forms';
+import { NzMessageService } from 'ng-zorro-antd';
+import { SocialService, SocialOpenType, ITokenService, DA_SERVICE_TOKEN } from '@delon/auth';
+import { ReuseTabService } from '@delon/abc';
+import { environment } from '@env/environment';
+import { CookieService } from 'angular2-cookie/services/cookies.service';
+import { debounce } from 'rxjs/operators';
+@Component({
+    selector: 'passport-login',
+    templateUrl: './login.component.html',
+    styleUrls: [ './login.component.less' ],
+    providers: [ SocialService, CookieService]
+})
+export class UserLoginComponent implements OnDestroy {
+
+    form: FormGroup;
+    error = '';
+    type = 0;
+    loading = false;
+
+    constructor(
+        fb: FormBuilder,
+        private router: Router,
+        public msg: NzMessageService,
+        private settingsService: SettingsService,
+        private socialService: SocialService,
+        @Optional() @Inject(ReuseTabService) private reuseTabService: ReuseTabService,
+        private loginService: LoginService,
+        @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService) {
+        this.form = fb.group({
+            userName: [null, [Validators.required, Validators.minLength(5)]],
+            password: [null, Validators.required],
+            mobile: [null, [Validators.required, Validators.pattern(/^1\d{10}$/)]],
+            captcha: [null, [Validators.required]],
+            remember: [true]
+        });
+        // let nowTime = new Date();
+        // nowTime.setDate(nowTime.getDate()+1);
+    }
+
+    // region: fields
+
+    get userName() { return this.form.controls.userName; }
+    get password() { return this.form.controls.password; }
+    get mobile() { return this.form.controls.mobile; }
+    get captcha() { return this.form.controls.captcha; }
+
+    // endregion
+
+    switch(ret: any) {
+        this.type = ret.index;
+    }
+
+    // region: get captcha
+
+    count = 0;
+    interval$: any;
+
+    getCaptcha() {
+        this.count = 59;
+        this.interval$ = setInterval(() => {
+            this.count -= 1;
+            if (this.count <= 0)
+                clearInterval(this.interval$);
+        }, 1000);
+    }
+
+    // endregion
+
+    submit() {
+        this.error = '';
+        if (this.type === 0) {
+            this.userName.markAsDirty();
+            this.password.markAsDirty();
+            if (this.userName.invalid || this.password.invalid) return;
+        } else {
+            this.mobile.markAsDirty();
+            this.captcha.markAsDirty();
+            if (this.mobile.invalid || this.captcha.invalid) return;
+        }
+        this.loading = true;
+        this.loginService.validate(this.userName.value, this.password.value).subscribe(
+                (res: Authorization) => {
+                    this.validateError['password_incorrect'] = false;
+                    this.validateError['account_expired'] = false;
+                    this.validateError['server_offline'] = false;
+                   if (res.token != null) {
+                        // ������������������������
+                       this.reuseTabService.clear();
+                       this.tokenService.set({
+                           token: res.token,
+                           name: this.userName.value,
+                           time: +new Date
+                       });
+                       this.validateError = {};
+                       this.router.navigate(['/']);
+                   }
+                },
+                (err: HttpErrorResponse) => {
+                    if (!!err) {
+                        const errMsg = err.error;
+                        console.log(errMsg);
+                        if (errMsg.status === 401 && errMsg.errorCode === 10) {                                
+                            this.validateError['password_incorrect'] = true;
+                            this.loading = false;
+                       } else if (errMsg.status === 401 && errMsg.errorCode === 12) {
+                           this.validateError['account_expired'] = true;
+                           this.loading = false;
+                       } else if (!errMsg.status  && !errMsg.errorCode) {
+                           this.validateError['server_offline'] = true;
+                           this.loading = false;
+                       }
+                    }                  
+                }
+           );
+
+    }
+    public validateError: {[s: string]: boolean} = {};
+    // region: social
+
+    open(type: string, openType: SocialOpenType = 'href') {
+        let url = ``;
+        let callback = ``;
+        if (environment.production)
+            callback = 'https://cipchk.github.io/ng-alain/callback/' + type;
+        else
+            callback = 'http://localhost:4200/callback/' + type;
+        switch (type) {
+            case 'auth0':
+                url = `//cipchk.auth0.com/login?client=8gcNydIDzGBYxzqV0Vm1CX_RXH-wsWo5&redirect_uri=${decodeURIComponent(callback)}`;
+                break;
+            case 'github':
+                url = `//github.com/login/oauth/authorize?client_id=9d6baae4b04a23fcafa2&response_type=code&redirect_uri=${decodeURIComponent(callback)}`;
+                break;
+            case 'weibo':
+                url = `https://api.weibo.com/oauth2/authorize?client_id=1239507802&response_type=code&redirect_uri=${decodeURIComponent(callback)}`;
+                break;
+        }
+        if (openType === 'window') {
+            this.socialService.login(url, '/', {
+                type: 'window'
+            }).subscribe(res => {
+                if (res) {
+                    this.settingsService.setUser(res);
+                    this.router.navigateByUrl('/');
+                }
+            });
+        } else {
+            this.socialService.login(url, '/', {
+                type: 'href'
+            });
+        }
+    }
+
+    // endregion
+
+    ngOnDestroy(): void {
+        if (this.interval$) clearInterval(this.interval$);
+    }
+}
diff --git a/src/app/routes/report/images/bg.png b/src/app/routes/report/images/bg.png
new file mode 100644
index 0000000..dd59418
--- /dev/null
+++ b/src/app/routes/report/images/bg.png
Binary files differ
diff --git a/src/app/routes/report/images/bg01.png b/src/app/routes/report/images/bg01.png
new file mode 100644
index 0000000..3222fee
--- /dev/null
+++ b/src/app/routes/report/images/bg01.png
Binary files differ
diff --git a/src/app/routes/report/images/bg02.png b/src/app/routes/report/images/bg02.png
new file mode 100644
index 0000000..3ac62c6
--- /dev/null
+++ b/src/app/routes/report/images/bg02.png
Binary files differ
diff --git a/src/app/routes/report/images/bg2.png b/src/app/routes/report/images/bg2.png
new file mode 100644
index 0000000..b349c5a
--- /dev/null
+++ b/src/app/routes/report/images/bg2.png
Binary files differ
diff --git a/src/app/routes/report/images/bg_yuanjiao.png b/src/app/routes/report/images/bg_yuanjiao.png
new file mode 100644
index 0000000..11f73f3
--- /dev/null
+++ b/src/app/routes/report/images/bg_yuanjiao.png
Binary files differ
diff --git a/src/app/routes/report/images/bg_yuanjiao01.png b/src/app/routes/report/images/bg_yuanjiao01.png
new file mode 100644
index 0000000..f163faf
--- /dev/null
+++ b/src/app/routes/report/images/bg_yuanjiao01.png
Binary files differ
diff --git a/src/app/routes/report/images/logo.png b/src/app/routes/report/images/logo.png
new file mode 100644
index 0000000..4c3a71f
--- /dev/null
+++ b/src/app/routes/report/images/logo.png
Binary files differ
diff --git a/src/app/routes/report/images/t_bg.png b/src/app/routes/report/images/t_bg.png
new file mode 100644
index 0000000..bbf9e10
--- /dev/null
+++ b/src/app/routes/report/images/t_bg.png
Binary files differ
diff --git a/src/app/routes/report/images/t_left.png b/src/app/routes/report/images/t_left.png
new file mode 100644
index 0000000..8d7a08c
--- /dev/null
+++ b/src/app/routes/report/images/t_left.png
Binary files differ
diff --git a/src/app/routes/report/images/t_right.png b/src/app/routes/report/images/t_right.png
new file mode 100644
index 0000000..947b579
--- /dev/null
+++ b/src/app/routes/report/images/t_right.png
Binary files differ
diff --git a/src/app/routes/report/images/table_bg.png b/src/app/routes/report/images/table_bg.png
new file mode 100644
index 0000000..526753f
--- /dev/null
+++ b/src/app/routes/report/images/table_bg.png
Binary files differ
diff --git a/src/app/routes/report/images/text_t_bg.png b/src/app/routes/report/images/text_t_bg.png
new file mode 100644
index 0000000..d8b159b
--- /dev/null
+++ b/src/app/routes/report/images/text_t_bg.png
Binary files differ
diff --git a/src/app/routes/report/images/text_t_left.png b/src/app/routes/report/images/text_t_left.png
new file mode 100644
index 0000000..c0c2698
--- /dev/null
+++ b/src/app/routes/report/images/text_t_left.png
Binary files differ
diff --git a/src/app/routes/report/images/text_t_right.png b/src/app/routes/report/images/text_t_right.png
new file mode 100644
index 0000000..f186672
--- /dev/null
+++ b/src/app/routes/report/images/text_t_right.png
Binary files differ
diff --git a/src/app/routes/report/report.component.css b/src/app/routes/report/report.component.css
new file mode 100644
index 0000000..b29de6d
--- /dev/null
+++ b/src/app/routes/report/report.component.css
@@ -0,0 +1,61 @@
+@charset "utf-8";
+/* CSS Document */
+
+	body{margin:0;padding:0;background-color:#070707;color:#eee;font-size:14px;line-height:30px;font-family: "Microsoft Yahei", "����������������", Tahoma, Arial, Helvetica, STHeiti}
+	a{text-decoration:none;cursor: pointer}
+	a:link,a:visited{color:#eee}
+	a:hover{color:#4dfdff}
+	h1,h2,h3,h4,ul,li,p{padding:0;margin:0;list-style:none;font-weight:lighter;}
+	.clear_fix:after{content:"";display: block;height:0;clear:both;visibility: hidden}
+	
+	.bg{ margin: 0 0; width: 1000px;}
+	.t_bg{height: 485.35px; background:url(./images/bg.png) no-repeat center top; background-size: 100% 100%; }
+
+	.t_bg img{text-align: center; width:200px; display: block; margin: 0 auto; padding-top: 30px;}
+	
+	.t_bg h1{padding-top: 5px; text-align: center; font-size: 54px; font-weight: bold;}
+	
+	.container{padding-top:30px;text-align:center;}
+	.title{display:inline-block;}
+	.title .title_left{ width:15px; height: 30px; float: left;background: url(./images/t_left.png) no-repeat;}
+	.title .text{ background:url(./images/t_bg.png) repeat;height: 30px; color: #0d56d0; font-size: 20px; float: left; line-height: 30px;}
+	.title .title_right{width:15px; height: 30px; float: left; background: url(./images/t_right.png) no-repeat;}
+	
+	.content{ text-align: center; margin: 10px; margin-left: 70px; margin-right: 70px;}
+	.content .left{ width: 48%; float: left; padding-right: 5px;}
+	.content .text_t,.content .text1,.content .text2{ color: rgb(255, 254, 254);text-shadow: 4.243px 4.243px 5.64px rgba(0, 97, 207, 0.75); font-weight: 500;}
+	
+	.content .text_t{display:inline-block;}
+	.content .text_t_left{ width: 14px;height: 28px; float: left; background: url(./images/text_t_left.png) no-repeat;}
+	.content .text_t_bg{ background: url(./images/text_t_bg.png) repeat;height: 28px; float: left;font-size: 18px; line-height: 28px;}
+	.content .text_t_right{ width: 14px;height: 28px; float: left; background: url(./images/text_t_right.png) no-repeat;}
+
+	.content .text1{ font-size:16px;line-height: 30px;}
+	.content .text2{ font-size:14px;line-height: 25px;}
+	.content .text2 .text_l{ float: left;}
+	.content .text2 .text_r{ float: right;}
+	.content .right{ float: right; width: 48%;}
+		
+/*bottom*/
+	
+	.t_bg_b{width: 100%;height: 485.35px; background:url(./images/bg2.png) no-repeat center top;background-size: 100%;}
+	.t_bg_b h1{padding-top: 25px; text-align: center; font-size: 16px; line-height: 34px; font-weight: 600;}
+
+	.table_bg{ margin: 0 85px;}
+	
+	.table_t{}
+	.table_t .t01,.table_t .t02,.table_t .t03,.table_t .t04{ float: right;text-align:center;font-size: 12px;color: #041324; font-weight: bold;}
+	.table_t .t01{ width: 125px;}
+	.table_t .t02{ width: 115px;}
+	.table_t .t03{ width: 260px;}
+	.table_t .t04{ width: 280px;}
+	
+	.table_text{ margin: 5px 0;}
+	.table_text img{ }
+	.table_text .table_tab_bg{background: url(./images/table_bg.png) no-repeat right;}
+	.table_text .tab1,.table_text .tab2,.table_text .tab3,.table_text .tab4{ float: left; color: #fff; text-align: center; margin-top: 4px;}
+	.table_text .tab1{ width: 125px; font-size: 11px; padding: 0 10px;}
+	.table_text .tab2{ width: 115px; font-size: 10px; padding: 0 10px; line-height: 15px;}
+	.table_text .tab3{ width: 260px; font-size: 10px; padding: 0 25px; line-height: 15px;}
+	.table_text .tab4{ width: 280px; font-size: 10px; padding: 0 20px; line-height: 15px;}
+
diff --git a/src/app/routes/report/report.component.html b/src/app/routes/report/report.component.html
new file mode 100644
index 0000000..4cce924
--- /dev/null
+++ b/src/app/routes/report/report.component.html
@@ -0,0 +1,80 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+	<meta charset="utf-8">
+	<title>������������</title>
+</head>
+<body>
+	<nz-spin [nzTip]="'������������������...'" [nzSize]="'large'"[nzSpinning]="spinning"> </nz-spin>
+
+	<div>
+		<div class="bg" *ngIf="!spinning">
+			<div class="t_bg">
+				<img src="./assets/img/logo.png">
+				
+				<h1>{{title}}������������������</h1>
+				<div class="container">
+					<div class="title">
+						<div class="title_left"></div>
+						<div class="text">
+							<span *ngFor="let item of items;let i = index"><span *ngIf="i > 0">���</span>{{item.monitorPointName}}{{item.professionName}}</span>
+							<span>������������������</span>
+						</div>
+						<div class="title_right"></div>
+						<div class="clear_fix"></div>
+					</div>
+				</div>
+				<div class="content">
+					<div *ngFor="let item of items;let i = index">
+						<div class="{{i % 2 == 0 ? 'left' : 'right'}}">
+							<div class="text_t">
+								<div class="text_t_left"></div>
+								<div class="text_t_bg">{{item.monitorPointName}}{{item.professionName}}</div>
+								<div class="text_t_right"></div>
+								<div class="clear_fix"></div>
+							</div>
+							<p *ngIf="item.monitorPointId" class="text1">���������������{{item.monitorPointAddress}}</p>
+							<p class="text1">������������������{{item.deviceCount?item.deviceCount:0}}���</p>
+							<div class="clear_fix"></div>
+						</div> 
+					</div>
+					<div class="clear_fix"></div>
+				</div>
+			</div>
+		</div>
+
+		<div [ngStyle]="{'display':spinning ? 'none' : 'block' }">
+			<div *ngFor="let i of sensorArr">
+				<div id="mydiv{{i}}" style="height: 485.35px; width: 1000px"></div>
+			</div>
+			<div id="pieChar" style="height: 485.35px; width: 1000px"></div>
+		</div>
+
+		<div id="conclusion" class="bg"  *ngIf="!spinning && isShow" >
+ 			<div class="t_bg_b">
+				<h1>{{title}}������������������������</h1>
+				<div class="table_bg">
+					<div class="table_t">
+						<p class="t04">���������������������</p>
+						<p class="t03">������������</p>
+						<p class="t02">������������������������</p>
+						<p class="t01">���������</p>			
+						<div class="clear_fix"></div>	
+					</div>
+					<div class="table_text"  *ngFor="let item of resultArr;let i = index">
+						<img src="./assets/img/No{{i+1}}.png"  style="float: left;">
+						<div class="table_tab_bg">
+							<p class="tab1">{{item.sensorName}}</p>
+							<p class="tab2">{{item.monitorPointName}}({{item.result}})</p>
+							<p class="tab3">{{item.effect}}</p>
+							<p class="tab4">{{item.measures}}</p>
+							<div class="clear_fix"></div>
+						</div>	
+					</div>
+				</div>
+			</div>
+		</div>
+
+	</div>
+</body>
+</html>
diff --git a/src/app/routes/report/report.component.ts b/src/app/routes/report/report.component.ts
new file mode 100644
index 0000000..85643f5
--- /dev/null
+++ b/src/app/routes/report/report.component.ts
@@ -0,0 +1,262 @@
+import {environment} from '../../../environments/environment';
+import {NzMessageService, NzModalService} from 'ng-zorro-antd';
+import {Component, OnInit, Injector} from '@angular/core';
+import {HttpClient} from '@angular/common/http';
+import * as echarts from 'echarts';
+import * as $ from 'jquery';
+
+@Component({
+  selector: 'app-report',
+  templateUrl: './report.component.html',
+  styleUrls: ['./report.component.css']
+
+})
+export class ReportComponent implements OnInit {
+  constructor(
+    public injector: Injector,
+    public http: HttpClient,
+    public msgSrv: NzMessageService
+  ) {
+    for (let index = 0; index < 30; index++) {
+      this.sensorArr.push(index);
+    }
+  }
+
+  [x: string]: any;
+
+  public spinning = true;
+
+  private echartOption = {
+    backgroundColor: '',
+    title: {
+      text: '',
+      // subtext: '12������',
+      left: 'center'
+    },
+    tooltip: {
+      trigger: 'axis'
+    },
+    legend: {
+      data: [],
+      orient: 'vertical',
+      right: 30,
+      top: 5,
+      bottom: 20,
+      type: 'scroll'
+    },
+    xAxis: {
+      type: 'category',
+      // boundaryGap: false,
+      data: [],
+      name: ''
+    },
+    yAxis: {
+      type: 'value',
+      name: ''
+
+    },
+    series: []
+  };
+
+  public sensorArr: any = [];
+  public resultArr: any = [];
+  public items: any = [];
+  public title: string;
+  private timeArr = ['���', '���', '���', '���', '���'];
+  public typeArr = ['year', 'month', 'day', 'hour'];
+  public sensorKeys: any = [
+    {key: 'e1', name: 'PM 2.5', effect: 'PM2.5������������������������������������������������������������������������������������', measures: '������������������������������������������������������������������������������������'},
+    {key: 'e2', name: 'PM 10', effect: '���������PM10������������������������������������������������������������������������������������', measures: '���������������������������������������������������������������������������������������'},
+    {key: 'e10', name: '���������������CO���', effect: '���������������������������������������������������������������������������������������', measures: '������������������������������������������'},
+    {key: 'e11', name: '���������������SO������', effect: '������������������������������������������������������������������������������������', measures: '������������������������������������������������������������������������������������������������������������������SO2'},
+    {key: 'e15', name: '���������O������', effect: '������������������������ ������������������������������������������������������������������������������', measures: '������������������������������������'},
+    {key: 'e16', name: '���������������NO������', effect: '���������������������������������������������������������������������������������������', measures: '���������������������������������(���������)������������������������������������������'}
+  ];
+
+  private pieCharOption: any = {
+    title: {
+      text: 'AQI������������������������',
+      x: 'center'
+    },
+    tooltip: {
+      trigger: 'item',
+      formatter: '{a} <br/>{b}: {c} ({d}%)'
+    },
+    legend: {
+      // x : 'center',
+      top: '10%',
+      data: []
+    },
+    graphic: [],
+    series: []
+  };
+  public isShow = true;
+  ngOnInit() {
+    const params = JSON.parse(sessionStorage.getItem('queryParams'));
+    if (!!params) {
+      localStorage.removeItem('queryParams');
+      const items = this.items = JSON.parse(params.items);
+      const timeType = params.type;
+      this.http.get(environment.SERVER_BASH_URL + 'report/compare', {params: params}).subscribe((res: any) => {
+        if (res.code === 0) {
+          this.msgSrv.error(res.message);
+        } else {
+          const option = this.echartOption;
+          const sensors = res.data.sensors;
+          const deviceCounts = res.data.deviceCounts;
+          const timeArr = this.timeArr;
+          const label = timeArr[this.typeArr.indexOf(timeType)];
+          option.xAxis.data = res.data.times;
+          option.xAxis.name = timeArr[timeArr.indexOf(label) + 1];
+          for (let index = 0; index < sensors.length; index++) {
+            const sensorKey = sensors[index];
+            const split = sensorKey.split('-');
+            option.title.text = split[1] + label + '������������';
+            option.yAxis.name = split[2] && split[2] !== 'null' ? '������:' + split[2] : '';
+            option.series = [];
+            option.legend.data = [];
+            if (index % 2 === 0) {
+              option.backgroundColor = 'rgba(0,0,0,0)';
+            } else {
+              option.backgroundColor = 'rgba(23,133,23,0.06)';
+            }
+            for (let i = 0; i < items.length; i++) {
+              this.title = items[i].formatTime;
+              items[i].deviceCount = deviceCounts[i];
+              /* if (!(items[i].monitorPointId)) {
+                items[i].monitorPointName = items[i].areaName;
+              } */
+              const showName = this.items[i].showName = 
+                items[i].mac ? ('������:' + items[i].deviceName) : 
+                  ((items[i].monitorPointId ? '���������:' + items[i].monitorPointName : items[i].areaName) + (items[i].professionName ? items[i].professionName : ''));
+              const legendName = items[i].formatTime + label + showName;
+              items[i].legendName = option.legend.data[i] = legendName;
+              if (res.data.datas[i][sensorKey]) {
+                option.series.push({
+                  name: legendName,
+                  data: res.data.datas[i][sensorKey],
+                  type: params.reportType,
+                  smooth: true,
+                  itemStyle: {
+                    normal: {
+                      barBorderRadius: [10, 10, 10, 10]
+                    }
+                  }
+                });
+              }
+            }
+            const myChart = echarts.init(document.getElementById('mydiv' + index));
+            myChart.setOption(option, true);
+            window.onresize = myChart.resize;
+            if (option.series.length < 1) {
+              $('#mydiv' + index).remove();
+            }
+          }
+          this.sensorArr.forEach(i => {
+            if (i >= sensors.length) {
+              $('#mydiv' + i).remove();
+            }
+          });
+          this.spinning = false;
+          if (!this.title) {
+            this.title = items[0].formatTime;
+          }
+          const title: any[] = this.title.replace(' ', '-').split('-');
+          this.title = '';
+          for (let i = 0; i < title.length; i++) {
+            this.title += title[i] + timeArr[i];
+          }
+
+          if ((params.type === 'month' || params.type === 'year') && res.data.sortList.length > 0) {
+            let center = ['50%', '50%'];
+            let left = '40%';
+            const length = items.length;
+            const alarmDatas = res.data.alarmDatas;
+            for (let i = 0; i < length; i++) {
+              this.pieCharOption.legend.data = [];
+              const data = [];
+              this.sensorKeys.forEach(sensorKey => {
+                this.pieCharOption.legend.data.push(sensorKey.name);
+                if (alarmDatas[i]) {
+                  data.push({
+                    name: sensorKey.name,
+                    value: alarmDatas[i][sensorKey.key]
+                  });
+                }
+              });
+              if (length === 2) {
+                if (i === 0) {
+                  center = ['25%', '50%'];
+                  left = '15%';
+                } else {
+                  center = ['75%', '50%'];
+                  left = '65%';
+                }
+              }
+              this.pieCharOption.series.push({
+                name: items[i].monitorPointName,
+                type: 'pie',
+                radius: ['20%', '40%'],
+                center: center,
+                label: {
+                  normal: {
+                    formatter: '{b}:{d}%'
+                  }
+                },
+                labelLine: {
+                  normal: {
+                    show: true
+                  }
+                },
+                data: data
+              });
+              this.pieCharOption.graphic.push({
+                type: 'text',
+                left: left,
+                top: '20%',
+                style: {
+                  text: items[i].legendName
+                }
+              });
+            }
+
+            if (sensors.length % 2 === 0) {
+              this.pieCharOption.backgroundColor = 'rgba(0,0,0,0)';
+            } else {
+              this.pieCharOption.backgroundColor = 'rgba(23,133,23,0.06)';
+            }
+            const myChart = echarts.init(document.getElementById('pieChar'));
+            myChart.setOption(this.pieCharOption, true);
+            window.onresize = myChart.resize;
+
+            for (let i = 0, j = res.data.sortList.length; i < j; i++) {
+              if (i < 5) {
+                for (const key in res.data.sortList[i]) {
+                  const split = key.split('-');
+                  this.sensorKeys.forEach(sensor => {
+                    if (sensor.key === split[0] && res.data.sortList[i][key] != 0) {
+                      this.resultArr.push({
+                        sensorName: sensor.name,
+                        monitorPointName: this.items[split[1]].showName,
+                        result: res.data.sortList[i][key] + '%',
+                        effect: sensor.effect,
+                        measures: sensor.measures
+                      });
+                    }
+
+                  });
+                }
+              }
+            }
+          } else {
+            $('#pieChar').remove();
+            this.isShow = false;
+          }
+        }
+      });
+    } else {
+      this.msgSrv.error('������������������������������������');
+      setTimeout('window.close();', 1000);
+    }
+  }
+}
diff --git a/src/app/routes/reports/alarm/alarm.component.html b/src/app/routes/reports/alarm/alarm.component.html
new file mode 100644
index 0000000..813187a
--- /dev/null
+++ b/src/app/routes/reports/alarm/alarm.component.html
@@ -0,0 +1,124 @@
+<pro-header [title]="'������������'"></pro-header>
+<nz-card [nzBordered]="false">
+	<form nz-form  (ngSubmit)="reportQuery()" [nzLayout]="'inline'">
+		<div nz-row [nzGutter]="24">
+
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="query.dimension" name="dimension" [nzSize]="'large'" [nzPlaceHolder]="'���������'" (ngModelChange)="dimensionChange($event)">
+							<nz-option *ngFor="let option of dimensionOptions" [nzLabel]="option.label" [nzValue]="option.value" ></nz-option>
+            			</nz-select>
+					</div>
+				</div>
+			</div>
+		</div>
+
+		<div nz-row [nzGutter]="24">
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������</label>
+					</div>
+					<div nz-form-control class="flex-1" style="width: 300px">
+                       <nz-popover [nzPlacement]="'bottomLeft'" [nzTrigger]="'click'">
+                            <nz-input [nzType]="'input'" nz-popover [ngModel]="sensorNames" name="sensorKeys" [nzReadonly]="true" [nzPlaceHolder]="'��������� ������'">
+                                <ng-template #suffix>
+                                    <i class="anticon anticon-down ant-cascader-picker-arrow" style="right: 1px;"></i>
+                                </ng-template>
+                            </nz-input>
+                            <ng-template #nzTemplate>
+                                <div [ngStyle]="{'width': '240px', 'height': '240px', 'overflow-y' :'auto'}">
+                                    <nz-tree [nzNodes]="sensorOptions" (nzActivate)="onTreeClickSelect($event)" (nzDeactivate)="onTreeClickSelect($event)" [nzCheckable]="true" (nzCheck)="onSensorSelect($event)"></nz-tree>
+                                </div>
+                            </ng-template>
+                        </nz-popover>
+					</div>
+				</div>
+			</div>
+
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="timeType" name="timeType" [nzSize]="'large'" [nzPlaceHolder]="'���������'">
+							<nz-option *ngFor="let option of typeOptions" [nzLabel]="option.label" [nzValue]="option" ></nz-option>
+            			</nz-select>
+					</div>
+				</div>
+			</div>
+
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label >������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-datepicker style="width: 100%;" [(ngModel)]="time" name="time" [nzPlaceHolder]="'��������� ������'"  [nzSize]="'large'" [nzFormat]="timeType.format" 
+							[nzMode]="'month'" ></nz-datepicker>
+					</div>
+				</div>
+			</div>
+
+		</div>
+
+		<div nz-row [nzGutter]="24">
+
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label nz-form-item-required>���������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+                        <nz-cascader (nzLoad)="areaLazyLoad($event)" [nzPlaceHolder]="'��������� ���/���/���'" [nzAllowClear]="false" [nzChangeOnSelect]="true" (nzSelect)="regionChange($event)">
+                        </nz-cascader>
+					</div>
+				</div>
+			</div>
+
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="query.monitorPointId" name="monitorPoint" [nzPlaceHolder]="'��������� ������������'" [nzSize]="'large'"  
+							[nzNotFoundContent]="'������������'" (ngModelChange)="monitorPointChange($event)" nzShowSearch nzAllowClear [nzDisabled]="isDisable"> 
+							<nz-option *ngFor="let option of monitorPointOptions"  [nzLabel]="option['name']" [nzValue]="option['id']"> </nz-option> 
+						</nz-select>
+					</div>
+				</div>
+			</div>
+
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="query.mac" name="mac" [nzSize]="'large'" [nzPlaceHolder]="'��������� ������'" [nzNotFoundContent]="'������������'" nzShowSearch nzAllowClear [nzDisabled]="isDisable">
+							<nz-option *ngFor="let option of deviceOptions" [nzLabel]="option.name" [nzValue]="option.mac" ></nz-option>
+            			</nz-select>
+					</div>
+				</div>
+			</div>
+		</div>
+
+		<div nz-row [nzGutter]="24">
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<button nz-button type="submit" [nzType]="'primary'" [nzSize]="'large'" [nzLoading]="loading">������</button>
+			</div>
+		</div>
+	</form>
+</nz-card>
+
+<nz-card [nzBordered]="false" [ngStyle]="{'display':isShow ? 'block' : 'none' }">
+	<div id="mydiv">
+		<!-- <div id="mydiv{{i}}" style="height: 485.35px; width: 1000px"></div> -->
+	</div>
+</nz-card>
\ No newline at end of file
diff --git a/src/app/routes/reports/alarm/alarm.component.ts b/src/app/routes/reports/alarm/alarm.component.ts
new file mode 100644
index 0000000..fa36855
--- /dev/null
+++ b/src/app/routes/reports/alarm/alarm.component.ts
@@ -0,0 +1,310 @@
+import {DateService} from '../../../business/services/util/date.service';
+import {HttpClient} from '@angular/common/http';
+import {Component, OnInit} from '@angular/core';
+import {_HttpClient} from '@delon/theme';
+// tslint:disable-next-line:import-blacklist
+import {Subject} from 'rxjs';
+import {CascaderOption} from 'ng-zorro-antd/src/cascader/nz-cascader.component';
+import {AreacodeService} from '@business/services/http/areacode.service';
+import {NzTreeComponent} from 'ng-tree-antd';
+import {NzMessageService} from 'ng-zorro-antd';
+import {environment} from '../../../../environments/environment';
+import * as echarts from 'echarts';
+import * as $ from 'jquery';
+
+@Component({
+  selector: 'app-alarm',
+  templateUrl: './alarm.component.html',
+})
+
+export class AlarmComponent implements OnInit {
+
+  constructor(
+    public http: HttpClient,
+    public dateSrv: DateService,
+    public msgSrv: NzMessageService,
+    private areacodeService: AreacodeService,
+  ) {
+    this.timeType = this.typeOptions[1];
+    this.query.dimension = this.dimensionOptions[0].value;
+  }
+
+  [x: string]: any;
+  public loading = false;
+  public isShow = false;
+  public sensorArr: any = [];
+  public query: any = {};
+  public sensorOptions = [];
+  public monitorPointOptions = [];
+  public deviceOptions = [];
+  public typeOptions = [
+    {value: 'year', label: '���', format: 'YYYY'},
+    {value: 'month', label: '���', format: 'YYYY-MM'}
+  ];
+  public dimensionOptions = [
+    {value: 'sensor', label: '������'},
+    {value: 'monitorPoint', label: '������������'}
+  ];
+  isDisable = false;
+  private treeClickStream: Subject<any> = new Subject<any>();
+  private _sensors: {[key: string]: string} = {};
+  private _sensorNames: string;
+  get sensorNames(): string {
+    return this._sensorNames;
+  }
+
+  private pieCharOption: any = {
+    title: {
+      text: '������������������������',
+      x: 'center'
+    },
+    tooltip: {
+      trigger: 'item',
+      formatter: '{a} <br/>{b}: {c} ({d}%)'
+    },
+    //    legend: {
+    //      //x : 'center',
+    //      top: '10%',
+    //      data: []
+    //    },
+    series: []
+  };
+  private serie: any = {
+    name: '',
+    type: 'pie',
+    radius: ['20%', '40%'],
+    label: {
+      normal: {
+        formatter: '{b}:{d}%'
+      }
+    },
+    labelLine: {
+      normal: {
+        show: true
+      }
+    },
+    data: []
+  };
+
+  ngOnInit() {
+    this.http.get(environment.SERVER_BASH_URL + 'sensor/all').subscribe((res: any) => {
+      if (res.code === 0) {
+        this.msgSrv.error(res.message);
+      } else {
+        this.sensorOptions.push({id: -1, name: '������', isExpanded: true, children: res.data});
+      }
+    });
+  }
+
+  dimensionChange(value) {
+    if (value === 'sensor') {
+      this.isDisable = false;
+    } else {
+      this.isDisable = true;
+      this.query.monitorPointId = null;
+      this.query.mac = null;
+    }
+  }
+
+  public onTreeClickSelect(event): void {
+    this.treeClickStream.next(event);
+  }
+
+  public onSensorSelect(event): void {
+    const data = event.node.data;
+    if (data.id === -1 && data.halfChecked === false) {
+      if (!!data.checked) {
+        this.sensorOptions[0].children.forEach(
+          sensor => {
+            this._sensors[sensor.id] = sensor.sensorKey + '-' + sensor.name + '-' + sensor.unit;
+          }
+        );
+      } else {
+        this._sensors = {};
+      }
+    } else {
+      if (!!data.checked) {
+        this._sensors[data.id] = data.sensorKey + '-' + data.name + '-' + data.unit;
+      } else {
+        delete this._sensors[data.id];
+      }
+    }
+    this.reloadSensorNames();
+
+  }
+  private reloadSensorNames(): void {
+    // ������������������������
+    setTimeout(() => {
+      this._sensorNames = '';
+      const sensorNameList = Object.keys(this._sensors).map(
+        id => {
+          const sensor = this.sensorOptions[0].children.find(item => {
+            return Number(id) === Number(item.id);
+          });
+          return sensor.name;
+        }
+      );
+      this._sensorNames = sensorNameList.join(', ');
+    }, 1);
+  }
+
+  public areaLazyLoad(event: {option: CascaderOption, index: number, resolve: (children: CascaderOption[]) => void, reject: () => void}) {
+    const index = event['index'];
+    const option = event.option;
+    switch (index) {
+      case -1:
+        this.areacodeService.getProvinces().subscribe(
+          (res: {label: string, value: string}[]) => {
+            event.resolve(res);
+          }
+        );
+        break;
+      case 0:
+        this.areacodeService.getCities(option.value).subscribe(
+          (res: {label: string, value: string}[]) => {
+            event.resolve(res);
+          }
+        );
+        break;
+      case 1:
+        this.areacodeService.getAreas(option.value).subscribe(
+          (res: {label: string, value: string}[]) => {
+            event.resolve(res);
+          }
+        );
+        break;
+    }
+  }
+
+  public regionChange(event: {option: CascaderOption, index: number}) {
+    let name = '';
+    const option = event.option;
+    this.query.areaCode = null;
+    this.query.monitorPointId = null;
+    this.query.mac = null;
+    switch (event.index) {
+      case 0:
+        name = 'provinceCode';
+        this.query.provinceCode = option.value;
+        this.query.cityCode = null;
+        break;
+      case 1:
+        name = 'cityCode';
+        this.query.cityCode = option.value;
+        break;
+      case 2:
+        name = 'areaCode';
+        this.query.areaCode = option.value;
+        break;
+    }
+    this.http.get(environment.SERVER_BASH_URL + 'monitor-point/list/region', {params: {name: name, value: option.value}}).subscribe((res: any) => {
+      if (res.code === 0) {
+        this.msgSrv.error(res.message);
+      } else {
+        this.monitorPointOptions = res.data;
+      }
+    });
+  }
+
+  monitorPointChange(value) {
+    this.query.mac = null;
+    this.deviceOptions = [];
+    if (value) {
+      this.http.get(environment.SERVER_BASH_URL + 'device/monitorPointId', {params: {monitorPointId: value}}).subscribe((res: any) => {
+        if (res.code === 0) {
+          this.msgSrv.error(res.message);
+        } else {
+          this.deviceOptions = res.data;
+        }
+      });
+    }
+  }
+
+  reportQuery() {
+    const query = this.query;
+    if (this.monitorPointOptions.length > 0) {
+      this.sensorArr = [];
+      $('#mydiv').empty();
+      for (let index = 0; index < 30; index++) {
+        this.sensorArr.push(index);
+        $('#mydiv').append('<div id=\'mydiv' + index + '\' style=\'height: 485.35px; width: 1000px\'></div>');
+      }
+      this.loading = true;
+      this.isShow = false;
+      query.time = this.dateSrv.date_format(this.time, this.timeType.format);
+      delete query.sensors;
+      if (this._sensors) {
+        const sensors = [];
+        for (const key in this._sensors) {
+          sensors.push(this._sensors[key]);
+        }
+        if (sensors.length > 0) {
+          query.sensors = JSON.stringify(sensors);
+        }
+      }
+      query.type = this.timeType.value;
+      this.http.get(environment.SERVER_BASH_URL + 'report/pie', {params: query}).subscribe((res: any) => {
+        const option = this.pieCharOption;
+        let index = 0;
+        if (query.dimension === 'monitorPoint') {
+          for (const key in res.data) {
+            let name: string;
+            this.sensorOptions[0].children.forEach(sensor => {
+              if (key === sensor.sensorKey) {
+                name = sensor.name;
+              }
+            });
+            option.title.text = name + '������������������������';
+
+            if (index % 2 === 0) {
+              option.backgroundColor = 'rgba(0,0,0,0)';
+            } else {
+              option.backgroundColor = 'rgba(23,133,23,0.06)';
+            }
+
+            option.series = [];
+            this.serie.name = name;
+            this.serie.data = res.data[key];
+            option.series.push(this.serie);
+
+            const myChart = echarts.init(document.getElementById('mydiv' + index));
+            myChart.setOption(option, true);
+            window.onresize = myChart.resize;
+            index = index + 1;
+          }
+        } else {
+          option.series = [];
+          if (!!res.data.list && res.data.list.length > 0) {
+            option.title.text = '������������������������';
+            this.serie.data = res.data.list;
+            option.series.push(this.serie);
+            const myChart = echarts.init(document.getElementById('mydiv' + index));
+            myChart.setOption(option, true);
+            window.onresize = myChart.resize;
+            index = index + 1;
+          }
+
+          // this.setOption(option,index);
+        }
+
+        this.sensorArr.forEach(i => {
+          if (i >= index) {
+            $('#mydiv' + i).remove();
+          }
+        });
+        this.loading = false;
+        this.isShow = true;
+
+      });
+    } else {
+      this.msgSrv.error('���������������������������');
+    }
+  }
+
+  setOption(option, index) {
+    const myChart = echarts.init(document.getElementById('mydiv' + index));
+    myChart.setOption(this.pieCharOption, true);
+    window.onresize = myChart.resize;
+    index = index + 1;
+  }
+}
diff --git a/src/app/routes/reports/demo/demo.component.html b/src/app/routes/reports/demo/demo.component.html
new file mode 100644
index 0000000..ea195e5
--- /dev/null
+++ b/src/app/routes/reports/demo/demo.component.html
@@ -0,0 +1,154 @@
+<pro-header [title]="'������������'"></pro-header>
+<nz-card [nzBordered]="false">
+	<form nz-form  (ngSubmit)="reportQuery()" [nzLayout]="'inline'">
+		<div nz-row [nzGutter]="24">
+			<div nz-col [nzSpan]="5" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<!-- <nz-select [nzMode]="'multiple'" [(ngModel)]="query.sensorKeys" name="sensorKeys" [nzSize]="'large'" [nzPlaceHolder]="'���������'">
+							<nz-option *ngFor="let option of sensorOptions" [nzLabel]="option.name" [nzValue]="option.sensorKey + '-' + option.name + '-' + option.unit"></nz-option>
+            			</nz-select> -->
+                        <nz-popover [nzPlacement]="'bottomLeft'" [nzTrigger]="'click'">
+                            <nz-input [nzType]="'input'" nz-popover [ngModel]="sensorNames" name="sensorKeys" [nzReadonly]="true" [nzPlaceHolder]="'��������� ������'" [nzSize]="'large'">
+                                <ng-template #suffix>
+                                    <i class="anticon anticon-down ant-cascader-picker-arrow" style="right: 1px;"></i>
+                                </ng-template>
+                            </nz-input>
+                            <ng-template #nzTemplate>
+                                <div [ngStyle]="{'width': '240px', 'height': '240px', 'overflow-y' :'auto'}">
+                                    <nz-tree [nzNodes]="sensorOptions" (nzActivate)="onTreeClickSelect($event)" (nzDeactivate)="onTreeClickSelect($event)" [nzCheckable]="true" (nzCheck)="onSensorSelect($event)"></nz-tree>
+                                </div>
+                            </ng-template>
+                        </nz-popover>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="5" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="query.dimension" name="dimension" [nzSize]="'large'" [nzPlaceHolder]="'���������'" (ngModelChange)="dimensionChange($event)">
+							<nz-option *ngFor="let option of dimensionOptions" [nzLabel]="option.label" [nzValue]="option.value" ></nz-option>
+            			</nz-select>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="5" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="timeType" name="timeType" [nzSize]="'large'" [nzPlaceHolder]="'���������'">
+							<nz-option *ngFor="let option of typeOptions" [nzLabel]="option.label" [nzValue]="option" ></nz-option>
+            			</nz-select>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="5" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="query.reportType" name="reportType" [nzSize]="'large'" [nzPlaceHolder]="'���������'">
+							<nz-option *ngFor="let option of reportOptions" [nzLabel]="option.label" [nzValue]="option.value" ></nz-option>
+            			</nz-select>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="4" class="mb-md" *ngIf="items.length < 2">
+				<button nz-button type="button" [nzType]="'primary'" [nzSize]="'large'" (click)="addItem()">
+					<!-- <i class="anticon anticon-plus"></i> -->
+					<i class="anticon anticon-plus-circle-o"></i>
+					<span>������������������</span>
+				</button>
+			</div>
+			
+		</div>
+
+		<div nz-row [nzGutter]="24" *ngFor="let item of items;let i = index">
+			<div nz-col [nzSpan]="5" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label nz-form-item-required>������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+                        <nz-cascader [nzSize]="'large'" (nzLoad)="areaLazyLoad($event,i)" [nzPlaceHolder]="'��������� ���/���/���/���/���'" [nzAllowClear]="false" [nzChangeOnSelect]="true" (nzSelect)="regionChange($event,i)">
+                        </nz-cascader>
+					</div>
+				</div>
+			</div>
+
+			<div nz-col [nzSpan]="5" class="mb-md" [ngStyle]="{'display':monitorPointShow ? 'block' : 'none' }">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="item.monitorPoint" name="monitorPoint{{item.id}}" [nzPlaceHolder]="'��������� ������������'" [nzSize]="'large'"  
+							[nzNotFoundContent]="'������������'" (ngModelChange)="getDevices(i)" nzShowSearch nzAllowClear> 
+							<nz-option *ngFor="let option of item.monitorPointOptions"  [nzLabel]="option['name']" [nzValue]="option"> </nz-option> 
+						</nz-select>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="5" class="mb-md" [ngStyle]="{'display':professionShow ? 'block' : 'none' }">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label >������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="item.profession" name="profession{{item.id}}" [nzSize]="'large'" [nzPlaceHolder]="'��������� ������'" nzAllowClear (ngModelChange)="getDevices(i)" >
+							<nz-option *ngFor="let option of professionOptions" [nzLabel]="option.name" [nzValue]="option" ></nz-option>
+            			</nz-select>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="5" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="item.device" name="mac{{item.id}}" [nzSize]="'large'" [nzPlaceHolder]="'��������� ������'" [nzNotFoundContent]="'������������'" nzShowSearch nzAllowClear>
+							<nz-option *ngFor="let option of item.deviceOptions" [nzLabel]="option.name" [nzValue]="option" ></nz-option>
+            			</nz-select>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="5" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-datepicker style="width: 100%;" [(ngModel)]="item.time" name="time{{item.id}}" [nzFormat]="timeType.format" [nzDisabledDate]="_disabledDate" [nzAllowClear]="false"
+							[nzMode]="timeType.value=='hour'||timeType.value=='day'?'day':'month'" [nzShowTime]="timeType.value=='hour'?true:false" [nzSize]="'large'"></nz-datepicker>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="4" class="mb-md" *ngIf="items.length > 1">
+				<button nz-button type="button" [nzType]="'danger'" [nzSize]="'large'" (click)="items.splice(i, 1)">
+					<i class="anticon anticon-minus-circle-o dynamic-delete-button"></i>
+					<span>������������������</span>
+				</button>
+			</div>
+		</div>
+
+		<div nz-row [nzGutter]="24">
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<button nz-button type="submit" [nzType]="'primary'" [nzSize]="'large'">
+					<a target="_blank" [routerLink]="['/report']" (click)="reportQuery()">������</a>
+				</button>
+				<!-- <button nz-button type="reset" [nzSize]="'large'" class="mx-sm" (click)="load()">������</button> -->
+			</div>
+		</div>
+	</form>
+
+</nz-card>
diff --git a/src/app/routes/reports/demo/demo.component.ts b/src/app/routes/reports/demo/demo.component.ts
new file mode 100644
index 0000000..c279929
--- /dev/null
+++ b/src/app/routes/reports/demo/demo.component.ts
@@ -0,0 +1,330 @@
+import {environment} from '../../../../environments/environment';
+import {DateService} from '../../../business/services/util/date.service';
+import {NzMessageService} from 'ng-zorro-antd';
+import {Component, OnInit} from '@angular/core';
+import {HttpClient} from '@angular/common/http';
+import {CascaderOption} from 'ng-zorro-antd/src/cascader/nz-cascader.component';
+import {AreacodeService} from '@business/services/http/areacode.service';
+import {NzTreeComponent} from 'ng-tree-antd';
+import {Subject} from 'rxjs/Subject';
+
+@Component({
+  selector: 'app-demo',
+  templateUrl: './demo.component.html',
+  styles: []
+})
+
+export class DemoComponent implements OnInit {
+  [x: string]: any;
+  public query: any = {};
+  public sensorOptions = [];
+  public typeOptions = [
+    {value: 'year', label: '���', format: 'YYYY'},
+    {value: 'month', label: '���', format: 'YYYY-MM'},
+    {value: 'day', label: '���', format: 'YYYY-MM-DD'},
+    {value: 'hour', label: '���', format: 'YYYY-MM-DD HH'}
+  ];
+  public reportOptions = [
+    {value: 'bar', label: '���������'},
+    {value: 'line', label: '���������'}
+  ];
+  public professionOptions = [];
+  public dimensionOptions = [
+    {value: 'monitorPoint', label: '������������'},
+    {value: 'profession', label: '������'}
+  ];
+  monitorPointShow = true;
+  professionShow = false;
+  public items: any[] = [{
+    id: 0,
+    profession: null,
+    monitorPoint: null,
+    device: null,
+    time: new Date(),
+    monitorPointOptions: [],
+    deviceOptions: []
+  }];
+
+  private treeClickStream: Subject<any> = new Subject<any>();
+  private _sensors: {[key: string]: string} = {};
+  private _sensorNames: string;
+  get sensorNames(): string {
+    return this._sensorNames;
+  }
+
+  constructor(
+    public http: HttpClient,
+    public dateSrv: DateService,
+    private areacodeService: AreacodeService,
+    public msgSrv: NzMessageService
+  ) {
+    this.timeType = this.typeOptions[1];
+    this.query.reportType = this.reportOptions[1].value;
+    this.query.dimension = this.dimensionOptions[0].value;
+  }
+
+  ngOnInit() {
+    this.http.get(environment.SERVER_BASH_URL + 'sensor/all').subscribe((res: any) => {
+      if (res.code === 0) {
+        this.msgSrv.error(res.message);
+      } else {
+        this.sensorOptions.push({id: -1, name: '������', isExpanded: true, children: res.data});
+      }
+    });
+
+    this.http.get(environment.SERVER_BASH_URL + 'mobile/profession').subscribe((res: any) => {
+      if (res.errno !== 0) {
+        this.msgSrv.error(res.message);
+      } else {
+        this.professionOptions = res.data;
+      }
+    });
+  }
+  
+  dimensionChange(value) {
+    this.items.forEach((item, index) => {
+      item.profession = null;
+      item.monitorPoint = null;
+      this.getDevices(index);
+    });
+    if (value === 'monitorPoint') {
+      this.professionShow = false;
+      this.monitorPointShow = true;
+    } else {
+      this.professionShow = true;
+      this.monitorPointShow = false;
+    }
+  }
+
+  public onTreeClickSelect(event): void {
+    this.treeClickStream.next(event);
+  }
+
+  public onSensorSelect(event): void {
+    const data = event.node.data;
+    if (data.id === -1 && data.halfChecked === false) {
+      if (!!data.checked) {
+        this.sensorOptions[0].children.forEach(
+          sensor => {
+            this._sensors[sensor.id] = sensor.sensorKey + '-' + sensor.name + '-' + sensor.unit;
+          }
+        );
+      } else {
+        this._sensors = {};
+      }
+    } else {
+      if (!!data.checked) {
+        this._sensors[data.id] = data.sensorKey + '-' + data.name + '-' + data.unit;
+      } else {
+        delete this._sensors[data.id];
+      }
+    }
+    this.reloadSensorNames();
+
+  }
+  private reloadSensorNames(): void {
+    // ������������������������
+    setTimeout(() => {
+      this._sensorNames = '';
+      const sensorNameList = Object.keys(this._sensors).map(
+        id => {
+          const sensor = this.sensorOptions[0].children.find(item => {
+            return Number(id) === Number(item.id);
+          });
+          return sensor.name;
+        }
+      );
+      this._sensorNames = sensorNameList.join(', ');
+    }, 1);
+  }
+
+  addItem() {
+    const id = (this.items.length > 0) ? this.items[this.items.length - 1].id + 1 : 0;
+    const index = this.items.push({
+      id: id,
+      profession: null,
+      monitorPoint: null,
+      device: null,
+      time: new Date(),
+      monitorPointOptions: [],
+      deviceOptions: []
+    });
+  }
+
+  public areaLazyLoad(event: {option: CascaderOption, index: number, resolve: (children: CascaderOption[]) => void, reject: () => void}) {
+    const index = event['index'];
+    const option = event.option;
+    switch (index) {
+      case -1:
+        this.areacodeService.getProvinces().subscribe(
+          (res: {label: string, value: string}[]) => {
+            event.resolve(res);
+          }); 
+        break;
+      case 0:
+        this.areacodeService.getCities(option.value).subscribe(
+          (res: {label: string, value: string}[]) => {
+            event.resolve(res);
+          });
+         break;
+      case 1:
+        this.areacodeService.getAreas(option.value,false).subscribe(
+          (res: {label: string, value: string}[]) => {
+            event.resolve(res);
+          }); 
+        break;
+      case 2:
+        this.areacodeService.getTowns(option.value).subscribe(
+          (res: {label: string, value: string}[]) => {
+            event.resolve(res);
+          }); 
+        break;
+      case 3:
+        this.areacodeService.getVillages(option.value).subscribe(
+          (res: {label: string, value: string}[]) => {
+            event.resolve(res);
+          }); 
+        break;
+    }
+  }
+
+  public regionChange(event: {option: CascaderOption, index: number}, i) {
+
+    let name = '';
+    let areaName = '';
+    const option = event.option;
+    this.items[i].monitorPoint = null;
+    //this.items[i].profession = null;
+    this.items[i].cityCode = null;
+    this.items[i].areaCode = null;
+    this.items[i].townCode = null;
+    this.items[i].villageCode = null;
+    
+    switch (event.index) {
+      case 0:
+        name = 'provinceCode';
+        this.items[i].provinceCode = option.value;
+        areaName = option.label;
+        break;
+      case 1:
+        name = 'cityCode';
+        this.items[i].cityCode = option.value;
+        areaName = option.parent.label + '/' + option.label;
+        break;
+      case 2:
+        name = 'areaCode';
+        this.items[i].areaCode = option.value;
+        areaName = option.parent.parent.label + '/' + option.parent.label + '/' + option.label;
+        break;
+      case 3:
+        name = 'townCode';
+        this.items[i].townCode = option.value;
+        areaName = option.parent.parent.parent.label + '/' + option.parent.parent.label + '/' + option.parent.label + '/' + option.label;
+        break;
+      case 4:
+        name = 'villageCode';
+        this.items[i].villageCode = option.value;
+        areaName = option.parent.parent.parent.parent.label + '/' + option.parent.parent.parent.label + '/' + option.parent.parent.label + '/' + option.parent.label + '/' + option.label;
+        break;
+    }
+    this.items[i].areaName = areaName;
+    this.http.get(environment.SERVER_BASH_URL + 'monitor-point/list/region', {params: {name: name, value: option.value}}).subscribe((res: any) => {
+      if (res.code === 0) {
+        this.msgSrv.error(res.message);
+      } else {
+        this.items[i].monitorPointOptions = res.data;
+      }
+    });
+    this.getDevices(i);
+  }
+  
+  getDevices(i) {
+    this.items[i].device = null;
+    if (!!this.items[i].profession) {
+      this.items[i].professionId = this.items[i].profession.id;
+    } else {
+      this.items[i].professionId = null;
+    }
+    if (!!this.items[i].monitorPoint) {
+      this.items[i].monitorPointId = this.items[i].monitorPoint.id;
+    } else {
+      this.items[i].monitorPointId = null;
+    }
+    return this.http.get(environment.SERVER_BASH_URL + 'device/professionId', {params: this.items[i]}).subscribe((res: any) => {
+      if (res.code === 0) {
+        this.msgSrv.error(res.message);
+      } else {
+        this.items[i].deviceOptions = res.data;
+      }
+    });
+  }
+  
+  _disabledDate(current: Date): boolean {
+    return current && current.getTime() > Date.now();
+  }
+
+  reportQuery() {
+    const query = this.query;
+    let validate = true;
+    const queryItems = [];
+    for (let i = 0; i < this.items.length; i++) {
+      const areaName = '';
+      const item = this.items[i];
+      const queryItem: any = {};
+      if (item.monitorPointOptions.length > 0 && item.deviceOptions.length > 0) {
+        for (const key in item) {
+          if (item[key]) {
+            queryItem[key] = item[key];
+          }
+        }
+        if (queryItem.profession) {
+          queryItem.professionId = queryItem.profession.id;
+          queryItem.professionName = queryItem.profession.name;
+          delete queryItem.profession;
+        }
+        if (queryItem.monitorPoint) {
+          queryItem.monitorPointId = queryItem.monitorPoint.id;
+          queryItem.monitorPointName = queryItem.monitorPoint.name;
+          queryItem.monitorPointAddress = queryItem.monitorPoint.address;
+          delete queryItem.monitorPoint;
+        } else {
+          queryItem.monitorPointName = queryItem.areaName;
+        }
+        delete queryItem.monitorPointOptions;
+        if (queryItem.device) {
+          queryItem.mac = queryItem.device.mac;
+          queryItem.deviceName = queryItem.device.name;
+          delete queryItem.device;
+        }
+        if (queryItem.deviceOptions && queryItem.deviceOptions.length > 0) {
+          queryItem.deviceCount = queryItem.deviceOptions.length;
+        }
+        delete queryItem.deviceOptions;
+        queryItem.formatTime = this.dateSrv.date_format(queryItem.time, this.timeType.format);
+        delete queryItem.time;
+        queryItems.push(queryItem);
+      } else {
+        validate = false;
+        break;
+      }
+    }
+    if (validate) {
+      delete query.sensors;
+      if (this._sensors) {
+        const sensors = [];
+        for (const key in this._sensors) {
+          sensors.push(this._sensors[key]);
+        }
+        if (sensors.length > 0) {
+          query.sensors = JSON.stringify(sensors);
+        }
+      }
+      query.items = JSON.stringify(queryItems);
+      query.type = this.timeType.value;
+      sessionStorage.setItem('queryParams', JSON.stringify(query));
+    } else {
+      this.msgSrv.error('���������������������������������������������������������������');
+      return false;
+    }
+  }
+}
diff --git a/src/app/routes/reports/excel/excel.component.html b/src/app/routes/reports/excel/excel.component.html
new file mode 100644
index 0000000..f0245c9
--- /dev/null
+++ b/src/app/routes/reports/excel/excel.component.html
@@ -0,0 +1,121 @@
+<pro-header [title]="'������������'"></pro-header>
+<nz-card [nzBordered]="false">
+	<form nz-form  (ngSubmit)="reportQuery()" [nzLayout]="'inline'">
+		<div nz-row [nzGutter]="24">
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+                       <nz-popover [nzPlacement]="'bottomLeft'" [nzTrigger]="'click'">
+                            <nz-input [nzType]="'input'" nz-popover [ngModel]="sensorNames" name="sensorKeys" [nzReadonly]="true" [nzPlaceHolder]="'��������� ������'" [nzSize]="'large'">
+                                <ng-template #suffix>
+                                    <i class="anticon anticon-down ant-cascader-picker-arrow" style="right: 1px;"></i>
+                                </ng-template>
+                            </nz-input>
+                            <ng-template #nzTemplate>
+                                <div [ngStyle]="{'width': '240px', 'height': '240px', 'overflow-y' :'auto'}">
+                                    <nz-tree [nzNodes]="sensorOptions" (nzActivate)="onTreeClickSelect($event)" (nzDeactivate)="onTreeClickSelect($event)" [nzCheckable]="true" (nzCheck)="onSensorSelect($event)">
+                                    </nz-tree>
+                                </div>
+                            </ng-template>
+                        </nz-popover>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="timeType" name="timeType" [nzSize]="'large'" [nzPlaceHolder]="'���������'">
+							<nz-option *ngFor="let option of typeOptions" [nzLabel]="option.label" [nzValue]="option" ></nz-option>
+            			</nz-select>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label nz-form-item-required>���������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-datepicker style="width: 100%;" [(ngModel)]="query.time" name="time" [nzPlaceHolder]="'��������� ������'"  [nzSize]="'large'" [nzFormat]="timeType.format" 
+							[nzMode]="timeType.value=='hour'||timeType.value=='day'?'day':'month'" [nzShowTime]="timeType.value=='hour'?true:false"></nz-datepicker>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label >���������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-datepicker style="width: 100%;" [(ngModel)]="query.timeb" name="timeb" [nzPlaceHolder]="'��������� ������'" [nzSize]="'large'" [nzFormat]="timeType.format" 
+							[nzMode]="timeType.value=='hour'||timeType.value=='day'?'day':'month'" [nzShowTime]="timeType.value=='hour'?true:false"></nz-datepicker>
+					</div>
+				</div>
+			</div>
+		</div>
+
+		<div nz-row [nzGutter]="24">
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label nz-form-item-required>���������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+                        <nz-cascader (nzLoad)="areaLazyLoad($event)" [nzPlaceHolder]="'��������� ���/���/���'" [nzAllowClear]="false" [nzChangeOnSelect]="true" (nzSelect)="regionChange($event)" [nzSize]="'large'">
+                        </nz-cascader>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label >������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="query.professionId" name="profession" [nzSize]="'large'" [nzPlaceHolder]="'��������� ������'" nzAllowClear (ngModelChange)="getDevices()" >
+							<nz-option *ngFor="let option of professionOptions" [nzLabel]="option.name" [nzValue]="option.id" ></nz-option>
+            			</nz-select>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="query.monitorPointId" name="monitorPoint" [nzPlaceHolder]="'��������� ������������'" [nzSize]="'large'"  
+							[nzNotFoundContent]="'������������'" (ngModelChange)="getDevices()" nzShowSearch nzAllowClear> 
+							<nz-option *ngFor="let option of monitorPointOptions"  [nzLabel]="option['name']" [nzValue]="option['id']"> </nz-option> 
+						</nz-select>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label class="label-width-70">
+						<label>������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="query.mac" name="mac" [nzSize]="'large'" [nzPlaceHolder]="'��������� ������'" [nzNotFoundContent]="'������������'" nzShowSearch nzAllowClear>
+							<nz-option *ngFor="let option of deviceOptions" [nzLabel]="option.name" [nzValue]="option.mac" ></nz-option>
+            			</nz-select>
+					</div>
+				</div>
+			</div>
+		</div>
+
+		<div nz-row [nzGutter]="24">
+			<div nz-col [nzSpan]="6" class="mb-md">
+				<button nz-button type="submit" [nzType]="'primary'" [nzSize]="'large'">������</button>
+				<!-- <button nz-button type="reset" [nzSize]="'large'" class="mx-sm">������</button> -->
+			</div>
+		</div>
+	</form>
+</nz-card>
diff --git a/src/app/routes/reports/excel/excel.component.ts b/src/app/routes/reports/excel/excel.component.ts
new file mode 100644
index 0000000..8e4dba4
--- /dev/null
+++ b/src/app/routes/reports/excel/excel.component.ts
@@ -0,0 +1,206 @@
+import {environment} from '../../../../environments/environment';
+import {DateService} from '../../../business/services/util/date.service';
+import {NzMessageService, NzModalService} from 'ng-zorro-antd';
+import {Component, OnInit, Inject} from '@angular/core';
+import {HttpClient} from '@angular/common/http';
+import {ITokenService, DA_SERVICE_TOKEN} from '@delon/auth';
+import {CascaderOption} from 'ng-zorro-antd/src/cascader/nz-cascader.component';
+import {AreacodeService} from '@business/services/http/areacode.service';
+import {NzTreeComponent} from 'ng-tree-antd';
+import {Subject} from 'rxjs/Subject';
+
+@Component({
+  selector: 'app-excel',
+  templateUrl: './excel.component.html',
+  styles: []
+})
+export class ExcelComponent implements OnInit {
+  [x: string]: any;
+  public query: any = {};
+  public sensorOptions = [];
+  public monitorPointOptions = [];
+  public deviceOptions = [];
+  public typeOptions = [
+    {value: 'year', label: '���', format: 'YYYY'},
+    {value: 'month', label: '���', format: 'YYYY-MM'},
+    {value: 'day', label: '���', format: 'YYYY-MM-DD'},
+    {value: 'hour', label: '���', format: 'YYYY-MM-DD HH'}
+  ];
+  public professionOptions = [];
+
+  private treeClickStream: Subject<any> = new Subject<any>();
+  private _sensors: {[key: string]: string} = {};
+  private _sensorNames: string;
+  get sensorNames(): string {
+    return this._sensorNames;
+  }
+
+  constructor(
+    public http: HttpClient,
+    public dateSrv: DateService,
+    public msgSrv: NzMessageService,
+    private areacodeService: AreacodeService,
+    @Inject(DA_SERVICE_TOKEN) public tokenService: ITokenService
+  ) {
+    this.timeType = this.typeOptions[1];
+  }
+
+  ngOnInit() {
+    this.query.time = null;
+    this.query.timeb = null;
+    this.http.get(environment.SERVER_BASH_URL + 'sensor/all').subscribe((res: any) => {
+      if (res.code === 0) {
+        this.msgSrv.error(res.message);
+      } else {
+        this.sensorOptions.push({id: -1, name: '������', isExpanded: true, children: res.data});
+      }
+    });
+    this.http.get(environment.SERVER_BASH_URL + 'mobile/profession').subscribe((res: any) => {
+      if (res.errno !== 0) {
+        this.msgSrv.error(res.message);
+      } else {
+        this.professionOptions = res.data;
+      }
+    });
+  }
+
+  public onTreeClickSelect(event): void {
+    this.treeClickStream.next(event);
+  }
+
+  public onSensorSelect(event): void {
+    const data = event.node.data;
+    if (data.id === -1 && data.halfChecked === false) {
+      if (!!data.checked) {
+        this.sensorOptions[0].children.forEach(
+          sensor => {
+            this._sensors[sensor.id] = sensor.sensorKey + '-' + sensor.name + '-' + sensor.unit;
+          }
+        );
+      } else {
+        this._sensors = {};
+      }
+    } else {
+      if (!!data.checked) {
+        this._sensors[data.id] = data.sensorKey + '-' + data.name + '-' + data.unit;
+      } else {
+        delete this._sensors[data.id];
+      }
+    }
+    this.reloadSensorNames();
+
+  }
+  private reloadSensorNames(): void {
+    // ������������������������
+    setTimeout(() => {
+      this._sensorNames = '';
+      const sensorNameList = Object.keys(this._sensors).map(
+        id => {
+          const sensor = this.sensorOptions[0].children.find(item => {
+            return Number(id) === Number(item.id);
+          });
+          return sensor.name;
+        }
+      );
+      this._sensorNames = sensorNameList.join(', ');
+    }, 1);
+  }
+
+  public areaLazyLoad(event: {option: CascaderOption, index: number, resolve: (children: CascaderOption[]) => void, reject: () => void}) {
+    const index = event['index'];
+    const option = event.option;
+    switch (index) {
+      case -1:
+        this.areacodeService.getProvinces().subscribe(
+          (res: {label: string, value: string}[]) => {
+            event.resolve(res);
+          }
+        ); break;
+      case 0:
+        this.areacodeService.getCities(option.value).subscribe(
+          (res: {label: string, value: string}[]) => {
+            event.resolve(res);
+          }
+        ); break;
+      case 1:
+        this.areacodeService.getAreas(option.value).subscribe(
+          (res: {label: string, value: string}[]) => {
+            event.resolve(res);
+          }
+        ); break;
+    }
+  }
+
+  public regionChange(event: {option: CascaderOption, index: number}) {
+    let name = '';
+    const option = event.option;
+    this.query.areaCode = null;
+    this.query.monitorPointId = null;
+    switch (event.index) {
+      case 0:
+        name = 'provinceCode';
+        this.query.provinceCode = option.value;
+        this.query.cityCode = null;
+        break;
+      case 1:
+        name = 'cityCode';
+        this.query.cityCode = option.value;
+        break;
+      case 2:
+        name = 'areaCode';
+        this.query.areaCode = option.value;
+        break;
+    }
+    this.http.get(environment.SERVER_BASH_URL + 'monitor-point/list/region', {params: {name: name, value: option.value}}).subscribe((res: any) => {
+      if (res.code === 0) {
+        this.msgSrv.error(res.message);
+      } else {
+        this.monitorPointOptions = res.data;
+      }
+    });
+   this.getDevices();
+
+  }
+
+  getDevices() {
+    this.query.mac = null;
+    return this.http.get(environment.SERVER_BASH_URL + 'device/professionId', {params: this.query}).subscribe((res: any) => {
+      if (res.code === 0) {
+        this.msgSrv.error(res.message);
+      } else {
+        this.deviceOptions = res.data;
+      }
+    });
+  }
+
+  reportQuery() {
+    const query = this.query;
+    if (this.monitorPointOptions.length > 0 && query.time) {
+      query.time = this.dateSrv.date_format(query.time, this.timeType.format);
+      if (query.timeb) {
+        query.timeb = this.dateSrv.date_format(query.timeb, this.timeType.format);
+      }
+      query.type = this.timeType.value;
+      delete query.sensors;
+      if (this._sensors) {
+        const sensors = [];
+        for (const key in this._sensors) {
+          sensors.push(this._sensors[key]);
+        }
+        if (sensors.length > 0) {
+          query.sensors = JSON.stringify(sensors);
+        }
+      }
+
+      let url = environment.SERVER_BASH_URL + 'report/excel?';
+      for (const a in query) {
+        if (query[a]) {
+          url += encodeURI(a) + '=' + encodeURI(query[a]) + '&';
+        }
+      }
+      window.location.href = url + '_token=' + this.tokenService.get().token;
+    } else {
+      this.msgSrv.error('���������������������������������������������������������������');
+    }
+  }
+}
diff --git a/src/app/routes/reports/query/query.component.html b/src/app/routes/reports/query/query.component.html
new file mode 100644
index 0000000..cae4d8e
--- /dev/null
+++ b/src/app/routes/reports/query/query.component.html
@@ -0,0 +1,239 @@
+<div class="content__title">
+    <h1>������������</h1>
+</div>
+<nz-card [nzBordered]="false">
+    <form nz-form  [nzLayout]="'inline'">
+        <div nz-row [nzGutter]="24">
+            <div nz-col [nzSpan]="8" class="mb-md">
+                <div nz-form-item class="d-flex">
+                    <div  [ngStyle]="{'width': '100px'}" nz-form-label>
+                        <label>
+                            ������({{ sensorsSelect+'/'+sensorsLength }})
+                        </label>
+                    </div>
+                    <div nz-form-control class="flex-1">
+                        <nz-popover   [nzPlacement]="'bottomLeft'" [(nzVisible)]="sensorSelectVisible" [nzTrigger]="'click'">
+                            <nz-input [nzType]="'input'" nz-popover [ngModel]="sensorNames" style="cursor:pointer;"
+                            name="sensorNames" [nzReadonly]="true"
+                            [nzPlaceHolder]="'���������������������'">
+                                <ng-template #suffix>
+                                        <i class="anticon anticon-down ng-star-inserted ant-cascader-picker-arrow" style="right: 1px;"></i>
+                                </ng-template>
+                            </nz-input>
+                            <ng-template #nzTemplate>
+                                <div style="position: relative; width: 240px; height: 240px;" (mouseover) = "onTreeMouseOver($event)"  (mouseout) = "onTreeMouseOut($event)">
+                                    <div style="position: absolute; left: -16px; width: 272px; height: 256px; overflow-y :auto; top: -8px;">
+                                            <nz-tree [nzNodes]="sensorOptions"  (nzActivate)="onTreeClickSelect($event)"
+                                            (nzDeactivate)="onTreeClickSelect($event)" [nzCheckable]="true" (nzCheck)="onSensorSelect($event)"></nz-tree>
+                                    </div>
+                                </div>
+                            </ng-template>
+                        </nz-popover>
+                        <!-- <div style="top:0; right: -62px; position:absolute; font-size: 16px; color: #696969;">
+                            <span>(</span>
+                            <span style="display: inline-block; width: 50px; text-align: center;">
+                                {{ sensorsSelect+'/'+sensorsLength }}
+                            </span>
+                            <span>)</span>
+                        </div> -->
+                    </div>
+                </div>
+            </div>
+            <div nz-col [nzSpan]="9" class="mb-md">
+                <div nz-form-item class="d-flex">
+                    <div [ngStyle]="{'width': '128px'}" nz-form-label>
+                        <label>������������</label>
+                    </div>
+                    <div nz-form-control class="flex-1">
+                        <nz-select name="timeUnit" [(ngModel)]="timeUnit" [nzPlaceHolder]="'������ ������������'" (ngModelChange)="setTimeUnit($event)" [nzNotFoundContent]="'������������'">
+                            <nz-option *ngFor="let option of timeUnitOptions" [nzLabel]="option.label" [nzValue]="option">
+                            </nz-option>
+                        </nz-select>
+                    </div>
+                </div>
+            </div>
+            <div nz-col [nzSpan]="7" class="mb-md">
+                <div nz-form-item class="d-flex">
+                    <div  nz-form-label>
+                        <label>������������</label>
+                    </div>
+                    <div *ngIf="timeUnit.value!='MONTH'; else elseBlock" nz-form-control class="flex-1">
+                        <nz-datepicker [ngStyle]="{'width': '100%'}" name="actualTime" [(ngModel)]="actualTime" [nzAllowClear]="false" [nzShowTime]="_timeType.showTime"
+                            [nzMode]="_timeType.mode" [nzFormat]="_timeType.dateFormat" [nzPlaceHolder]="'������������'">
+                        </nz-datepicker>
+                    </div>
+                    <ng-template #elseBlock>
+                        <div nz-form-control class="flex-1">
+                            <nz-select name="actualYear" [(ngModel)]="actualYear" [nzPlaceHolder]="'������ ������������'" (ngModelChange)="setTimeUnit($event)" [nzNotFoundContent]="'������������'">
+                                <nz-option *ngFor="let option of actualYearOptions" [nzLabel]="option + ' ���'" [nzValue]="option">
+                                </nz-option>
+                            </nz-select>
+                        </div>
+                    </ng-template>
+                </div>
+            </div>
+        </div>
+        <div [ngStyle]="{'display':isCollapse ? 'none' : 'block' }" nz-row [nzGutter]="24">
+            <div nz-col [nzSpan]="8" class="mb-md">
+                <div nz-form-item class="d-flex">
+                    <div [ngStyle]="{'width': '100px'}" nz-form-label>
+                        <label>���������</label>
+                    </div>
+                    <div nz-form-control class="flex-1">
+                        <nz-cascader [class.class123]="true" (nzLoad)="areaLazyLoad($event)" [nzPlaceHolder]="'������ ���/���/���'" (nzSelectionChange)="setAreasData($event)"
+                            [nzAllowClear]="false" [nzChangeOnSelect]="true" [ngModel]="_areas" name="areasData">
+                        </nz-cascader>
+                    </div>
+                </div>
+            </div>
+            <div nz-col [nzSpan]="9" class="mb-md">
+                <div nz-form-item class="d-flex">
+                    <div [ngStyle]="{'width': '128px'}" nz-form-label>
+                            <label>
+                                    <nz-dropdown>
+                                        <button nz-button nz-dropdown ><span>{{dimensionItem.label}}</span> <i class="anticon anticon-down"></i></button>
+                                            <ul nz-menu>
+                                              <li *ngFor="let option of otherDimensions;let i = index;"  nz-menu-item>
+                                                <a (click)="selectDimension(option)">{{option.label}}</a>
+                                              </li>
+                                            </ul>
+                                    </nz-dropdown>
+                            </label>
+                    </div>
+                    <div nz-form-control class="flex-1">
+                        <nz-select name="deviceDimension" style="width: 100%;" [(ngModel)]="deviceDimension" nzAllowClear [nzPlaceHolder]="'������ '+ dimensionItem.label +'(������������������)'"
+                            nzShowSearch (nzSearchChange)="dimensionsChange($event)" [nzNotFoundContent]="'������������'">
+                            <nz-option *ngFor="let option of dimensionOptions" [nzLabel]="option.name" [nzValue]="option">
+                            </nz-option>
+                        </nz-select>
+                    </div>
+                </div>
+            </div>
+            <div nz-col [nzSpan]="7" class="mb-md">
+                <div nz-form-item class="d-flex">
+                    <div [ngStyle]="{'width': '70px'}" nz-form-label>
+                        <label>��� ���</label>
+                    </div>
+                    <div nz-form-control class="flex-1">
+                        <nz-select name="device" style="width: 100%;" [(ngModel)]="device" nzAllowClear [nzPlaceHolder]="'��������� '+ dimensionItem.label +'(������������������������)'" nzShowSearch
+                            (nzSearchChange)="devicesChange($event)" [nzNotFoundContent]="'������������'">
+                            <nz-option *ngFor="let option of deviceOptions" [nzLabel]="option.name" [nzValue]="option">
+                            </nz-option>
+                        </nz-select>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div nz-row>
+            <div nz-col [nzSpan]="24" class="text-right">
+                <button nz-button [nzType]="'primary'" (click)="loadGrid()">
+                    <i class="anticon anticon-search"></i>
+                    <span>������</span>
+                </button>
+                <a class="pl-sm" (click)="toggleCollapse()">
+                    ������
+                    <i class="anticon" [class.anticon-down]="isCollapse" [class.anticon-up]="!isCollapse"></i>
+                </a>
+            </div>
+        </div>
+    </form>
+</nz-card>
+<nz-card>
+    <div nz-row [nzGutter]="16">
+        <div nz-col [ngStyle]="{'display':isChartCollapse ? 'none' : 'block' }" [nzMd]="24">
+            <div echarts style="margin-top: 12px;" [options]="chartOption" [loading]="chartLoading" class="line-chart" (chartInit)="onChartInit($event)"></div>
+        </div>
+        <div *ngIf="isChartCollapse" style="width:100%; text-align:center;">
+            <span style="font-size:18px; font-weight: bold;">{{ _chartTitleTemp }}</span>
+        </div>
+        <div *ngIf="!!echartsIntance&&!isChartCollapse" class="chart-switch-select">
+            <nz-dropdown>
+                <a class="ant-dropdown-link" nz-dropdown>
+                    <p class="display-3 text-primary">������������
+                        <i class="anticon anticon-down"></i>
+                    </p>
+                </a>
+                <ul style="cursor:pointer; max-height: 260px; overflow:auto;" nz-menu>
+                    <li [ngClass]="{'ant-dropdown-menu-item-selected':chartSelectedIndex==m}" *ngFor="let item of grid.data,index as m" (click)="switchSensor(m)"
+                        nz-menu-item>
+                        {{item.sensor.name}}&nbsp;
+                        <i *ngIf="chartSelectedIndex==m" class="anticon anticon-check-circle-o"></i>
+                    </li>
+                </ul>
+            </nz-dropdown>
+        </div>
+        <a *ngIf="!!echartsIntance" style="position: absolute; right: 0; top: -10px;" class="pl-sm" (click)="toggleChartCollapse()">
+            ������
+            <i class="anticon" [class.anticon-down]="isChartCollapse" [class.anticon-up]="!isChartCollapse"></i>
+        </a>
+    </div>
+</nz-card>
+<nz-card>
+    <div nz-row [nzGutter]="16">
+        <div nz-col [nzMd]="24">
+            <div style="width:100%; text-align:center;">
+                <span style="font-size:18px; font-weight: bold;">{{ _tableTitleTemp }}</span>
+            </div>
+        </div>
+    </div>
+    <div nz-row [nzGutter]="16">
+        <div nz-col [nzMd]="24">
+            <nz-table #nzTable [nzScroll]="{ x:tableWidth,y:350 }" [nzDataSource]="grid.data" [nzIsPagination]="false" [nzLoading]="grid.loading">
+                <ng-template #nzFixedHeader>
+                    <thead nz-thead>
+                        <tr>
+                            <th nz-th [nzWidth]="'160px'" [ngStyle]="{'position': 'relative', 'text-align':'center', 'left':sensorNameScrollLeft+'px'}">
+                                <span>������������</span>
+                            </th>
+                            <th nz-th [nzWidth]="'80px'" *ngFor="let col of grid.columns" [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
+                                <span>{{ col.text }}</span>
+                            </th>
+                        </tr>
+                    </thead>
+                </ng-template>
+                <tbody nz-tbody>
+                    <tr nz-tbody-tr style="cursor:pointer;" *ngFor="let row of nzTable.data,index as i" (click)="switchSensor(i)" (mouseover)="sensorTableFocus(i)"
+                        (mouseout)="sensorTableBlur(i)" [ngClass]="{'table-tr-bgcolor-focus': i === sensorTableFocusIndex,'table-tr-bgcolor-blur': i !== sensorTableFocusIndex}">
+                        <td nz-td class='sensor-name' [ngStyle]="{'background-color': '#FFF'}">
+                            <span>
+                                <span>{{ row.sensor.name+'('+row.sensor.unit+')' }}</span>&nbsp;
+                                <i *ngIf="chartSelectedIndex==i" class="anticon anticon-line-chart"></i>
+                            </span>
+                        </td>
+                        <td nz-td *ngFor="let col of grid.columns,index as n" [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
+                            <span [ngSwitch]="col.type">
+                                <!-- ������������������������������������ -->
+                                <span title="{{ row.data[n]|tyepHandle:col:row }}" style="width:100%; display:block; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;"
+                                    *ngSwitchDefault> {{ row.data[n]|tyepHandle:col:row }} </span>
+                                <!-- ������������������������������������ -->
+                            </span>
+                        </td>
+                    </tr>
+                </tbody>
+            </nz-table>
+            <div *ngIf="grid.data.length>0" [ngClass]="{'table-scroll':true,'table-scroll-box-shadow': sensorNameScrollLeft>2 }" style="position: absolute; top:0;">
+                <nz-table #nzTable [nzDataSource]="grid.data" [nzIsPagination]="false">
+                    <thead nz-thead>
+                        <tr>
+                            <th nz-th [nzWidth]="'160px'" style="text-align:center; position:relative; display:block; z-index:9;">
+                                <span>������������</span>
+                            </th>
+                        </tr>
+                    </thead>
+                    <tbody nz-tbody [ngStyle]="{'top':sensorNameScrollTop+'px'}" style="position: relative; z-index:7; display:block;">
+                        <tr nz-tbody-tr style="cursor:pointer;" *ngFor="let row of nzTable.data,index as i" (mouseover)="sensorTableFocus(i)" (mouseout)="sensorTableBlur(i)"
+                            [ngClass]="{'table-tr-bgcolor-focus': i === sensorTableFocusIndex,'table-tr-bgcolor-blur': i !== sensorTableFocusIndex}"
+                            (click)="switchSensor(i)">
+                            <td nz-td class='sensor-name' [ngStyle]="{'width':'160px','text-align': 'center'}">
+                                <span>
+                                    <span>{{ row.sensor.name+'('+row.sensor.unit+')' }}</span>&nbsp;
+                                    <i *ngIf="chartSelectedIndex==i" class="anticon anticon-line-chart"></i>
+                                </span>
+                            </td>
+                        </tr>
+                    </tbody>
+                </nz-table>
+            </div>
+        </div>
+    </div>
+</nz-card>
diff --git a/src/app/routes/reports/query/query.component.less b/src/app/routes/reports/query/query.component.less
new file mode 100644
index 0000000..1a97419
--- /dev/null
+++ b/src/app/routes/reports/query/query.component.less
@@ -0,0 +1,24 @@
+.line-chart {
+    height: 100%;
+}
+.table-tr-bgcolor-focus {
+    background-color: #ecf6fd;
+}
+.table-tr-bgcolor-blur {
+    background-color: #fff;
+}
+.table-scroll {
+    z-index: 9;
+    height: auto;
+    max-height: 388px;
+    overflow: hidden;
+}
+.table-scroll-box-shadow {
+    -moz-box-shadow: 4px 0 2px rgba(0, 0, 0, 0.1); /* ������ Firefox */
+    box-shadow: 4px 0 2px rgba(0, 0, 0, 0.1);
+}
+.chart-switch-select {
+     position: absolute;
+     right: 8%;
+     top: 2%;
+}
diff --git a/src/app/routes/reports/query/query.component.ts b/src/app/routes/reports/query/query.component.ts
new file mode 100644
index 0000000..6a3e980
--- /dev/null
+++ b/src/app/routes/reports/query/query.component.ts
@@ -0,0 +1,797 @@
+import { Component, OnInit, ViewChild } from '@angular/core';
+import { _HttpClient } from '@delon/theme';
+import { Sensor, Device, DataCondition, MonitorPoint, Organization, LineChartCriteria } from '@business/entity/data';
+import { TimeUnits, AreaRange, ResultCode, DeviceDimension } from '@business/enum/types.enum';
+import { SensorsService } from '@business/services/http/sensors.service';
+import { PageBean, ResultBean, Grid } from '@business/entity/grid';
+import { NzTreeComponent } from 'ng-tree-antd';
+import * as moment from 'moment';
+import { ExampleService } from '@business/services/util/example.service';
+import { DeviceService } from '@business/services/http/device.service';
+import { CascaderOption } from 'ng-zorro-antd/src/cascader/nz-cascader.component';
+import { AreacodeService } from '@business/services/http/areacode.service';
+import { MonitorPointService } from '@business/services/http/monitor-point.service';
+import { NzMessageService } from 'ng-zorro-antd';
+import * as $ from 'jquery';
+import { DateService } from '@business/services/util/date.service';
+import { zip } from 'rxjs/observable/zip';
+import { Subject } from 'rxjs/Subject';
+
+@Component({
+  selector: 'app-query',
+  templateUrl: './query.component.html',
+  styleUrls: ['./query.component.less']
+})
+export class QueryComponent implements OnInit {
+    
+    // aqi������������
+    private aqiSort = {
+        e1: 1,
+        e2: 2,
+        e10: 3,
+        e11: 4,
+        e15: 5,
+        e16: 6
+    };
+
+    public tableWidth = 2800;
+    // private tableWidthOption = {
+    //     'MONTH': 1400,
+    //     'DAY': 2800,
+    //     'HOUR': 2100,
+    //     'MINUTE': 5000
+    // };
+    public expandForm: boolean; // ��������� ������������
+    // public sensors: any[] = [];
+    public sensorOptions: any[] = [];    
+    /**
+     * ���������������������������������
+     * ���������������������������������������������������������������������
+     * @memberof QueryComponent
+     */
+    public timeUnitOptions = [
+        {label: '���', value: TimeUnits.MONTH},
+        {label: '���', value: TimeUnits.DAY},
+        {label: '���', value: TimeUnits.HOUR},
+        {label: '���', value: TimeUnits.MINUTE},
+    ];
+    public timeUnit: {label: string, value: TimeUnits} = this.timeUnitOptions[2];
+    // ���������������������������������������
+    public actualTime: Date = moment().subtract(1, 'days').toDate();
+    public actualYearOptions: number [];
+    public isCollapse = false;
+    public isChartCollapse = false;
+    // ������������
+    public _areas: { label: string, value: string }[] = new Array();
+    public  grid: Grid<{sensor: Sensor, data: string [], weight?: number}> = new Grid();
+    // public grid.data: {sensor: Sensor, data: string [], weight?: number} [] = [];
+    //  ������������������������������������������
+    public sensorNameScrollLeft = 0;
+    public sensorNameScrollTop = 0;
+     @ViewChild(NzTreeComponent)  private tree: NzTreeComponent;
+     private _timeType: {showTime: boolean|{[key: string]: Function|boolean}, mode:  'month' | 'day', dateFormat: string  } = {showTime: false, mode: 'day', dateFormat: 'YYYY���MM���DD���'};
+     // ���key-value������,������������������
+     private _sensors: {[key: string]: string} = {};
+     private _sensorNames: string;     
+     get sensorNames(): string {
+         return this._sensorNames;
+     }
+     public toggleCollapse() {
+         this.isCollapse = !this.isCollapse;
+     }
+     public toggleChartCollapse() {
+          // ���������������
+         if (this.isChartCollapse && !!this.echartsIntance) {
+            this.reloadChart();
+            this.switchSensor(this.chartSelectedIndex);
+            // this.chartLoading = false;
+         }        
+         this.isChartCollapse = !this.isChartCollapse;
+     }
+     public deviceOptions: Device[] = [];
+     public dataCondition: DataCondition = {areaRangeId: 320583, areaRange: AreaRange.AREA, deviceDimension: DeviceDimension.NONE};
+
+     public dimensionOptions: MonitorPoint[] = [];
+    
+     get actualYear(): number {
+         return this.actualTime.getFullYear();
+     }
+     set actualYear(year) { 
+         this.actualTime.setFullYear(Number(year));
+     }
+     dimensionsChange(text?: string) {
+        switch (this.dimensionItem.value) {
+            case DeviceDimension.MONITORPOINT:
+            this.monitorPointsChange(text); break;
+            case DeviceDimension.PROFESSION:
+            this.professionsChange(text); break;
+        }
+     }
+     professionsChange(text?: string) {
+        this.http.get<ResultBean<any[]>>('profession/getall').subscribe(
+            result => {
+                if (!!result.code) {
+                    this.dimensionOptions = result.data;
+                }
+            }
+        );
+      }
+     monitorPointsChange(text?: string) {
+        const pageBean: PageBean = { pageIndex: 0, pageSize: 20 };
+        const example = new ExampleService();
+        let areaName = '';
+        switch (this._areas.length) {
+            case 1:
+                areaName = 'provinceCode'; break;
+            case 2:
+                areaName = 'cityCode'; break;
+            case 3:
+                areaName = 'areaCode'; break;
+        }
+        if (!!text) {
+            example.or().andLike({ name: 'name', value: '%' + text + '%' })
+                .andEqualTo({ name: areaName, value:  Number(this._areas.slice(-1).pop().value) });
+        } else {
+            example.or()
+                .andEqualTo({ name: areaName, value:  Number(this._areas.slice(-1).pop().value) });
+        }
+        this.monitorPointService.getPageByExample(pageBean, example).subscribe(
+            (res: PageBean) => {
+                if (!!res && !!res.data) {
+                    this.dimensionOptions = res.data;
+                }
+            }
+        );
+    }
+     devicesChange(text?: string) {
+        if (!!this.deviceDimension) {
+            const example = new ExampleService();
+            const deviceDimensionProperty = 
+            this.dimensionItem.value === DeviceDimension.MONITORPOINT ? 'monitorPointId' : 'professionId';
+            if (!!text) {
+            example.or().andEqualTo({ name: deviceDimensionProperty, value: this.deviceDimension.id })
+                .andLike({name: 'text', value: text});
+            } else {
+                example.or().andEqualTo({ name: deviceDimensionProperty, value: this.deviceDimension.id });
+            }
+            this.deviceService.getPageByExample(null, example).subscribe(
+                (res: PageBean) => {
+                    if (!!res && !!res.data) {
+                        this.deviceOptions = res.data;
+                    }
+                }
+            );
+        } else {
+            this.deviceOptions = [];
+        }
+    }
+    /**
+     * ������������
+     */
+    public chartLoading: boolean;
+    public chartOption;
+    public echartsIntance;
+    public chartSelectedIndex = 0;
+    public onChartInit(e): void {
+        this.echartsIntance = e;
+    }
+    constructor(        
+    private http: _HttpClient,
+    private sensorsService: SensorsService,
+    private deviceService: DeviceService,
+    private areacodeService: AreacodeService,
+    private monitorPointService: MonitorPointService,
+    private msg: NzMessageService,
+    private dateService: DateService,
+    ) { }    
+    ngOnInit() { 
+        this.initPage();
+        // ������������ tree click ������
+        this.treeClickStream.debounceTime(1).subscribe( event => {
+            const data = event.node.data;  
+            // console.log(data);    
+            if (data.id === -1) {
+                const children = data.children;
+                // ������������
+                if (!data.halfChecked && data.checked) {
+                    // ���������������
+                    data['checked'] = false;
+                    data['halfChecked'] = false;
+                    children.forEach(element => {
+                        element['checked'] = false;
+                    });
+                    this._sensors = {};
+                    // ������ ������ ������������
+                } else {
+                    // ������������
+                    children.forEach(element => {
+                        element['checked'] = true;
+                        this._sensors [element.id] = element.sensorKey;
+                    });
+                    data['checked'] = true;
+                    data['halfChecked'] = false;
+                }
+            } else {
+                const parentData = event.node.parent.data;
+                data['checked'] = !data['checked'];
+                if (data['checked']) {
+                    this._sensors [data.id] = data.sensorKey;
+                } else {
+                    delete this._sensors [data.id];
+                }
+                const length = Object.keys(this._sensors).length;
+                parentData['halfChecked'] = length > 0 
+                && this.sensorOptions[0].children.length > length;
+                parentData['checked'] = !parentData['halfChecked'] && length !== 0;
+            }
+            this.reloadSensorNames();
+        });
+    }
+
+    private initPage() {
+        this.sensorsService.getPagingList(null, null).subscribe(
+            (res: PageBean) => {
+                this.sensorOptions.push({id: -1, name: '������', isExpanded: true, children: res.data});
+            }
+        );
+        this.actualYearOptions = this.newArray(this.actualYear - 9, 10).map(item => Number(item)).reverse();
+                // ��������� ���������
+                this.http.get('organization/get-my-org').subscribe(
+                    (res: ResultBean<Organization>) => {
+                        if (res.code === ResultCode.SUCCESS) {
+                            const org = res.data;
+                            const areas = new Array(3);
+                            if (!!org.areaNames) {                              
+                                const areaNames = org.areaNames;
+                                Object.keys(areaNames).forEach(
+                                    key => {
+                                        const value = areaNames[key];
+                                        if ( value != null) {
+                                            switch (key) {
+                                                case 'provinceName' :
+                                                areas[0] = {label : value, value: org.provinceCode }; break;
+                                                case 'cityName' :
+                                                areas[1] = {label : value, value: org.cityCode }; break;
+                                                case 'areaName' :
+                                                areas[2] = {label : value, value: org.areaCode }; break;
+                                            }
+                                        }
+                                    }
+                                );                               
+                            } else {
+                                for (let i = 0; i < areas.length; i++) {
+                                    switch (i) {
+                                        case  0:
+                                        areas[0] = {label : '���������', value: 320000 }; break;
+                                        case  1:
+                                        areas[1] = {label : '���������', value: 320500 }; break;
+                                        case  2:
+                                        areas[2] = {label : '���������', value: 320583 }; break;
+                                    }
+                                }
+                            }
+                            this.setAreasData(areas);
+                        }
+                    }
+                );
+                this.dimensionItem = this.dimensions[0];
+                // this.dimensionsChange();
+    }
+    public get sensorsLength(): number {
+        return this.sensorOptions.length > 0 ? this.sensorOptions[0].children.length : 0;
+    }
+    public  get  sensorsSelect(): number {
+        return Object.keys(this._sensors).length;
+    }
+    public areaLazyLoad(event: { option: CascaderOption, index: number, resolve: (children: CascaderOption[]) => void, reject: () => void }) {
+        const index = event['index'];
+        const option = event.option;
+        switch (index) {
+            case -1:
+                this.areacodeService.getProvinces().subscribe(
+                    (res: { label: string, value: string }[]) => {
+                        event.resolve(res);
+                    }
+                ); break;
+            case 0:
+                this.areacodeService.getCities(option.value).subscribe(
+                    (res: { label: string, value: string }[]) => {
+                        event.resolve(res);
+                    }
+                ); break;
+            case 1:
+                this.areacodeService.getAreas(option.value).subscribe(
+                    (res: { label: string, value: string }[]) => {
+                        event.resolve(res);
+                    }
+                ); break;
+        }
+    }
+    // ��������������������� ��������� ��� ������������������������
+    public  setAreasData(areas: {label: string, value: string}[] ) {
+        let isChanged = false;
+        isChanged = areas.some( (item , index: number) => {
+            // this._areas[index] ���null ������ ������������������
+            return this._areas.length < areas.length 
+            || !this._areas[index] 
+            || this._areas[index].value !== item.value;
+        });
+        if ( isChanged ) {
+            this._areas = areas;
+            this.deviceDimension = null;
+            if (this.dimensionItem.value === DeviceDimension.MONITORPOINT) {
+                this.dimensionsChange();
+            }
+        }
+    }
+
+     // ��������� ������ ������������, ������ ���������������������������null ������������������������������
+     public dimensionItem: {label: string, value: DeviceDimension};
+     public dimensions: {label: string, value: DeviceDimension}[] = [
+         {label: '������������', value: DeviceDimension.MONITORPOINT},
+         {label: '������������', value: DeviceDimension.PROFESSION}
+     ];
+     public get otherDimensions(): {label: string, value: DeviceDimension}[] {
+         return  this.dimensions.filter(
+             item => {
+                 return item.value !== this.dimensionItem.value;
+             }
+         );
+     }
+     public selectDimension(option: {label: string, value: DeviceDimension}) {
+         this.dimensionItem = option;
+         this.dimensionsChange();
+         this._deviceDimension = null;
+         // ������������������
+         this.device = null;
+         this.deviceOptions = null;
+     }
+     public _deviceDimension: {id: number, name: string};
+     get deviceDimension(): {id: number, name: string} {
+         return this._deviceDimension;
+     }
+     set deviceDimension(value) {        
+        if (!!value) {
+              // ������ ������������������
+             if (this._deviceDimension !== value) {
+                this._deviceDimension = value; // ���������������������������������������������������������
+                this._device = null; // ���������������
+                this.devicesChange();
+             }
+             // ������null ������������������������������
+        } else {
+             this._deviceDimension = null;
+             this.device = null;
+             this.deviceOptions = null;
+        }
+        
+     }
+    // ��������� ������ ������������
+    public _device: Device;
+    set device(val: Device) {
+        this._device = val;
+
+    }
+    get device(): Device {
+        return this._device;
+    }
+   
+
+    /**
+     * ������ ���������������
+     * 
+     * @readonly
+     * @type {string}
+     * @memberof QueryComponent
+     */  
+    private treeClickStream: Subject<any> = new Subject<any>();
+    public onTreeClickSelect(event): void {
+          this.treeClickStream.next(event);
+    }
+    public onSensorSelect(event): void {
+        const data = event.node.data;
+        if (data.id === -1 && data.halfChecked === false) {
+            if (!!data.checked) {
+                this.sensorOptions[0].children.forEach(
+                    sensor => {
+                        this._sensors [sensor.id] = sensor.sensorKey;
+                    }
+                );
+            } else {
+                this._sensors = {};
+            }
+        } else {
+             if (!!data.checked) {
+                this._sensors [data.id] = data.sensorKey;
+             } else {
+                delete this._sensors[data.id];
+             }
+        }
+        this.reloadSensorNames();
+    }
+    private reloadSensorNames(): void {
+        // ������������������������
+        setTimeout(() => {
+            this._sensorNames = '';
+            const sensorNameList = Object.keys(this._sensors).map(
+                id => {
+                  const sensor =  this.sensorOptions[0].children.find(item => {
+                        return Number(id) === Number(item.id)   ;
+                    });
+                    return sensor.name;
+                }
+            );
+            this._sensorNames = sensorNameList.join(', ');
+        }, 1);
+    }
+    public setTimeUnit(val: {label: string, value: TimeUnits} ) {       
+        switch (val.value) {
+            // YYYY-MM-DD HH:mm:ss
+            case TimeUnits.MONTH:
+            this._timeType.dateFormat = 'YYYY���';
+                // this._timeType.dateFormat = 'YYYY-MM';
+                // this._timeType.mode = 'month';                
+                // this._timeType.endShowTime = null;
+                break;
+            case TimeUnits.DAY:
+                this._timeType.dateFormat = 'YYYY���MM���';
+                this._timeType.mode = 'month';
+                this._timeType.showTime = false;
+                break;
+            case TimeUnits.HOUR:
+                this._timeType.dateFormat = 'YYYY���MM���DD���';
+                this._timeType.mode = 'day';
+                this._timeType.showTime = false;
+                break;
+            case TimeUnits.MINUTE:
+                this._timeType.dateFormat = 'YYYY���MM���DD��� HH���';
+                this._timeType.mode = 'day';
+                this._timeType.showTime = {
+                    nzHideDisabledOptions: true,
+                    nzDisabledHours: () => {
+                        return [];
+                    },
+                    nzDisabledMinutes: (h) => {
+                        return this.newArray(60).slice(1).map(
+                            item => Number(item)
+                        );
+                    },
+                    nzDisabledSeconds: () => {
+                        return this.newArray(60).slice(1).map(
+                            item => Number(item)
+                        );
+                    }
+                };
+                break;
+        }
+    }
+   private newArray = (startOrLen: number, len?: number, prefix?: string, suffix?: string) => {
+        const result = [];
+        const s = !!len ? startOrLen : 0;
+        len = !!len ? len : startOrLen;
+        suffix = !!suffix ? suffix : '';
+        prefix = !!prefix ? prefix :  '';
+        for (let i = s; result.length < len; i++) {
+            result.push(prefix + i + suffix);
+        }
+        return result;
+    }
+    public loadGrid(): void {        
+        // ������������
+        const sensors = Object.values(this._sensors);
+        if ( sensors.length === 0 ) {
+            this.msg.error(' ������������ ������������');
+            return ;
+        }
+       this.grid.loading = true;
+       this.sensorNameScrollLeft = 0;
+       this.grid.data = [];
+       const start: Date = this.getPeriodDate(this.actualTime , 'start');
+       const end: Date = this.getPeriodDate(this.actualTime , 'end');
+       this.dataCondition['actualTime'] = null;
+       this.dataCondition['timeUnits'] = this.timeUnit.value;
+       // ���������������
+       const dimValue: number = !!this._deviceDimension ? this._deviceDimension.id : null;
+       const devValue: number = !!this._device ? this._device.id : null;
+       const areasData = [ devValue, dimValue, Number(this._areas.slice(-1).pop().value)];
+       if (!!this.deviceDimension) {
+        this.dataCondition.dimensionValue = this._deviceDimension.id;
+        this.dataCondition.deviceDimension = this.dimensionItem.value;
+       }
+       for (let index = 0 ; index < areasData.length ; index++) {
+            const item = areasData[index];
+            if ( item !== null ) {
+                this.dataCondition.areaRangeId = item;
+                switch (index) {
+                    case 0: this.dataCondition.areaRange = AreaRange.DEVICE; break;
+                    case 1:                   
+                    // ������������������
+                    if (this.dimensionItem.value === DeviceDimension.MONITORPOINT) {
+                         this.dataCondition.areaRange = AreaRange.MONITORPOINT;                        
+                    // ���������������
+                    } else {
+                         // ������������������������
+                         this.switchAreas();
+                         // ���������������������
+                         this.dataCondition.areaRangeId = areasData.slice(-1).pop();                         
+                    } break;
+                    case 2: 
+                        this.switchAreas();
+                    break;
+                }
+                break;
+            }
+       }
+       const dataConditions = [this.dataCondition];
+       const lineChartCriteria: LineChartCriteria = {
+        sensorKeys: sensors,
+        timePeriod: {startTime: start , endTime: end, timeUnits: this.timeUnit.value },
+        dataConditions: dataConditions
+      };
+      const timePeriod = lineChartCriteria.timePeriod;
+      switch (timePeriod.timeUnits) {
+          case TimeUnits.MONTH:
+          this.grid.columns = this.newArray(1, 12, null, '���').map(
+               item => {
+                   return {text: item};
+               }
+          ); break;
+          case TimeUnits.DAY:
+          const mo = moment(lineChartCriteria.timePeriod.startTime);
+          const days = mo.endOf('month').date();
+          this.grid.columns = this.newArray(1, days, null, '���').map(
+               item => {
+                   return {text: item};
+               }
+          ); break;
+          case TimeUnits.HOUR:
+          this.grid.columns = this.newArray(0, 24, null, '���').map(
+            item => {
+                return {text: item};
+            }
+          ); break;
+          case TimeUnits.MINUTE:
+          this.grid.columns = this.newArray(0, 60, null, '���').map(
+            item => {
+                return {text: item};
+            }
+          ); break;
+      }   
+        // ���������������������������������
+        this.tableWidth =  this.grid.columns.length * 80 + 160;   
+      this.reloadChart();
+      // ������������������
+      this.reloadChartTitle();
+      // ������������
+      this.grid.data = [];
+      console.log(lineChartCriteria);
+      this.http.post('/report/line-chart', lineChartCriteria).subscribe(
+        (res: ResultBean<{[key: string]: Array<Array<number>>}>) => {
+           if (res.code === 1) {
+              const data =  res.data;
+              if (!!data) {
+                const sensorKeys = Object.keys(data);
+                // aqi������������������������������������ ���������
+                sensorKeys.forEach(
+                    key => {
+                       const sensor = (<Array<Sensor>>this.sensorOptions[0].children).
+                       find(item => {
+                           return item.sensorKey === key;
+                       });
+                       let weight = this.aqiSort[key];
+                       weight = !!weight ? weight : 101;
+                    //    this.gridSensors.push(sensor);
+                       const sensorData = data[key][0].map(
+                           value => {
+                                if (weight > 100) {
+                                    // pair.value ���null,������������
+                                    weight = !!value ? weight : weight + 1;
+                                }
+                                // ���������������������2���
+                                return value != null ? String(Math.round(value * 100) / 100) : '-';
+                           }
+                       );
+                       this.grid.data.push({sensor: sensor, data: sensorData, weight: weight});
+                    }
+               );
+              }
+              this.grid.data.sort( (a, b) =>  a.weight - b.weight );
+              this.grid.loading = false;
+              this.switchSensor(0);
+           }
+        }
+      );
+        $('.ant-table-body').scroll(
+            () => {
+                this.sensorNameScrollLeft =  $('.ant-table-body').scrollLeft();
+                this.sensorNameScrollTop =   -$('.ant-table-body').scrollTop();
+            }
+        );
+    }
+    private switchAreas(): void {
+          switch (this._areas.length ) {
+            case 1: this.dataCondition.areaRange = AreaRange.PROVINCE; break;
+            case 2: this.dataCondition.areaRange = AreaRange.CITY; break;
+            case 3: this.dataCondition.areaRange = AreaRange.AREA; break;
+          }
+    }
+    private reloadChart(): void {
+        const  timeList = this.grid.columns.map(item => item.text);  
+         if (!!this.echartsIntance) {
+             this.chartOption = null;
+             this.echartsIntance.clear();
+         }
+        //  let series = null;
+        //  if ( this.chartSelectedIndex < this.grid.data.length ) {
+        //     series = [{type: 'line', data: this.grid.data[this.chartSelectedIndex]}];
+        //  }
+         
+         this.initOpton({ xAxis : [{data : timeList}]});
+         this.chartLoading = true;
+      }
+      private initOpton(opt: {[key: string]: object}) {
+         const defaultOption = {
+            title: {
+                left: 'center'
+            },
+            tooltip : {
+                trigger: 'axis',
+                axisPointer: {
+                    type: 'cross',
+                    label: {
+                        backgroundColor: '#6a7985'
+                    }
+                }
+            },
+            legend: {
+                data: []
+            },
+            toolbox: {
+                feature: {
+                    saveAsImage: {}
+                }
+            },
+            grid: {
+                left: '3%',
+                right: '4%',
+                bottom: '3%',
+                containLabel: true
+            },
+            xAxis : [
+                {
+                    type : 'category',
+                    boundaryGap : false
+                }
+            ],
+            yAxis : [
+                {
+                    type : 'value'
+                }
+            ],
+            series : [
+            ]
+        };
+        $.extend(true, defaultOption, opt);
+        this.chartOption = defaultOption;
+      }
+    public get sensorUnit() {
+        return this.grid.data[this.chartSelectedIndex].sensor.unit;
+    }
+    // ������������������ ������������
+    public _chartTitleTemp = '';
+    public _tableTitleTemp = '';
+    public reloadChartTitle(): void {
+        const names = ['������', '������', '������', '������', '������'];
+        switch ( this.dataCondition.areaRange ) {
+            case AreaRange.MONITORPOINT :
+            names[0] = '������������';
+            names[1] = this._deviceDimension.name; break;          
+            case AreaRange.DEVICE :
+            names[0] = '������';
+            names[1] = this._device.name; break;
+            default :
+            names[0] = '';
+            names[1] = this._areas.map( item => item.label).join('/'); 
+            break;
+        }
+        // ������������
+        if (!!this._deviceDimension) {
+            switch (this.dataCondition.deviceDimension) {
+                case DeviceDimension.PROFESSION :
+                names[2] = '[' + this._deviceDimension.name + ']';
+                break;
+                default :
+                names[2] = '';
+                break;
+            }
+        } else {
+            names[2] = '';
+        }
+
+        names[3] = moment(this.actualTime).format(this._timeType.dateFormat);
+        if ( this.grid.data.length > this.chartSelectedIndex) {
+            names[4] = this.grid.data[this.chartSelectedIndex].sensor.name;
+        }        
+        const title = names.join('  ') + ' ������';
+        if (title.trim() !== this._chartTitleTemp.trim()) {
+             this._chartTitleTemp = title;
+        }
+        const tableTile = names.slice(0, -1).join('  ') + ' ������������';
+        if (tableTile.trim() !== this._tableTitleTemp.trim()) {
+            this._tableTitleTemp = tableTile;
+       }
+    }
+    public switchSensor(index: number): void {
+        this.chartSelectedIndex = index;
+        this.chartLoading = true; 
+          this.reloadChartTitle();      
+        setTimeout(() => {
+            const series = [{type: 'line', data: this.grid.data[index].data}];
+            this.echartsIntance.setOption({
+                title: {
+                        text: this._chartTitleTemp
+                },
+                yAxis : [
+                    {
+                        name : '���������' + this.sensorUnit
+                    }
+                ],
+                series: series
+            });
+           this.chartLoading = false; 
+        }, 600); 
+    }
+    private getPeriodDate(value: Date , type?: 'start'|'end' ): Date {
+        let month = 0;
+        let day = 1;
+        let hour = 0;
+        let minute = 0;
+        let second = 0; 
+        let millisecond = 0;
+        if ('end' === type) {
+            month = 11;
+            day = 31;
+            hour = 23;
+            minute = 59;
+            second = 59;
+            millisecond = 999;
+        }
+        const mo = moment(value);
+        switch ( this.timeUnit.value ) {
+            case TimeUnits.MONTH:
+            mo.month(month).date(day).hour(hour).minute(minute).second(second).millisecond(millisecond); break;
+            case TimeUnits.DAY:
+            mo.date(day).hour(hour).minute(minute).second(second).millisecond(millisecond); break;
+            case TimeUnits.HOUR:
+            mo.hour(hour).minute(minute).second(second).millisecond(millisecond); break;
+            case TimeUnits.MINUTE:
+            mo.minute(minute).second(second).millisecond(millisecond); break;
+            // case TimeUnits.MINUTE:
+            // mo.second(second).millisecond(millisecond); break;
+        }
+        return mo.toDate();
+    }
+    public sensorTableFocusIndex = -1;
+    public sensorTableFocus(index) {
+        this.sensorTableFocusIndex = index;
+    }
+   
+    public sensorTableBlur(index) {
+        this.sensorTableFocusIndex = -1;
+    }
+    public sensorSelectVisible = false;
+    public treeMouseOverOccur = false;
+    public onTreeMouseOver(event) {
+        this.treeMouseOverOccur = true;
+    }
+    public onTreeMouseOut(event) {
+        this.treeMouseOverOccur = false;
+        setTimeout(() => {
+            if (!this.treeMouseOverOccur) {
+                this.sensorSelectVisible =  false;
+            }
+        }, 900);
+    }
+}
+
+
diff --git a/src/app/routes/reports/reports.module.ts b/src/app/routes/reports/reports.module.ts
new file mode 100644
index 0000000..d5c29d7
--- /dev/null
+++ b/src/app/routes/reports/reports.module.ts
@@ -0,0 +1,57 @@
+import { Component, OnInit } from '@angular/core';
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { RouterModule, Routes } from '@angular/router';
+import { SharedModule } from '@shared/shared.module';
+
+import { DemoComponent } from './demo/demo.component';
+import { ExcelComponent } from './excel/excel.component';
+import { QueryComponent } from './query/query.component';
+import { PipeModule } from '@business/pipe/pipe.module';
+import { NzTreeModule } from 'ng-tree-antd';
+import { NgxEchartsModule } from 'ngx-echarts';
+import { SensorsService } from '@business/services/http/sensors.service';
+import { NzMessageService } from 'ng-zorro-antd';
+import { AreacodeService } from '@business/services/http/areacode.service';
+import { MonitorPointService } from '@business/services/http/monitor-point.service';
+import { DeviceService } from '@business/services/http/device.service';
+import { DateService } from '@business/services/util/date.service';
+import { AlarmComponent } from './alarm/alarm.component';
+
+const routes: Routes = [
+  {
+    path: '',
+    children: [
+      { path: 'query', component: QueryComponent },
+      { path: 'demo', component: DemoComponent },
+      { path: 'excel', component: ExcelComponent },
+      { path: 'alarm', component: AlarmComponent },
+    ]
+  }
+];
+
+
+const COMPONENTS_NOROUNT = [  ];
+
+@NgModule({
+  imports: [
+    // ������������������������������������
+    PipeModule,
+    NzTreeModule,
+    NgxEchartsModule,
+    CommonModule,
+    SharedModule,
+    RouterModule.forChild(routes)
+  ],
+  declarations: [
+    ...COMPONENTS_NOROUNT,
+    DemoComponent,
+    ExcelComponent,
+    AlarmComponent,
+    QueryComponent
+  ],
+  providers: [SensorsService, NzMessageService, AreacodeService,
+     MonitorPointService, DeviceService, DateService],
+  entryComponents: COMPONENTS_NOROUNT
+})
+export class ReportsModule { }
diff --git a/src/app/routes/routes-routing.module.ts b/src/app/routes/routes-routing.module.ts
new file mode 100644
index 0000000..f4719f0
--- /dev/null
+++ b/src/app/routes/routes-routing.module.ts
@@ -0,0 +1,54 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+import { environment } from '@env/environment';
+// layout
+import { LayoutDefaultComponent } from '../layout/default/default.component';
+import { LayoutFullScreenComponent } from '../layout/fullscreen/fullscreen.component';
+import { LayoutPassportComponent } from '../layout/passport/passport.component';
+// dashboard pages
+import { DashboardV1Component } from './dashboard/v1/v1.component';
+import { DashboardAnalysisComponent } from './dashboard/analysis/analysis.component';
+import { DashboardMonitorComponent } from './dashboard/monitor/monitor.component';
+import { DashboardWorkplaceComponent } from './dashboard/workplace/workplace.component';
+import { ReportComponent } from './report/report.component';
+import { UserLoginComponent } from 'app/routes/passport/login/login.component';
+
+
+const routes: Routes = [
+    {
+        path: '',
+        component: LayoutDefaultComponent,
+        children: [
+            { path: '', redirectTo: 'dashboard/workplace', pathMatch: 'full' },
+            { path: 'dashboard', redirectTo: 'dashboard/v1', pathMatch: 'full' },
+            { path: 'dashboard/v1', component: DashboardV1Component, data: { translate: 'dashboard_v1' } },
+            { path: 'dashboard/analysis', component: DashboardAnalysisComponent, data: { translate: 'dashboard_analysis' } },
+            { path: 'dashboard/monitor', component: DashboardMonitorComponent, data: { translate: 'dashboard_monitor' } },
+            { path: 'dashboard/workplace', component: DashboardWorkplaceComponent, data: { translate: 'dashboard_workplace' } },
+            { path: 'users', loadChildren: './users/users.module#UsersModule' },
+            { path: 'devices', loadChildren: './devices/devices.module#DevicesModule' },
+            { path: 'sensors', loadChildren: './sensors/sensors.module#SensorsModule' },
+            { path: 'systems', loadChildren: './systems/systems.module#SystemsModule' },
+            { path: 'reports', loadChildren: './reports/reports.module#ReportsModule' }
+        ]
+    },    // passport
+    {
+        path: 'passport',
+        component: LayoutPassportComponent,
+        children: [
+            {data: {title: '������������'}, path: 'login', component: UserLoginComponent }
+        ]
+    },    // passport
+    {
+      path: 'report',
+      component: ReportComponent,
+      data: {title: '������������'}
+    },
+    { path: '**', redirectTo: 'passport/login' }
+];
+
+@NgModule({
+    imports: [RouterModule.forRoot(routes, { useHash: environment.useHash })],
+    exports: [RouterModule]
+  })
+export class RouteRoutingModule { }
diff --git a/src/app/routes/routes.module.ts b/src/app/routes/routes.module.ts
index bca0d72..776196a 100644
--- a/src/app/routes/routes.module.ts
+++ b/src/app/routes/routes.module.ts
@@ -1,11 +1,20 @@
+import { UserLoginComponent } from './passport/login/login.component';
+import { DateService } from '@business/services/util/date.service';
+import { _HttpClient } from '@delon/theme';
 import { NgModule } from '@angular/core';
 import { RouterModule } from '@angular/router';
+
 import { SharedModule } from '@shared/shared.module';
-import { environment } from '../../environments/environment';
-
-import { routes } from './routes';
-
-
+import { RouteRoutingModule } from './routes-routing.module';
+import { environment } from '@env/environment';
+// dashboard pages
+import { DashboardV1Component } from './dashboard/v1/v1.component';
+import { DashboardAnalysisComponent } from './dashboard/analysis/analysis.component';
+import { DashboardMonitorComponent } from './dashboard/monitor/monitor.component';
+import { DashboardWorkplaceComponent } from './dashboard/workplace/workplace.component';
+import { ReportComponent } from './report/report.component';
+// Statics
+import 'rxjs/add/observable/throw';
 
 // Operators
 import 'rxjs/add/operator/catch';
@@ -17,15 +26,20 @@
 import 'rxjs/add/operator/filter';
 import 'rxjs/add/operator/last';
 import 'rxjs/add/operator/delay';
+
 @NgModule({
-    imports: [
-        SharedModule,
-        RouterModule.forRoot(routes, { useHash: environment.useHash })
-    ],
+    imports: [ SharedModule, RouteRoutingModule ],
     declarations: [
+        DashboardV1Component,
+        DashboardAnalysisComponent,
+        DashboardMonitorComponent,
+        DashboardWorkplaceComponent,
+        UserLoginComponent,
+        ReportComponent
     ],
-    exports: [
-        RouterModule
+    providers: [
+        _HttpClient,
+        DateService
     ]
 })
 
diff --git a/src/app/routes/routes.ts b/src/app/routes/routes.ts
deleted file mode 100644
index 9c01b63..0000000
--- a/src/app/routes/routes.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { LayoutComponent } from '../layout/layout.component';
-import { LayoutFullScreenComponent } from '../layout/fullscreen/fullscreen.component';
-
-
-export const routes = [
-    {
-        path: '',
-        component: LayoutComponent,
-        children: [
-            { path: "", redirectTo: "home-page", pathMatch: "full" },
-            {
-              path: "home-page",
-              loadChildren: "./home-page/home-page.module#HomePageModule"
-            }
-        ]
-    },
-    { path: '**', redirectTo: 'home-page' }
-];
diff --git a/src/app/routes/sensors/basic-info/basic-info.component.html b/src/app/routes/sensors/basic-info/basic-info.component.html
new file mode 100644
index 0000000..c5a31b2
--- /dev/null
+++ b/src/app/routes/sensors/basic-info/basic-info.component.html
@@ -0,0 +1,68 @@
+<pro-header [title]="grid.title"></pro-header>
+<nz-card [nzBordered]="false">
+    	<div class="mb-md">
+                <button nz-button (click)="addOrModify($event)" [nzType]="'primary'" [nzSize]="'large'">
+                    <i class="anticon anticon-plus"></i><span>������</span>
+                </button>
+                <ng-container *ngIf="grid.selectedIndexs.length > 0"> &nbsp;
+                <button nz-button [nzSize]="'large'" (click)="deleteSelected($event)">������������</button>
+                </ng-container>
+                <nz-input [ngStyle]="{'width': '280px','float':'right'}" [(ngModel)]="queryMap.value" name=""  [nzPlaceHolder]="queryMap.text"
+                (keyup)="queryTextChanged($event)" (change)="queryTextChanged($event)" ></nz-input>
+        </div>
+    	<div class="mb-md">
+                <nz-alert *ngIf="grid.selectedIndexs.length > 0" [nzType]="'info'" [nzShowIcon]="true"> 
+                    <span alert-body>
+                         ���������<strong class="text-primary">{{grid.selectedIndexs.length}}</strong>���
+                    </span> 
+                </nz-alert>
+    </div>
+    <nz-table #nzTable
+              [nzAjaxData]="grid.data"         
+              [nzTotal]="grid.total"
+              [(nzPageIndex)]="grid.pageIndex"
+              [(nzPageSize)]="grid.pageSize"
+              [nzLoading]="grid.loading"
+              [nzShowTotal]="true"
+              (nzPageIndexChange)="load()">
+              <thead nz-thead>
+                  <tr>
+                    <th nz-th [nzCheckbox]="true">
+                        <label nz-checkbox [(ngModel)]="grid.allChecked" [nzIndeterminate]="grid.indeterminate" (ngModelChange)="grid.checkAll($event)"></label>
+                    </th>
+                    <th nz-th *ngFor="let col of grid.columns"
+                     [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}" >
+                           <span>{{ col.text }}</span>
+                           <nz-table-sort *ngIf="col.isSort"   [(nzValue)]="col.sort" (nzValueChange)="sort(col.name,$event)"></nz-table-sort>
+                    </th>
+                    <th nz-th><span>������</span></th>
+                  </tr>
+              </thead>
+              <tbody nz-tbody>
+                <tr nz-tbody-tr *ngFor="let row of nzTable.data">
+                    <td nz-td [nzCheckbox]="true">
+                       <label nz-checkbox [(ngModel)]="row.checked" (ngModelChange)="grid.refreshStatus($event)"></label>
+                    </td>
+                    <td nz-td *ngFor="let col of grid.columns"
+                    [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
+                        <span [ngSwitch]="col.type">
+                             <!-- ������������������������������������ -->
+                            <span *ngSwitchDefault> {{ row[col.name]|tyepHandle:col:row }} </span>
+                             <!-- ������������������������������������ -->        
+                        </span>
+                    </td>
+                    <td nz-td>
+                            <a (click)="addOrModify(row)">������</a>                            
+                            <span nz-table-divider></span>
+                            <nz-popconfirm [nzTitle]="'������������������'+grid.title+'���?'" [nzOkText]="'Yes'" [nzCancelText]="'No'" (nzOnConfirm)="delete(row.id)" >
+                            <a nz-popconfirm>������</a>
+                            </nz-popconfirm>
+                            <span nz-table-divider></span>
+                            <a (click)="configSensorUnit(row)">������������</a>
+                     </td>
+                </tr>
+              </tbody>
+              </nz-table>
+  </nz-card>
+  
+
diff --git a/src/app/routes/sensors/basic-info/basic-info.component.ts b/src/app/routes/sensors/basic-info/basic-info.component.ts
new file mode 100644
index 0000000..491aa4f
--- /dev/null
+++ b/src/app/routes/sensors/basic-info/basic-info.component.ts
@@ -0,0 +1,186 @@
+import { NzModalService, NzMessageService } from 'ng-zorro-antd';
+import { PageBean } from '@business/entity/grid';
+import {  Sensor } from '@business/entity/data';
+import { ModalHelper } from '@delon/theme';
+import { SensorsService } from '@business/services/http/sensors.service';
+import { Column, Grid } from '@business/entity/grid';
+import { Component, OnInit } from '@angular/core';
+import { Subject } from 'rxjs/Subject';
+import { SensorEditComponent } from './sensor-edit/sensor-edit.component';
+import { SensorUnitComponent } from './sensor-unit/sensor-unit.component';
+
+
+
+@Component({
+  selector: 'app-basic-info',
+  templateUrl: './basic-info.component.html',
+  styles: []
+})
+export class BasicInfoComponent implements OnInit {
+
+
+  grid: Grid<Sensor> = new Grid(null);
+  queryMap = { text: '���������������', value: ''};
+  queryTextStream: Subject<string> = new Subject<string>();
+    private initPage() {
+    const sensor: Sensor =  {
+      name: {
+        text: '������',
+        width: '200px'  
+      },
+      sensorKey: {
+        text: '������',
+        width: '60px'  
+      },
+      lower: {
+        text: '���������',
+        width: '90px'  
+      },
+      upper: {
+        text: '���������',
+        width: '90px'  
+      },
+      unit: {
+        text: '������',
+        width: '100px'  
+      },
+      description: {
+        text: '������'
+      }
+    };
+    this.grid.title = '���������';
+    this.grid.setColumns(sensor);
+    this.grid.pageSize = 10;
+  }
+  constructor(
+    private sensorsService: SensorsService,
+    
+    private confirmServ: NzModalService,
+    public msgSrv: NzMessageService,
+    private modalHelper: ModalHelper,
+  ) {}
+
+  ngOnInit() {
+    this.initPage();
+    this.queryTextStream
+    .debounceTime(500)
+    .distinctUntilChanged()
+    .subscribe(queryText => {
+        this.load();
+    });
+  }
+  queryTextChanged($event) {
+      this.queryTextStream.next(this.queryMap.value);
+  }
+  load(reload: boolean = false) {   
+    if (reload) {
+      this.grid.pageIndex = 1 ;
+    }
+    // ������������������ExpressionChangedAfterItHasBeenCheckedError
+    setTimeout(() => {
+      this.grid.loading = true;
+     }, 1);
+    this.sensorsService.getPagingList(this.grid, this.queryMap.value).subscribe(
+       (res: PageBean) => {
+            this.grid.loading = true;
+            if (res != null && res.data != null) {
+              this.grid.initData(res);
+              this.grid.refreshStatus();
+              setTimeout(() => {
+                this.grid.loading = false;
+               }, 1);
+            }
+       }
+    );
+  }
+
+// rowData���null���������������
+  addOrModify(d) {
+    const data = {};
+    if ( d != null) {
+      Object.assign(data, d);
+    }
+    this.modalHelper.static(SensorEditComponent, { data }).subscribe( 
+      ( ret: { data: any, close: Function} ) => {
+      // ������������
+      if (ret.data['index'] != null ) {
+          const index: number = ret.data['index'] ;
+          const origData = this.grid.getData()[index];
+          const isModified =  Object.keys(origData).some(
+            (key: string) => {
+                return ret.data[key] !== origData[key];    
+            } 
+          );
+          // ������������
+          if (!isModified) { 
+            ret.close();
+            this.msgSrv.success(this.grid.title + '���������������������');
+            return;
+          }
+      }
+      this.sensorsService.save(ret.data).subscribe(
+         ( res: any) => {
+            if (res.code === 1) {
+              this.load();
+              ret.close();
+              this.msgSrv.success(this.grid.title + '���������������');
+            }
+         }
+      );
+    });
+  }
+
+  delete(...id: number[]) {
+    this.sensorsService.delete( ...id ).subscribe(
+      ( res: any) => {
+         if (res.code === 1) {
+           this.load();
+           this.msgSrv.success(this.grid.title + '���������������');
+         }
+      }
+   );
+  }
+
+   deleteSelected() {
+    this.confirmServ.confirm({
+      title: '������������',
+      content: '������������������������������������������������',
+      okText: '������',
+      cancelText: '������'
+    }).on('onOk', () => {
+       if (this.grid.selectedIndexs != null && this.grid.selectedIndexs.length > 0) {
+          const ids = this.grid.selectedIndexs.map(
+              (index: number) => {
+                  const id = this.grid.data[index].id;
+                  return Number.parseInt(id);
+              }
+          );
+          this.delete( ...ids );
+       }
+    });
+  }
+  sort(field: string, value: string) {
+    // ������������field
+    this.grid.sorts = this.grid.sorts.filter(
+       (fn: string) => {
+          return fn !== field;
+       }
+     );
+     // ������value������null������������������������������filed
+     if ( value != null ) {
+        this.grid.sorts.push(field);
+     }
+     this.load();
+  }
+  configSensorUnit(d) {
+    const data = {};
+    if ( d != null) {
+      Object.assign(data, d);
+    }
+    this.modalHelper.static(SensorUnitComponent, { data }).subscribe(
+      res => {
+
+      }
+    );
+  }
+}
diff --git a/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.html b/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.html
new file mode 100644
index 0000000..24c8a06
--- /dev/null
+++ b/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.html
@@ -0,0 +1,64 @@
+<div class="modal-header">
+  <div class="modal-title">{{ data.id != null ? '������' : '������'}} - ���������</div>
+</div>
+<form [formGroup]="validateForm" (ngSubmit)="save($event,validateForm.value,validateForm.valid)" nz-form [nzType]="'horizontal'">
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label nz-form-item-required>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="10" nzHasFeedback>
+      <nz-input formControlName="name" maxlength="20" [nzPlaceHolder]="'������'">
+      </nz-input>
+    </div>
+  </div>
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label nz-form-item-required>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="5" nzHasFeedback>
+      <nz-input formControlName="sensorKey" maxlength="20" [nzPlaceHolder]="'������'">
+      </nz-input>
+    </div>
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+      <nz-input formControlName="unit" maxlength="20" [nzPlaceHolder]="'������'">
+      </nz-input>
+    </div>
+  </div>  
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="5" nzHasFeedback>
+        <nz-input-number [ngStyle]="{'width': '100%' }" formControlName="lower" >
+          </nz-input-number>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="2" nzHasFeedback></div>
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="5" nzHasFeedback>
+          <nz-input-number [ngStyle]="{'width': '100%' }" formControlName="upper" >
+          </nz-input-number>
+    </div>
+  </div>
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="16" nzHasFeedback>
+      <nz-input formControlName="description" maxlength="100"></nz-input>
+    </div>
+  </div>
+  <div class="modal-footer">
+    <button nz-button type="button" (click)="close()">������</button>
+    <button nz-button [nzType]="'primary'" [nzLoading]="isSaving">
+      <span>
+        ������
+        <span *ngIf="isSaving">���</span>
+      </span>
+    </button>
+  </div>
+</form>
\ No newline at end of file
diff --git a/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.ts b/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.ts
new file mode 100644
index 0000000..63a1882
--- /dev/null
+++ b/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.ts
@@ -0,0 +1,64 @@
+import { NzModalSubject } from 'ng-zorro-antd';
+import { Sensor } from '@business/entity/data';
+import { Component, OnInit } from '@angular/core';
+import { FormGroup, FormBuilder, Validators } from '@angular/forms';
+import { SensorsService } from '@business/services/http/sensors.service';
+
+@Component({
+  selector: 'app-sensor-edit',
+  templateUrl: './sensor-edit.component.html',
+  styles: []
+})
+export class SensorEditComponent implements OnInit {
+  data: Sensor;
+  isSaving = false;
+  validateForm: FormGroup;
+  constructor(    
+    private subject: NzModalSubject,
+    private formBuilder: FormBuilder,
+    private organizationService: SensorsService
+    ) { }
+
+  ngOnInit() {
+     const data = this.data;
+     const validates: Sensor  = {
+          name: [data.name, [Validators.required] ],
+          sensorKey: [data.sensorKey, [Validators.required] ],
+          lower: [data.lower ],
+          upper: [data.upper ],
+          unit: [data.unit ],
+          description: [data.description ]
+     };
+     this.validateForm = this.formBuilder.group(
+         validates
+     );
+  }
+  close() {
+       this.subject.destroy();
+  }
+  save($event, value, valid) {
+      $event.preventDefault();
+      if (valid) {
+        for (const i in this.validateForm.controls) {
+          this.validateForm.controls[ i ].disable();
+        } 
+        this.isSaving = true;
+        Object.keys(value).forEach( (key: string) => {
+              // '_'������������������������������
+              if (!key.startsWith('_') && value[key] != null) {
+                   this.data[key] = value[key];
+              }
+        } );
+        this.subject.next( this );
+      } else {
+        this.validate(); 
+      }
+  }
+  validate() {
+     for (const i in this.validateForm.controls) {
+       this.validateForm.controls[ i ].markAsDirty();
+     }
+  }
+  
+
+}
diff --git a/src/app/routes/sensors/basic-info/sensor-unit/sensor-unit.component.html b/src/app/routes/sensors/basic-info/sensor-unit/sensor-unit.component.html
new file mode 100644
index 0000000..5a10e19
--- /dev/null
+++ b/src/app/routes/sensors/basic-info/sensor-unit/sensor-unit.component.html
@@ -0,0 +1,84 @@
+<div class="modal-header">
+    <div class="modal-title">������-���������������</div>
+</div>
+<form [formGroup]="validateForm" (ngSubmit)="save($event,validateForm.value,validateForm.valid)" nz-form [nzType]="'horizontal'">
+    <div nz-form-item nz-row class="mb-sm">
+      <div nz-form-label nz-col [nzSm]="7" [nzXs]="24">
+        <label nz-form-item-required>������</label>
+      </div>
+      <div nz-form-control nz-col [nzSpan]="5" nzHasFeedback>
+           <label>{{ data.name }}</label>
+      </div>
+      <div nz-form-label nz-col [nzSm]="2" [nzXs]="24">
+          <label nz-form-item-required>���������</label>
+      </div>
+      <div nz-form-control nz-col [nzSpan]="5" nzHasFeedback>
+             <label>{{ data.unit }}</label>
+      </div>
+    </div>
+    <div nz-form-item nz-row class="mb-sm">
+      <div nz-form-label nz-col [nzSm]="7" [nzXs]="24">
+        <label nz-form-item-required>������������</label>
+      </div>
+      <div nz-form-control nz-col [nzSpan]="10" nzHasFeedback>
+        <nz-input formControlName="name" maxlength="20" [nzPlaceHolder]="'������'">
+        </nz-input>
+      </div>
+    </div>
+    <div nz-form-item nz-row class="mb-sm">
+      <div nz-form-label nz-col [nzSm]="7" [nzXs]="24">
+        <label nz-form-item-required>������������</label>
+      </div>
+      <div nz-form-control nz-col [nzSpan]="10">
+          <nz-select formControlName="_rule-operator"  style="width: 18%">
+            <nz-option *ngFor="let option of operatorOptions" [nzLabel]="option.label" [nzValue]="option.value">
+            </nz-option>
+          </nz-select>
+          <nz-input-number formControlName="_rule-value" style="width: 20%" [nzMin]="0.000001" maxlength="20" [nzStep]="0.000001"></nz-input-number>  
+          <button nz-button style="left: 1px;" [nzType]="'default'" (click) = "addRule($event)"><i class="anticon anticon-plus"></i></button>           
+      </div>
+    </div>
+    <div nz-form-item nz-row class="mb-sm">
+      <div nz-col [nzSm]="7" [nzXs]="24">
+      </div>
+      <div nz-form-control nz-col [nzSpan]="9" nzHasFeedback>
+        <nz-input  nzReadonly = "true" formControlName="_rules" maxlength="10000" [nzPlaceHolder]="'(���������������������������������)'">
+        </nz-input>        
+      </div>
+      <div nz-col [nzSpan]="3" style="padding-left: 8px;padding-top: 2px;">
+        <button nz-button [nzType]="'default'" (click) = "clearRules($event)"><i class="anticon anticon-close"></i></button>
+      </div>
+    </div>
+    <div nz-row class="mb-sm">
+        <div nz-col [nzSm]="7" [nzXs]="24">
+        </div>
+        <div nz-col [nzSpan]="10" style="text-align:right;">
+          <button nz-button [nzType]="'default'" (click)="reset($event)">������������</button>
+          <button nz-button [nzType]="'primary'" [nzLoading]="isSaving">
+            <span *ngIf="getValueFormControl('id') !== null">������������</span>
+            <span *ngIf="getValueFormControl('id') === null">������������</span>
+          </button>
+        </div>
+    </div>
+  </form>
+  <div nz-row class="mb-sm">
+    <div nz-col [nzSm]="5" [nzXs]="24">
+    </div>
+    <div nz-col [nzSm]="13" [nzXs]="24">
+      <div style="display: block;overflow-y:auto; width:100%;max-height:200px;border: 0;padding: 0;margin: 0">
+      <div *ngFor="let item of dataList" nz-row class="mb-sm" style="padding:4px 0 0 0;border-top: 2px dotted #e9e9e9;">
+        <div nz-col [nzSm]="8" [nzXs]="24">
+           <label>{{item.name}}</label>
+        </div>
+        <div nz-col [nzSm]="12" [nzXs]="24">
+            <label>{{ rulesToShow(item.rules) }}</label>
+        </div>
+        <div nz-col [nzSm]="4" [nzXs]="24">
+            <a (click)="toEdit(item)">������</a>
+            <span>&nbsp;|&nbsp;</span>
+            <nz-popconfirm [nzTitle]="'���������������?'" [nzOkText]="'Yes'" [nzCancelText]="'No'" (nzOnConfirm)="delete(item.id)" >
+              <a nz-popconfirm>������</a>
+          </nz-popconfirm>
+        </div>
+    </div>    
+  </div>
\ No newline at end of file
diff --git a/src/app/routes/sensors/basic-info/sensor-unit/sensor-unit.component.ts b/src/app/routes/sensors/basic-info/sensor-unit/sensor-unit.component.ts
new file mode 100644
index 0000000..0f48916
--- /dev/null
+++ b/src/app/routes/sensors/basic-info/sensor-unit/sensor-unit.component.ts
@@ -0,0 +1,166 @@
+import { Component, OnInit } from '@angular/core';
+import { _HttpClient } from '@delon/theme';
+import { NzModalSubject } from 'ng-zorro-antd';
+import { FormGroup, Validators, FormBuilder, FormControl } from '@angular/forms';
+import { Sensor, SensorUnit, OperatorRule } from '@business/entity/data';
+import { ToolsService } from '@business/services/util/tools.service';
+import { Operator, ResultCode } from '@business/enum/types.enum';
+import { ResultBean } from '@business/entity/grid';
+import { SensorUnitService } from '@business/services/http/sensor-unit.service';
+
+@Component({
+  selector: 'app-sensor-unit',
+  templateUrl: './sensor-unit.component.html',
+})
+export class SensorUnitComponent implements OnInit {
+    public isSaving = false;
+    public validateForm: FormGroup;
+    public operatorOptions: {label: string, value: Operator} [] = [
+      {label: '���', value: Operator.PLUS},
+      {label: '���', value: Operator.MINUS},
+      {label: '���', value: Operator.MULTIPLY},
+      {label: '���', value: Operator.DIVIDE}
+    ];
+    // public rule = '���';
+    public data: Sensor;
+    public dataList: SensorUnit[] = [];
+    constructor(
+        private subject: NzModalSubject,
+        private formBuilder: FormBuilder,
+        private http: _HttpClient,
+        private sensorUnitService: SensorUnitService
+    ) { }
+    loadDataList() {
+      this.sensorUnitService.getListBySensorId(this.data.id).subscribe(
+        res => {
+          if (res.code === 1 ) {
+            this.dataList = res.data;
+          }
+        }
+      );
+    }
+    public rulesToShow(rules: string) {
+        return rules.replace( /d/g, '').replace('{0}', '������');
+    }
+    ngOnInit() {
+      this.loadDataList();
+      const validates: SensorUnit  = {
+           id: [null ],
+           sensorId: [this.data.id, [Validators.required] ],
+           name: [null, [Validators.required] ]
+      };
+      validates['_rule-operator'] = [Operator.MULTIPLY];
+      validates['_rule-value'] = 1000;
+      validates['_rules'] =  [null, [Validators.required]];
+      this.validateForm = this.formBuilder.group(
+          validates
+      );
+      // this.validateForm.controls['_rules'].disable();
+    }
+    save($event, value, valid) {
+        $event.preventDefault();
+        if (valid) {
+          for (const i in this.validateForm.controls) {
+            this.validateForm.controls[ i ].disable();
+          } 
+          this.isSaving = true;
+          ToolsService.removePrivate(value);
+          const sensorUnit: SensorUnit = {};
+          Object.assign(sensorUnit, value);
+          sensorUnit['rules'] = this.rulesToString(this.rules);
+          sensorUnit['originalUnitName'] = this.data.unit;
+          console.log(JSON.stringify(sensorUnit));
+          this.http.post('sensor-unit/add-or-modify', sensorUnit).subscribe(
+            (res: ResultBean<any>) => {
+                if (!!res.code) {
+                  for (const i in this.validateForm.controls) {
+                    this.validateForm.controls[ i ].enable();
+                  }
+                  this.isSaving = false;
+                  this.loadDataList();
+                  this.reset();
+                }
+            }
+          );
+        } else {
+          this.validate(); 
+        }
+    }
+    toEdit(item) {      
+        this.reset();
+        this.setValueToControl('id', item.id);
+        this.setValueToControl('name', item.name);
+    }
+    delete(id) {
+      this.http.get('sensor-unit/delete', {id: id}).subscribe(
+          (res: ResultBean<any>) => {
+             if (!!res.code ) {
+               this.loadDataList();
+             }
+          }
+      );
+    }
+    validate() {
+        for (const i in this.validateForm.controls) {
+          this.validateForm.controls[ i ].markAsDirty();
+        }
+     }
+     private rules: OperatorRule[] = [];
+     addRule(event) {
+      event.preventDefault();
+      const rule: OperatorRule = {
+        operator: this.getValueFormControl('_rule-operator'),
+        value: this.getValueFormControl('_rule-value')
+      };
+      this.rules.push(rule);
+      this.setValueToControl('_rules' , this.rulesToString(this.rules, '������'));
+     }     rulesToString(rules , dataLabel?: string) {     
+        let rulesString = '' ;
+        const isDataLabel = dataLabel === undefined;
+        dataLabel = isDataLabel ? '{0}' : dataLabel;
+        if (!!this.rules && this.rules.length > 0) {
+            // const dataLabel = '������';
+            rulesString += dataLabel ;
+            this.rules.forEach(rule => {
+              if (!rulesString.endsWith(dataLabel)) {
+                rulesString = '(' + rulesString + ')';
+              } 
+              switch (rule.operator) {
+                  case Operator.PLUS: rulesString += '+' + rule.value; break;
+                  case Operator.MINUS: rulesString += '-' + rule.value; break;
+                  case Operator.MULTIPLY: rulesString += '*' + rule.value; break;
+                  case Operator.DIVIDE: rulesString += '/' + rule.value; break;
+               }
+               if ( isDataLabel ) {
+                 rulesString += 'd';
+               }
+            });
+        }
+        return rulesString;
+     }
+     getValueFormControl(controlName: string) {
+       return ToolsService.getValueFormControl(this.validateForm, controlName);
+     }
+     setValueToControl(controlName: string, value: any) {
+      ToolsService.setValueToControl(this.validateForm, controlName, value);
+     }
+     clearRules(event) {
+      event.preventDefault();
+      this.rules = [];
+      this.setValueToControl('_rules', this.rulesToString(this.rules, '������'));
+     }
+    //  print() {
+    //      debugger;
+    //      console.log(this.validateForm.controls['_rule']);
+    //  }
+    reset(event?: any) {
+      if (!!event) {
+        event.preventDefault();
+      }
+      this.setValueToControl('id', null);
+      this.setValueToControl('name', null);
+      this.setValueToControl('_rules', null);
+      this.setValueToControl('_rule-operator', Operator.MULTIPLY);
+      this.setValueToControl('_rule-value', 1000);
+    }
+}
diff --git a/src/app/routes/sensors/sensors.module.ts b/src/app/routes/sensors/sensors.module.ts
new file mode 100644
index 0000000..9412be2
--- /dev/null
+++ b/src/app/routes/sensors/sensors.module.ts
@@ -0,0 +1,40 @@
+import { SensorsService } from '@business/services/http/sensors.service';
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { BasicInfoComponent } from './basic-info/basic-info.component';
+import {RouterModule, Routes} from '@angular/router';
+import { PipeModule } from '@business/pipe/pipe.module';
+import { SharedModule } from '@shared/shared.module';
+import { _HttpClient } from '@delon/theme/services/http/http.client';
+import { FormBuilder } from '@angular/forms';
+import { SensorEditComponent } from './basic-info/sensor-edit/sensor-edit.component';
+import { SensorUnitComponent } from './basic-info/sensor-unit/sensor-unit.component';
+import { ToolsService } from '@business/services/util/tools.service';
+import { SensorUnitService } from '@business/services/http/sensor-unit.service';
+
+const routes: Routes = [
+  {
+    path: '',
+    children: [
+      { path: 'basic', component: BasicInfoComponent }
+    ]
+  }
+];
+const COMPONENTS_NOROUNT = [SensorEditComponent, SensorUnitComponent];
+@NgModule({
+  imports: [
+    // ������������������������������������
+    PipeModule,
+    CommonModule,
+    SharedModule,
+    RouterModule.forChild(routes)
+  ],
+  declarations: [    
+    BasicInfoComponent,
+    SensorUnitComponent,
+    SensorEditComponent
+  ],
+  providers: [SensorsService, _HttpClient, FormBuilder, ToolsService, SensorUnitService],
+  entryComponents: COMPONENTS_NOROUNT
+})
+export class SensorsModule { }
diff --git a/src/app/routes/systems/account/account-edit/account-edit.component.html b/src/app/routes/systems/account/account-edit/account-edit.component.html
new file mode 100644
index 0000000..58b2dad
--- /dev/null
+++ b/src/app/routes/systems/account/account-edit/account-edit.component.html
@@ -0,0 +1,57 @@
+<div class="modal-header">
+	<div class="modal-title">{{account.id > 0 ? '������' : '������'}} - ������</div>
+</div>
+<form (ngSubmit)="save()" nz-form [nzType]="'horizontal'" [formGroup]="validateForm">
+	<div nz-form-item nz-row class="mb-sm">
+		<div nz-form-label nz-col [nzSpan]="4">
+			<label nz-form-item-required>������</label>
+		</div>
+		<!-- [nzValidateStatus]="accountName" -->
+		<div nz-form-control nz-col [nzSpan]="8" nzHasFeedback >
+			<input nz-input formControlName="accountName" maxlength="30" required [nzDisabled]="account.id > 0 ? true : false" (blur)="check(validateForm.controls.accountName.value)"/>
+			<div nz-form-explain *ngIf="validateForm.controls.accountName.dirty && validateForm.controls.accountName.hasError('required')">���������������������!</div>
+			<div nz-form-explain *ngIf="validateForm.controls.accountName.dirty && validateForm.controls.accountName.hasError('unique')">���������������������!</div>
+		</div>
+		<div nz-form-label nz-col [nzSpan]="4">
+			<label>������</label>
+		</div>
+		<div nz-form-control nz-col [nzSpan]="8" nzHasFeedback>
+			<input nz-input maxlength="11" formControlName="mobile" />
+		</div>
+	</div>
+	<div nz-form-item nz-row class="mb-sm">
+		<div nz-form-label nz-col [nzSpan]="4">
+			<label>������������</label>
+		</div>
+		<div nz-form-control nz-col [nzSpan]="8" >
+			<input nz-input formControlName="email" />
+		</div>
+		<div nz-form-label nz-col [nzSpan]="4">
+			<label>���������</label>
+		</div>
+		<div nz-form-control nz-col [nzSpan]="8" >
+			<input nz-input formControlName="weixin" />
+		</div>
+	</div>
+	<div nz-form-item nz-row class="mb-sm">
+		<div nz-form-label nz-col [nzSpan]="4">
+			<label nz-form-item-required>������</label>
+		</div>
+		<div nz-form-control nz-col [nzSpan]="8" nzHasFeedback>
+			<nz-select style="width: 290px;" nzAllowClear [nzPlaceHolder]="'input search text'" [nzFilter]="false" nzShowSearch 
+				formControlName="organizationId" (nzSearchChange)="searchChange($event)" [nzNotFoundContent]="'������������'" required> 
+				<nz-option *ngFor="let option of searchOptions"  [nzLabel]="option['name']" [nzValue]="option['id']"> </nz-option> 
+			</nz-select>
+		</div>
+		<div nz-form-label nz-col [nzSpan]="4">
+			<label>������������</label>
+		</div>
+		<div nz-form-control nz-col [nzSpan]="8" >
+			<nz-datepicker style="width: 290px;" formControlName="expireTime" nzShowTime></nz-datepicker>
+		</div>
+	</div>
+	<div class="modal-footer">
+		<button nz-button type="button" (click)="close()">������</button>
+		<button nz-button  [nzType]="'primary'" [disabled]="!validateForm.valid">������</button>
+	</div>
+</form>
diff --git a/src/app/routes/systems/account/account-edit/account-edit.component.ts b/src/app/routes/systems/account/account-edit/account-edit.component.ts
new file mode 100644
index 0000000..7ee9ec0
--- /dev/null
+++ b/src/app/routes/systems/account/account-edit/account-edit.component.ts
@@ -0,0 +1,94 @@
+import {NzModalSubject} from 'ng-zorro-antd';
+import {Component, OnInit} from '@angular/core';
+import {HttpClient} from '@angular/common/http';
+import {environment} from '../../../../../environments/environment';
+import {FormGroup, FormBuilder, FormControl, Validators} from '@angular/forms';
+import * as $ from 'jquery';
+
+
+@Component({
+  selector: 'app-account-edit',
+  templateUrl: './account-edit.component.html',
+  styles: []
+})
+export class AccountEditComponent implements OnInit {
+
+  account: any;
+  validateForm: FormGroup;
+  searchOptions = [];
+
+  constructor(
+    private subject: NzModalSubject,
+    public http: HttpClient,
+    private formBuilder: FormBuilder
+  ) {
+
+  }
+
+  ngOnInit() {
+    const account = this.account;
+    this.validateForm = this.formBuilder.group({
+      accountName: [account.accountName],
+      mobile: [account.mobile],
+      email: [account.email],
+      weixin: [account.weixin],
+      organizationId: [account.organizationId],
+      expireTime: [account.expireTime],
+      id: [account.id]
+    });
+    this.searchOptions = account.organization ? [account.organization] : [];
+    
+    $(document).keydown(function(event) {
+      switch (event.keyCode) {
+        case 13: return false;
+      }
+    });
+  }
+
+  save() {
+    const validateForm = this.validateForm;
+    const controls = validateForm.controls;
+    if (validateForm.valid) {
+      for (const i in controls) {
+        controls[i].disable();
+      }
+      this.http.post(environment.SERVER_BASH_URL + '/account/account', validateForm.value).subscribe(() => {
+        this.subject.next('true');
+        this.close();
+      });
+    } else {
+      for (const i in controls) {
+        controls[i].markAsDirty();
+      }
+    }
+  }
+
+  close() {
+    this.subject.destroy();
+  }
+
+  check(accountName) {
+    const controlsAccountName = this.validateForm.controls.accountName;
+    if (accountName) {
+      this.http.get(environment.SERVER_BASH_URL + '/account/' + accountName).subscribe((res: any) => {
+        if (res.data > 0) {
+          controlsAccountName.setErrors({unique: true});
+        }
+      });
+    } else {
+      controlsAccountName.setErrors({required: true});
+    }
+  }
+
+  searchChange(searchText) {
+    if (searchText) {
+      const query = encodeURI(searchText);
+      if (query) {
+        this.http.get(environment.SERVER_BASH_URL + '/organization/list/' + query).subscribe((res: any) => {
+          this.searchOptions = res.data;
+        });
+      }
+    }
+  }
+
+}
diff --git a/src/app/routes/systems/account/account.component.html b/src/app/routes/systems/account/account.component.html
new file mode 100644
index 0000000..a3e795f
--- /dev/null
+++ b/src/app/routes/systems/account/account.component.html
@@ -0,0 +1,171 @@
+<pro-header [title]="'������������'"></pro-header>
+<nz-card [nzBordered]="false">
+    <form nz-form (ngSubmit)="load(true)" [nzLayout]="'inline'">
+        <div nz-row [nzGutter]="24">
+            <div nz-col [nzSpan]="8" class="mb-md">
+                <div nz-form-item class="d-flex">
+                    <div nz-form-label>
+                        <label>������</label>
+                    </div>
+                    <div nz-form-control class="flex-1">
+                        <nz-input [(ngModel)]="query.accountName" name="name" [nzSize]="'large'" [nzPlaceHolder]="'���������������'"></nz-input>
+                    </div>
+                </div>
+            </div>
+            <div nz-col [nzSpan]="8" class="mb-md">
+                <div nz-form-item class="d-flex">
+                    <div nz-form-label>
+                        <label>������</label>
+                    </div>
+                    <div nz-form-control class="flex-1">
+                        <nz-input [(ngModel)]="query.mobile" name="mobile" [nzSize]="'large'" [nzPlaceHolder]="'���������������'"></nz-input>
+                    </div>
+                </div>
+            </div>
+            <div nz-col [nzSpan]="8" class="mb-md">
+                <div nz-form-item class="d-flex">
+                    <div nz-form-label>
+                        <label>������������</label>
+                    </div>
+                    <div nz-form-control class="flex-1">
+                        <nz-select [(ngModel)]="query.isDelete" name="isDelete" [nzSize]="'large'">
+                            <nz-option *ngFor="let option of isDeleteOptions" [nzLabel]="option.label" [nzValue]="option.value"></nz-option>
+                        </nz-select>
+                    </div>
+                </div>
+            </div>
+            <div nz-col [nzSpan]="8" class="mb-md">
+                <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="loading" [nzSize]="'large'">������</button>
+                <button nz-button type="reset" [nzSize]="'large'" class="mx-sm">������</button>
+            </div>
+        </div>
+    </form>
+
+    <div class="mb-md">
+        <button nz-button (click)="edit()" [nzType]="'primary'" [nzSize]="'large'">
+            <i class="anticon anticon-plus"></i>
+            <span>������</span>
+        </button>
+        <ng-container *ngIf="selectedRows.length > 0"> &nbsp;
+            <button nz-button [nzSize]="'large'" (click)="remove()">������������</button>
+        </ng-container>
+    </div>
+
+    <div class="mb-md">
+        <nz-alert [nzType]="'info'" [nzShowIcon]="true">
+            <span alert-body>
+                ���������
+                <strong class="text-primary">{{selectedRows.length}}</strong>���
+            </span>
+        </nz-alert>
+    </div>
+
+    <nz-table #nzTable [nzAjaxData]="data" [nzLoading]="loading" [nzTotal]="total" [(nzPageIndex)]="query.pageIndex" [nzPageSize]="query.pageSize"
+        [nzShowTotal]="true" (nzPageIndexChange)="load()">
+        <thead nz-thead>
+            <tr>
+                <th nz-th [nzCheckbox]="true">
+                    <label nz-checkbox [(ngModel)]="allChecked" [nzIndeterminate]="indeterminate" (ngModelChange)="checkAll($event)"></label>
+                </th>
+                <th nz-th>
+                    <span>������</span>
+                    <nz-table-sort (nzValueChange)="sort('account_name', $event)"></nz-table-sort>
+                </th>
+                <th nz-th>
+                    <span>������</span>
+                </th>
+                <th nz-th>
+                    <span>������������</span>
+                </th>
+                <th nz-th>
+                    <span>���������</span>
+                </th>
+                <!-- <th nz-th><span>������</span></th> -->
+                <th nz-th>
+                    <span>������</span>
+                </th>
+                <th nz-th>
+                    <span>������������</span>
+                </th>
+                <th nz-th>
+                    <span>������������</span>
+                    <nz-table-sort (nzValueChange)="sort('expire_time', $event)"></nz-table-sort>
+                </th>
+                <th nz-th>
+                    <span>������</span>
+                </th>
+            </tr>
+        </thead>
+        <tbody nz-tbody>
+            <tr nz-tbody-tr *ngFor="let account of nzTable.data">
+                <td nz-td [nzCheckbox]="true">
+                    <label nz-checkbox [(ngModel)]="account.checked" (ngModelChange)="refreshStatus($event)" [nzDisabled]="account.isDelete == '1'? true : false"></label>
+                </td>
+                <td nz-td>{{account.accountName}}</td>
+                <td nz-td>{{account.mobile}}</td>
+                <td nz-td>{{account.email}}</td>
+                <td nz-td>{{account.weixin}}</td>
+                <!-- <td nz-td>{{account.Pwd}}</td> -->
+                <td nz-td>{{account.organization?account.organization.name:account.organizationId}}</td>
+                <td nz-td>{{format_date(account.createTime)}}</td>
+                <td nz-td>{{format_date(account.expireTime)}}</td>
+                <td nz-td>
+                    <a (click)="edit(account)">������</a>
+                    <ng-container *ngIf="account.isDelete == '0'">
+                        <span nz-table-divider></span>
+                        <nz-popconfirm [nzTitle]="'���������������������������?'" [nzOkText]="'Yes'" [nzCancelText]="'No'" (nzOnConfirm)="delete(account.id)">
+                            <a nz-popconfirm>������</a>
+                        </nz-popconfirm>
+                        <span nz-table-divider></span>
+                        <nz-dropdown>
+                            <a class="ant-dropdown-link" nz-dropdown>
+                                ������
+                                <i class="anticon anticon-down"></i>
+                            </a>
+                            <ul nz-menu>
+                                <li nz-menu-item>
+                                    <a (click)="showResetPwdWindow(account)">������������</a>
+                                </li>
+                            </ul>
+                        </nz-dropdown>
+                    </ng-container>
+                </td>
+            </tr>
+        </tbody>
+    </nz-table>
+</nz-card>
+<!-- ������������������ -->
+<nz-modal [nzVisible]="resetPwdWindowIsVisible" [nzTitle]="'������������'" [nzContent]="modalContent" (nzOnCancel)="resetPwdCancel()"
+    (nzOnOk)="resetPwdOk()" [nzConfirmLoading]="isResetPwdLoading">
+    <ng-template #modalContent>
+        <form nz-form [formGroup]="resetPwdForm">
+            <div nz-form-item nz-row>
+                <div nz-form-label nz-col [nzSm]="6" [nzXs]="24">
+                    <label for="accountName" >������</label>
+                </div>
+                <div nz-form-control nz-col [nzSm]="14" [nzXs]="24">
+                    <h4 class="h4">{{ getFormControl('accountName').value }}</h4>
+                </div>
+            </div>
+            <div nz-form-item nz-row>
+                <div nz-form-label nz-col [nzSm]="6" [nzXs]="24">
+                    <label for="password" nz-form-item-required>������</label>
+                </div>
+                <div nz-form-control nz-col [nzSm]="14" [nzXs]="24" nzHasFeedback>
+                    <nz-input [nzSize]="'large'" formControlName="password" [nzType]="'password'" [nzId]="'password'" (ngModelChange)="updateConfirmValidator()"></nz-input>
+                    <div nz-form-explain *ngIf="getFormControl('password').dirty&&getFormControl('password').hasError('required')">���������������!</div>
+                </div>
+            </div>
+            <div nz-form-item nz-row>
+                <div nz-form-label nz-col [nzSm]="6" [nzXs]="24">
+                    <label for="checkPassword" nz-form-item-required>������������</label>
+                </div>
+                <div nz-form-control nz-col [nzSm]="14" [nzXs]="24" nzHasFeedback>
+                    <nz-input [nzSize]="'large'" formControlName="checkPassword" [nzType]="'password'" [nzId]="'checkPassword'"></nz-input>
+                    <div nz-form-explain *ngIf="getFormControl('checkPassword').dirty&&getFormControl('checkPassword').hasError('required')">���������������!</div>
+                    <div nz-form-explain *ngIf="getFormControl('checkPassword').dirty&&getFormControl('checkPassword').hasError('confirm')">���������������������!</div>
+                </div>
+            </div>
+        </form>
+    </ng-template>
+</nz-modal>
diff --git a/src/app/routes/systems/account/account.component.ts b/src/app/routes/systems/account/account.component.ts
new file mode 100644
index 0000000..8f4f93c
--- /dev/null
+++ b/src/app/routes/systems/account/account.component.ts
@@ -0,0 +1,201 @@
+import {Component, OnInit} from '@angular/core';
+import {NzMessageService, NzModalService} from 'ng-zorro-antd';
+import {ModalHelper} from '@delon/theme';
+import {HttpClient} from '@angular/common/http';
+import {environment} from '../../../../environments/environment';
+import { DateService } from '../../../business/services/util/date.service';
+import {AccountEditComponent} from './account-edit/account-edit.component';
+import { FormBuilder, Validators, FormControl, FormGroup } from '@angular/forms';
+import { ResultBean } from '@business/entity/grid';
+@Component({
+  selector: 'app-account',
+  templateUrl: './account.component.html',
+  styles: []
+})
+
+export class AccountComponent implements OnInit {
+
+  public isDeleteOptions = [
+    {value: '1', label: '���'},
+    {value: '0', label: '���'}
+  ];
+
+  query: any = {
+    pageIndex: 1,
+    pageSize: 10,
+    isDelete: this.isDeleteOptions[1].value
+  };
+  data: any[] = [];
+  total: 0;
+
+  selectedRows: any[] = [];
+  allChecked = false;
+  indeterminate = false;
+  sortMap: string[] = [];
+  loading = true;
+
+  constructor(
+    public http: HttpClient,
+    private confirmServ: NzModalService,
+    public dateSrv: DateService,
+    public msgSrv: NzMessageService,
+    private modalHelper: ModalHelper,
+    private fb: FormBuilder
+  ) {
+
+  }
+
+  load(reload: boolean = false) {
+    if (reload) {
+      this.query.pageIndex = 1;
+    }
+    this.http.get(environment.SERVER_BASH_URL + '/account/list', {params: this.query}).subscribe((res: any) => {
+      if (res.code === 0) {
+        this.msgSrv.error(res.message);
+      } else {
+        this.data = res.data.data;
+        this.total = res.data.total;
+      }
+      this.refreshStatus();
+      this.loading = false;
+    });
+  }
+
+  ngOnInit() {
+    this.load();
+    // ������������������
+    this.resetPwdForm = this.fb.group({
+    accountName      : [ null, [ Validators.email ] ],
+    password         : [ null, [ Validators.required ] ],
+    checkPassword    : [ null, [ Validators.required, this.confirmationValidator ] ]
+    });
+  }
+
+  edit(account?: any) {
+    if (!account) {
+      account = {};
+    }
+    this.modalHelper.static(AccountEditComponent, {account}).subscribe((res: any) => {
+      if (res.code === 0) {
+        this.msgSrv.error(res.message);
+      } else {
+        this.msgSrv.success('���������������������');
+        this.load(true);
+      }
+    });
+  }
+
+  remove() {
+    const ids: number[] = [];
+    this.confirmServ.confirm({
+      title: '������������',
+      content: '���������������������������?',
+      okText: '������',
+      cancelText: '������'
+    }).on('onOk', () => {
+      this.selectedRows.forEach(i => {
+        ids.push(i.id);
+      });
+      this.delete(...ids);
+    });
+  }
+
+  delete(...ids: number[]) {
+    this.http.post(environment.SERVER_BASH_URL + '/account/ids', ids).subscribe((res: any) => {
+      if (res.data > 0) {
+        this.msgSrv.success('���������������������');
+        this.load(true);
+      } else {
+        this.msgSrv.error(res.message);
+      }
+    });
+  }
+
+  checkAll(value: boolean) {
+    this.data.forEach(i => {
+      if (i.isDelete === '1') {
+        i.checked = false;
+      } else {
+        i.checked = value;
+      }
+    });
+    this.refreshStatus();
+  }
+
+  refreshStatus() {
+    const allChecked = this.data.every(value => value.checked);
+    const allUnChecked = this.data.every(value => !value.checked);
+    this.allChecked = allChecked;
+    this.indeterminate = (!allChecked) && (!allUnChecked);
+    this.selectedRows = this.data.filter(value => value.checked);
+  }
+
+  sort(field: string, value: any) {
+    const temp = this.sortMap;
+    this.sortMap = [];
+    temp.forEach(i => {
+      if (!i.startsWith(field)) {
+        this.sortMap.push(i);
+      }
+    });
+    if (value) {
+      this.sortMap.push(`${field} ${value}`);
+    }
+    this.query.sorter = this.sortMap.length > 0 ? this.sortMap.join(',') : '';
+    this.load(true);
+  }
+
+  format_date(date) {
+    if (date) {
+      return this.dateSrv.date_format(date, 'YYYY-MM-DD');
+    }
+   }
+  public resetPwdWindowIsVisible = false;
+  public isResetPwdLoading = false;
+  public resetPwdForm: FormGroup;
+  public showResetPwdWindow(account) {
+        this.resetPwdWindowIsVisible = true;
+        this.resetPwdForm = this.fb.group({
+          id               : [ account.id ],
+          accountName      : [ account.accountName],
+          password         : [ null, [ Validators.required ] ],
+          checkPassword    : [ null, [ Validators.required, this.confirmationValidator ] ]
+        });
+  }
+  public resetPwdCancel() {
+       this.resetPwdWindowIsVisible = false;
+  }
+  public resetPwdOk() {
+    for (const i in this.resetPwdForm.controls) {
+      this.resetPwdForm.controls[ i ].markAsDirty();
+    }
+    if (this.resetPwdForm.valid) {
+       this.isResetPwdLoading = true;
+       const data = this.resetPwdForm.value;
+       data['accountName'] = null;
+       this.http.post(environment.SERVER_BASH_URL + '/account/account', data).subscribe((res: ResultBean<any>) => {
+         if ( res.code === 1 && res.data === 1 ) {
+          this.isResetPwdLoading = false;
+          this.resetPwdWindowIsVisible = false;
+          this.msgSrv.success('���������������������');
+         }
+      });
+    }
+  }
+  confirmationValidator = (control: FormControl): { [s: string]: boolean } => {
+    if (!control.value) {
+      return { required: true };
+    } else if (control.value !== this.resetPwdForm.controls[ 'password' ].value) {
+      return { confirm: true, error: true };
+    }
+  }
+  getFormControl(name) {
+    return this.resetPwdForm.controls[ name ];
+  }
+  updateConfirmValidator() {
+    /** wait for refresh value */
+    setTimeout(_ => {
+      this.resetPwdForm.controls[ 'checkPassword' ].updateValueAndValidity();
+    });
+  }
+}
diff --git a/src/app/routes/systems/organization/organization-config-screen/organization-config-screen.component.html b/src/app/routes/systems/organization/organization-config-screen/organization-config-screen.component.html
new file mode 100644
index 0000000..c8c58ee
--- /dev/null
+++ b/src/app/routes/systems/organization/organization-config-screen/organization-config-screen.component.html
@@ -0,0 +1,161 @@
+<ng-container *ngIf="!!deviceVersions.length; else elseTemplate">
+    <nz-tabset [nzTabPosition]="'left'" [(nzSelectedIndex)]="selectedIndex" (nzSelectedIndexChange)="swapTab()">
+        <nz-tab *ngFor="let tab of deviceVersions">
+            <ng-template #nzTabHeading>
+                {{tab.name}}
+            </ng-template>
+            <nz-spin [nzSpinning]="isSpinning">            
+                        <form *ngIf="!!deviceVersions.length" nz-form>
+                                <nz-card [nzBordered]="false" nzTitle="���������({{surplusSensors.length}})">
+                                    <div nz-form-item nz-row>
+                                        <ng-container *ngFor="let sensor of surplusSensors,index as i">
+                                            <div nz-form-control nz-col [nzSm]="2">
+                                                <label>{{ sensor.name }}</label>
+                                            </div>
+                                            <div nz-form-control nz-col [nzSm]="4">
+                                                <nz-dropdown [nzTrigger]="'click'">
+                                                    <a class="ant-dropdown-link" nz-dropdown>
+                                                        ������
+                                                        <i class="anticon anticon-down"></i>
+                                                    </a>
+                                                    <ul nz-menu>
+                                                        <li nz-menu-item>
+                                                            <a (click)="moveTo(surplusSensors,i,defaultMonitorItems)">
+                                                                ���������
+                                                            </a>
+                                                        </li>
+                                                        <li nz-menu-divider></li>
+                                                        <li nz-menu-item (click)="moveTo(surplusSensors,i,coreMonitorItems)" [nzDisable]="isCoreItemsFull">
+                                                            ���������
+                                                            <span *ngIf="isCoreItemsFull">(������)</span>
+                                                        </li>
+                                                    </ul>
+                                                </nz-dropdown>
+                                            </div>
+                                        </ng-container>
+                                    </div>
+                                    <nz-row nzType="flex" nzJustify="end" nzAlign="top">
+                                        <nz-col nzSpan="4" >
+                                            <button (click)="moveAllto(surplusSensors,defaultMonitorItems)" nz-button>���������������������</button>
+                                        </nz-col>
+                                    </nz-row>
+                                </nz-card>
+                                <div nz-form-item nz-row>
+                                    <div nz-form-control nz-col [nzSm]="8"></div>
+                                    <div nz-form-control nz-col [nzSm]="8">
+                                        <label class="display-3">������������ :</label>
+                                        <span class="display-3">{{ chartSensorName }}</span>
+                                    </div>
+                                    <div nz-form-control nz-col [nzSm]="8"></div>
+                                </div>
+                                <nz-card [nzBordered]="false" nzTitle="���������({{defaultMonitorItems.length}})">
+                                    <div *ngFor="let sensor of defaultMonitorItems,index as i" nz-form-item nz-row>
+                                        <div nz-form-control nz-col [nzSm]="6">
+                                            <label>{{ sensor.name }}</label>
+                                        </div>
+                                        <div nz-form-control nz-col [nzSm]="3">
+                                            <a (click)="itemUp(defaultMonitorItems,i)">������</a>
+                                        </div>
+                                        <div nz-form-control nz-col [nzSm]="3">
+                                            <a (click)="itemDown(defaultMonitorItems,i)">������</a>
+                                        </div>
+                                        <div nz-form-control nz-col [nzSm]="3">
+                                            <a (click)="setChartSensorKey(sensor.sensorKey)">������������</a>
+                                        </div>
+                                        <div nz-form-control nz-col [nzSm]="3">
+                                            <nz-dropdown [nzTrigger]="'click'">
+                                                <a class="ant-dropdown-link" nz-dropdown>
+                                                    ������
+                                                    <i class="anticon anticon-down"></i>
+                                                </a>
+                                                <ul nz-menu>
+                                                    <li nz-menu-item>
+                                                        <a (click)="moveTo(defaultMonitorItems,i,surplusSensors)">
+                                                            ���������
+                                                        </a>
+                                                    </li>
+                                                    <li nz-menu-divider></li>
+                                                    <li nz-menu-item (click)="moveTo(defaultMonitorItems,i,coreMonitorItems)" [nzDisable]="isCoreItemsFull">
+                                                        ���������
+                                                        <span *ngIf="isCoreItemsFull">(������)</span>
+                                                    </li>
+                                                </ul>
+                                            </nz-dropdown>
+                                        </div>
+                                    </div>
+                                </nz-card>
+                                <nz-card [nzBordered]="false" nzTitle="���������({{coreMonitorItems.length}}/6)">
+                                    <div *ngFor="let sensor of coreMonitorItems,index as i" nz-form-item nz-row>
+                                        <div nz-form-control nz-col [nzSm]="6">
+                                            <label>{{ sensor.name }}</label>
+                                        </div>
+                                        <div nz-form-control nz-col [nzSm]="3">
+                                            <a (click)="itemUp(coreMonitorItems,i)">������</a>
+                                        </div>
+                                        <div nz-form-control nz-col [nzSm]="3">
+                                            <a (click)="itemDown(coreMonitorItems,i)">������</a>
+                                        </div>
+                                        <div nz-form-control nz-col [nzSm]="3">
+                                            <a (click)="setChartSensorKey(sensor.sensorKey)">������������</a>
+                                        </div>
+                                        <div nz-form-control nz-col [nzSm]="3">
+                                            <nz-dropdown [nzTrigger]="'click'">
+                                                <a class="ant-dropdown-link" nz-dropdown>
+                                                    ������
+                                                    <i class="anticon anticon-down"></i>
+                                                </a>
+                                                <ul nz-menu>
+                                                    <li nz-menu-item>
+                                                        <a (click)="moveTo(coreMonitorItems,i,surplusSensors)">
+                                                            ���������
+                                                        </a>
+                                                    </li>
+                                                    <li nz-menu-divider></li>
+                                                    <li nz-menu-item (click)="moveTo(coreMonitorItems,i,defaultMonitorItems)">
+                                                        ���������
+                                                    </li>
+                                                </ul>
+                                            </nz-dropdown>
+                                        </div>
+                                    </div>
+                                </nz-card>
+                                <nz-card [nzBordered]="false" nzTitle="���������({{optionalFixedItems.length}})">
+                                        <div nz-form-item nz-row>
+                                            <ng-container *ngFor="let sensor of optionalFixedItems,index as i">
+                                                <div nz-form-control nz-col [nzSm]="2">
+                                                </div>
+                                                <div nz-form-control nz-col [nzSm]="4">
+                                                    <label nz-checkbox [ngModel]="isFixedSensorSelected(sensor.sensorKey)" 
+                                                    (ngModelChange) = "changeFixedItem( $event, sensor)"
+                                                    name="fixed_{{sensor.sensorKey}}_selected"></label>
+                                                    &nbsp;
+                                                    <label>{{ sensor.name }}</label>
+                                                </div>
+                                            </ng-container>
+                                        </div>
+                                    </nz-card>
+                            </form>
+            </nz-spin>
+        </nz-tab>
+    </nz-tabset>
+</ng-container>
+<ng-template #elseTemplate>
+    <div nz-form-item nz-row>
+        <div  nz-form-label nz-col [nzSm]="24" style="text-align: center;">
+            <h2 *ngIf="deviceVersions.length == 0">������������������������������������������������</h2>
+        </div>
+    </div>
+</ng-template>
+
+
+<footer-toolbar>
+    <label>���������������</label>
+    <span [ngStyle]="{'font-size': '16px','font-weight': 'bold','margin-right':'30px'}">{{ organization.name }}</span>
+    <button nz-button type="button" (click)="backToList()">������</button>
+    <button nz-button [nzType]="'primary'" (click)="save()" [nzLoading]="isSaving">
+        <span>
+            ������
+            <span *ngIf="isSaving">���</span>
+        </span>
+    </button>
+</footer-toolbar>
diff --git a/src/app/routes/systems/organization/organization-config-screen/organization-config-screen.component.ts b/src/app/routes/systems/organization/organization-config-screen/organization-config-screen.component.ts
new file mode 100644
index 0000000..62ac30c
--- /dev/null
+++ b/src/app/routes/systems/organization/organization-config-screen/organization-config-screen.component.ts
@@ -0,0 +1,222 @@
+import { Component, OnInit } from '@angular/core';
+import { _HttpClient } from '@delon/theme';
+import { NzMessageService } from 'ng-zorro-antd';
+import { OrganizationService } from '@business/services/http/organization.service';
+import { Sensor, Organization } from '@business/entity/data';
+import { ResultBean } from '@business/entity/grid';
+
+@Component({
+  selector: 'app-organization-config-screen',
+  templateUrl: './organization-config-screen.component.html',
+})
+export class OrganizationConfigScreenComponent implements OnInit {
+
+    constructor(
+        private http: _HttpClient,
+        private organizationService: OrganizationService,
+        public msgSrv: NzMessageService
+    ) { }
+    public selectedIndex = 0;
+    public defaultSwapFlag: string;
+    public coreSwapFlag: string;
+    public organization: Organization;
+    public deviceVersions: any[] = [];
+    public addedSensors: any[] = [];
+    // ������������������
+    public surplusSensors: any[] = [];
+    public defaultMonitorItems: any[] = [];
+    public coreMonitorItems: any[] = [];
+    public optionalFixedItems: any[] = [];
+    public fixedMonitorItems: any[] =  [];
+    public chartSensorKey: string;
+    
+    ngOnInit() {
+      this.organization = this.organizationService.data;
+      this.deviceVersions = 
+                !!this.organizationService.getResultBeanData('deviceVersions') ?
+                this.organizationService.getResultBeanData('deviceVersions') : [];
+      const rtdLayout = this.organizationService.getResultBeanData('rtdLayout');
+      const sensorCombs = <any[]>this.organizationService.getResultBeanData('sensorCombs');
+      const optionalFixedItems = <any[]>this.organizationService.getResultBeanData('optionalFixedItems');
+      this.loadPage(rtdLayout, sensorCombs, optionalFixedItems);
+    }
+    swapTab() {
+        const version = this.deviceVersions[this.selectedIndex];
+        this.isSaving = true;
+        this.isSpinning = true;
+        this.http.get('org-layout/rtd-act-config', {orgId: this.organization.id, versionNo: version.version }).subscribe(
+            (res: ResultBean<any>) => {
+                if ( res.code > 0 ) {
+                    const data = res.data;
+                    const rtdLayout = data.rtdLayout;
+                    const sensorCombs = data.sensorCombs;
+                    const optionalFixedItems = data.optionalFixedItems;
+                    this.loadPage(rtdLayout, sensorCombs, optionalFixedItems);
+                    this.isSaving = false;
+                    this.isSpinning = false;
+                }
+            }
+        );
+    }
+    loadPage(rtdLayout: 
+        {chartSensorKey: string,
+         coreMonitorItems: any[], 
+         defaultMonitorItems: any [],
+         optionalFixedItems: any[],
+         fixedMonitorItems: any[]}
+        , sensorCombs: any[], optionalFixedItems: any[]) {
+        this.chartSensorKey = '';
+        this.coreMonitorItems = [];
+        this.defaultMonitorItems = [];
+        this.addedSensors = [];
+        this.surplusSensors = [];
+        this.fixedMonitorItems = [];
+        this.optionalFixedItems = !!optionalFixedItems ? optionalFixedItems : [];
+        if (!!rtdLayout && !!sensorCombs.length) {
+            this.chartSensorKey = rtdLayout.chartSensorKey;
+            this.coreMonitorItems = rtdLayout.coreMonitorItems;
+            this.defaultMonitorItems = rtdLayout.defaultMonitorItems;
+            this.fixedMonitorItems = rtdLayout.fixedMonitorItems;
+            this.addedSensors = [...rtdLayout.coreMonitorItems, ...rtdLayout.defaultMonitorItems];
+            this.surplusSensors = sensorCombs.filter(
+                ( item: any ) => {
+                  return !this.addedSensors.some(
+                      (sen: any) => {
+                          return item.sensorKey === sen.sensorKey;
+                      }
+                  );
+                }
+            );
+        } else {
+          this.surplusSensors = sensorCombs;
+        }
+    }
+    public get haveTaps(): Boolean {
+        return !!this.deviceVersions && !!this.deviceVersions.length;
+    }
+    public get isCoreItemsFull(): Boolean {
+        return this.coreMonitorItems.length >= 6;
+    }
+    public setChartSensorKey(sensorKey) {
+        this.chartSensorKey = sensorKey;
+    }
+    public itemUp(items: any[], index) {
+        if (index !== 0 ) {
+           const tempIndex = index - 1;
+           const temp = items[tempIndex];
+           items[tempIndex] = items[index];
+           items[index] = temp;
+        }
+   }
+   public itemDown(items: any[], index) {
+     if (index < (items.length - 1) ) {             
+        const tempIndex = index + 1;
+        const temp = items[tempIndex];
+        items[tempIndex] = items[index];
+        items[index] = temp;
+     }
+    }
+
+    moveTo(source: any[], sIndex: number, target: any[]) {
+        const temp = source[sIndex];
+        source.splice(sIndex, 1);
+        target.push(temp);
+        // ������������������
+        this.refreshAddedList();
+        this.refreshChartSensorKey();
+    }
+    moveAllto(source: any[],  target: any[]) {
+        const length = source.length;
+        target.push(...source);
+        source.splice(0, length);   
+        this.refreshAddedList();
+        this.refreshChartSensorKey();     
+    }
+    public refreshChartSensorKey() {
+        const isChartKeyRemoved = this.surplusSensors.some(
+            item => {
+                return item.sensorKey === this.chartSensorKey;
+            }
+        );
+        if (isChartKeyRemoved || !this.chartSensorKey) {
+            this.chartSensorKey = null;
+            const length = this.addedSensors.length;
+            if (length > 0) {
+                this.chartSensorKey =  this.addedSensors[length - 1].sensorKey;
+            }
+        }
+    }
+    public get chartSensorName() {
+        const sensor = this.addedSensors.find(
+            item => {
+                return item.sensorKey === this.chartSensorKey;
+            }
+        );
+        return !!sensor ? sensor.name : '';
+    }
+    refreshAddedList() {
+        this.addedSensors = [...this.defaultMonitorItems, ...this.coreMonitorItems];
+    }
+    public isSaving = false;
+    public isSpinning = false;
+    save() {
+         this.isSaving = true;
+         const version = this.deviceVersions[this.selectedIndex].version;
+         const orgId = this.organization.id;
+         if ( !!this.addedSensors.length ) {
+            const rtdLayout = {
+                chartSensorKey: this.chartSensorKey,
+                defaultMonitorItems: this.defaultMonitorItems,
+                coreMonitorItems: this.coreMonitorItems,
+                fixedMonitorItems: this.fixedMonitorItems
+            };
+            const rtdLayoutUpload = {
+                realTimeDeviceLayout : rtdLayout,
+                organizationId: orgId,
+                version: version
+            };            
+            this.http.post('org-layout/rtd-save', rtdLayoutUpload).subscribe(
+                (res: ResultBean<any>) => {
+                    if (res.code > 0 ) {
+                        this.isSaving = false;
+                        this.msgSrv.success('������������');
+                    }
+                }
+            );
+         } else {
+            this.http.get('org-layout/rtd-remove', {orgId: orgId, version: version}).subscribe(
+                (res: ResultBean<any>) => {
+                    if (res.code > 0 ) {
+                        this.isSaving = false;
+                        this.msgSrv.success('������������');
+                    }
+                }
+            );
+         }
+    }
+    isFixedSensorSelected(sensorKey: string) {
+        const isSelected = this.fixedMonitorItems.some( item => {
+            return item.sensorKey === sensorKey;
+        });
+        return isSelected;
+    }
+
+    changeFixedItem(event, sensor) {
+         if (event) {
+            this.fixedMonitorItems.push(sensor);
+         } else {
+            const delteIndex =  this.fixedMonitorItems.findIndex(
+                item => {
+                    return item.sensorKey === sensor.sensorKey;
+                }
+            );
+            if (delteIndex > 0 ) {
+                this.fixedMonitorItems.splice(delteIndex, 1);
+            }           
+         }
+    }
+    backToList() {
+        this.organizationService.handle = 'list';
+        this.organizationService.title = '������������';
+    }
+}
diff --git a/src/app/routes/systems/organization/organization-config-unit/organization-config-unit.component.html b/src/app/routes/systems/organization/organization-config-unit/organization-config-unit.component.html
new file mode 100644
index 0000000..f8f6fa2
--- /dev/null
+++ b/src/app/routes/systems/organization/organization-config-unit/organization-config-unit.component.html
@@ -0,0 +1,43 @@
+<form nz-form>
+    <ng-container *ngIf="!!osuList.length; else elseTemplate">
+            <nz-row nzGutter="8">      
+                    <ng-container *ngFor="let osu of osuList,index as i">
+                                          
+                        <div  nz-form-label nz-col [nzSm]="3">
+                                <label>{{osu.sensor.description}}</label>
+                        </div>
+                        <div nz-form-control nz-col [nzSm]="3">
+                            <nz-select [nzMode]="'default'" nzAllowClear 
+                            nzPlaceHolder="{{osu.sensor.unit}}(������������)" [(ngModel)]="osu.sensorUnitId" name="sensorUnit_{{i}}">
+                                <nz-option
+                                    *ngFor="let option of sensorUnitMap[osu.sensor.id]"
+                                    [nzLabel]="option.name"
+                                    [nzValue]="option.id">
+                                </nz-option>
+                            </nz-select>
+                        </div>                  
+                    </ng-container>
+                </nz-row>
+    </ng-container>
+    <ng-template #elseTemplate>
+            <div nz-form-item nz-row>
+                    <div  nz-form-label nz-col [nzSm]="24" style="text-align: center;">
+                            <h2>������������������������������������������������</h2>
+                    </div>
+            </div>
+    </ng-template>
+    
+
+
+</form>
+<footer-toolbar>
+        <label>���������������</label>
+        <span [ngStyle]="{'font-size': '16px','font-weight': 'bold','margin-right':'30px'}">{{ organization.name }}</span>
+        <button nz-button type="button" (click)="backToList()">������</button>
+        <button nz-button [nzType]="'primary'" (click)="save()" [nzLoading]="isSaving">
+            <span>
+                ������
+                <span *ngIf="isSaving">���</span>
+            </span>
+        </button>
+</footer-toolbar>
diff --git a/src/app/routes/systems/organization/organization-config-unit/organization-config-unit.component.ts b/src/app/routes/systems/organization/organization-config-unit/organization-config-unit.component.ts
new file mode 100644
index 0000000..ebf441c
--- /dev/null
+++ b/src/app/routes/systems/organization/organization-config-unit/organization-config-unit.component.ts
@@ -0,0 +1,71 @@
+import { Component, OnInit } from '@angular/core';
+import { _HttpClient } from '@delon/theme';
+import { OrganizationService } from '@business/services/http/organization.service';
+import { Organization, OrganizationSensorUnit } from '@business/entity/data';
+import { ResultBean } from '@business/entity/grid';
+import { NzMessageService } from 'ng-zorro-antd';
+
+@Component({
+  selector: 'app-organization-config-unit',
+  templateUrl: './organization-config-unit.component.html',
+})
+export class OrganizationConfigUnitComponent implements OnInit {
+    public organization: Organization;
+    constructor(
+        private http: _HttpClient,
+        private organizationService: OrganizationService,
+        public msgSrv: NzMessageService
+    ) { }
+
+    public originalOsuList: OrganizationSensorUnit[] = [];
+    public osuList: OrganizationSensorUnit[] = [];
+    public sensorUnitMap;
+    ngOnInit() {
+        this.organization = this.organizationService.data;
+        this.sensorUnitMap = <OrganizationSensorUnit []> this.organizationService.config.resultBean.data.sensorUnitMap;
+        const osuList = <OrganizationSensorUnit []> this.organizationService.config.resultBean.data.osuList;
+        this.osuList = osuList;
+        // ������������������
+        osuList.forEach(item => {
+            const osu = {};
+            Object.assign(osu, item);
+            this.originalOsuList.push(osu);
+        });
+        console.log(this.osuList);
+        console.log(this.sensorUnitMap);
+    }
+    public isSaving = false;
+    save() {
+        this.isSaving = true;
+        const modifyList = [];
+        // ���������������������
+        this.osuList.forEach(
+            item => {
+                const osu = this.originalOsuList.find(
+                    su => {
+                        return su.sensor.id === item.sensor.id && 
+                        su.sensorUnitId !== item.sensorUnitId;
+                    }
+                );
+                if (!!osu) {
+                    modifyList.push(item);
+                }
+            }
+        );
+        if (!!modifyList.length) {
+            this.http.post('org-sunit/saves', modifyList).subscribe(
+                (res: ResultBean<any>) => {
+                    if (res.code > 0 ) {
+                        this.isSaving = false;
+                        this.msgSrv.success(this.organization.name + ' ���������������');
+                        // this.backToList();
+                    }
+                }
+            );
+        }
+    }
+    backToList() {
+        this.organizationService.handle = 'list';
+        this.organizationService.title = '������������';
+      }
+}
diff --git a/src/app/routes/systems/organization/organization-config/organization-config.component.html b/src/app/routes/systems/organization/organization-config/organization-config.component.html
new file mode 100644
index 0000000..a88f3cd
--- /dev/null
+++ b/src/app/routes/systems/organization/organization-config/organization-config.component.html
@@ -0,0 +1,124 @@
+<form nz-form [formGroup]="validateForm" (ngSubmit)="save($event,validateForm.value,validateForm.valid)" [nzLayout]="'vertical'"
+    #f="ngForm">
+    <nz-card [nzBordered]="false" nzTitle="��������������������������������������������� ������������ ������������������������)">
+        <nz-table #nzTable [nzDataSource]="grid.data" [nzPageSize]="10" [nzLoading]="grid.loading" [nzShowTotal]="true">
+            <thead nz-thead>
+                <tr>
+                    <th nz-th [nzCheckbox]="true">
+                        <label nz-checkbox formControlName="_allChecked" [nzIndeterminate]="indeterminate" (ngModelChange)="checkAll($event)"></label>
+                    </th>
+                    <th nz-th>
+                        ���������������(������)
+                    </th>
+                    <th nz-th>
+                        ������
+                    </th>
+                    <th nz-th>
+                        ������
+                    </th>
+                    <th nz-th>
+                        ������
+                    </th>
+                    <th nz-th [ngStyle]="{'width': '72px'}">
+                        ������������
+                    </th>
+                    <th nz-th>
+                        <span *ngIf="hasDegression">������������</span>
+                    </th>
+                    <th nz-th>
+                        <span *ngIf="hasDegression">������������</span>
+                    </th>
+                    <th nz-th>
+                        <span *ngIf="hasDegression">������������</span>
+                    </th>
+                </tr>
+            </thead>
+            <tbody formGroupName="alarmLevels" nz-tbody>
+                <tr nz-tbody-tr style="height:50px;" *ngFor="let row of nzTable.data" formGroupName="{{row.sensorKey}}">
+
+                    <td nz-td [nzCheckbox]="true">
+                        <label nz-checkbox formControlName="enable"></label>
+                    </td>
+                    <td nz-td>
+                        <span>
+                            {{ row.name }}({{ row.unit }})
+                        </span>
+                    </td>
+                    <td nz-td formArrayName="increment" *ngFor="let in of validateForm.get('alarmLevels.'+row.sensorKey+'.increment').controls; index as i">
+                        <div nz-form-item>
+                            <div style="width:100px;" nz-form-control nzHasFeedback>
+                                <nz-input-number style="width: 100%;"  [formControlName]="i" maxlength="20" nzDisabled="{{ !f.value['alarmLevels'][row.sensorKey]['enable'] }}"></nz-input-number>
+                            </div>
+                        </div>
+                    </td>
+                    <td nz-td style="padding-top: 0;">
+                        <div nz-form-control>
+                            <nz-switch formControlName="degressEnable" (click)="refreshHasDegression(f.value['alarmLevels'][row.sensorKey]['degressEnable'])"
+                            nzDisabled="{{ !f.value['alarmLevels'][row.sensorKey]['enable'] }}"></nz-switch>
+                        </div>
+                    </td>
+                    <td nz-td formArrayName="degression" *ngFor="let in of validateForm.get('alarmLevels.'+row.sensorKey+'.degression').controls; index as i">
+                        <div *ngIf="f.value['alarmLevels'][row.sensorKey]['degressEnable']" nz-form-item>
+                            <div style="width:100px;"  nz-form-control nzHasFeedback>
+                                <nz-input-number style="width: 100%;" [formControlName]="i" maxlength="20" nzDisabled="{{ !f.value['alarmLevels'][row.sensorKey]['enable'] }}"></nz-input-number>
+                            </div>
+                        </div>
+                    </td>
+                </tr>
+            </tbody>
+        </nz-table>
+    </nz-card>
+    <div [ngStyle]="{'background-color':'#f5f7fa','width':'110%','left':'-5%','height':'20px','position':'relative'}"></div>
+    <nz-card [nzBordered]="false" nzTitle="������������" formGroupName="alarmMode">
+        <label nz-checkbox formControlName="enable">
+            <span>������������</span>
+        </label>
+        <div [ngStyle]="{'margin-left': '20%'}">
+            <br/>
+            <br/>
+            <br/>
+            <div *ngFor="let i of [1,2,3]" nz-form-item nz-row class="mb-sm">
+                <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+                    <span [ngSwitch]="i">
+                        <label *ngSwitchCase="1">������������������:</label>
+                        <label *ngSwitchCase="2">������������������:</label>
+                        <label *ngSwitchCase="3">������������������:</label>
+                    </span>
+                </div>
+                <div nz-form-control nz-col [nzSpan]="12" nzHasFeedback>
+                    <nz-select formControlName="{{ 'level'+i }}" [nzMode]="'multiple'" [nzPlaceHolder]="'������ ������������'" [nzNotFoundContent]="'������������'"
+                        nzDisabled="{{ !f.value['alarmMode']['enable'] }}">
+                        <nz-option *ngFor="let option of alarmModes" [nzLabel]="option.label" [nzValue]="option.value" [nzDisabled]="option.disabled">
+                        </nz-option>
+                    </nz-select>
+                </div>
+                <br/>
+                <br/>
+                <br/>
+            </div>
+            <br/>
+            <div nz-form-item nz-row class="mb-sm">
+                <div nz-form-label nz-col [nzSm]="5" [nzXs]="24">
+                    <span>
+                        <label>������������������<small>(������������)</small>:</label>
+                    </span>
+                </div>
+                <div nz-form-control nz-col [nzSpan]="12">
+                    <nz-input-number style="width: 200px;"  formControlName="interval" [nzParser]="parserInt" nzMin="1" nzStep="1" nzDisabled="{{ !f.value['alarmMode']['enable'] }}"></nz-input-number>
+                </div>
+            </div>
+        </div>
+    </nz-card>
+    <footer-toolbar errorCollect>
+        <span [ngStyle]="{'color':'red','width':'300px','margin-right':'40px'}">{{ errorMessage }}</span>
+        <label>���������������</label>
+        <span [ngStyle]="{'font-size': '16px','font-weight': 'bold','margin-right':'30px'}">{{ organization.name }}</span>
+        <button nz-button type="button" (click)="backToList()">������</button>
+        <button nz-button [nzType]="'primary'" [nzLoading]="isSaving">
+            <span>
+                ������
+                <span *ngIf="isSaving">���</span>
+            </span>
+        </button>
+    </footer-toolbar>
+</form>
diff --git a/src/app/routes/systems/organization/organization-config/organization-config.component.ts b/src/app/routes/systems/organization/organization-config/organization-config.component.ts
new file mode 100644
index 0000000..fe80593
--- /dev/null
+++ b/src/app/routes/systems/organization/organization-config/organization-config.component.ts
@@ -0,0 +1,294 @@
+import { NzMessageService } from 'ng-zorro-antd';
+import { filter } from 'rxjs/operators';
+import { HttpClient } from '@angular/common/http';
+import { FormGroup, FormBuilder, FormControl, Validators, FormArray, AbstractControl } from '@angular/forms';
+import { Grid, PageBean } from '@business/entity/grid';
+import { Organization, AlarmConfig, AlarmSensorLevel, AlarmConfigValue } from '@business/entity/data';
+import { Component, OnInit, OnDestroy } from '@angular/core';
+import { OrganizationService } from '@business/services/http/organization.service';
+import { _HttpClient } from '@delon/theme';
+import { AlarmConfigService } from '@business/services/http/alarm-config.service';
+import { AlarmStyle } from '@business/enum/types.enum';
+import { patterns } from '@business/enum/patterns.enum';
+import { ToolsService } from '@business/services/util/tools.service';
+
+@Component({
+  selector: 'app-organization-config',
+  templateUrl: './organization-config.component.html',
+  styles: [],
+  providers: [AlarmConfigService]
+})
+export class OrganizationConfigComponent implements OnInit, OnDestroy {
+  ngOnDestroy(): void {
+    this.backToList();
+  }
+  public organization: Organization;
+  grid: Grid<object> = new Grid<object>(null);
+  validateForm: FormGroup;
+  constructor(
+    private organizationService: OrganizationService,
+    private alarmConfigService: AlarmConfigService,
+    private formBuilder: FormBuilder,
+    private http: _HttpClient,
+    public msgSrv: NzMessageService
+
+  ) {
+    this.organization = this.organizationService.data;
+  }
+
+  ngOnInit() {
+    this.load();
+  }
+  load(reload: boolean = false) {
+    if (reload) {
+      this.grid.pageIndex = 1;
+    }
+    // ������������������ExpressionChangedAfterItHasBeenCheckedError
+    setTimeout(() => {
+      this.grid.loading = true;
+     }, 1);
+    const pageBean = this.organizationService.config.pageBean;
+    let resultBean = this.organizationService.config.resultBean;
+    resultBean = resultBean == null ? {} : resultBean;
+    if (pageBean != null && pageBean.data != null) {
+      this.grid.initData(pageBean);
+      let alarmConfig: AlarmConfig = null;
+      if (resultBean == null || resultBean.data == null) {
+        alarmConfig = this.alarmConfigService.generateAlarmConfig(pageBean.data);
+      } else {
+        // ������ ������ ���������
+        alarmConfig = this.alarmConfigService.generateAlarmConfig(pageBean.data, <AlarmConfig>resultBean.data);
+      }
+      const alarmConfigValue = alarmConfig.value;
+
+      const alarmLevels = alarmConfigValue.alarmLevels;
+      const alarmLevelsGroupsConfig = {};
+      Object.keys(alarmLevels).forEach(key => {
+
+        let increment = alarmLevels[key].increment;
+        increment = increment == null || increment.length !== 3 ? [0, 0, 0] : increment;
+        const incrementArray = this.formBuilder.array([
+          [increment[0]],
+          [increment[1]],
+          [increment[2]]
+        ]);
+        let degression = alarmLevels[key].degression;
+        degression = degression == null || degression.length !== 3 ? [0, 0, 0] : degression;
+        const degressionArray =
+          this.formBuilder.array([
+            [degression[0]],
+            [degression[1]],
+            [degression[2]]
+          ]);
+        // ������������������������
+        // let _degressionEnable = degression[0] != 0 || degression[1] != 0 || degression[2] != 0;
+
+        const alarmSensorGroup = this.formBuilder.group(
+          {
+            degressEnable: [alarmLevels[key].degressEnable],
+            enable: [alarmLevels[key].enable],
+            increment: incrementArray,
+            degression: degressionArray,
+          }, { validator: this.alarmLevelValidator }
+        );
+        alarmSensorGroup.get('enable').valueChanges.subscribe(
+          (value: any) => {
+            if (this._allCheckTriggers <= 0) {
+              this.refreshIndeterminate();
+            } else {
+              this._allCheckTriggers--;
+            }
+          }
+        );
+        alarmLevelsGroupsConfig[key] = alarmSensorGroup;
+      });
+      this.alarmModes.push(
+        { label: '������', value: AlarmStyle.email, disabled: false },
+        { label: '������', value: AlarmStyle.sms, disabled: false },
+        { label: '������', value: AlarmStyle.voice, disabled: false },
+        { label: '������', value: AlarmStyle.weixin, disabled: false }
+      );
+      const alarmMode = alarmConfigValue.alarmMode;
+      this.validateForm = this.formBuilder.group({
+        alarmLevels: this.formBuilder.group(alarmLevelsGroupsConfig),
+        alarmMode: this.formBuilder.group(
+          {
+            enable: [alarmMode.enable],
+            interval: [alarmMode.interval],
+            level1: [alarmMode.level1],
+            level2: [alarmMode.level2],
+            level3: [alarmMode.level3]
+          }
+        ),
+        '_id': alarmConfig.id,
+        '_allChecked': []
+      });
+      this.validateForm.statusChanges.subscribe(
+         item => {
+             this.setErrorMessage();
+         }
+      );
+      this.refreshIndeterminate();      
+    }
+      this.refreshHasDegression(false);
+        // ������������������ExpressionChangedAfterItHasBeenCheckedError
+        setTimeout(() => {
+          this.grid.loading = false;
+         }, 1);
+  }
+  alarmModes: { label: string, value: AlarmStyle, disabled: boolean }[] = [];
+  backToList() {
+    this.organizationService.handle = 'list';
+    this.organizationService.title = '������������';
+  }
+  indeterminate: boolean;
+  checkAll(param) {
+    const keys = this.grid.data.map(
+      item => {
+        return item['sensorKey'];
+      }
+    );
+    this._allCheckTriggers = 0;
+    keys.forEach(
+      (key: string) => {
+        this._allCheckTriggers++;
+        this.validateForm.get('alarmLevels.' + key + '.enable').setValue(param);
+      }
+    );
+    this.refreshIndeterminate();
+  }
+  private _allCheckTriggers = 0;
+  refreshIndeterminate() {
+    const keys = this.grid.data.map(
+      item => {
+        return item['sensorKey'];
+      }
+    );
+    const allChecked = keys.every(key => this.validateForm.get('alarmLevels.' + key + '.enable').value);
+    const allUnChecked = keys.every(key => !this.validateForm.get('alarmLevels.' + key + '.enable').value);
+    this.indeterminate = (!allChecked) && (!allUnChecked);
+  }
+  isSaving = false;
+  save($event, value, valid) {
+    $event.preventDefault();
+    if (valid) {
+       this.isSaving = true;
+       const data: AlarmConfig = {
+         id: value._id,
+         organizationId: this.organization.id,
+         value: value
+       };
+      //  ToolsService.removePrivate(data.value);
+       this.alarmConfigService.save(data).subscribe(
+           result => {
+              if (result != null && result.code === 1) {
+                 this.msgSrv.success(this.organization.name + ' ���������������');
+                //  this.backToList();
+              }
+           }
+       );
+    }
+  }    
+  
+  setErrorMessage() {
+    this.errorMessage = '';
+    const errObj = this.getLastError(this.validateForm);
+    if (errObj != null && Object.keys(errObj).length > 0) {
+     if (errObj['increment']) {
+      this.errorMessage = '������ ������ ������ ������������';
+     } else if (errObj['degression']) {
+      this.errorMessage = '������������ ������������ ������������ ������������';
+     } else if (errObj['pattern'] != null && errObj['pattern']['requiredPattern'] === '^' + patterns.num.toString() + '$') {
+      this.errorMessage = '���������������������';
+     }
+    }
+}
+  errorMessage = '';
+  private removeError(error: 'increment'|'degression', ...controls: AbstractControl[]) {
+    controls.forEach(
+      item => {
+         if (item.hasError(error) && Object.keys(item.errors).length === 1) {
+           item.setErrors(null);
+         }
+      }
+   ); 
+  }
+  private addError(error: 'increment'|'degression', ...controls: AbstractControl[]) {
+    controls.forEach(
+      item => {
+        const errs = {};
+        errs[error] = true;
+        item.setErrors(errs);
+        item.markAsDirty();
+      }
+   ); 
+  }
+  private alarmLevelValidator = (control: FormControl): { [s: string]: boolean } => {
+        const enable = control.get('enable').value;
+        const degressEnable = control.get('degressEnable').value;       
+        const i0 = control.get('increment.0');
+        const i1 = control.get('increment.1');
+        const i2 = control.get('increment.2');
+        const d0 = control.get('degression.0');
+        const d1 = control.get('degression.1');
+        const d2 = control.get('degression.2');
+        // ��������������� ������������������������������
+        if (!enable) {
+          this.removeError('increment', i0, i1, i2);
+          this.removeError('degression', d0, d1, d2);
+          return null;
+        }
+        const result = {};
+        const i0_value = parseInt(i0.value, 10);
+        const i1_value = parseInt(i1.value, 10);
+        const i2_value = parseInt(i2.value, 10);
+        if ((i0_value !== 0 || i1_value !== 0 || i2_value !== 0) && (i0_value >= i1_value || i1_value >= i2_value)) {
+          this.addError('increment', i0, i1, i2);
+          result['increment'] = true;
+        } else {
+          this.removeError('increment', i0, i1, i2);
+        } 
+        const d0_value = parseInt(d0.value, 10);
+        const d1_value = parseInt(d1.value, 10);
+        const d2_value = parseInt(d2.value, 10);
+          if (degressEnable && (d0_value !== 0 || d1_value !== 0 || d2_value !== 0) && (d1_value >= d0_value || d2_value >= d1_value)) {
+            this.addError('degression', d0, d1, d2);
+            result['degression'] = true;
+          } else {
+            this.removeError('degression', d0, d1, d2);
+          }
+        return Object.keys(result).length === 0 ? null : result;
+  }
+   getLastError(control: FormGroup|FormArray) {
+         if (control.errors != null) {
+             return control.errors;
+         } else {
+           const controls =   Object.values(control.controls);
+           for (let i = controls.length - 1; i >= 0; i--) {
+                const c = controls[i];
+                if (c.errors != null) {
+                  return c.errors;
+                } else if (c instanceof FormArray || c instanceof FormGroup) {
+                      const result = this.getLastError(c);
+                      if (result != null) {
+                         return result;
+                      }
+                }
+           }
+         }
+   }
+   public hasDegression = false;
+   public refreshHasDegression(value) {
+       if (value) {
+         this.hasDegression = true;
+       } else {
+        this.hasDegression = Object.values(this.validateForm.value['alarmLevels']).some(
+             ( item: any) => {
+                return item['degressEnable'];
+             }
+          );
+       }
+   }
+   // ���������
+   parserInt = (value) => parseInt(value , 10);
+}
diff --git a/src/app/routes/systems/organization/organization-edit/organization-edit.component.html b/src/app/routes/systems/organization/organization-edit/organization-edit.component.html
new file mode 100644
index 0000000..b945e8e
--- /dev/null
+++ b/src/app/routes/systems/organization/organization-edit/organization-edit.component.html
@@ -0,0 +1,91 @@
+<div class="modal-header">
+  <div class="modal-title">{{ data.id != null ? '������' : '������'}} - ������</div>
+</div>
+<form [formGroup]="validateForm" (ngSubmit)="save($event,validateForm.value,validateForm.valid)" nz-form [nzType]="'horizontal'">
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label nz-form-item-required>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+      <nz-input formControlName="name" maxlength="20" [nzPlaceHolder]="'������������'">
+      </nz-input>
+    </div>
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="4" nzHasFeedback>
+      <nz-select style="width:100%;" formControlName="rank" [nzPlaceHolder]="'������ ������'">
+        <nz-option *ngFor="let option of rankOptions" [nzLabel]="option.label" [nzValue]="option.value" [nzDisabled]="option.disabled">
+        </nz-option>
+      </nz-select>
+    </div>
+  </div>
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label nz-form-item-required>���/���/���</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+      <nz-cascader [class.class123]="true" (nzChange)="setAreaCodes($event)" formControlName="_areas" (nzLoad)="areaLazyLoad($event)"
+      [nzPlaceHolder]="'������ ���/���/���'" >
+      </nz-cascader>
+    </div>
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+      <nz-input formControlName="address" maxlength="20" 
+      [nzPlaceHolder]="'������������(���)������������120���'">
+      </nz-input>
+    </div>
+  </div>
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+      <nz-input formControlName="telephone" maxlength="20" 
+      [nzPlaceHolder]="'������(���)���0512-12345678'"></nz-input>
+    </div>
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+      <nz-input formControlName="email" maxlength="20" 
+      [nzPlaceHolder]="'������(���)���abc@qq.com'"></nz-input>
+    </div>
+  </div>
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label nz-form-item-required>������������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="6" nzHasFeedback>
+      <nz-datepicker nzSize="large"  style="width:100%;" formControlName="createTime" nzShowTime  [nzPlaceHolder]="'������������'"
+      [nzFormat]="'YYYY-MM-DD HH:mm:ss'" ></nz-datepicker>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="1" nzHasFeedback></div>
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label nz-form-item-required>������������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+      <nz-datepicker nzSize="large"  style="width:100%;" formControlName="expireTime" nzShowTime  [nzPlaceHolder]="'������������'"
+      [nzFormat]="'YYYY-MM-DD HH:mm:ss'" ></nz-datepicker>
+    </div>
+  </div>
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="16" nzHasFeedback>
+      <nz-input formControlName="description" maxlength="100"></nz-input>
+    </div>
+  </div>
+  <div class="modal-footer">
+    <button nz-button type="button" (click)="close()">������</button>
+    <button nz-button [nzType]="'primary'" [nzLoading]="isSaving">
+      <span>
+        ������
+        <span *ngIf="isSaving">���</span>
+      </span>
+    </button>
+  </div>
+</form>
diff --git a/src/app/routes/systems/organization/organization-edit/organization-edit.component.ts b/src/app/routes/systems/organization/organization-edit/organization-edit.component.ts
new file mode 100644
index 0000000..50d8b5a
--- /dev/null
+++ b/src/app/routes/systems/organization/organization-edit/organization-edit.component.ts
@@ -0,0 +1,116 @@
+import { Organization } from '@business/entity/data';
+import { AreacodeService } from '@business/services/http/areacode.service';
+import { Component, OnInit } from '@angular/core';
+import { NzMessageService, NzModalSubject } from 'ng-zorro-antd';
+import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms';
+import { CascaderOption } from 'ng-zorro-antd/src/cascader/nz-cascader.component';
+
+@Component({
+  selector: 'app-organization-edit',
+  templateUrl: './organization-edit.component.html',
+  styles: []
+})
+export class OrganizationEditComponent implements OnInit {
+
+  rankOptions = [
+    { value: 0, label: '������' },
+    { value: 1, label: '������������' },
+    { value: 2, label: '���������' },
+    { value: 3, label: '������������' },
+    { value: 4, label: '���������' },
+    { value: 5, label: '���������' }
+  ];
+
+  data: Organization;
+  isSaving = false;
+  validateForm: FormGroup;
+  constructor(    
+    private subject: NzModalSubject,
+    private formBuilder: FormBuilder,
+    private areacodeService: AreacodeService
+    ) { }
+
+  ngOnInit() {
+    const data = this.data;
+    const areaNames = data.areaNames;
+    let _areas = null;
+    if (areaNames != null) {
+      _areas = {
+       label: Object.values(areaNames).join('/'),
+       value: data.areaCode
+      };
+    }
+    if (data.createTime == null) {
+      data.createTime = new Date().getTime();
+    }
+     const validates: Organization|object  = {
+          name: [data.name, [Validators.required] ],
+          rank: [data.rank],
+          telephone: [data.telephone, [ Validators.pattern('^0\\d{2,3}-?\\d{7,8}$') ]],
+          email: [data.email, [ Validators.pattern('^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+') ] ],
+          address: [data.address ],
+          _areas: [_areas,  [Validators.required]],
+          createTime: [data.createTime, [Validators.required] ],
+          expireTime: [data.expireTime, [Validators.required] ],
+          description: [data.description ]
+     };
+     this.validateForm = this.formBuilder.group(
+         validates
+     );
+  }
+  close() {
+       this.subject.destroy();
+  }
+  save($event, value, valid) {
+      $event.preventDefault();
+      if (valid) {
+        for (const i in this.validateForm.controls) {
+          this.validateForm.controls[ i ].disable();
+        } 
+        this.isSaving = true;
+        Object.keys(value).forEach( (key: string) => {
+              // '_'������������������������������
+              if (!key.startsWith('_') && value[key] != null) {
+                   this.data[key] = value[key];
+              }
+        } );
+        this.subject.next( this );
+      } else {
+        this.validate(); 
+      }
+  }
+  validate() {
+     for (const i in this.validateForm.controls) {
+       this.validateForm.controls[ i ].markAsDirty();
+     }
+  }
+  areaLazyLoad(event: { option: CascaderOption, index: number, resolve: (children: CascaderOption[]) => void, reject: () => void }) {
+    const index = event['index'];
+    const option = event.option;  
+    switch (index) {
+       case -1:
+       this.areacodeService.getProvinces().subscribe(
+         (res: {label: string, value: string}[]) => {
+             event.resolve( res );
+         }
+       ); break;
+       case 0:
+       this.areacodeService.getCities(option.value).subscribe(
+         (res: {label: string, value: string}[]) => {
+             event.resolve( res );
+         }
+       ); break;
+       case 1:
+       this.areacodeService.getAreas(option.value).subscribe(
+         (res: {label: string, value: string}[]) => {
+             event.resolve( res );
+         }
+       ); break;
+    }
+  }
+  setAreaCodes(codes: string[]) {
+      this.data.provinceCode = codes[0];
+      this.data.cityCode = codes[1];
+      this.data.areaCode = codes[2];
+  }
+}
diff --git a/src/app/routes/systems/organization/organization-list/organization-list.component.html b/src/app/routes/systems/organization/organization-list/organization-list.component.html
new file mode 100644
index 0000000..0bb7324
--- /dev/null
+++ b/src/app/routes/systems/organization/organization-list/organization-list.component.html
@@ -0,0 +1,83 @@
+<nz-card [nzBordered]="false">
+    	<div class="mb-md">
+                <button nz-button (click)="addOrModify($event)" [nzType]="'primary'" [nzSize]="'large'">
+                    <i class="anticon anticon-plus"></i><span>������</span>
+                </button>
+                <ng-container *ngIf="grid.selectedIndexs.length > 0"> &nbsp;
+                <button nz-button [nzSize]="'large'" (click)="deleteSelected($event)">������������</button>
+                </ng-container>
+                <nz-input [ngStyle]="{'width': '280px','float':'right'}" [(ngModel)]="queryMap.value" name=""  [nzPlaceHolder]="queryMap.text"
+                (keyup)="queryTextChanged($event)" (change)="queryTextChanged($event)" ></nz-input>
+        </div>
+    	<div class="mb-md">
+                <nz-alert *ngIf="grid.selectedIndexs.length > 0" [nzType]="'info'" [nzShowIcon]="true"> 
+                    <span alert-body>
+                         ���������<strong class="text-primary">{{grid.selectedIndexs.length}}</strong>���
+                    </span> 
+                </nz-alert>
+    </div>
+    <nz-table #nzTable
+              [nzAjaxData]="grid.data"              
+              [nzTotal]="grid.total"
+              [(nzPageIndex)]="grid.pageIndex"
+              [(nzPageSize)]="grid.pageSize"
+              [nzLoading]="grid.loading"
+              [nzShowTotal]="true"
+              (nzPageIndexChange)="load()">
+              <thead nz-thead>
+                  <tr>
+                    <th nz-th [nzCheckbox]="true">
+                        <label nz-checkbox [(ngModel)]="grid.allChecked" [nzIndeterminate]="grid.indeterminate" (ngModelChange)="grid.checkAll($event)"></label>
+                    </th>
+                    <th nz-th *ngFor="let col of grid.columns"
+                     [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}" >
+                           <span>{{ col.text }}</span>
+                           <nz-table-sort *ngIf="col.isSort"   [(nzValue)]="col.sort" (nzValueChange)="sort(col.name,$event)"></nz-table-sort>
+                    </th>
+                    <th nz-th><span>������</span></th>
+                  </tr>
+              </thead>
+              <tbody nz-tbody>
+                <tr nz-tbody-tr *ngFor="let row of nzTable.data">
+                    <td nz-td [nzCheckbox]="true">
+                       <label nz-checkbox [(ngModel)]="row.checked" (ngModelChange)="grid.refreshStatus($event)"></label>
+                    </td>
+                    <td nz-td *ngFor="let col of grid.columns"
+                    [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
+                        <span [ngSwitch]="col.type">
+                             <!-- ������������������������������������ -->
+                            <span *ngSwitchDefault> {{ row[col.name]|tyepHandle:col:row }} </span>
+                             <!-- ������������������������������������ -->        
+                        </span>
+                    </td>
+                    <td nz-td>
+                            <a (click)="addOrModify(row)">������</a>
+                            <span nz-table-divider></span>
+                              <nz-popconfirm [nzTitle]="'������������������'+grid.title+'���?'" [nzOkText]="'Yes'" [nzCancelText]="'No'" (nzOnConfirm)="delete(row.id)" >
+                                <a nz-popconfirm>������</a>
+                              </nz-popconfirm>
+                            <span nz-table-divider></span>
+                            <a [routerLink]="['/systems/registration']" (click)="registration(row)">���������</a>
+                            <span nz-table-divider></span>
+                            <nz-dropdown>
+                                <a class="ant-dropdown-link" nz-dropdown>
+                                  ������ <i class="anticon anticon-down"></i>
+                                </a>
+                                <ul nz-menu>
+                                  <li nz-menu-item>
+                                        <a (click)="configAlarm(row)">������������������</a>
+                                  </li>
+                                  <li nz-menu-item>
+                                        <a (click)="configScreenLayout(row)">������������������</a>
+                                  </li>
+                                  <li nz-menu-item>
+                                        <a (click)="configShowUnit(row)">������������������</a>
+                                  </li>
+                                </ul>
+                              </nz-dropdown>
+                     </td>
+                </tr>
+              </tbody>
+              </nz-table>
+  </nz-card>
+  
diff --git a/src/app/routes/systems/organization/organization-list/organization-list.component.ts b/src/app/routes/systems/organization/organization-list/organization-list.component.ts
new file mode 100644
index 0000000..3cce5b9
--- /dev/null
+++ b/src/app/routes/systems/organization/organization-list/organization-list.component.ts
@@ -0,0 +1,269 @@
+import { AlarmConfigService } from '@business/services/http/alarm-config.service';
+import { SensorsService } from '@business/services/http/sensors.service';
+import { Router } from '@angular/router';
+import { ModalHelper, _HttpClient } from '@delon/theme';
+import { NzModalService, NzMessageService } from 'ng-zorro-antd';
+import { OrganizationService } from '@business/services/http/organization.service';
+import { Grid, Column, PageBean, ResultBean } from '@business/entity/grid';
+import { Organization, OrganizationSensorUnit } from '@business/entity/data';
+import { Component, OnInit } from '@angular/core';
+import { Subject } from 'rxjs/Subject';
+import { Types } from '@business/enum/types.enum';
+import { OrganizationEditComponent } from 'app/routes/systems/organization/organization-edit/organization-edit.component';
+import { zip } from 'rxjs/observable/zip';
+
+@Component({
+  selector: 'app-organization-list',
+  templateUrl: './organization-list.component.html',
+  styles: [],
+  providers: [AlarmConfigService]
+})
+export class OrganizationListComponent implements OnInit {
+  private organization: Organization;
+  grid: Grid<Organization> = new Grid(null);
+  queryMap = { text: '���������������', value: ''};
+  queryTextStream: Subject<string> = new Subject<string>();
+    private initPage() {
+    this.organization =  {
+      name: {
+        text: '������',
+        width: '120px'  
+      },
+      rank: {
+        text: '������',
+        width: '80px',
+        format: (value: any, col: Column, row: any) => {
+          const item = [
+            { value: 0, label: '������' },
+            { value: 1, label: '������������' },
+            { value: 2, label: '���������' },
+            { value: 3, label: '������������' },
+            { value: 4, label: '���������' },
+            { value: 5, label: '���������' }
+          ].filter( (rankItem: {value: number, label: string }) => {
+            return rankItem.value === value;
+          });
+          return item != null && item.length === 1 ? item[0].label : '';
+        }
+      },
+      telephone: {
+        text: '������',
+        width: '120px'
+      },
+      address: {
+        text: '������',
+        width: '300px',
+        format: (value: any, col: Column, row: any) => {
+              value = value == null ? '' : value ;
+              if (row['areaNames'] != null) {
+                return row['areaNames']['provinceName'] + row['areaNames']['cityName'] + row['areaNames']['areaName'] + value;
+              } else {
+                return value;
+              }
+              
+        }
+      },
+      createTime: {
+        text: '������������',
+        width: '100px',
+        type: {
+         name: Types.Date,
+         format: 'YYYY-MM-DD HH:mm:ss'
+        },
+         isSort: true
+      },
+      expireTime: {
+        text: '������������',
+        width: '100px',
+        type: {
+         name: Types.Date,
+         format: 'YYYY-MM-DD HH:mm:ss'
+        },
+         isSort: true  
+      }
+    };
+    this.grid.title = '������';
+    this.grid.setColumns(this.organization);
+    this.grid.pageSize = 10;
+  }
+  constructor(
+    private organizationService: OrganizationService,
+    
+    private confirmServ: NzModalService,
+    public msgSrv: NzMessageService,
+    private modalHelper: ModalHelper,
+    private router: Router,
+    private sensorsService: SensorsService,
+    private alarmConfigService: AlarmConfigService,
+    private http: _HttpClient
+  ) {}
+
+  ngOnInit() {
+    this.initPage();
+    this.queryTextStream
+    .debounceTime(500)
+    .distinctUntilChanged()
+    .subscribe(queryText => {
+        this.load();
+    });
+  }
+  queryTextChanged($event) {
+      this.queryTextStream.next(this.queryMap.value);
+  }
+  load(reload: boolean = false) {   
+    if (reload) {
+      this.grid.pageIndex = 1 ;
+    }
+    // ������������������ExpressionChangedAfterItHasBeenCheckedError
+    setTimeout(() => {
+      this.grid.loading = true;
+     }, 1);
+    this.organizationService.getPagingList(this.grid, this.queryMap.value).subscribe(
+       (res: PageBean) => {
+            this.grid.loading = true;
+            if (res != null && res.data != null) {
+              this.grid.initData(res);
+              this.grid.refreshStatus();
+              setTimeout(() => {
+                this.grid.loading = false;
+               }, 1);
+            }
+       }
+    );
+  }
+
+// rowData���null���������������
+  addOrModify(d) {
+    const data = {};
+    if ( d != null) {
+      Object.assign(data, d);
+    }
+    const cols = this.organization;
+    this.modalHelper.static(OrganizationEditComponent, { cols , data }).subscribe( 
+      ( ret: { data: any, close: Function} ) => {
+      // ������������
+      if (ret.data['index'] != null ) {
+          const index: number = ret.data['index'] ;
+          const origData = this.grid.getData()[index];
+          const isModified =  Object.keys(origData).some(
+            (key: string) => {
+                return ret.data[key] !== origData[key];    
+            } 
+          );
+          // ������������
+          if (!isModified) { 
+            ret.close();
+            this.msgSrv.success('���������������������������');
+            return;
+          }
+      }
+      this.organizationService.save(ret.data).subscribe(
+         ( res: any) => {
+            if (res.code === 1) {
+              this.load();
+              ret.close();
+              this.msgSrv.success('���������������������');
+            }
+         }
+      );
+    });
+  }
+
+  delete(...id: number[]) {
+    this.organizationService.delete( ...id ).subscribe(
+      ( res: any) => {
+         if (res.code === 1) {
+           this.load();
+           this.msgSrv.success('���������������������������');
+         }
+      }
+   );
+  }
+
+   deleteSelected() {
+    this.confirmServ.confirm({
+      title: '������������',
+      content: '������������������������������������������������',
+      okText: '������',
+      cancelText: '������'
+    }).on('onOk', () => {
+       if (this.grid.selectedIndexs != null && this.grid.selectedIndexs.length > 0) {
+          const ids = this.grid.selectedIndexs.map(
+              (index: number) => {
+                  const id = this.grid.data[index].id;
+                  return Number.parseInt(id);
+              }
+          );
+          this.delete( ...ids );
+       }
+    });
+  }
+  sort(field: string, value: string) {
+    // ������������field
+    this.grid.sorts = this.grid.sorts.filter(
+       (fn: string) => {
+          return fn !== field;
+       }
+     );
+     // ������value������null������������������������������filed
+     if ( value != null ) {
+        this.grid.sorts.push(field);
+     }
+     this.load();
+  }
+   configAlarm(row) {
+        // ������������������ExpressionChangedAfterItHasBeenCheckedError
+        setTimeout(() => {
+          this.grid.loading = true;
+         }, 1);
+    zip(
+      this.sensorsService.getPagingList({pageIndex: 0, pageSize: 0}, null),
+      this.alarmConfigService.getByOid( row.id )
+    ).subscribe(([pageBean, resultBean]) => {
+      this.grid.loading = false;
+      this.organizationService.handle = 'config' ;
+      this.organizationService.data = row;
+      this.organizationService.config = {pageBean, resultBean};
+      this.organizationService.title = '������������������';
+    });
+  }
+    configScreenLayout(row) {
+              // ������������������ExpressionChangedAfterItHasBeenCheckedError
+              setTimeout(() => {
+                this.grid.loading = true;
+                }, 1);
+              this.http.get('org-layout/rtd-config', {orgId: row.id}).subscribe(
+                   (res: ResultBean<any>) => {
+                      if ( res.code > 0 ) {
+                        this.grid.loading = false;
+                        this.organizationService.handle = 'screen' ;
+                        this.organizationService.data = row;
+                        this.organizationService.config['resultBean'] = res;
+                        console.log(res);
+                        this.organizationService.title = '������������������';
+                      }
+                   }
+              );
+    }
+    configShowUnit(row) {
+        // ������������������ExpressionChangedAfterItHasBeenCheckedError
+        setTimeout(() => {
+          this.grid.loading = true;
+          }, 1);
+        this.http.get('org-sunit/gets-byoid', {orgId: row.id}).subscribe(
+             (res: ResultBean<any>) => {
+                if ( res.code > 0 ) {
+                  this.grid.loading = false;
+                  this.organizationService.handle = 'unit' ;
+                  this.organizationService.data = row;
+                  this.organizationService.config['resultBean'] = res;
+                  console.log(res);
+                  this.organizationService.title = '������������������';
+                }
+             }
+        );
+    }
+  registration(row) {
+      sessionStorage.setItem('organization', JSON.stringify(row));
+  }
+}
diff --git a/src/app/routes/systems/organization/organization.component.html b/src/app/routes/systems/organization/organization.component.html
new file mode 100644
index 0000000..8e39e35
--- /dev/null
+++ b/src/app/routes/systems/organization/organization.component.html
@@ -0,0 +1,12 @@
+<pro-header [title]="organizationService.title">
+    
+</pro-header>
+<nz-card [nzBordered]="false" [nzNoHovering]="true">
+        <ng-template #body>
+            <app-organization-list *ngIf="organizationService.handle=='list'"></app-organization-list>
+            <app-organization-config *ngIf="organizationService.handle=='config'"></app-organization-config>
+            <app-organization-config-screen *ngIf="organizationService.handle=='screen'"></app-organization-config-screen>
+            <app-organization-config-unit *ngIf="organizationService.handle=='unit'"></app-organization-config-unit>
+        </ng-template>
+</nz-card>
+  
diff --git a/src/app/routes/systems/organization/organization.component.ts b/src/app/routes/systems/organization/organization.component.ts
new file mode 100644
index 0000000..7f68d8c
--- /dev/null
+++ b/src/app/routes/systems/organization/organization.component.ts
@@ -0,0 +1,17 @@
+import { OrganizationService } from '@business/services/http/organization.service';
+import { Component, OnInit } from '@angular/core';
+
+
+
+@Component({
+  selector: 'app-organization',
+  templateUrl: './organization.component.html',
+  styles: []
+})
+export class OrganizationComponent implements OnInit {
+  ngOnInit(): void {
+  }
+  constructor(
+    public organizationService: OrganizationService
+  ) {}
+}
diff --git a/src/app/routes/systems/registration/registration.component.html b/src/app/routes/systems/registration/registration.component.html
new file mode 100644
index 0000000..9ea8ebb
--- /dev/null
+++ b/src/app/routes/systems/registration/registration.component.html
@@ -0,0 +1,27 @@
+<div class="content__title">
+	<h1>���������������({{organization.name}})</h1>
+</div>
+<nz-card [nzBordered]="false">
+	<div class="mb-md">
+		<button nz-button [nzType]="'primary'" [nzSize]="'large'" (click)="isVisible=true">
+			<i class="anticon anticon-plus"></i><span>������</span>
+		</button>
+	</div>
+	<simple-table #simpleTable [data]="dataUrl" [extraParams]="extraParams" [columns]="columns" [showTotal]="true" [ps]="10" [reqReName]="{pi: 'pageIndex',ps: 'pageSize'}" [resReName]="{list: 'data',total: 'total'}">
+	</simple-table> 
+</nz-card>
+
+<nz-modal [nzVisible]="isVisible" [nzTitle]="'���������������'" [nzContent]="modalContent" (nzOnCancel)="isVisible=false" (nzOnOk)="registrationOk()">
+    <ng-template #modalContent>
+		<form nz-form >
+			<div nz-form-item nz-row>
+				<div nz-form-label nz-col [nzSm]="6" [nzXs]="24">
+				    <label nz-form-item-required>������������</label>
+				</div>
+				<div nz-col [nzSm]="14" [nzXs]="24">
+					<nz-datepicker style="width: 100%;" [(ngModel)]="_date" name='_date' [nzFormat]="'YYYY-MM-DD'" [nzDisabledDate]="_disabledDate" [nzAllowClear]="false"></nz-datepicker>
+				</div>
+			</div>
+		</form>
+    </ng-template>
+</nz-modal>
diff --git a/src/app/routes/systems/registration/registration.component.ts b/src/app/routes/systems/registration/registration.component.ts
new file mode 100644
index 0000000..1eb1136
--- /dev/null
+++ b/src/app/routes/systems/registration/registration.component.ts
@@ -0,0 +1,72 @@
+import {environment} from '../../../../environments/environment';
+import {Component, OnInit, ViewChild} from '@angular/core';
+import {SimpleTableColumn} from '@delon/abc';
+import {_HttpClient} from '@delon/theme';
+import * as moment from 'moment';
+import {NzMessageService} from 'ng-zorro-antd';
+import { Subject } from 'rxjs/Subject';
+@Component({
+  selector: 'app-registration',
+  templateUrl: './registration.component.html',
+})
+export class RegistrationComponent implements OnInit {
+  constructor(
+    public msgSrv: NzMessageService,
+    private http: _HttpClient
+  ) {}
+
+  @ViewChild('simpleTable') simpleTable: {load: Function};
+
+  dataUrl = environment.SERVER_BASH_URL + 'machineactivate/list';
+
+  queryTextStream: Subject<string> = new Subject<string>();
+
+  extraParams: any = {};
+  organization: any = {};
+  columns: SimpleTableColumn[] = [
+    {title: '���������', index: 'activationCode'},
+    {
+      title: '������������', index: 'isUsed', format: function(machineActivate) {
+        return machineActivate.isUsed == 1 ? '���' : '���';
+      }
+    },
+    {
+      title: '������������', type: 'date', index: 'createTime', format: function(machineActivate) {
+        return moment(machineActivate.createTime).format('YYYY-MM-DD HH:mm:ss');
+      }
+    },
+    {
+      title: '������������', type: 'date', index: 'expireDate', format: function(machineActivate) {
+        return moment(machineActivate.expireDate).format('YYYY-MM-DD');
+      }
+    },
+  ];
+  isVisible = false;
+  _date = new Date(Date.now() + 3600 * 24 * 1 * 1000);
+
+  ngOnInit() {
+    const organization = this.organization = JSON.parse(sessionStorage.getItem('organization'));
+    this.extraParams.organizationId = organization.id;
+    this.queryTextStream.debounceTime(900).distinctUntilChanged().subscribe(value => {
+      this.load();
+    });
+  }
+
+  load() {
+    this.simpleTable.load();
+  }
+
+  _disabledDate(current: Date): boolean {
+    return current && current.getTime() < Date.now();
+  }
+
+  registrationOk() {
+    this.http.get(environment.SERVER_BASH_URL + '/machineactivate/machine', {organizationId: this.organization.id, expireDate: moment(this._date).format('YYYY-MM-DD')}).subscribe((res: any) => {
+      if (res.code == 1 && res.data == 1) {
+        this.isVisible = false;
+        this.msgSrv.success('������������������������');
+        this.load();
+      }
+    });
+  }
+}
diff --git a/src/app/routes/systems/systems.module.ts b/src/app/routes/systems/systems.module.ts
new file mode 100644
index 0000000..e3e7ba5
--- /dev/null
+++ b/src/app/routes/systems/systems.module.ts
@@ -0,0 +1,60 @@
+import { FormBuilder } from '@angular/forms';
+import { _HttpClient } from '@delon/theme';
+import { Component, OnInit } from '@angular/core';
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { RouterModule, Routes } from '@angular/router';
+import { SharedModule } from '@shared/shared.module';
+import { AccountComponent } from './account/account.component';
+import { AccountEditComponent } from './account/account-edit/account-edit.component';
+import { OrganizationComponent } from './organization/organization.component';
+import { PipeModule } from '@business/pipe/pipe.module';
+import { OrganizationEditComponent } from './organization/organization-edit/organization-edit.component';
+import { ToolsService } from '@business/services/util/tools.service';
+import { OrganizationService } from '@business/services/http/organization.service';
+import { AreacodeService } from '@business/services/http/areacode.service';
+import { OrganizationConfigComponent } from './organization/organization-config/organization-config.component';
+import { OrganizationListComponent } from './organization/organization-list/organization-list.component';
+import { RegistrationComponent } from './registration/registration.component';
+import { SensorsService } from '@business/services/http/sensors.service';
+import { BusinessModule } from '@business/business.module';
+import { OrganizationConfigScreenComponent } from './organization/organization-config-screen/organization-config-screen.component';
+import { OrganizationConfigUnitComponent } from './organization/organization-config-unit/organization-config-unit.component';
+
+const routes: Routes = [
+  {
+    path: '',
+    children: [
+      { path: 'account', component: AccountComponent },
+      { path: 'organization', component: OrganizationComponent },
+      { path: 'registration', component: RegistrationComponent }
+    ]
+  }
+];
+
+const COMPONENTS_NOROUNT = [ AccountEditComponent, OrganizationEditComponent ];
+
+@NgModule({
+  imports: [
+    // ������������������������������������
+    PipeModule,
+    CommonModule,
+    SharedModule,
+    RouterModule.forChild(routes),
+    BusinessModule
+  ],
+  declarations: [
+    ...COMPONENTS_NOROUNT,
+    AccountComponent,
+    AccountEditComponent,
+    OrganizationComponent,
+    OrganizationConfigComponent,
+    OrganizationListComponent,
+    OrganizationConfigScreenComponent,
+    OrganizationConfigUnitComponent,
+    RegistrationComponent
+  ],
+  providers: [ToolsService, SensorsService, OrganizationService, _HttpClient, FormBuilder, AreacodeService],
+  entryComponents: COMPONENTS_NOROUNT
+})
+export class SystemsModule { }
diff --git a/src/app/routes/users/alarm-user/alarm-user-edit/alarm-user-edit.component.html b/src/app/routes/users/alarm-user/alarm-user-edit/alarm-user-edit.component.html
new file mode 100644
index 0000000..7ff3c0d
--- /dev/null
+++ b/src/app/routes/users/alarm-user/alarm-user-edit/alarm-user-edit.component.html
@@ -0,0 +1,56 @@
+<div class="modal-header">
+	<div class="modal-title">{{alarmUser.id > 0 ? '������' : '������'}} - ������������</div>
+</div>
+<form (ngSubmit)="save()" nz-form [nzType]="'horizontal'" [formGroup]="validateForm">
+	<div nz-form-item nz-row class="mb-sm">
+		<div nz-form-label nz-col [nzSpan]="4">
+			<label>���������</label>
+		</div>
+		<div nz-form-control nz-col [nzSpan]="8" nzHasFeedback>
+			<input nz-input formControlName="name"/>
+		</div>
+		<div nz-form-label nz-col [nzSpan]="4">
+			<label nz-form-item-required>������</label>
+		</div>
+		<div nz-form-control nz-col [nzSpan]="8" nzHasFeedback>
+			<input nz-input formControlName="mobile" maxlength="11" required/>
+		</div>
+	</div>
+	<div nz-form-item nz-row class="mb-sm">
+		<div nz-form-label nz-col [nzSpan]="4">
+			<label nz-form-item-required>������������</label>
+		</div>
+		<div nz-form-control nz-col [nzSpan]="8" nzHasFeedback>
+			<input nz-input formControlName="email" required/>
+		</div>
+		<div nz-form-label nz-col [nzSpan]="4">
+			<label nz-form-item-required>���������</label>
+		</div>
+		<div nz-form-control nz-col [nzSpan]="8" nzHasFeedback>
+			<input nz-input formControlName="weixin" required/>
+		</div>
+	</div>
+	<div nz-form-item nz-row class="mb-sm">
+		<div nz-form-label nz-col [nzSpan]="4">
+			<label nz-form-item-required>������</label>
+		</div>
+		<div nz-form-control nz-col [nzSpan]="8" nzHasFeedback>
+			<nz-select style="width: 290px;" nzAllowClear [nzPlaceHolder]="'input search text'" [nzFilter]="false" nzShowSearch 
+				formControlName="organizationId" (nzSearchChange)="searchChange($event)" [nzNotFoundContent]="'������������'" required> 
+				<nz-option *ngFor="let option of searchOptions"  [nzLabel]="option['name']" [nzValue]="option['id']"> </nz-option> 
+			</nz-select>
+		</div>
+		<div nz-form-label nz-col [nzSpan]="4">
+			<label>������������</label>
+		</div>
+		<div nz-form-control nz-col [nzSpan]="8" nzHasFeedback>
+			<div nz-form-control>
+				<nz-datepicker  style="width: 290px;" formControlName="expireTime"></nz-datepicker>
+			</div>
+		</div>
+	</div>
+	<div class="modal-footer">
+		<button nz-button type="button" (click)="close()">������</button>
+		<button nz-button  [nzType]="'primary'">������</button>
+	</div>
+</form>
diff --git a/src/app/routes/users/alarm-user/alarm-user-edit/alarm-user-edit.component.ts b/src/app/routes/users/alarm-user/alarm-user-edit/alarm-user-edit.component.ts
new file mode 100644
index 0000000..754c92f
--- /dev/null
+++ b/src/app/routes/users/alarm-user/alarm-user-edit/alarm-user-edit.component.ts
@@ -0,0 +1,71 @@
+import {NzModalSubject} from 'ng-zorro-antd';
+import {Component, OnInit} from '@angular/core';
+import {HttpClient} from '@angular/common/http';
+import {environment} from '../../../../../environments/environment';
+import {FormGroup, FormBuilder, FormControl, Validators} from '@angular/forms';
+
+@Component({
+  selector: 'app-alarm-user-edit',
+  templateUrl: './alarm-user-edit.component.html',
+  styles: []
+})
+export class AlarmUserEditComponent implements OnInit {
+
+  alarmUser: any;
+  validateForm: FormGroup;
+  searchOptions = [];
+
+  constructor(
+    private subject: NzModalSubject,
+    public http: HttpClient,
+    private formBuilder: FormBuilder
+  ) {}
+
+  ngOnInit() {
+    const alarmUser = this.alarmUser;
+    this.validateForm = this.formBuilder.group({
+      name: [alarmUser.name],
+      mobile: [alarmUser.mobile, [Validators.pattern('^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$')]],
+      email: [alarmUser.email, [Validators.email]],
+      weixin: [alarmUser.weixin],
+      organizationId: [alarmUser.organizationId],
+      expireTime: [alarmUser.expireTime],
+      id: [alarmUser.id]
+    });
+    this.searchOptions = alarmUser.organization ? [alarmUser.organization] : [];
+  }
+
+  save() {
+    const validateForm = this.validateForm;
+    const controls = validateForm.controls;
+    if (validateForm.valid) {
+      for (const i in controls) {
+        controls[i].disable();
+      }
+      this.http.post(environment.SERVER_BASH_URL + '/alarmUser/alarmUser', validateForm.value).subscribe(() => {
+        this.subject.next('true');
+        this.close();
+      });
+    } else {
+      for (const i in controls) {
+        controls[i].markAsDirty();
+      }
+    }
+  }
+
+  close() {
+    this.subject.destroy();
+  }
+
+  searchChange(searchText) {
+    if (searchText) {
+      const query = encodeURI(searchText);
+      if (query) {
+        this.http.get(environment.SERVER_BASH_URL + '/organization/list/' + query).subscribe((res: any) => {
+          this.searchOptions = res.data;
+        });
+      }
+    }
+  }
+
+}
diff --git a/src/app/routes/users/alarm-user/alarm-user.component.html b/src/app/routes/users/alarm-user/alarm-user.component.html
new file mode 100644
index 0000000..a4158ca
--- /dev/null
+++ b/src/app/routes/users/alarm-user/alarm-user.component.html
@@ -0,0 +1,114 @@
+<pro-header [title]="'������������������'"></pro-header>
+<nz-card [nzBordered]="false">
+	<form nz-form (ngSubmit)="load(true)" [nzLayout]="'inline'">
+		<div nz-row [nzGutter]="24">
+			<div nz-col [nzSpan]="8" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label>
+						<label>���������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-input [(ngModel)]="query.name" name="name" [nzSize]="'large'" [nzPlaceHolder]="'������������������'"></nz-input>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="8" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label>
+						<label>������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-input [(ngModel)]="query.mobile" name="mobile" [nzSize]="'large'" [nzPlaceHolder]="'���������������'"></nz-input>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="8" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label>
+						<label>������������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="query.isDelete" name="isDelete" [nzSize]="'large'">
+							<nz-option *ngFor="let option of isDeleteOptions" [nzLabel]="option.label" [nzValue]="option.value" ></nz-option>
+            			</nz-select>
+					</div>
+				</div>
+			</div>
+			<div nz-col [nzSpan]="8" class="mb-md">
+				<button nz-button type="submit" [nzType]="'primary'"
+					[nzLoading]="loading" [nzSize]="'large'">������</button>
+				<button nz-button type="reset" [nzSize]="'large'" class="mx-sm">������</button>
+			</div>
+		</div>
+	</form>
+
+	<div class="mb-md">
+		<button nz-button (click)="edit()" [nzType]="'primary'" [nzSize]="'large'">
+			<i class="anticon anticon-plus"></i><span>������</span>
+		</button>
+		<ng-container *ngIf="selectedRows.length > 0"> &nbsp;
+			<button nz-button [nzSize]="'large'" (click)="remove()">������������</button>
+		</ng-container>
+	</div>
+
+	<div class="mb-md">
+		<nz-alert [nzType]="'info'" [nzShowIcon]="true">
+			<span alert-body>
+				 ���������<strong class="text-primary">{{selectedRows.length}}</strong>���
+			</span>
+		</nz-alert>
+	</div>
+
+	<nz-table   #nzTable
+				[nzAjaxData]="data"
+				[nzLoading]="loading"
+				[nzTotal]="total"
+				[(nzPageIndex)]="query.pageIndex"
+				[nzPageSize]="query.pageSize"
+				[nzShowTotal]="true"
+				(nzPageIndexChange)="load()">
+		<thead nz-thead>
+			<tr>
+				<th nz-th [nzCheckbox]="true">
+					<label nz-checkbox [(ngModel)]="allChecked" [nzIndeterminate]="indeterminate" (ngModelChange)="checkAll($event)"></label>
+				</th>
+				<th nz-th><span>���������</span></th>
+				<th nz-th><span>������</span></th>
+				<th nz-th><span>������������</span></th>
+				<th nz-th><span>���������</span></th>
+				<!-- <th nz-th><span>������</span></th> -->
+				<th nz-th><span>������</span></th>
+				<th nz-th><span>������������</span></th>
+				<th nz-th>
+					<span>������������</span>
+					<nz-table-sort [(nzValue)]="sortMap" (nzValueChange)="sort('expire_time', $event)"></nz-table-sort>
+				</th>
+				<th nz-th><span>������</span></th>
+			</tr>
+		</thead>
+		<tbody nz-tbody>
+			<tr nz-tbody-tr *ngFor="let alarmUser of nzTable.data">
+				<td nz-td [nzCheckbox]="true">
+					<label nz-checkbox [(ngModel)]="alarmUser.checked" (ngModelChange)="refreshStatus($event)" [nzDisabled]="alarmUser.isDelete == '1'? true : false"></label>
+				</td>
+				<td nz-td>{{alarmUser.name}}</td>
+				<td nz-td>{{alarmUser.mobile}}</td>
+				<td nz-td>{{alarmUser.email}}</td>
+				<td nz-td>{{alarmUser.weixin}}</td>
+				<!-- <td nz-td>{{alarmUser.password}}</td> -->
+				<td nz-td>{{alarmUser.organization?alarmUser.organization.name:alarmUser.organizationId}}</td>
+				<td nz-td>{{format_date(alarmUser.createTime)}}</td>
+				<td nz-td>{{format_date(alarmUser.expireTime)}}</td>
+				<td nz-td>
+					<a (click)="edit(alarmUser)">������</a>
+					<ng-container *ngIf="alarmUser.isDelete == '0'">
+						<span nz-table-divider></span>
+						<nz-popconfirm  [nzTitle]="'���������������������������?'" [nzOkText]="'Yes'" [nzCancelText]="'No'" (nzOnConfirm)="delete(alarmUser.id)" >
+							<a nz-popconfirm>������</a>
+						</nz-popconfirm>
+					</ng-container>
+				</td>
+			</tr>
+		</tbody>
+	</nz-table>
+</nz-card>
diff --git a/src/app/routes/users/alarm-user/alarm-user.component.ts b/src/app/routes/users/alarm-user/alarm-user.component.ts
new file mode 100644
index 0000000..c1342f7
--- /dev/null
+++ b/src/app/routes/users/alarm-user/alarm-user.component.ts
@@ -0,0 +1,141 @@
+import {Component, OnInit} from '@angular/core';
+import {NzMessageService, NzModalService} from 'ng-zorro-antd';
+import {ModalHelper} from '@delon/theme';
+import {HttpClient} from '@angular/common/http';
+import {environment} from '../../../../environments/environment';
+import {DateService} from '@business/services/util/date.service';
+import {AlarmUserEditComponent} from './alarm-user-edit/alarm-user-edit.component';
+
+@Component({
+  selector: 'app-alarm-user',
+  templateUrl: './alarm-user.component.html',
+  styles: []
+})
+export class AlarmUserComponent implements OnInit {
+
+  isDeleteOptions = [
+    {value: '1', label: '���'},
+    {value: '0', label: '���'}
+  ];
+
+  query: any = {
+    pageIndex: 1,
+    pageSize: 10,
+    isDelete: this.isDeleteOptions[1].value
+  };
+  data: any[] = [];
+  total: 0;
+
+  selectedRows: any[] = [];
+  allChecked = false;
+  indeterminate = false;
+  sortMap: string[] = [];
+  loading = true;
+
+  constructor(
+    public http: HttpClient,
+    private confirmServ: NzModalService,
+    public dateSrv: DateService,
+    public msgSrv: NzMessageService,
+    private modalHelper: ModalHelper
+  ) {
+
+  }
+
+  load(reload: boolean = false) {
+    if (reload) {
+      this.query.pageIndex = 1;
+    }
+    this.http.get(environment.SERVER_BASH_URL + '/alarmUser/list', {params: this.query}).subscribe((res: any) => {
+      this.data = res.data.data;
+      this.total = res.data.total;
+
+      this.refreshStatus();
+      this.loading = false;
+    });
+  }
+
+  ngOnInit() {
+    this.load();
+  }
+
+  edit(alarmUser?: any) {
+    if (!alarmUser) {
+      alarmUser = {};
+    }
+    this.modalHelper.static(AlarmUserEditComponent, {alarmUser}).subscribe((res: any) => {
+      if (res.code === 0) {
+        this.msgSrv.error(res.message);
+      } else {
+        this.msgSrv.success('���������������������');
+        this.load(true);
+      }
+    });
+  }
+
+  remove() {
+    const ids: number[] = [];
+    this.confirmServ.confirm({
+      title: '������������',
+      content: '���������������������������?',
+      okText: '������',
+      cancelText: '������'
+    }).on('onOk', () => {
+      this.selectedRows.forEach(i => {
+        ids.push(i.id);
+      });
+      this.delete(...ids);
+    });
+  }
+
+  delete(...ids: number[]) {
+    this.http.post(environment.SERVER_BASH_URL + '/alarmUser/ids', ids).subscribe((res: any) => {
+      if (res.data > 0) {
+        this.msgSrv.success('���������������������');
+        this.load(true);
+      } else {
+        this.msgSrv.error(res.message);
+      }
+    });
+  }
+
+  checkAll(value: boolean) {
+    this.data.forEach(i => {
+      if (i.isDelete === '1') {
+        i.checked = false;
+      } else {
+        i.checked = value;
+      }
+    });
+    this.refreshStatus();
+  }
+
+  refreshStatus() {
+    const allChecked = this.data.every(value => value.checked);
+    const allUnChecked = this.data.every(value => !value.checked);
+    this.allChecked = allChecked;
+    this.indeterminate = (!allChecked) && (!allUnChecked);
+    this.selectedRows = this.data.filter(value => value.checked);
+  }
+
+  sort(field: string, value: any) {
+    const temp = this.sortMap;
+    this.sortMap = [];
+    temp.forEach(i => {
+      if (!i.startsWith(field)) {
+        this.sortMap.push(i);
+      }
+    });
+    if (value) {
+      this.sortMap.push(`${field} ${value}`);
+    }
+    this.query.sorter = this.sortMap.length > 0 ? this.sortMap.join(',') : '';
+    this.load(true);
+  }
+
+  format_date(date) {
+    if (date) {
+      return this.dateSrv.date_format(date, 'YYYY-MM-DD');
+    }
+  }
+}
diff --git a/src/app/routes/users/installer/edit/edit.component.html b/src/app/routes/users/installer/edit/edit.component.html
new file mode 100644
index 0000000..fd5d65a
--- /dev/null
+++ b/src/app/routes/users/installer/edit/edit.component.html
@@ -0,0 +1,41 @@
+<div class="modal-header">
+  <div class="modal-title">{{user.id > 0 ? '������' : '������'}} - ������������</div>
+</div>
+<form (ngSubmit)="save()" nz-form [nzType]="'horizontal'"  [formGroup]="validateForm">
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSpan]="4"><label nz-form-item-required>������</label></div>
+    <div nz-form-control nz-col [nzSpan]="8" nzHasFeedback>
+      <input nz-input formControlName="name" maxlength="30" required />
+    </div>
+    <div nz-form-label nz-col [nzSpan]="4"><label nz-form-item-required>������/������</label></div>
+    <div nz-form-control nz-col [nzSpan]="8" nzHasFeedback>
+      <input nz-input formControlName="mobile" maxlength="11" required />
+    </div>
+  </div>
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSpan]="4"><label>������������</label></div>
+    <div nz-form-control nz-col [nzSpan]="8">
+      <input nz-input formControlName="email"/>
+    </div>
+    <div nz-form-label nz-col [nzSpan]="4"><label>���������</label></div>
+    <div nz-form-control nz-col [nzSpan]="8">
+      <input nz-input formControlName="weixin" />
+    </div>
+  </div>
+  <div nz-form-item nz-row class="mb-sm">
+    <div nz-form-label nz-col [nzSpan]="4"><label>������</label></div>
+    <div nz-form-control nz-col [nzSpan]="8">
+      <input nz-input formControlName="organizationId" maxlength="20" placeholder="20���������" />
+    </div>
+    <div nz-form-label nz-col [nzSpan]="4"><label>������������</label></div>
+    <div nz-form-control nz-col [nzSpan]="8">
+      <div nz-form-control >
+        <nz-datepicker style="width: 290px;" formControlName="expireTime"></nz-datepicker>
+      </div>
+    </div>
+  </div>
+  <div class="modal-footer">
+    <button nz-button type="button" (click)="close()">������</button>
+    <button nz-button  [nzType]="'primary'">������</button>
+  </div>
+</form>
diff --git a/src/app/routes/users/installer/edit/edit.component.ts b/src/app/routes/users/installer/edit/edit.component.ts
new file mode 100644
index 0000000..e19f61d
--- /dev/null
+++ b/src/app/routes/users/installer/edit/edit.component.ts
@@ -0,0 +1,90 @@
+import { ResultBean } from '@business/entity/grid';
+import { Subject } from 'rxjs/Subject';
+import {NzModalSubject, NzMessageService} from 'ng-zorro-antd';
+import {Component, OnInit} from '@angular/core';
+import {ModalHelper} from '@delon/theme';
+import {HttpClient, HttpResponse} from '@angular/common/http';
+import {environment} from 'environments/environment';
+import {DateService} from '@business/services/util/date.service';
+import {FormGroup, FormBuilder, FormControl, Validators} from '@angular/forms';
+import { catchError } from 'rxjs/operators';
+import { ErrorObservable } from 'rxjs/observable/ErrorObservable';
+
+@Component({
+  selector: 'app-edit',
+  templateUrl: './edit.component.html',
+  styles: []
+})
+export class UserInstallerEditComponent implements OnInit {
+
+  user: any;
+  public validateForm: FormGroup;
+    constructor(
+    private subject: NzModalSubject,
+    public http: HttpClient,
+    private formBuilder: FormBuilder,
+  ) {}
+
+  ngOnInit() {
+    const user = this.user;
+    this.validateForm = this.formBuilder.group({
+      name: [user.name],
+      mobile: [user.mobile, [Validators.pattern('^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$')]],
+      email: [user.email],
+      weixin: [user.weixin],
+      organizationId: [user.organizationId],
+      expireTime: [user.expireTime],
+      id: [user.id]
+    });
+    const mobileControl = this.validateForm.get('mobile');
+    mobileControl.valueChanges.filter(val => {
+      return val != null && val.trim() !== '';
+    }).debounceTime(900).distinctUntilChanged().subscribe( value => {
+           if (mobileControl.errors == null) {
+                mobileControl.setErrors({unique: true});
+                this.http.get(environment.SERVER_BASH_URL + '/operateUser/unique-mobile?mobile=' + value)
+                .pipe(                    
+                     catchError(() => {
+                       const req = <XMLHttpRequest>event.target;
+                       if (req.status === 401) {
+                        this.subject.destroy();
+                       }                       
+                      // ������������������������������������
+                      return ErrorObservable.create(event);
+                    })
+                )
+                .subscribe(
+                    (val: ResultBean<boolean>) => {
+                        if (val.code === 1 && val.data) {
+                          this.validateForm.get('mobile').setErrors(null);
+                        }
+                    }
+                );
+           }
+    });
+  }
+
+  save() {
+    const validateForm = this.validateForm;
+    const controls = validateForm.controls;
+    if (validateForm.valid) {
+      for (const i in controls) {
+        controls[i].disable();
+      }
+      this.http.post(environment.SERVER_BASH_URL + '/operateUser/operateUser', validateForm.value).subscribe(() => {
+        this.subject.next('true');
+        this.close();
+      });
+    } else {
+      for (const i in controls) {
+        controls[i].markAsDirty();
+      }
+    }
+
+  }
+
+  close() {
+    this.subject.destroy();
+  }
+
+}
diff --git a/src/app/routes/users/installer/installer.component.html b/src/app/routes/users/installer/installer.component.html
new file mode 100644
index 0000000..7d24dd6
--- /dev/null
+++ b/src/app/routes/users/installer/installer.component.html
@@ -0,0 +1,150 @@
+<pro-header [title]="'������������������'"></pro-header>
+<nz-card [nzBordered]="false">
+  <form nz-form (ngSubmit)="load(true)" [nzLayout]="'inline'">
+    <div nz-row [nzGutter]="24">
+      <div nz-col [nzSpan]="8" class="mb-md">
+        <div nz-form-item class="d-flex">
+          <div nz-form-label><label for="u_name">������</label></div>
+          <div nz-form-control class="flex-1">
+            <nz-input [(ngModel)]="q.u_name" name="u_name" [nzSize]="'large'" [nzPlaceHolder]="'���������������'" nzId="u_name"></nz-input>
+          </div>
+        </div>
+      </div>
+      <div nz-col [nzSpan]="8" class="mb-md">
+        <div nz-form-item class="d-flex">
+          <div nz-form-label><label for="u_mobile">������/������</label></div>
+          <div nz-form-control class="flex-1">
+            <nz-input [(ngModel)]="q.u_mobile" name="u_mobile" [nzSize]="'large'" [nzPlaceHolder]="'���������������'" nzId="u_mobile"></nz-input>
+          </div>
+        </div>
+      </div>
+      <div nz-col [nzSpan]="8" class="mb-md">
+				<div nz-form-item class="d-flex">
+					<div nz-form-label>
+						<label>������������</label>
+					</div>
+					<div nz-form-control class="flex-1">
+						<nz-select [(ngModel)]="q.isDelete" name="isDelete" [nzSize]="'large'">
+							<nz-option *ngFor="let option of isDeleteOptions" [nzLabel]="option.label" [nzValue]="option.value" ></nz-option>
+            			</nz-select>
+					</div>
+				</div>
+			</div>
+      <div nz-col [nzSpan]="8" class="mb-md">
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="loading" [nzSize]="'large'">������</button>
+        <button nz-button type="reset" [nzSize]="'large'" class="mx-sm">������</button>
+      </div>
+    </div>
+  </form>
+  <div class="mb-md">
+    <button nz-button (click)="add()" [nzType]="'primary'" [nzSize]="'large'">
+      <i class="anticon anticon-plus"></i><span>������</span>
+    </button>
+    <ng-container *ngIf="selectedRows.length > 0">
+      &nbsp;<button nz-button [nzSize]="'large'" (click)="remove()">������������</button>
+    </ng-container>
+  </div>
+  <div class="mb-md">
+    <nz-alert [nzType]="'info'" [nzShowIcon]="true">
+        <span alert-body>
+            ��������� <strong class="text-primary">{{selectedRows.length}}</strong> ���
+        </span>
+    </nz-alert>
+  </div>
+  <nz-table #nzTable
+            [nzAjaxData]="data"
+            [nzLoading]="loading"
+            [nzTotal]="total"
+            [(nzPageIndex)]="q.pi"
+            [nzPageSize]="q.ps"
+            [nzShowTotal]="true"
+            (nzPageIndexChange)="load()">
+    <thead nz-thead>
+    <tr>
+      <th nz-th [nzCheckbox]="true">
+        <label nz-checkbox [(ngModel)]="allChecked" [nzIndeterminate]="indeterminate" (ngModelChange)="checkAll($event)"></label>
+      </th>
+      <th nz-th><span>������</span></th>
+      <th nz-th><span>������/������</span></th>
+      <th nz-th><span>������������</span></th>
+      <th nz-th><span>���������</span></th>
+      <th nz-th><span>������</span></th>
+      <th nz-th><span>������������</span></th>
+      <th nz-th>
+        <span>������������</span>
+        <nz-table-sort [(nzValue)]="sortMap.updatedAt" (nzValueChange)="sort('expire_time', $event)"></nz-table-sort>
+      </th>
+      <th nz-th><span>������</span></th>
+    </tr>
+    </thead>
+    <tbody nz-tbody>
+    <tr nz-tbody-tr *ngFor="let i of nzTable.data">
+      <td nz-td [nzCheckbox]="true">
+        <label nz-checkbox [(ngModel)]="i.checked" (ngModelChange)="refreshStatus($event)">
+        </label>
+      </td>
+      <td nz-td>{{i.name}}</td>
+      <td nz-td>{{i.mobile}}</td>
+      <td nz-td>{{i.email}}</td>
+      <td nz-td>{{i.weixin}}</td>
+      <td nz-td>{{i.organizationId}}</td>
+      <td nz-td>{{format_date(i.createTime)}}</td>
+      <td nz-td>{{format_date(i.expireTime)}}</td>
+      <td nz-td>
+        <a (click)="edit(i)">������</a>
+        <span nz-table-divider></span>
+          <nz-popconfirm [nzTitle]="'���������������������������?'" [nzOkText]="'Yes'" [nzCancelText]="'No'" (nzOnConfirm)="delete(i)" >
+            <a nz-popconfirm>������</a>
+          </nz-popconfirm>
+          <span nz-table-divider></span>
+          <nz-dropdown>
+              <a class="ant-dropdown-link" nz-dropdown>
+                  ������
+                  <i class="anticon anticon-down"></i>
+              </a>
+              <ul nz-menu>
+                  <li nz-menu-item>
+                      <a (click)="showResetPwdWindow(i)">������������</a>
+                  </li>
+              </ul>
+          </nz-dropdown>
+      </td>
+    </tr>
+    </tbody>
+  </nz-table>
+</nz-card>
+<!-- ������������������ -->
+<nz-modal [nzVisible]="resetPwdWindowIsVisible" [nzTitle]="'������������'" [nzContent]="modalContent" (nzOnCancel)="resetPwdCancel()"
+    (nzOnOk)="resetPwdOk()" [nzConfirmLoading]="isResetPwdLoading">
+    <ng-template #modalContent>
+        <form nz-form [formGroup]="resetPwdForm">
+            <div nz-form-item nz-row>
+                <div nz-form-label nz-col [nzSm]="6" [nzXs]="24">
+                    <label for="name" >������</label>
+                </div>
+                <div nz-form-control nz-col [nzSm]="14" [nzXs]="24">
+                    <h4 class="h4">{{ getFormControl('name').value }}</h4>
+                </div>
+            </div>
+            <div nz-form-item nz-row>
+                <div nz-form-label nz-col [nzSm]="6" [nzXs]="24">
+                    <label for="password" nz-form-item-required>������</label>
+                </div>
+                <div nz-form-control nz-col [nzSm]="14" [nzXs]="24" nzHasFeedback>
+                    <nz-input [nzSize]="'large'" formControlName="password" [nzType]="'password'" [nzId]="'password'" (ngModelChange)="updateConfirmValidator()"></nz-input>
+                    <div nz-form-explain *ngIf="getFormControl('password').dirty&&getFormControl('password').hasError('required')">���������������!</div>
+                </div>
+            </div>
+            <div nz-form-item nz-row>
+                <div nz-form-label nz-col [nzSm]="6" [nzXs]="24">
+                    <label for="checkPassword" nz-form-item-required>������������</label>
+                </div>
+                <div nz-form-control nz-col [nzSm]="14" [nzXs]="24" nzHasFeedback>
+                    <nz-input [nzSize]="'large'" formControlName="checkPassword" [nzType]="'password'" [nzId]="'checkPassword'"></nz-input>
+                    <div nz-form-explain *ngIf="getFormControl('checkPassword').dirty&&getFormControl('checkPassword').hasError('required')">���������������!</div>
+                    <div nz-form-explain *ngIf="getFormControl('checkPassword').dirty&&getFormControl('checkPassword').hasError('confirm')">���������������������!</div>
+                </div>
+            </div>
+        </form>
+    </ng-template>
+</nz-modal>
diff --git a/src/app/routes/users/installer/installer.component.ts b/src/app/routes/users/installer/installer.component.ts
new file mode 100644
index 0000000..56af9e0
--- /dev/null
+++ b/src/app/routes/users/installer/installer.component.ts
@@ -0,0 +1,199 @@
+import {Component, OnInit} from '@angular/core';
+import {NzMessageService} from 'ng-zorro-antd';
+import {ModalHelper} from '@delon/theme';
+import {HttpClient} from '@angular/common/http';
+import {UserInstallerEditComponent} from './edit/edit.component';
+import {environment} from 'environments/environment';
+import {DateService} from '@business/services/util/date.service';
+import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms';
+import { ResultBean } from '@business/entity/grid';
+
+@Component({
+  selector: 'app-installer',
+  templateUrl: './installer.component.html',
+  styles: []
+})
+export class InstallerComponent implements OnInit {
+  isDeleteOptions = [
+    {value: '1', label: '���'},
+    {value: '0', label: '���'}
+  ];
+  q: any = {
+    pi: 1,
+    ps: 10,
+    isDelete: this.isDeleteOptions[1].value,
+    sorter: '',
+    u_name: '',
+    u_mobile: ''
+  };
+  data: any[] = [];
+  total: 0;
+
+  selectedRows: any[] = [];
+  curRows: any[] = [];
+  allChecked = false;
+  indeterminate = false;
+  sortMap: any = {};
+  loading = true;
+
+  constructor(
+    public http: HttpClient,
+    public dateSrv: DateService,
+    public msgSrv: NzMessageService,
+    private modalHelper: ModalHelper,
+    private fb: FormBuilder
+  ) {}
+
+  ngOnInit() {
+    this.load();
+    // ���������������������������
+    this.resetPwdForm = this.fb.group({
+      name    : [ null, [ Validators.email ] ],
+      password         : [ null, [ Validators.required ] ],
+      checkPassword    : [ null, [ Validators.required, this.confirmationValidator ] ]
+      });
+  }
+
+  load(reload: boolean = false) {
+    if (reload) {
+      this.q.pi = 1;
+    }
+    this.http.get(environment.SERVER_BASH_URL + '/operateUser/list', {params: this.q}).subscribe((res: any) => {
+      this.data = res.data.data;
+      this.total = res.data.total;
+      this.dataChange(this.data);
+      this.loading = false;
+    });
+  }
+
+  edit(user) {
+    this.modalHelper.static(UserInstallerEditComponent, {user}).subscribe(() => {
+      this.load(true);
+      this.msgSrv.success('���������������������������');
+    });
+  }
+
+  add() {
+    const user = {};
+    this.modalHelper.static(UserInstallerEditComponent, {user}).subscribe(() => {
+      this.load(true);
+      this.msgSrv.success('���������������������������');
+    });
+  }
+
+  delete(user) {
+    this.http.post(environment.SERVER_BASH_URL + '/operateUser/operateUser/id', user).subscribe((res: any) => {
+      this.msgSrv.success('���������������������������');
+      this.load(true);
+    });
+  }
+
+  remove() {
+    const ids = [];
+    this.selectedRows.forEach(i => {
+      ids.push(i.id);
+    });
+    this.http.post(environment.SERVER_BASH_URL + '/operateUser/operateUsers/ids', ids).subscribe((res: any) => {
+      this.msgSrv.success('���������������������������');
+      this.load(true);
+    });
+  }
+
+  checkAll(value: boolean) {
+    this.curRows.forEach(i => {
+      if (i.isDelete === '1') {
+        i.checked = false;
+      } else {
+        i.checked = value;
+      }
+    });
+    this.refreshStatus();
+  }
+
+  dataChange(res: any) {
+    this.curRows = res;
+    this.refreshStatus();
+  }
+
+  refreshStatus() {
+    const allChecked = this.curRows.every(value => value.checked);
+    const allUnChecked = this.curRows.every(value => !value.checked);
+    this.allChecked = allChecked;
+    this.indeterminate = (!allChecked) && (!allUnChecked);
+    this.selectedRows = this.data.filter(value => value.checked);
+  }
+
+  sort(field: string, value: any) {
+    this.sortMap = {};
+    this.sortMap[field] = value;
+    this.q.sorter = value ? `${field} ${value}` : '';
+    this.load(true);
+  }
+
+  reset(ls: any[]) {
+    for (const item of ls) item.value = false;
+    this.load(true);
+  }
+
+  format_date(date) {
+    if (date) {
+      return this.dateSrv.date_format(date, 'YYYY-MM-DD');
+    }
+  }
+  public resetPwdWindowIsVisible = false;
+  public isResetPwdLoading = false;
+  public resetPwdForm: FormGroup;
+  public resetPwdCancel() {
+    this.resetPwdWindowIsVisible = false;
+}
+public resetPwdOk() {
+  for (const i in this.resetPwdForm.controls) {
+    this.resetPwdForm.controls[ i ].markAsDirty();
+  }
+  if (this.resetPwdForm.valid) {
+     this.isResetPwdLoading = true;
+     const data = this.resetPwdForm.value;
+     data['name'] = null;
+     this.http.post(environment.SERVER_BASH_URL + '/operateUser/operateUser', data).subscribe((res: ResultBean<any>) => {
+       if ( res.code === 1 && res.data === 1 ) {
+        this.isResetPwdLoading = false;
+        this.resetPwdWindowIsVisible = false;
+        this.msgSrv.success('���������������������');
+       }
+    });
+  }
+}
+  /**
+   *  ������������������������
+   * @param account 
+   */
+  public showResetPwdWindow(install) {
+    this.resetPwdWindowIsVisible = true;
+    this.resetPwdForm = this.fb.group({
+      id               : [ install.id ],
+      name      : [ install.name],
+      password         : [ null, [ Validators.required ] ],
+      checkPassword    : [ null, [ Validators.required, this.confirmationValidator ] ]
+    });
+  }
+  confirmationValidator = (control: FormControl): { [s: string]: boolean } => {
+    if (!control.value) {
+      return { required: true };
+    } else if (control.value !== this.resetPwdForm.controls[ 'password' ].value) {
+      return { confirm: true, error: true };
+    }
+  }
+  /**
+   * ������ formControl������ ������ ���������������������
+   * @param name y
+   */
+  public getFormControl(name) {
+    return this.resetPwdForm.controls[ name ];
+  }
+  updateConfirmValidator() {
+    /** wait for refresh value */
+    setTimeout(_ => {
+      this.resetPwdForm.controls[ 'checkPassword' ].updateValueAndValidity();
+    });
+  }
+}
diff --git a/src/app/routes/users/users.module.ts b/src/app/routes/users/users.module.ts
new file mode 100644
index 0000000..2852962
--- /dev/null
+++ b/src/app/routes/users/users.module.ts
@@ -0,0 +1,37 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { InstallerComponent } from './installer/installer.component';
+import { RouterModule, Routes } from '@angular/router';
+import { SharedModule } from '@shared/shared.module';
+
+import { UserInstallerEditComponent } from './installer/edit/edit.component';
+import { AlarmUserComponent } from './alarm-user/alarm-user.component';
+import { AlarmUserEditComponent } from './alarm-user/alarm-user-edit/alarm-user-edit.component';
+
+const routes: Routes = [
+  {
+    path: '',
+    children: [
+      { path: 'installer', component: InstallerComponent },
+      { path: 'alarm-user', component: AlarmUserComponent }
+    ]
+  }
+];
+
+const COMPONENTS_NOROUNT = [ UserInstallerEditComponent, AlarmUserEditComponent ];
+
+@NgModule({
+  imports: [
+    CommonModule,
+    SharedModule,
+    RouterModule.forChild(routes)
+  ],
+  declarations: [
+    InstallerComponent,
+    ...COMPONENTS_NOROUNT,
+    AlarmUserComponent,
+    AlarmUserEditComponent
+  ],
+  entryComponents: COMPONENTS_NOROUNT
+})
+export class UsersModule { }
diff --git a/src/app/shared/README.md b/src/app/shared/README.md
new file mode 100644
index 0000000..2819b60
--- /dev/null
+++ b/src/app/shared/README.md
@@ -0,0 +1,30 @@
+# ShareModule
+
+**���** ���������������
+
++ ���������������������������������
+
+**���** ������������������������������
+
+**������** ��� `providers` ���������
+
+## ������������������������������
+
+���������������������������������������������������������������**������**���������������������������������������
+
+```
+��������� components
+������� ��������� comp1
+������� ������� ��������� index.ts
+������� ������� ��������� README.md
+������� ��������� comp2
+������� ������� ��������� index.ts
+������� ������� ��������� README.md
+��������� directives
+������� ��������� dire1
+������� ������� ��������� index.ts
+������� ������� ��������� README.md
+������� ��������� dire2
+������� ������� ��������� index.ts
+������� ������� ��������� README.md
+```
diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts
index a3c06a1..1df679d 100644
--- a/src/app/shared/shared.module.ts
+++ b/src/app/shared/shared.module.ts
@@ -1,169 +1,23 @@
-import { NgModule, ModuleWithProviders } from '@angular/core';
+import { NgModule } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { ReactiveFormsModule, FormsModule } from '@angular/forms';
-import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
 import { RouterModule } from '@angular/router';
-
+// delon
 import { NgZorroAntdExtraModule } from 'ng-zorro-antd-extra';
 import { AlainThemeModule } from '@delon/theme';
-import { AlainABCModule } from '@delon/abc';
 import { AlainACLModule } from '@delon/acl';
-
-// third libs
-import { CountdownModule } from 'ngx-countdown';
-
+import { ZORROMODULES, ABCMODULES } from '../delon.module';
 // i18n
 import { TranslateModule } from '@ngx-translate/core';
-import { I18NService } from '@core/i18n/i18n.service';
 
-// region: zorro modules
-
-import {
-    // LoggerModule,
-    // NzLocaleModule,
-    NzButtonModule,
-    NzAlertModule,
-    NzBadgeModule,
-    // NzCalendarModule,
-    NzCascaderModule,
-    NzCheckboxModule,
-    NzDatePickerModule,
-    NzFormModule,
-    NzInputModule,
-    NzInputNumberModule,
-    NzGridModule,
-    NzMessageModule,
-    NzModalModule,
-    NzNotificationModule,
-    NzPaginationModule,
-    NzPopconfirmModule,
-    NzPopoverModule,
-    NzRadioModule,
-    NzRateModule,
-    NzSelectModule,
-    NzSpinModule,
-    NzSliderModule,
-    NzSwitchModule,
-    NzProgressModule,
-    NzTableModule,
-    NzTabsModule,
-    NzTagModule,
-    NzTimePickerModule,
-    NzUtilModule,
-    NzStepsModule,
-    NzDropDownModule,
-    NzMenuModule,
-    NzBreadCrumbModule,
-    NzLayoutModule,
-    NzRootModule,
-    NzCarouselModule,
-    // NzCardModule,
-    NzCollapseModule,
-    NzTimelineModule,
-    NzToolTipModule,
-    // NzBackTopModule,
-    // NzAffixModule,
-    // NzAnchorModule,
-    NzAvatarModule,
-    // SERVICES
-    NzNotificationService,
-    NzMessageService
-} from 'ng-zorro-antd';
-const ZORROMODULES = [
-    // LoggerModule,
-    // NzLocaleModule,
-    NzButtonModule,
-    NzAlertModule,
-    NzBadgeModule,
-    // NzCalendarModule,
-    NzCascaderModule,
-    NzCheckboxModule,
-    NzDatePickerModule,
-    NzFormModule,
-    NzInputModule,
-    NzInputNumberModule,
-    NzGridModule,
-    NzMessageModule,
-    NzModalModule,
-    NzNotificationModule,
-    NzPaginationModule,
-    NzPopconfirmModule,
-    NzPopoverModule,
-    NzRadioModule,
-    NzRateModule,
-    NzSelectModule,
-    NzSpinModule,
-    NzSliderModule,
-    NzSwitchModule,
-    NzProgressModule,
-    NzTableModule,
-    NzTabsModule,
-    NzTagModule,
-    NzTimePickerModule,
-    NzUtilModule,
-    NzStepsModule,
-    NzDropDownModule,
-    NzMenuModule,
-    NzBreadCrumbModule,
-    NzLayoutModule,
-    NzRootModule,
-    NzCarouselModule,
-    // NzCardModule,
-    NzCollapseModule,
-    NzTimelineModule,
-    NzToolTipModule,
-    // NzBackTopModule,
-    // NzAffixModule,
-    // NzAnchorModule,
-    NzAvatarModule
-];
+// region: third libs
+import { CountdownModule } from 'ngx-countdown';
+const THIRDMODULES = [ CountdownModule ];
 // endregion
 
-// region: @delon/abc modules
-import {
-    AdAvatarListModule,
-    AdChartsModule,
-    AdCountDownModule,
-    AdDescListModule,
-    AdEllipsisModule,
-    AdErrorCollectModule,
-    AdExceptionModule,
-    AdFooterToolbarModule,
-    AdGlobalFooterModule,
-    AdNoticeIconModule,
-    AdNumberInfoModule,
-    AdProHeaderModule,
-    AdResultModule,
-    AdSidebarNavModule,
-    AdStandardFormRowModule,
-    AdTagSelectModule,
-    AdTrendModule,
-    AdDownFileModule,
-    AdImageModule,
-    AdUtilsModule
-} from '@delon/abc';
-const ABCMODULES = [
-    AdAvatarListModule,
-    AdChartsModule,
-    AdCountDownModule,
-    AdDescListModule,
-    AdEllipsisModule,
-    AdErrorCollectModule,
-    AdExceptionModule,
-    AdFooterToolbarModule,
-    AdGlobalFooterModule,
-    AdNoticeIconModule,
-    AdNumberInfoModule,
-    AdProHeaderModule,
-    AdResultModule,
-    AdSidebarNavModule,
-    AdStandardFormRowModule,
-    AdTagSelectModule,
-    AdTrendModule,
-    AdDownFileModule,
-    AdImageModule,
-    AdUtilsModule
-];
+// region: your componets & directives
+const COMPONENTS = [];
+const DIRECTIVES = [];
 // endregion
 
 @NgModule({
@@ -172,14 +26,18 @@
         FormsModule,
         RouterModule,
         ReactiveFormsModule,
-        HttpClientModule,
         ...ZORROMODULES,
-        NgZorroAntdExtraModule.forRoot(),
+        NgZorroAntdExtraModule,
         AlainThemeModule.forChild(),
         ...ABCMODULES,
-        AlainACLModule.forRoot(),
+        AlainACLModule,
         // third libs
-        CountdownModule
+        ...THIRDMODULES
+    ],
+    declarations: [
+        // your components
+        ...COMPONENTS,
+        ...DIRECTIVES
     ],
     exports: [
         CommonModule,
@@ -190,22 +48,13 @@
         NgZorroAntdExtraModule,
         AlainThemeModule,
         ...ABCMODULES,
-        AlainACLModule,
         // i18n
         TranslateModule,
         // third libs
-        CountdownModule
+        ...THIRDMODULES,
+        // your components
+        ...COMPONENTS,
+        ...DIRECTIVES
     ]
 })
-export class SharedModule {
-    static forRoot(): ModuleWithProviders {
-        return {
-            ngModule: SharedModule,
-            providers: [
-                // ng-zorro-antd Services
-                NzNotificationService,
-                NzMessageService
-            ]
-        };
-    }
-}
+export class SharedModule { }
diff --git a/src/assets/app-data.json b/src/assets/app-data.json
index 6620609..584e5e2 100644
--- a/src/assets/app-data.json
+++ b/src/assets/app-data.json
@@ -1,125 +1,101 @@
 {
     "app": {
         "name": "������������������������",
-        "description": "������������������������"
+        "description": "������������������������������������������"
     },
     "user": {
         "name": "Admin",
         "avatar": "./assets/img/zorro.svg",
         "email": "admin@qq.com"
     },
-    "menu": [
-        {
-          "text": "������������",
-          "group": true,
-          "hideInBreadcrumb": true,
-          "children": [
-            {
-              "text": "������������",
-              "icon": "icon-speedometer",
-              "link": "/home-page"
-            },
-            {
-              "text": "������������",
-              "icon": "icon-pie-chart",
-              "children": [
+    "menu": [{
+            "text": "���������",
+            "translate": "main_navigation",
+            "group": true,
+            "children": [{
+                "text": "���������",
+                "link": "/dashboard/workplace",
+                "icon": "icon-speedometer",
+                "translate": "dashboard_workplace"
+            }]
+        }, {
+            "text": "������������",
+            "group": true,
+            "children": [{
+                "text": "������������",
+                "icon": "icon-user",
+                "children": [{
+                  "text": "������������",
+                  "link": "/users/installer"
+                }, {
+                  "text": "������������",
+                  "link": "/users/alarm-user"
+                }]
+              }, {
+                "text": "������������",
+                "icon": "icon-grid",
+                "children": [{
+                  "text": "������������",
+                  "link": "/devices/basic"
+                }, {
+                  "text": "������������",
+                  "link": "/devices/version"
+                }, {
+                  "text": "������������������",
+                  "link": "/devices/monitor-point"
+                }]
+              }, {
+                "text": "���������������",
+                "icon": "icon-note",
+                "children": [{
+                  "text": "������������",
+                  "link": "/sensors/basic"
+                }]
+              },{
+                "text": "������������",
+                "icon": "icon-chart",
+                "children": [
                   {
-                    "text": "������",
-                    "link": "/"
-                  }
-                  ,
+                  "text": "������������",
+                  "link": "/reports/query"
+                  },
                   {
-                    "text": "������",
-                    "link": "/"
-                  }
-                  ,
+                  "text": "������������",
+                  "link": "/reports/demo"
+                  },
                   {
-                    "text": "������������",
-                    "link": "/"
+                  "text": "������������",
+                  "link": "/reports/alarm"
+                  },
+                  {
+                  "text": "������������",
+                  "link": "/reports/excel"
                   }
-              ]
-            },
-            {
-              "text": "������������",
-              "icon": "icon-directions",
-              "children": [
-                {
-                  "text": "������������",
-                  "link": "/"
-                }
-                ,
-                {
-                  "text": "������",
-                  "link": "/"
-                }
-              ]
-            },
-            {
-              "text": "������������",
-              "icon": "icon-chemistry",
-              "link": "/"
-            },
-            {
-              "text": "������������������",
-              "icon": "icon-puzzle",
-               "children": [
-                {
-                  "text": "gis������",
-                  "link": "/"
-                }
-                ,
-                {
-                  "text": "������������",
-                  "link": "/"
-                }
-                ,
-                {
-                  "text": "������������",
-                  "link": "/"
-                }
-               ]
-            },
-            {
-              "text": "������������",
-              "icon": "icon-note",
-              "link": "/"
-            },
-            {
-              "text": "������������",
-              "icon": "icon-support",
-              "link": "/"
-            },
-            {
-              "text": "������������",
-              "icon": "icon-wrench",
-              "children": [
-            {
-                  "text": "������������",
-                  "link": "/"
-                }
-                ,
-                {
-                  "text": "������������",
-                  "link": "/"
-                }
-                ,
-                {
-                  "text": "������������",
-                  "link": "/"
-                }
-          ]
-            },
-            {
-              "text": "������������",
-              "icon": "icon-flag",
-              "link": "/"
-            },
-            {
-              "text": "������������",
-              "icon": "icon-people",
-              "link": "/"
-            }
-          ]
+                ]
+              }, {
+                "text": "������������",
+                "icon": "icon-settings",
+                "children": [
+                  {
+                  "text": "������������",
+                  "link": "/systems/account"
+                  },
+                  {
+                    "text": "������������",
+                    "link": "/systems/organization"
+                    },
+	                {
+		                "text": "���������������",
+		                "link": "/systems/registration",
+		                "hide": true
+	                }
+                ]
+              }
+            ]
+
+
         }
-      ]
+
+
+    ]
 }
diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json
index 262c53d..34270db 100644
--- a/src/assets/i18n/en.json
+++ b/src/assets/i18n/en.json
@@ -38,19 +38,25 @@
     "typography": "Typography",
     "iconsfont": "Iconsfont",
     "colors": "Colors",
+    "other": "Other",
+    "split": "Split",
+    "clipboard": "Clipboard",
     "forms": "Forms",
     "extended": "Extended",
     "standard": "Standard",
     "validation": "Validation",
     "upload": "Upload",
     "cropper": "Image Crop",
+    "editor": "Editor",
     "charts": "Charts",
     "tables": "Tables",
+    "fs-table": "Fullscreen Table",
     "maps": "Maps",
     "qq": "QQ",
     "baidu": "Baidu",
     "logics": "Logics",
     "guard": "Route Guard",
+    "cache": "Cache",
     "acl": "ACL",
     "downfile": "Down File",
     "report": "Report",
diff --git a/src/assets/i18n/zh-CN.json b/src/assets/i18n/zh-CN.json
index 2488a5e..e0badcd 100644
--- a/src/assets/i18n/zh-CN.json
+++ b/src/assets/i18n/zh-CN.json
@@ -6,7 +6,7 @@
     "logout": "������",
     "more": "������",
     "full": "������",
-    "top-search-ph": "������������������������������������",
+    "top-search-ph": "������������������������������������������",
     "theme": "������",
     "theme-switch": "������������",
     "light": "���",
@@ -38,19 +38,25 @@
     "typography": "������������",
     "iconsfont": "icon������",
     "colors": "������",
+    "other": "������",
+    "split": "������������",
+    "clipboard": "���������",
     "forms": "������",
     "standard": "������",
     "extended": "������",
     "validation": "������",
     "upload": "������",
     "cropper": "������������",
+    "editor": "���������",
     "charts": "������",
     "tables": "������",
+    "fs-table": "������������",
     "maps": "������",
     "qq": "QQ",
     "baidu": "������",
     "logics": "������������",
     "guard": "������������",
+    "cache": "������������",
     "acl": "������������������������",
     "downfile": "������������",
     "report": "������",
diff --git a/src/assets/img/avatar.jpg b/src/assets/img/avatar.jpg
deleted file mode 100644
index ebc92fb..0000000
--- a/src/assets/img/avatar.jpg
+++ /dev/null
Binary files differ
diff --git a/src/environments/environment.chore.ts b/src/environments/environment.chore.ts
index bb3034e..206d19c 100644
--- a/src/environments/environment.chore.ts
+++ b/src/environments/environment.chore.ts
@@ -1,4 +1,5 @@
 export const environment = {
+    chore: true,
     SERVER_URL: `./`,
     production: true,
     hmr: false,
diff --git a/src/environments/environment.hmr.ts b/src/environments/environment.hmr.ts
index 687d0b9..cdf064e 100644
--- a/src/environments/environment.hmr.ts
+++ b/src/environments/environment.hmr.ts
@@ -1,6 +1,8 @@
 export const environment = {
+    chore: false,
     SERVER_URL: `./`,
-    production: true,
+    production: false,
     hmr: true,
-    useHash: true
+    useHash: true,
+    SERVER_BASH_URL: `http://47.96.171.62:8080/screen_api_v2/`
 };
diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts
index 3f794b3..7e3be56 100644
--- a/src/environments/environment.prod.ts
+++ b/src/environments/environment.prod.ts
@@ -1,6 +1,8 @@
 export const environment = {
+    chore: false,
     SERVER_URL: `./`,
     production: true,
     hmr: false,
-    useHash: true
+    useHash: true,
+    SERVER_BASH_URL:`http://47.96.15.25:8080/screen_api_v2/`
 };
diff --git a/src/environments/environment.ts b/src/environments/environment.ts
index 26fbb75..6163163 100644
--- a/src/environments/environment.ts
+++ b/src/environments/environment.ts
@@ -4,8 +4,10 @@
 // The list of which env maps to which file can be found in `.angular-cli.json`.
 
 export const environment = {
-    SERVER_URL: `http://127.0.0.1:8080/`,
+    chore: false,
+    SERVER_URL: `./`,
     production: false,
     hmr: false,
-    useHash: true
+    useHash: true,
+    SERVER_BASH_URL: `http://47.96.171.62:8080/screen_api_v2/`
 };
diff --git a/src/index.html b/src/index.html
index 6ab9cf7..04af5b5 100644
--- a/src/index.html
+++ b/src/index.html
@@ -3,14 +3,106 @@
 
 <head>
     <meta charset="utf-8">
-    <title>ngAlain</title>
+    <title>������������������������</title>
     <base href="/">
     <meta name="viewport" content="width=device-width, initial-scale=1">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <link rel="icon" type="image/x-icon" href="favicon.ico">
-	<!-- Apple Touch Icon -->
-	<!-- <link rel="apple-touch-icon" href="custom-icon.png"> -->
-    <style type="text/css">.preloader{position:fixed;top:0;left:0;width:100%;height:100%;overflow:hidden;background:#49a9ee;z-index:9999;transition:opacity .65s}.preloader-hidden-add{opacity:1;display:block}.preloader-hidden-add-active{opacity:0}.preloader-hidden{display:none}.cs-loader{position:absolute;top:0;left:0;height:100%;width:100%}.cs-loader-inner{transform:translateY(-50%);top:50%;position:absolute;width:100%;color:#fff;text-align:center}.cs-loader-inner label{font-size:20px;opacity:0;display:inline-block}@keyframes lol{0%{opacity:0;transform:translateX(-300px)}33%{opacity:1;transform:translateX(0)}66%{opacity:1;transform:translateX(0)}100%{opacity:0;transform:translateX(300px)}}.cs-loader-inner label:nth-child(6){animation:lol 3s infinite ease-in-out}.cs-loader-inner label:nth-child(5){animation:lol 3s .1s infinite ease-in-out}.cs-loader-inner label:nth-child(4){animation:lol 3s .2s infinite ease-in-out}.cs-loader-inner label:nth-child(3){animation:lol 3s .3s infinite ease-in-out}.cs-loader-inner label:nth-child(2){animation:lol 3s .4s infinite ease-in-out}.cs-loader-inner label:nth-child(1){animation:lol 3s .5s infinite ease-in-out}</style>
+    <!-- Apple Touch Icon -->
+    <!-- <link rel="apple-touch-icon" href="custom-icon.png"> -->
+    <style type="text/css">
+        .preloader {
+            position: fixed;
+            top: 0;
+            left: 0;
+            width: 100%;
+            height: 100%;
+            overflow: hidden;
+            background: #49a9ee;
+            z-index: 9999;
+            transition: opacity 0.65s;
+        }
+
+        .preloader-hidden-add {
+            opacity: 1;
+            display: block;
+        }
+
+        .preloader-hidden-add-active {
+            opacity: 0;
+        }
+
+        .preloader-hidden {
+            display: none;
+        }
+
+        .cs-loader {
+            position: absolute;
+            top: 0;
+            left: 0;
+            height: 100%;
+            width: 100%;
+        }
+
+        .cs-loader-inner {
+            transform: translateY(-50%);
+            top: 50%;
+            position: absolute;
+            width: 100%;
+            color: #fff;
+            text-align: center;
+        }
+
+        .cs-loader-inner label {
+            font-size: 20px;
+            opacity: 0;
+            display: inline-block;
+        }
+
+        @keyframes lol {
+            0% {
+                opacity: 0;
+                transform: translateX(-300px);
+            }
+            33% {
+                opacity: 1;
+                transform: translateX(0);
+            }
+            66% {
+                opacity: 1;
+                transform: translateX(0);
+            }
+            100% {
+                opacity: 0;
+                transform: translateX(300px);
+            }
+        }
+
+        .cs-loader-inner label:nth-child(6) {
+            animation: lol 3s infinite ease-in-out;
+        }
+
+        .cs-loader-inner label:nth-child(5) {
+            animation: lol 3s .1s infinite ease-in-out;
+        }
+
+        .cs-loader-inner label:nth-child(4) {
+            animation: lol 3s .2s infinite ease-in-out;
+        }
+
+        .cs-loader-inner label:nth-child(3) {
+            animation: lol 3s .3s infinite ease-in-out;
+        }
+
+        .cs-loader-inner label:nth-child(2) {
+            animation: lol 3s .4s infinite ease-in-out;
+        }
+
+        .cs-loader-inner label:nth-child(1) {
+            animation: lol 3s .5s infinite ease-in-out;
+        }
+
+    </style>
 </head>
 
 <body>
@@ -18,12 +110,12 @@
     <div class="preloader">
         <div class="cs-loader">
             <div class="cs-loader-inner">
-                <label>	���</label>
-                <label>	���</label>
-                <label>	���</label>
-                <label>	���</label>
-                <label>	���</label>
-                <label>	���</label>
+                <label> ���</label>
+                <label> ���</label>
+                <label> ���</label>
+                <label> ���</label>
+                <label> ���</label>
+                <label> ���</label>
             </div>
         </div>
     </div>
diff --git a/src/styles/index.less b/src/styles/index.less
index dcd9331..e4a5cd0 100644
--- a/src/styles/index.less
+++ b/src/styles/index.less
@@ -1 +1,4 @@
 // ������������������������������������������������������
+.label-width-70 {
+			width: 70px;
+		}
\ No newline at end of file
diff --git a/src/test.ts b/src/test.ts
index cd612ee..59871f7 100644
--- a/src/test.ts
+++ b/src/test.ts
@@ -1,5 +1,4 @@
 // This file is required by karma.conf.js and loads recursively all the .spec and framework files
-
 import 'zone.js/dist/long-stack-trace-zone';
 import 'zone.js/dist/proxy.js';
 import 'zone.js/dist/sync-test';
@@ -26,6 +25,7 @@
 );
 // Then we find all the tests.
 const context = require.context('./', true, /\.spec\.ts$/);
+// const context = require.context('./', true, /qq\.component\.spec\.ts$/);
 // And load the modules.
 context.keys().map(context);
 // Finally, start Karma to run the tests.
diff --git a/src/testing/common.spec.ts b/src/testing/common.spec.ts
index 7aed99b..9aa9b27 100644
--- a/src/testing/common.spec.ts
+++ b/src/testing/common.spec.ts
@@ -2,15 +2,17 @@
 
 import { TestBed, async, TestModuleMetadata } from '@angular/core/testing';
 import { Type, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
-
-import { CoreModule } from '@core/core.module';
 import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
-import { HttpLoaderFactory } from 'app/app.module';
-import { HttpClient } from '@angular/common/http';
+import { RouterTestingModule } from '@angular/router/testing';
+import { HttpClientModule, HttpClient } from '@angular/common/http';
+
 import { ALAIN_I18N_TOKEN, ColorsService, SettingsService, MenuService, ScrollService, _HttpClient, ALAIN_THEME_OPTIONS } from '@delon/theme';
 import { I18NService } from '@core/i18n/i18n.service';
-import { RouterTestingModule } from '@angular/router/testing';
+import { CoreModule } from '@core/core.module';
 import { SharedModule } from '@shared/shared.module';
+import { DelonModule } from '../app/delon.module';
+import { AlainAuthModule } from '@delon/auth';
+import { HttpLoaderFactory } from '../app/app.module';
 
 const resetTestingModule = TestBed.resetTestingModule,
       preventAngularFromResetting = () => TestBed.resetTestingModule = () => TestBed;
@@ -29,7 +31,13 @@
         // region: imports
         if (!moduleDef.imports) moduleDef.imports = [];
         moduleDef.imports.push(RouterTestingModule);
-        moduleDef.imports.push(SharedModule.forRoot());
+        moduleDef.imports.push(HttpClientModule);
+        moduleDef.imports.push(DelonModule);
+        moduleDef.imports.push(SharedModule);
+        // auth
+        moduleDef.imports.push(AlainAuthModule.forRoot({
+            login_url: `/passport/login`
+        }));
         moduleDef.imports.push(TranslateModule.forRoot({
             loader: {
                 provide: TranslateLoader,
diff --git a/src/tsconfig.app.json b/src/tsconfig.app.json
index 29f6da9..0903fbc 100644
--- a/src/tsconfig.app.json
+++ b/src/tsconfig.app.json
@@ -6,10 +6,16 @@
     "module": "es2015",
     "types": [],
     "paths": {
-      "@shared": [ "app/shared" ],
-      "@shared/*": [ "app/shared/*" ],
-      "@core": [ "app/core/" ],
-      "@core/*": [ "app/core/*" ]
+        "@shared": [ "app/shared" ],
+        "@shared/*": [ "app/shared/*" ],
+        "@core": [ "app/core/" ],
+        "@core/*": [ "app/core/*" ],
+        "@testing": [ "testing/" ],
+        "@testing/*": [ "testing/*" ],
+        "@env": [ "environments/" ],
+        "@env/*": [ "environments/*" ],
+        "@business": [ "app/business" ],
+        "@business/*": [ "app/business/*" ]
     }
   },
   "exclude": [
diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json
index f460cf7..3c1fdec 100644
--- a/src/tsconfig.spec.json
+++ b/src/tsconfig.spec.json
@@ -10,10 +10,16 @@
       "node"
     ],
     "paths": {
-      "@shared": [ "app/shared" ],
-      "@shared/*": [ "app/shared/*" ],
-      "@core": [ "app/core/" ],
-      "@core/*": [ "app/core/*" ]
+        "@shared": [ "app/shared" ],
+        "@shared/*": [ "app/shared/*" ],
+        "@core": [ "app/core/" ],
+        "@core/*": [ "app/core/*" ],
+        "@testing": [ "testing/" ],
+        "@testing/*": [ "testing/*" ],
+        "@env": [ "environments/" ],
+        "@env/*": [ "environments/*" ],
+        "@business": [ "app/business" ],
+        "@business/*": [ "app/business/*" ]
     }
   },
   "files": [
diff --git a/tsconfig.json b/tsconfig.json
index 9b73cb0..e961ded 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -20,7 +20,13 @@
         "@shared": [ "app/shared" ],
         "@shared/*": [ "app/shared/*" ],
         "@core": [ "app/core/" ],
-        "@core/*": [ "app/core/*" ]
+        "@core/*": [ "app/core/*" ],
+        "@testing": [ "testing/" ],
+        "@testing/*": [ "testing/*" ],
+        "@env": [ "environments/" ],
+        "@env/*": [ "environments/*" ],
+        "@business": [ "app/business" ],
+        "@business/*": [ "app/business/*" ]
     }
   }
 }
diff --git a/yarn-error.log b/yarn-error.log
new file mode 100644
index 0000000..197bb9c
--- /dev/null
+++ b/yarn-error.log
@@ -0,0 +1,8403 @@
+Arguments: 
+  C:\Program Files\nodejs\node.exe C:\Users\fengxiang\AppData\Roaming\npm\node_modules\yarn\bin\yarn.js add angular2-cookie
+
+PATH: 
+  C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Program Files\Git\cmd;C:\Program Files\Java\jdk1.8.0_152\bin;C:\Program Files\Java\jdk1.8.0_152\jre\bin;C:\Program Files\nodejs;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit;C:\Windows\system32\config\systemprofile\.dnx\bin;C:\Program Files\Microsoft DNX\Dnvm;C:\Program Files\Microsoft SQL Server\120\Tools\Binn;C:\Program Files\Microsoft SQL Server\130\Tools\Binn;D:\cygwin64\bin;C:\Users\fengxiang\AppData\Roaming\npm;D:\Program Files\Microsoft VS Code\bin;D:\cygwin64\bin;C:\Python27
+
+Yarn version: 
+  1.3.2
+
+Node version: 
+  8.9.3
+
+Platform: 
+  win32 x64
+
+npm manifest: 
+  {
+    "name": "ng-alain",
+    "version": "0.6.0-rc.2",
+    "description": "ng-zorro-antd admin panel front-end framework",
+    "author": "cipchk",
+    "homepage": "https://cipchk.github.io/ng-alain/",
+    "bugs": {
+      "url": "https://github.com/cipchk/ng-alain/issues"
+    },
+    "engines": {
+      "node": ">= 4.2.1",
+      "npm": ">= 3"
+    },
+    "license": "MIT",
+    "scripts": {
+      "precommit": "npm run lint-staged",
+      "ng": "ng",
+      "start": "ng serve --host=0.0.0.0",
+      "serve:hmr": "ng serve -o --hmr -e=hmr",
+      "build": "ng build --prod --build-optimizer",
+      "build-dev": "ng build --build-optimizer --aot --dev",
+      "build-prod": "ng build --build-optimizer --prod",
+      "analyze": "ng build --prod --build-optimizer --stats-json",
+      "lint": "run-s lint:ts lint:style",
+      "lint:ts": "ng lint",
+      "lint:style": "stylelint \"{src}/**/*.less\" --syntax less",
+      "lint-staged": "lint-staged",
+      "e2e": "ng e2e",
+      "test": "ng test -sr -sm=false",
+      "test-coverage": "ng test -sr -cc -sm=false"
+    },
+    "dependencies": {
+      "@angular/animations": "^5.0.0",
+      "@angular/common": "^5.0.0",
+      "@angular/compiler": "^5.0.0",
+      "@angular/core": "^5.0.0",
+      "@angular/forms": "^5.0.0",
+      "@angular/http": "^5.0.0",
+      "@angular/platform-browser": "^5.0.0",
+      "@angular/platform-browser-dynamic": "^5.0.0",
+      "@angular/router": "^5.0.0",
+      "@antv/data-set": "^0.8.3",
+      "@antv/g2": "^3.0.1",
+      "@antv/g2-plugin-slider": "^2.0.0",
+      "@delon/abc": "0.6.1",
+      "@delon/acl": "0.6.1",
+      "@delon/auth": "0.6.1",
+      "@delon/theme": "0.6.1",
+      "@delon/cache": "0.6.1",
+      "@ngx-translate/core": "^9.0.0",
+      "@ngx-translate/http-loader": "^2.0.0",
+      "angular2-baidu-map": "^4.1.0",
+      "angular-qq-maps": "^1.0.1",
+      "angular-split": "^1.0.0-rc.0",
+      "angular-tree-component": "^7.0.1",
+      "core-js": "^2.5.1",
+      "echarts": "^3.8.5",
+      "file-saver": "^1.3.3",
+      "font-awesome": "^4.7.0",
+      "moment": "^2.19.3",
+      "ng-clipboard-antd": "^2.0.1",
+      "ng-tree-antd": "^2.0.0",
+      "ng-zorro-antd": "^0.6.5",
+      "ng-zorro-antd-extra": "^1.1.6",
+      "ng2-dnd": "^5.0.0",
+      "ng2-file-upload": "^1.2.1",
+      "ng2-img-cropper": "^0.9.0",
+      "ngx-color-picker": "^5.0.0",
+      "ngx-countdown": "^2.0.0",
+      "ngx-tinymce": "^1.0.1",
+      "ngx-ueditor": "^1.1.0",
+      "rxjs": "^5.5.5",
+      "screenfull": "^3.3.1",
+      "simple-line-icons": "^2.4.1",
+      "sweetalert2": "^7.0.0",
+      "weather-icons": "^1.3.2",
+      "zone.js": "^0.8.18"
+    },
+    "devDependencies": {
+      "@angular/cli": "^1.5.2",
+      "@angular/compiler-cli": "^5.0.0",
+      "@angular/language-service": "^5.0.0",
+      "@angularclass/hmr": "^2.1.3",
+      "@angularclass/hmr-loader": "^3.0.4",
+      "@types/jasmine": "~2.6.0",
+      "@types/jasminewd2": "~2.0.3",
+      "@types/jszip": "^3.1.2",
+      "@types/mockjs": "^1.0.0",
+      "@types/node": "~6.0.60",
+      "codecov": "^3.0.0",
+      "codelyzer": "~4.0.1",
+      "jasmine-core": "~2.8.0",
+      "jasmine-spec-reporter": "~4.2.1",
+      "karma": "~1.7.1",
+      "karma-chrome-launcher": "~2.2.0",
+      "karma-cli": "~1.0.1",
+      "karma-coverage-istanbul-reporter": "^1.3.0",
+      "karma-jasmine": "~1.1.0",
+      "karma-jasmine-html-reporter": "^0.2.2",
+      "karma-remap-istanbul": "^0.6.0",
+      "karma-sauce-launcher": "^1.2.0",
+      "lint-staged": "^5.0.0",
+      "mockjs": "^1.0.1-beta3",
+      "npm-run-all": "^4.1.1",
+      "protractor": "~5.1.2",
+      "stylelint": "^8.2.0",
+      "stylelint-config-standard": "^17.0.0",
+      "ts-node": "~3.2.0",
+      "tslint": "~5.7.0",
+      "typescript": "~2.5.0",
+      "webpack-bundle-analyzer": "^2.9.0",
+      "xlsx": "^0.11.16"
+    },
+    "lint-staged": {
+      "src/**/*.ts": "lint:ts",
+      "src/**/*.less": "lint:style"
+    }
+  }
+
+yarn manifest: 
+  No manifest
+
+Lockfile: 
+  # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+  # yarn lockfile v1
+  
+  
+  "@angular-devkit/build-optimizer@~0.0.36":
+    version "0.0.36"
+    resolved "http://registry.npm.taobao.org/@angular-devkit/build-optimizer/download/@angular-devkit/build-optimizer-0.0.36.tgz#e816ee9be22dbb777724f0281acfa72cfff184b7"
+    dependencies:
+      loader-utils "^1.1.0"
+      source-map "^0.5.6"
+      typescript "~2.6.1"
+      webpack-sources "^1.0.1"
+  
+  "@angular-devkit/core@0.0.22":
+    version "0.0.22"
+    resolved "http://registry.npm.taobao.org/@angular-devkit/core/download/@angular-devkit/core-0.0.22.tgz#e90f46bf7ff47d260a767959267bc65ffee39ef1"
+    dependencies:
+      source-map "^0.5.6"
+  
+  "@angular-devkit/schematics@~0.0.42":
+    version "0.0.42"
+    resolved "http://registry.npm.taobao.org/@angular-devkit/schematics/download/@angular-devkit/schematics-0.0.42.tgz#34eea7136455545c8abd21edf94a36870a073fea"
+    dependencies:
+      "@angular-devkit/core" "0.0.22"
+      "@ngtools/json-schema" "^1.1.0"
+      "@schematics/schematics" "0.0.11"
+      minimist "^1.2.0"
+      rxjs "^5.5.2"
+  
+  "@angular/animations@^5.0.0":
+    version "5.1.3"
+    resolved "http://registry.npm.taobao.org/@angular/animations/download/@angular/animations-5.1.3.tgz#3af3073bfdfeac61d7e6058257b3b19c97183a96"
+    dependencies:
+      tslib "^1.7.1"
+  
+  "@angular/cdk@^5.0.0":
+    version "5.0.4"
+    resolved "http://registry.npm.taobao.org/@angular/cdk/download/@angular/cdk-5.0.4.tgz#f76a268e404f41aff0e908b21e7de9a5dfc07150"
+    dependencies:
+      tslib "^1.7.1"
+  
+  "@angular/cli@^1.5.2":
+    version "1.6.3"
+    resolved "http://registry.npm.taobao.org/@angular/cli/download/@angular/cli-1.6.3.tgz#63120b347fc8ee206f773074d25fdd4807c189e3"
+    dependencies:
+      "@angular-devkit/build-optimizer" "~0.0.36"
+      "@angular-devkit/schematics" "~0.0.42"
+      "@ngtools/json-schema" "1.1.0"
+      "@ngtools/webpack" "1.9.3"
+      "@schematics/angular" "~0.1.11"
+      autoprefixer "^6.5.3"
+      chalk "~2.2.0"
+      circular-dependency-plugin "^4.2.1"
+      common-tags "^1.3.1"
+      copy-webpack-plugin "^4.1.1"
+      core-object "^3.1.0"
+      css-loader "^0.28.1"
+      cssnano "^3.10.0"
+      denodeify "^1.2.1"
+      ember-cli-string-utils "^1.0.0"
+      exports-loader "^0.6.3"
+      extract-text-webpack-plugin "^3.0.2"
+      file-loader "^1.1.5"
+      fs-extra "^4.0.0"
+      glob "^7.0.3"
+      html-webpack-plugin "^2.29.0"
+      istanbul-instrumenter-loader "^2.0.0"
+      karma-source-map-support "^1.2.0"
+      less "^2.7.2"
+      less-loader "^4.0.5"
+      license-webpack-plugin "^1.0.0"
+      loader-utils "1.1.0"
+      lodash "^4.11.1"
+      memory-fs "^0.4.1"
+      minimatch "^3.0.4"
+      node-modules-path "^1.0.0"
+      nopt "^4.0.1"
+      opn "~5.1.0"
+      portfinder "~1.0.12"
+      postcss-custom-properties "^6.1.0"
+      postcss-loader "^2.0.8"
+      postcss-url "^7.1.2"
+      raw-loader "^0.5.1"
+      resolve "^1.1.7"
+      rxjs "^5.5.2"
+      sass-loader "^6.0.3"
+      semver "^5.1.0"
+      silent-error "^1.0.0"
+      source-map-loader "^0.2.0"
+      source-map-support "^0.4.1"
+      style-loader "^0.13.1"
+      stylus "^0.54.5"
+      stylus-loader "^3.0.1"
+      uglifyjs-webpack-plugin "^1.1.5"
+      url-loader "^0.6.2"
+      webpack "~3.10.0"
+      webpack-dev-middleware "~1.12.0"
+      webpack-dev-server "~2.9.3"
+      webpack-merge "^4.1.0"
+      webpack-sources "^1.0.0"
+      webpack-subresource-integrity "^1.0.1"
+      zone.js "^0.8.14"
+    optionalDependencies:
+      node-sass "^4.3.0"
+  
+  "@angular/common@^5.0.0":
+    version "5.1.3"
+    resolved "http://registry.npm.taobao.org/@angular/common/download/@angular/common-5.1.3.tgz#db517c00a95f72885eb2091098eaed4f95494a63"
+    dependencies:
+      tslib "^1.7.1"
+  
+  "@angular/compiler-cli@^5.0.0":
+    version "5.1.3"
+    resolved "http://registry.npm.taobao.org/@angular/compiler-cli/download/@angular/compiler-cli-5.1.3.tgz#e9cfd183a8a12fddad0188d2b7e4e9a45f302d82"
+    dependencies:
+      chokidar "^1.4.2"
+      minimist "^1.2.0"
+      reflect-metadata "^0.1.2"
+      tsickle "^0.25.5"
+  
+  "@angular/compiler@^5.0.0":
+    version "5.1.3"
+    resolved "http://registry.npm.taobao.org/@angular/compiler/download/@angular/compiler-5.1.3.tgz#125008477895aee1bf71294bf981a4ba184c1e59"
+    dependencies:
+      tslib "^1.7.1"
+  
+  "@angular/core@^5.0.0":
+    version "5.1.3"
+    resolved "http://registry.npm.taobao.org/@angular/core/download/@angular/core-5.1.3.tgz#b739f69834c344285250a384d0c203dd36778a37"
+    dependencies:
+      tslib "^1.7.1"
+  
+  "@angular/forms@^5.0.0":
+    version "5.1.3"
+    resolved "http://registry.npm.taobao.org/@angular/forms/download/@angular/forms-5.1.3.tgz#fe4c0c37c504e78c85f8e50db6e098705fa72f4c"
+    dependencies:
+      tslib "^1.7.1"
+  
+  "@angular/http@^5.0.0":
+    version "5.1.3"
+    resolved "http://registry.npm.taobao.org/@angular/http/download/@angular/http-5.1.3.tgz#eeea2a6760fa54449a967fb5abdd473736c5c989"
+    dependencies:
+      tslib "^1.7.1"
+  
+  "@angular/language-service@^5.0.0":
+    version "5.1.3"
+    resolved "http://registry.npm.taobao.org/@angular/language-service/download/@angular/language-service-5.1.3.tgz#b55f295943133e33940ff71e6bb0afa93d7f4d36"
+  
+  "@angular/platform-browser-dynamic@^5.0.0":
+    version "5.1.3"
+    resolved "http://registry.npm.taobao.org/@angular/platform-browser-dynamic/download/@angular/platform-browser-dynamic-5.1.3.tgz#ad37e4dbd5251e7ea256ad9323fe11c848d04050"
+    dependencies:
+      tslib "^1.7.1"
+  
+  "@angular/platform-browser@^5.0.0":
+    version "5.1.3"
+    resolved "http://registry.npm.taobao.org/@angular/platform-browser/download/@angular/platform-browser-5.1.3.tgz#5abe7809009eff6bff3bf89faba96fe066fb2036"
+    dependencies:
+      tslib "^1.7.1"
+  
+  "@angular/router@^5.0.0":
+    version "5.1.3"
+    resolved "http://registry.npm.taobao.org/@angular/router/download/@angular/router-5.1.3.tgz#69627d7186e4ab8e7d4058c4400f82d3899ebd7a"
+    dependencies:
+      tslib "^1.7.1"
+  
+  "@angularclass/hmr-loader@^3.0.4":
+    version "3.0.4"
+    resolved "http://registry.npm.taobao.org/@angularclass/hmr-loader/download/@angularclass/hmr-loader-3.0.4.tgz#3e3a07ba835650c9015629b8e187fe8dcd5527b8"
+    dependencies:
+      loader-utils "^1.1.0"
+  
+  "@angularclass/hmr@^2.1.3":
+    version "2.1.3"
+    resolved "http://registry.npm.taobao.org/@angularclass/hmr/download/@angularclass/hmr-2.1.3.tgz#34e658ed3da37f23b0a200e2da5a89be92bb209f"
+  
+  "@antv/data-set@^0.8.3":
+    version "0.8.3"
+    resolved "http://registry.npm.taobao.org/@antv/data-set/download/@antv/data-set-0.8.3.tgz#7f58207532a9de5d174b52676b876247b2acab02"
+    dependencies:
+      d3-array "~1.2.0"
+      d3-composite-projections "~1.2.0"
+      d3-dsv "~1.0.5"
+      d3-geo "~1.6.4"
+      d3-geo-projection "~2.1.2"
+      d3-hexjson "^1.0.1"
+      d3-hierarchy "~1.1.5"
+      d3-sankey "~0.7.1"
+      d3-voronoi "~1.1.2"
+      lodash "~4.17.4"
+      point-at-length "~1.0.2"
+      regression "~2.0.0"
+      simple-statistics "~4.1.0"
+      topojson-client "~3.0.0"
+      wolfy87-eventemitter "~5.1.0"
+  
+  "@antv/g2-plugin-slider@^2.0.0":
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/@antv/g2-plugin-slider/download/@antv/g2-plugin-slider-2.0.1.tgz#45cf6da6f2050fabe64166a213674422afe4eebf"
+  
+  "@antv/g2@^3.0.1":
+    version "3.0.3"
+    resolved "http://registry.npm.taobao.org/@antv/g2/download/@antv/g2-3.0.3.tgz#ee59e1ded71b065d1e9ef3fe6d572fe5de07c069"
+    dependencies:
+      "@antv/g" "~2.0.4"
+      fecha "~2.3.2"
+      gl-matrix "~2.4.0"
+      lodash "~4.17.4"
+      wolfy87-eventemitter "~5.2.4"
+  
+  "@antv/g@~2.0.4":
+    version "2.0.4"
+    resolved "http://registry.npm.taobao.org/@antv/g/download/@antv/g-2.0.4.tgz#b637c641b4dd6092fc4d628aa604424d29faca0d"
+    dependencies:
+      d3-ease "^1.0.3"
+      d3-interpolate "^1.1.5"
+      d3-timer "^1.0.6"
+      gl-matrix "^2.3.2"
+      lodash "^4.17.4"
+      wolfy87-eventemitter "^5.1.0"
+  
+  "@delon/abc@0.6.1":
+    version "0.6.1"
+    resolved "http://registry.npm.taobao.org/@delon/abc/download/@delon/abc-0.6.1.tgz#161ab09848715700fd00d073c55ac0a51268195d"
+  
+  "@delon/acl@0.6.1":
+    version "0.6.1"
+    resolved "http://registry.npm.taobao.org/@delon/acl/download/@delon/acl-0.6.1.tgz#2728f2c24684640caff36db98c0777589b59f747"
+  
+  "@delon/auth@0.6.1":
+    version "0.6.1"
+    resolved "http://registry.npm.taobao.org/@delon/auth/download/@delon/auth-0.6.1.tgz#26b0945008663b7126ea30aca6372a6bc5d6a9cb"
+  
+  "@delon/cache@0.6.1":
+    version "0.6.1"
+    resolved "http://registry.npm.taobao.org/@delon/cache/download/@delon/cache-0.6.1.tgz#13b412897743dc2ad612c4c4fca280c3dc044825"
+  
+  "@delon/theme@0.6.1":
+    version "0.6.1"
+    resolved "http://registry.npm.taobao.org/@delon/theme/download/@delon/theme-0.6.1.tgz#4e98b1dc565c2f0684717c44ed73509cd866f120"
+  
+  "@ngtools/json-schema@1.1.0", "@ngtools/json-schema@^1.1.0":
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/@ngtools/json-schema/download/@ngtools/json-schema-1.1.0.tgz#c3a0c544d62392acc2813a42c8a0dc6f58f86922"
+  
+  "@ngtools/webpack@1.9.3":
+    version "1.9.3"
+    resolved "http://registry.npm.taobao.org/@ngtools/webpack/download/@ngtools/webpack-1.9.3.tgz#353e27e6f21ab35467d17b67e3096dfc5d9bf80c"
+    dependencies:
+      chalk "~2.2.0"
+      enhanced-resolve "^3.1.0"
+      loader-utils "^1.0.2"
+      magic-string "^0.22.3"
+      semver "^5.3.0"
+      source-map "^0.5.6"
+      tree-kill "^1.0.0"
+      webpack-sources "^1.1.0"
+  
+  "@ngx-translate/core@^9.0.0":
+    version "9.0.2"
+    resolved "http://registry.npm.taobao.org/@ngx-translate/core/download/@ngx-translate/core-9.0.2.tgz#d4cab861e3ea8ea14a6df5dcd744dfeb29fb15e2"
+  
+  "@ngx-translate/http-loader@^2.0.0":
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/@ngx-translate/http-loader/download/@ngx-translate/http-loader-2.0.1.tgz#aa67788e64bfa8652691a77b022b3b4031209113"
+  
+  "@schematics/angular@~0.1.11":
+    version "0.1.11"
+    resolved "http://registry.npm.taobao.org/@schematics/angular/download/@schematics/angular-0.1.11.tgz#b5f15320bbb60969d66c76a8ef6545058ac81ece"
+    dependencies:
+      "@angular-devkit/core" "0.0.22"
+  
+  "@schematics/schematics@0.0.11":
+    version "0.0.11"
+    resolved "http://registry.npm.taobao.org/@schematics/schematics/download/@schematics/schematics-0.0.11.tgz#c8f70f270ed38f29b2873248126fd59abd635862"
+  
+  "@types/jasmine@*":
+    version "2.8.3"
+    resolved "http://registry.npm.taobao.org/@types/jasmine/download/@types/jasmine-2.8.3.tgz#f910edc67d69393d562d10f8f3d205ea3f3306bf"
+  
+  "@types/jasmine@~2.6.0":
+    version "2.6.3"
+    resolved "http://registry.npm.taobao.org/@types/jasmine/download/@types/jasmine-2.6.3.tgz#586963bfdd35e38f24a0a0b63a438cf521292ed9"
+  
+  "@types/jasminewd2@~2.0.3":
+    version "2.0.3"
+    resolved "http://registry.npm.taobao.org/@types/jasminewd2/download/@types/jasminewd2-2.0.3.tgz#0d2886b0cbdae4c0eeba55e30792f584bf040a95"
+    dependencies:
+      "@types/jasmine" "*"
+  
+  "@types/jszip@^3.1.2":
+    version "3.1.3"
+    resolved "http://registry.npm.taobao.org/@types/jszip/download/@types/jszip-3.1.3.tgz#5567e9f0a31012341cedcc707175f2c28a430005"
+    dependencies:
+      "@types/node" "*"
+  
+  "@types/mockjs@^1.0.0":
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/@types/mockjs/download/@types/mockjs-1.0.0.tgz#a696e1f64c92e7bd6af6343bf8350d1b9d12b388"
+  
+  "@types/node@*":
+    version "9.3.0"
+    resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-9.3.0.tgz#3a129cda7c4e5df2409702626892cb4b96546dd5"
+  
+  "@types/node@^6.0.46", "@types/node@~6.0.60":
+    version "6.0.96"
+    resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-6.0.96.tgz#7bf0bf40d6ce51e93762cc47d010c8cc5ebb2179"
+  
+  "@types/q@^0.0.32":
+    version "0.0.32"
+    resolved "http://registry.npm.taobao.org/@types/q/download/@types/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5"
+  
+  "@types/selenium-webdriver@^2.53.35", "@types/selenium-webdriver@~2.53.39":
+    version "2.53.43"
+    resolved "http://registry.npm.taobao.org/@types/selenium-webdriver/download/@types/selenium-webdriver-2.53.43.tgz#2de3d718819bc20165754c4a59afb7e9833f6707"
+  
+  abbrev@1:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+  
+  abbrev@1.0.x:
+    version "1.0.9"
+    resolved "http://registry.npm.taobao.org/abbrev/download/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
+  
+  abs-svg-path@~0.1.1:
+    version "0.1.1"
+    resolved "http://registry.npm.taobao.org/abs-svg-path/download/abs-svg-path-0.1.1.tgz#df601c8e8d2ba10d4a76d625e236a9a39c2723bf"
+  
+  accepts@1.3.3:
+    version "1.3.3"
+    resolved "http://registry.npm.taobao.org/accepts/download/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
+    dependencies:
+      mime-types "~2.1.11"
+      negotiator "0.6.1"
+  
+  accepts@~1.3.4:
+    version "1.3.4"
+    resolved "http://registry.npm.taobao.org/accepts/download/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f"
+    dependencies:
+      mime-types "~2.1.16"
+      negotiator "0.6.1"
+  
+  acorn-dynamic-import@^2.0.0:
+    version "2.0.2"
+    resolved "http://registry.npm.taobao.org/acorn-dynamic-import/download/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
+    dependencies:
+      acorn "^4.0.3"
+  
+  acorn@^4.0.3:
+    version "4.0.13"
+    resolved "http://registry.npm.taobao.org/acorn/download/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+  
+  acorn@^5.0.0, acorn@^5.1.1:
+    version "5.3.0"
+    resolved "http://registry.npm.taobao.org/acorn/download/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822"
+  
+  adler-32@~1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/adler-32/download/adler-32-1.1.0.tgz#03551a5c7f0edfbd4fc8fa12a6814978eab651c3"
+    dependencies:
+      exit-on-epipe "~1.0.1"
+      printj "~1.1.0"
+  
+  adm-zip@0.4.4:
+    version "0.4.4"
+    resolved "http://registry.npm.taobao.org/adm-zip/download/adm-zip-0.4.4.tgz#a61ed5ae6905c3aea58b3a657d25033091052736"
+  
+  adm-zip@^0.4.7, adm-zip@~0.4.3:
+    version "0.4.7"
+    resolved "http://registry.npm.taobao.org/adm-zip/download/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1"
+  
+  after@0.8.2:
+    version "0.8.2"
+    resolved "http://registry.npm.taobao.org/after/download/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
+  
+  agent-base@2:
+    version "2.1.1"
+    resolved "http://registry.npm.taobao.org/agent-base/download/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7"
+    dependencies:
+      extend "~3.0.0"
+      semver "~5.0.1"
+  
+  ajv-keywords@^2.0.0, ajv-keywords@^2.1.0:
+    version "2.1.1"
+    resolved "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
+  
+  ajv@^4.9.1:
+    version "4.11.8"
+    resolved "http://registry.npm.taobao.org/ajv/download/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+    dependencies:
+      co "^4.6.0"
+      json-stable-stringify "^1.0.1"
+  
+  ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5, ajv@^5.2.3:
+    version "5.5.2"
+    resolved "http://registry.npm.taobao.org/ajv/download/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+    dependencies:
+      co "^4.6.0"
+      fast-deep-equal "^1.0.0"
+      fast-json-stable-stringify "^2.0.0"
+      json-schema-traverse "^0.3.0"
+  
+  align-text@^0.1.1, align-text@^0.1.3:
+    version "0.1.4"
+    resolved "http://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+    dependencies:
+      kind-of "^3.0.2"
+      longest "^1.0.1"
+      repeat-string "^1.5.2"
+  
+  alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/alphanum-sort/download/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+  
+  amdefine@>=0.0.4, amdefine@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+  
+  angular-qq-maps@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/angular-qq-maps/download/angular-qq-maps-1.0.1.tgz#ba4f312f501bb208837081ed9dd7e595ba53c810"
+  
+  angular-split@^1.0.0-rc.0:
+    version "1.0.0-rc.0"
+    resolved "http://registry.npm.taobao.org/angular-split/download/angular-split-1.0.0-rc.0.tgz#d7ec2fcb2166ce0e63babe000e18126e6ee9a407"
+    dependencies:
+      tslib "^1.7.1"
+  
+  angular-tree-component@^7.0.1:
+    version "7.0.1"
+    resolved "http://registry.npm.taobao.org/angular-tree-component/download/angular-tree-component-7.0.1.tgz#fc8d0e72d8c34b87131a3ba2bd32ad20945689ac"
+    dependencies:
+      lodash "4.17.4"
+      mobx ">=3"
+      mobx-angular ">=1"
+  
+  angular2-baidu-map@^4.1.0:
+    version "4.1.0"
+    resolved "https://registry.yarnpkg.com/angular2-baidu-map/-/angular2-baidu-map-4.1.0.tgz#9992840349a78e3d3c3eaf3b3857fd85e59ccb32"
+  
+  ansi-escapes@^1.0.0:
+    version "1.4.0"
+    resolved "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+  
+  ansi-gray@^0.1.1:
+    version "0.1.1"
+    resolved "http://registry.npm.taobao.org/ansi-gray/download/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
+    dependencies:
+      ansi-wrap "0.1.0"
+  
+  ansi-html@0.0.7:
+    version "0.0.7"
+    resolved "http://registry.npm.taobao.org/ansi-html/download/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
+  
+  ansi-regex@^2.0.0:
+    version "2.1.1"
+    resolved "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+  
+  ansi-regex@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+  
+  ansi-styles@^2.2.1:
+    version "2.2.1"
+    resolved "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+  
+  ansi-styles@^3.1.0, ansi-styles@^3.2.0:
+    version "3.2.0"
+    resolved "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88"
+    dependencies:
+      color-convert "^1.9.0"
+  
+  ansi-wrap@0.1.0:
+    version "0.1.0"
+    resolved "http://registry.npm.taobao.org/ansi-wrap/download/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
+  
+  any-observable@^0.2.0:
+    version "0.2.0"
+    resolved "http://registry.npm.taobao.org/any-observable/download/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242"
+  
+  anymatch@^1.3.0:
+    version "1.3.2"
+    resolved "http://registry.npm.taobao.org/anymatch/download/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
+    dependencies:
+      micromatch "^2.1.5"
+      normalize-path "^2.0.0"
+  
+  app-root-path@^2.0.0, app-root-path@^2.0.1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/app-root-path/download/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46"
+  
+  append-transform@^0.4.0:
+    version "0.4.0"
+    resolved "http://registry.npm.taobao.org/append-transform/download/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
+    dependencies:
+      default-require-extensions "^1.0.0"
+  
+  aproba@^1.0.3, aproba@^1.1.1:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+  
+  archiver-utils@^1.3.0:
+    version "1.3.0"
+    resolved "http://registry.npm.taobao.org/archiver-utils/download/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174"
+    dependencies:
+      glob "^7.0.0"
+      graceful-fs "^4.1.0"
+      lazystream "^1.0.0"
+      lodash "^4.8.0"
+      normalize-path "^2.0.0"
+      readable-stream "^2.0.0"
+  
+  archiver@1.3.0:
+    version "1.3.0"
+    resolved "http://registry.npm.taobao.org/archiver/download/archiver-1.3.0.tgz#4f2194d6d8f99df3f531e6881f14f15d55faaf22"
+    dependencies:
+      archiver-utils "^1.3.0"
+      async "^2.0.0"
+      buffer-crc32 "^0.2.1"
+      glob "^7.0.0"
+      lodash "^4.8.0"
+      readable-stream "^2.0.0"
+      tar-stream "^1.5.0"
+      walkdir "^0.0.11"
+      zip-stream "^1.1.0"
+  
+  are-we-there-yet@~1.1.2:
+    version "1.1.4"
+    resolved "http://registry.npm.taobao.org/are-we-there-yet/download/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
+    dependencies:
+      delegates "^1.0.0"
+      readable-stream "^2.0.6"
+  
+  argparse@^1.0.7:
+    version "1.0.9"
+    resolved "http://registry.npm.taobao.org/argparse/download/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
+    dependencies:
+      sprintf-js "~1.0.2"
+  
+  argv@0.0.2:
+    version "0.0.2"
+    resolved "http://registry.npm.taobao.org/argv/download/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab"
+  
+  arr-diff@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+    dependencies:
+      arr-flatten "^1.0.1"
+  
+  arr-flatten@^1.0.1:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+  
+  array-differ@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/array-differ/download/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
+  
+  array-filter@~0.0.0:
+    version "0.0.1"
+    resolved "http://registry.npm.taobao.org/array-filter/download/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+  
+  array-find-index@^1.0.1:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/array-find-index/download/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+  
+  array-flatten@1.1.1:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+  
+  array-flatten@^2.1.0:
+    version "2.1.1"
+    resolved "http://registry.npm.taobao.org/array-flatten/download/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296"
+  
+  array-includes@^3.0.3:
+    version "3.0.3"
+    resolved "http://registry.npm.taobao.org/array-includes/download/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d"
+    dependencies:
+      define-properties "^1.1.2"
+      es-abstract "^1.7.0"
+  
+  array-iterate@^1.0.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/array-iterate/download/array-iterate-1.1.1.tgz#865bf7f8af39d6b0982c60902914ac76bc0108f6"
+  
+  array-map@~0.0.0:
+    version "0.0.0"
+    resolved "http://registry.npm.taobao.org/array-map/download/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+  
+  array-reduce@~0.0.0:
+    version "0.0.0"
+    resolved "http://registry.npm.taobao.org/array-reduce/download/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+  
+  array-slice@^0.2.3:
+    version "0.2.3"
+    resolved "http://registry.npm.taobao.org/array-slice/download/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
+  
+  array-union@^1.0.1:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+    dependencies:
+      array-uniq "^1.0.1"
+  
+  array-uniq@^1.0.1, array-uniq@^1.0.2:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+  
+  array-unique@^0.2.1:
+    version "0.2.1"
+    resolved "http://registry.npm.taobao.org/array-unique/download/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+  
+  arraybuffer.slice@0.0.6:
+    version "0.0.6"
+    resolved "http://registry.npm.taobao.org/arraybuffer.slice/download/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca"
+  
+  arrify@^1.0.0, arrify@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/arrify/download/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+  
+  asap@~2.0.3:
+    version "2.0.6"
+    resolved "http://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+  
+  asn1.js@^4.0.0:
+    version "4.9.2"
+    resolved "http://registry.npm.taobao.org/asn1.js/download/asn1.js-4.9.2.tgz#8117ef4f7ed87cd8f89044b5bff97ac243a16c9a"
+    dependencies:
+      bn.js "^4.0.0"
+      inherits "^2.0.1"
+      minimalistic-assert "^1.0.0"
+  
+  asn1@~0.2.3:
+    version "0.2.3"
+    resolved "http://registry.npm.taobao.org/asn1/download/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+  
+  assert-plus@1.0.0, assert-plus@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+  
+  assert-plus@^0.2.0:
+    version "0.2.0"
+    resolved "http://registry.npm.taobao.org/assert-plus/download/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+  
+  assert@^1.1.1:
+    version "1.4.1"
+    resolved "http://registry.npm.taobao.org/assert/download/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+    dependencies:
+      util "0.10.3"
+  
+  async-each@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/async-each/download/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+  
+  async-foreach@^0.1.3:
+    version "0.1.3"
+    resolved "http://registry.npm.taobao.org/async-foreach/download/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
+  
+  async-limiter@~1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
+  
+  async@1.x, async@^1.4.0, async@^1.5.2:
+    version "1.5.2"
+    resolved "http://registry.npm.taobao.org/async/download/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+  
+  async@2.0.1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/async/download/async-2.0.1.tgz#b709cc0280a9c36f09f4536be823c838a9049e25"
+    dependencies:
+      lodash "^4.8.0"
+  
+  async@^2.0.0, async@^2.1.2, async@^2.1.4, async@^2.1.5, async@^2.4.1, async@^2.5.0:
+    version "2.6.0"
+    resolved "http://registry.npm.taobao.org/async/download/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4"
+    dependencies:
+      lodash "^4.14.0"
+  
+  asynckit@^0.4.0:
+    version "0.4.0"
+    resolved "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+  
+  autoprefixer@^6.3.1, autoprefixer@^6.5.3:
+    version "6.7.7"
+    resolved "http://registry.npm.taobao.org/autoprefixer/download/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
+    dependencies:
+      browserslist "^1.7.6"
+      caniuse-db "^1.0.30000634"
+      normalize-range "^0.1.2"
+      num2fraction "^1.2.2"
+      postcss "^5.2.16"
+      postcss-value-parser "^3.2.3"
+  
+  autoprefixer@^7.1.2:
+    version "7.2.4"
+    resolved "http://registry.npm.taobao.org/autoprefixer/download/autoprefixer-7.2.4.tgz#29b367c03876a29bfd3721260d945e3545666c8d"
+    dependencies:
+      browserslist "^2.10.2"
+      caniuse-lite "^1.0.30000784"
+      normalize-range "^0.1.2"
+      num2fraction "^1.2.2"
+      postcss "^6.0.15"
+      postcss-value-parser "^3.2.3"
+  
+  aws-sign2@~0.6.0:
+    version "0.6.0"
+    resolved "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+  
+  aws-sign2@~0.7.0:
+    version "0.7.0"
+    resolved "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+  
+  aws4@^1.2.1, aws4@^1.6.0:
+    version "1.6.0"
+    resolved "http://registry.npm.taobao.org/aws4/download/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+  
+  babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
+    version "6.26.0"
+    resolved "http://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+    dependencies:
+      chalk "^1.1.3"
+      esutils "^2.0.2"
+      js-tokens "^3.0.2"
+  
+  babel-generator@^6.18.0:
+    version "6.26.0"
+    resolved "http://registry.npm.taobao.org/babel-generator/download/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5"
+    dependencies:
+      babel-messages "^6.23.0"
+      babel-runtime "^6.26.0"
+      babel-types "^6.26.0"
+      detect-indent "^4.0.0"
+      jsesc "^1.3.0"
+      lodash "^4.17.4"
+      source-map "^0.5.6"
+      trim-right "^1.0.1"
+  
+  babel-messages@^6.23.0:
+    version "6.23.0"
+    resolved "http://registry.npm.taobao.org/babel-messages/download/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+    dependencies:
+      babel-runtime "^6.22.0"
+  
+  babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+    version "6.26.0"
+    resolved "http://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+    dependencies:
+      core-js "^2.4.0"
+      regenerator-runtime "^0.11.0"
+  
+  babel-template@^6.16.0:
+    version "6.26.0"
+    resolved "http://registry.npm.taobao.org/babel-template/download/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+    dependencies:
+      babel-runtime "^6.26.0"
+      babel-traverse "^6.26.0"
+      babel-types "^6.26.0"
+      babylon "^6.18.0"
+      lodash "^4.17.4"
+  
+  babel-traverse@^6.18.0, babel-traverse@^6.26.0:
+    version "6.26.0"
+    resolved "http://registry.npm.taobao.org/babel-traverse/download/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+    dependencies:
+      babel-code-frame "^6.26.0"
+      babel-messages "^6.23.0"
+      babel-runtime "^6.26.0"
+      babel-types "^6.26.0"
+      babylon "^6.18.0"
+      debug "^2.6.8"
+      globals "^9.18.0"
+      invariant "^2.2.2"
+      lodash "^4.17.4"
+  
+  babel-types@^6.18.0, babel-types@^6.26.0:
+    version "6.26.0"
+    resolved "http://registry.npm.taobao.org/babel-types/download/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+    dependencies:
+      babel-runtime "^6.26.0"
+      esutils "^2.0.2"
+      lodash "^4.17.4"
+      to-fast-properties "^1.0.3"
+  
+  babylon@^6.18.0:
+    version "6.18.0"
+    resolved "http://registry.npm.taobao.org/babylon/download/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+  
+  backo2@1.0.2:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/backo2/download/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+  
+  bail@^1.0.0:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/bail/download/bail-1.0.2.tgz#f7d6c1731630a9f9f0d4d35ed1f962e2074a1764"
+  
+  balanced-match@^0.4.2:
+    version "0.4.2"
+    resolved "http://registry.npm.taobao.org/balanced-match/download/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+  
+  balanced-match@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+  
+  base64-arraybuffer@0.1.5:
+    version "0.1.5"
+    resolved "http://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
+  
+  base64-js@^1.0.2:
+    version "1.2.1"
+    resolved "http://registry.npm.taobao.org/base64-js/download/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886"
+  
+  base64id@1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/base64id/download/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6"
+  
+  batch@0.6.1:
+    version "0.6.1"
+    resolved "http://registry.npm.taobao.org/batch/download/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
+  
+  bcrypt-pbkdf@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+    dependencies:
+      tweetnacl "^0.14.3"
+  
+  beeper@^1.0.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/beeper/download/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
+  
+  better-assert@~1.0.0:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/better-assert/download/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
+    dependencies:
+      callsite "1.0.0"
+  
+  big.js@^3.1.3:
+    version "3.2.0"
+    resolved "http://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+  
+  binary-extensions@^1.0.0:
+    version "1.11.0"
+    resolved "http://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+  
+  bl@^1.0.0:
+    version "1.2.1"
+    resolved "http://registry.npm.taobao.org/bl/download/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e"
+    dependencies:
+      readable-stream "^2.0.5"
+  
+  blob@0.0.4:
+    version "0.0.4"
+    resolved "http://registry.npm.taobao.org/blob/download/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921"
+  
+  block-stream@*:
+    version "0.0.9"
+    resolved "http://registry.npm.taobao.org/block-stream/download/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+    dependencies:
+      inherits "~2.0.0"
+  
+  blocking-proxy@0.0.5:
+    version "0.0.5"
+    resolved "http://registry.npm.taobao.org/blocking-proxy/download/blocking-proxy-0.0.5.tgz#462905e0dcfbea970f41aa37223dda9c07b1912b"
+    dependencies:
+      minimist "^1.2.0"
+  
+  bluebird@^3.3.0, bluebird@^3.4.7, bluebird@^3.5.0:
+    version "3.5.1"
+    resolved "http://registry.npm.taobao.org/bluebird/download/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
+  
+  bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+    version "4.11.8"
+    resolved "http://registry.npm.taobao.org/bn.js/download/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+  
+  body-parser@1.18.2, body-parser@^1.16.1:
+    version "1.18.2"
+    resolved "http://registry.npm.taobao.org/body-parser/download/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
+    dependencies:
+      bytes "3.0.0"
+      content-type "~1.0.4"
+      debug "2.6.9"
+      depd "~1.1.1"
+      http-errors "~1.6.2"
+      iconv-lite "0.4.19"
+      on-finished "~2.3.0"
+      qs "6.5.1"
+      raw-body "2.3.2"
+      type-is "~1.6.15"
+  
+  bonjour@^3.5.0:
+    version "3.5.0"
+    resolved "http://registry.npm.taobao.org/bonjour/download/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"
+    dependencies:
+      array-flatten "^2.1.0"
+      deep-equal "^1.0.1"
+      dns-equal "^1.0.0"
+      dns-txt "^2.0.2"
+      multicast-dns "^6.0.1"
+      multicast-dns-service-types "^1.1.0"
+  
+  boolbase@~1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+  
+  boom@2.x.x:
+    version "2.10.1"
+    resolved "http://registry.npm.taobao.org/boom/download/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+    dependencies:
+      hoek "2.x.x"
+  
+  boom@4.x.x:
+    version "4.3.1"
+    resolved "http://registry.npm.taobao.org/boom/download/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31"
+    dependencies:
+      hoek "4.x.x"
+  
+  boom@5.x.x:
+    version "5.2.0"
+    resolved "http://registry.npm.taobao.org/boom/download/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02"
+    dependencies:
+      hoek "4.x.x"
+  
+  brace-expansion@^1.1.7:
+    version "1.1.8"
+    resolved "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
+    dependencies:
+      balanced-match "^1.0.0"
+      concat-map "0.0.1"
+  
+  braces@^0.1.2:
+    version "0.1.5"
+    resolved "http://registry.npm.taobao.org/braces/download/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6"
+    dependencies:
+      expand-range "^0.1.0"
+  
+  braces@^1.8.2:
+    version "1.8.5"
+    resolved "http://registry.npm.taobao.org/braces/download/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+    dependencies:
+      expand-range "^1.8.1"
+      preserve "^0.2.0"
+      repeat-element "^1.1.2"
+  
+  brorand@^1.0.1:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+  
+  browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f"
+    dependencies:
+      buffer-xor "^1.0.3"
+      cipher-base "^1.0.0"
+      create-hash "^1.1.0"
+      evp_bytestokey "^1.0.3"
+      inherits "^2.0.1"
+      safe-buffer "^5.0.1"
+  
+  browserify-cipher@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
+    dependencies:
+      browserify-aes "^1.0.4"
+      browserify-des "^1.0.0"
+      evp_bytestokey "^1.0.0"
+  
+  browserify-des@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
+    dependencies:
+      cipher-base "^1.0.1"
+      des.js "^1.0.0"
+      inherits "^2.0.1"
+  
+  browserify-rsa@^4.0.0:
+    version "4.0.1"
+    resolved "http://registry.npm.taobao.org/browserify-rsa/download/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+    dependencies:
+      bn.js "^4.1.0"
+      randombytes "^2.0.1"
+  
+  browserify-sign@^4.0.0:
+    version "4.0.4"
+    resolved "http://registry.npm.taobao.org/browserify-sign/download/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+    dependencies:
+      bn.js "^4.1.1"
+      browserify-rsa "^4.0.0"
+      create-hash "^1.1.0"
+      create-hmac "^1.1.2"
+      elliptic "^6.0.0"
+      inherits "^2.0.1"
+      parse-asn1 "^5.0.0"
+  
+  browserify-zlib@^0.2.0:
+    version "0.2.0"
+    resolved "http://registry.npm.taobao.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+    dependencies:
+      pako "~1.0.5"
+  
+  browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6:
+    version "1.7.7"
+    resolved "http://registry.npm.taobao.org/browserslist/download/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9"
+    dependencies:
+      caniuse-db "^1.0.30000639"
+      electron-to-chromium "^1.2.7"
+  
+  browserslist@^2.10.2:
+    version "2.11.0"
+    resolved "http://registry.npm.taobao.org/browserslist/download/browserslist-2.11.0.tgz#50350d6873a82ebe0f3ae5483658c571ae5f9d7d"
+    dependencies:
+      caniuse-lite "^1.0.30000784"
+      electron-to-chromium "^1.3.30"
+  
+  buffer-crc32@^0.2.1:
+    version "0.2.13"
+    resolved "http://registry.npm.taobao.org/buffer-crc32/download/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+  
+  buffer-indexof@^1.0.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/buffer-indexof/download/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
+  
+  buffer-xor@^1.0.3:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+  
+  buffer@^4.3.0:
+    version "4.9.1"
+    resolved "http://registry.npm.taobao.org/buffer/download/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+    dependencies:
+      base64-js "^1.0.2"
+      ieee754 "^1.1.4"
+      isarray "^1.0.0"
+  
+  builtin-modules@^1.0.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+  
+  builtin-status-codes@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+  
+  bytes@3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+  
+  cacache@^10.0.1:
+    version "10.0.2"
+    resolved "http://registry.npm.taobao.org/cacache/download/cacache-10.0.2.tgz#105a93a162bbedf3a25da42e1939ed99ffb145f8"
+    dependencies:
+      bluebird "^3.5.0"
+      chownr "^1.0.1"
+      glob "^7.1.2"
+      graceful-fs "^4.1.11"
+      lru-cache "^4.1.1"
+      mississippi "^1.3.0"
+      mkdirp "^0.5.1"
+      move-concurrently "^1.0.1"
+      promise-inflight "^1.0.1"
+      rimraf "^2.6.1"
+      ssri "^5.0.0"
+      unique-filename "^1.1.0"
+      y18n "^3.2.1"
+  
+  callsite@1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/callsite/download/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
+  
+  camel-case@3.0.x:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
+    dependencies:
+      no-case "^2.2.0"
+      upper-case "^1.1.1"
+  
+  camelcase-keys@^2.0.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+    dependencies:
+      camelcase "^2.0.0"
+      map-obj "^1.0.0"
+  
+  camelcase-keys@^4.0.0:
+    version "4.2.0"
+    resolved "http://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77"
+    dependencies:
+      camelcase "^4.1.0"
+      map-obj "^2.0.0"
+      quick-lru "^1.0.0"
+  
+  camelcase@^1.0.2:
+    version "1.2.1"
+    resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+  
+  camelcase@^2.0.0:
+    version "2.1.1"
+    resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+  
+  camelcase@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+  
+  camelcase@^4.1.0:
+    version "4.1.0"
+    resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+  
+  caniuse-api@^1.5.2:
+    version "1.6.1"
+    resolved "http://registry.npm.taobao.org/caniuse-api/download/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"
+    dependencies:
+      browserslist "^1.3.6"
+      caniuse-db "^1.0.30000529"
+      lodash.memoize "^4.1.2"
+      lodash.uniq "^4.5.0"
+  
+  caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
+    version "1.0.30000789"
+    resolved "http://registry.npm.taobao.org/caniuse-db/download/caniuse-db-1.0.30000789.tgz#5cf3fec75480041ab162ca06413153141e234325"
+  
+  caniuse-lite@^1.0.30000784:
+    version "1.0.30000789"
+    resolved "http://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30000789.tgz#2e3d937b267133f63635ef7f441fac66360fc889"
+  
+  caseless@~0.11.0:
+    version "0.11.0"
+    resolved "http://registry.npm.taobao.org/caseless/download/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
+  
+  caseless@~0.12.0:
+    version "0.12.0"
+    resolved "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+  
+  ccount@^1.0.0:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/ccount/download/ccount-1.0.2.tgz#53b6a2f815bb77b9c2871f7b9a72c3a25f1d8e89"
+  
+  center-align@^0.1.1:
+    version "0.1.3"
+    resolved "http://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+    dependencies:
+      align-text "^0.1.3"
+      lazy-cache "^1.0.3"
+  
+  cfb@~1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/cfb/download/cfb-1.0.1.tgz#557bb24f67dae78803785a1595d365bc82c5fab4"
+    dependencies:
+      commander "^2.12.1"
+      printj "~1.1.0"
+  
+  chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
+    version "1.1.3"
+    resolved "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+    dependencies:
+      ansi-styles "^2.2.1"
+      escape-string-regexp "^1.0.2"
+      has-ansi "^2.0.0"
+      strip-ansi "^3.0.0"
+      supports-color "^2.0.0"
+  
+  chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0:
+    version "2.3.0"
+    resolved "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba"
+    dependencies:
+      ansi-styles "^3.1.0"
+      escape-string-regexp "^1.0.5"
+      supports-color "^4.0.0"
+  
+  chalk@~2.2.0:
+    version "2.2.2"
+    resolved "http://registry.npm.taobao.org/chalk/download/chalk-2.2.2.tgz#4403f5cf18f35c05f51fbdf152bf588f956cf7cb"
+    dependencies:
+      ansi-styles "^3.1.0"
+      escape-string-regexp "^1.0.5"
+      supports-color "^4.0.0"
+  
+  character-entities-html4@^1.0.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/character-entities-html4/download/character-entities-html4-1.1.1.tgz#359a2a4a0f7e29d3dc2ac99bdbe21ee39438ea50"
+  
+  character-entities-legacy@^1.0.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/character-entities-legacy/download/character-entities-legacy-1.1.1.tgz#f40779df1a101872bb510a3d295e1fccf147202f"
+  
+  character-entities@^1.0.0:
+    version "1.2.1"
+    resolved "http://registry.npm.taobao.org/character-entities/download/character-entities-1.2.1.tgz#f76871be5ef66ddb7f8f8e3478ecc374c27d6dca"
+  
+  character-reference-invalid@^1.0.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/character-reference-invalid/download/character-reference-invalid-1.1.1.tgz#942835f750e4ec61a308e60c2ef8cc1011202efc"
+  
+  chokidar@^1.4.1, chokidar@^1.4.2, chokidar@^1.6.0, chokidar@^1.7.0:
+    version "1.7.0"
+    resolved "http://registry.npm.taobao.org/chokidar/download/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+    dependencies:
+      anymatch "^1.3.0"
+      async-each "^1.0.0"
+      glob-parent "^2.0.0"
+      inherits "^2.0.1"
+      is-binary-path "^1.0.0"
+      is-glob "^2.0.0"
+      path-is-absolute "^1.0.0"
+      readdirp "^2.0.0"
+    optionalDependencies:
+      fsevents "^1.0.0"
+  
+  chownr@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/chownr/download/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+  
+  cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+    version "1.0.4"
+    resolved "http://registry.npm.taobao.org/cipher-base/download/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+    dependencies:
+      inherits "^2.0.1"
+      safe-buffer "^5.0.1"
+  
+  circular-dependency-plugin@^4.2.1:
+    version "4.3.0"
+    resolved "http://registry.npm.taobao.org/circular-dependency-plugin/download/circular-dependency-plugin-4.3.0.tgz#2a12824e584546e1aeea5865b7bf234a11c4a695"
+  
+  circular-json@^0.3.1:
+    version "0.3.3"
+    resolved "http://registry.npm.taobao.org/circular-json/download/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+  
+  clap@^1.0.9:
+    version "1.2.3"
+    resolved "http://registry.npm.taobao.org/clap/download/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
+    dependencies:
+      chalk "^1.1.3"
+  
+  clean-css@4.1.x:
+    version "4.1.9"
+    resolved "http://registry.npm.taobao.org/clean-css/download/clean-css-4.1.9.tgz#35cee8ae7687a49b98034f70de00c4edd3826301"
+    dependencies:
+      source-map "0.5.x"
+  
+  cli-cursor@^1.0.2:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/cli-cursor/download/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+    dependencies:
+      restore-cursor "^1.0.1"
+  
+  cli-spinners@^0.1.2:
+    version "0.1.2"
+    resolved "http://registry.npm.taobao.org/cli-spinners/download/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c"
+  
+  cli-truncate@^0.2.1:
+    version "0.2.1"
+    resolved "http://registry.npm.taobao.org/cli-truncate/download/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574"
+    dependencies:
+      slice-ansi "0.0.4"
+      string-width "^1.0.1"
+  
+  cliui@^2.1.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+    dependencies:
+      center-align "^0.1.1"
+      right-align "^0.1.1"
+      wordwrap "0.0.2"
+  
+  cliui@^3.2.0:
+    version "3.2.0"
+    resolved "http://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+    dependencies:
+      string-width "^1.0.1"
+      strip-ansi "^3.0.1"
+      wrap-ansi "^2.0.0"
+  
+  clone-deep@^0.3.0:
+    version "0.3.0"
+    resolved "http://registry.npm.taobao.org/clone-deep/download/clone-deep-0.3.0.tgz#348c61ae9cdbe0edfe053d91ff4cc521d790ede8"
+    dependencies:
+      for-own "^1.0.0"
+      is-plain-object "^2.0.1"
+      kind-of "^3.2.2"
+      shallow-clone "^0.1.2"
+  
+  clone-regexp@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/clone-regexp/download/clone-regexp-1.0.0.tgz#eae0a2413f55c0942f818c229fefce845d7f3b1c"
+    dependencies:
+      is-regexp "^1.0.0"
+      is-supported-regexp-flag "^1.0.0"
+  
+  clone-stats@^0.0.1:
+    version "0.0.1"
+    resolved "http://registry.npm.taobao.org/clone-stats/download/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
+  
+  clone@^1.0.0, clone@^1.0.2:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/clone/download/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f"
+  
+  clone@^2.1.1:
+    version "2.1.1"
+    resolved "http://registry.npm.taobao.org/clone/download/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
+  
+  co@^4.6.0:
+    version "4.6.0"
+    resolved "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+  
+  coa@~1.0.1:
+    version "1.0.4"
+    resolved "http://registry.npm.taobao.org/coa/download/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd"
+    dependencies:
+      q "^1.1.2"
+  
+  code-point-at@^1.0.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+  
+  codecov@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/codecov/download/codecov-3.0.0.tgz#c273b8c4f12945723e8dc9d25803d89343e5f28e"
+    dependencies:
+      argv "0.0.2"
+      request "2.81.0"
+      urlgrey "0.4.4"
+  
+  codelyzer@~4.0.1:
+    version "4.0.2"
+    resolved "http://registry.npm.taobao.org/codelyzer/download/codelyzer-4.0.2.tgz#d5e2390b97d95e73a7b1e6f0cf03e16cbf35b06f"
+    dependencies:
+      app-root-path "^2.0.1"
+      css-selector-tokenizer "^0.7.0"
+      cssauron "^1.4.0"
+      semver-dsl "^1.0.1"
+      source-map "^0.5.6"
+      sprintf-js "^1.0.3"
+  
+  codepage@~1.11.0:
+    version "1.11.1"
+    resolved "http://registry.npm.taobao.org/codepage/download/codepage-1.11.1.tgz#86472397ea5b2cdbb07b77016a512477a3cb8823"
+    dependencies:
+      commander "~2.11.0"
+      exit-on-epipe "~1.0.1"
+      voc "~1.0.0"
+  
+  collapse-white-space@^1.0.2:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/collapse-white-space/download/collapse-white-space-1.0.3.tgz#4b906f670e5a963a87b76b0e1689643341b6023c"
+  
+  color-convert@^1.3.0, color-convert@^1.9.0:
+    version "1.9.1"
+    resolved "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed"
+    dependencies:
+      color-name "^1.1.1"
+  
+  color-name@^1.0.0, color-name@^1.1.1:
+    version "1.1.3"
+    resolved "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+  
+  color-string@^0.3.0:
+    version "0.3.0"
+    resolved "http://registry.npm.taobao.org/color-string/download/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991"
+    dependencies:
+      color-name "^1.0.0"
+  
+  color-support@^1.1.3:
+    version "1.1.3"
+    resolved "http://registry.npm.taobao.org/color-support/download/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
+  
+  color@^0.11.0:
+    version "0.11.4"
+    resolved "http://registry.npm.taobao.org/color/download/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
+    dependencies:
+      clone "^1.0.2"
+      color-convert "^1.3.0"
+      color-string "^0.3.0"
+  
+  colormin@^1.0.5:
+    version "1.1.2"
+    resolved "http://registry.npm.taobao.org/colormin/download/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133"
+    dependencies:
+      color "^0.11.0"
+      css-color-names "0.0.4"
+      has "^1.0.1"
+  
+  colors@1.1.2, colors@^1.1.0, colors@^1.1.2, colors@~1.1.2:
+    version "1.1.2"
+    resolved "http://registry.npm.taobao.org/colors/download/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+  
+  combine-lists@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/combine-lists/download/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6"
+    dependencies:
+      lodash "^4.5.0"
+  
+  combined-stream@^1.0.5, combined-stream@~1.0.5:
+    version "1.0.5"
+    resolved "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
+    dependencies:
+      delayed-stream "~1.0.0"
+  
+  commander@*, commander@2, commander@2.12.x, commander@^2.11.0, commander@^2.12.1, commander@^2.9.0, commander@~2.12.1:
+    version "2.12.2"
+    resolved "http://registry.npm.taobao.org/commander/download/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555"
+  
+  commander@~2.11.0:
+    version "2.11.0"
+    resolved "http://registry.npm.taobao.org/commander/download/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
+  
+  common-tags@^1.3.1:
+    version "1.7.0"
+    resolved "http://registry.npm.taobao.org/common-tags/download/common-tags-1.7.0.tgz#2457c9d6c64f22b250c84c11c9b3f98b428f3083"
+    dependencies:
+      babel-runtime "^6.26.0"
+  
+  commondir@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+  
+  component-bind@1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/component-bind/download/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
+  
+  component-emitter@1.1.2:
+    version "1.1.2"
+    resolved "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"
+  
+  component-emitter@1.2.1:
+    version "1.2.1"
+    resolved "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+  
+  component-inherit@0.0.3:
+    version "0.0.3"
+    resolved "http://registry.npm.taobao.org/component-inherit/download/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
+  
+  compress-commons@^1.2.0:
+    version "1.2.2"
+    resolved "http://registry.npm.taobao.org/compress-commons/download/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f"
+    dependencies:
+      buffer-crc32 "^0.2.1"
+      crc32-stream "^2.0.0"
+      normalize-path "^2.0.0"
+      readable-stream "^2.0.0"
+  
+  compressible@~2.0.11:
+    version "2.0.12"
+    resolved "http://registry.npm.taobao.org/compressible/download/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66"
+    dependencies:
+      mime-db ">= 1.30.0 < 2"
+  
+  compression@^1.5.2:
+    version "1.7.1"
+    resolved "http://registry.npm.taobao.org/compression/download/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db"
+    dependencies:
+      accepts "~1.3.4"
+      bytes "3.0.0"
+      compressible "~2.0.11"
+      debug "2.6.9"
+      on-headers "~1.0.1"
+      safe-buffer "5.1.1"
+      vary "~1.1.2"
+  
+  concat-map@0.0.1:
+    version "0.0.1"
+    resolved "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+  
+  concat-stream@^1.5.0:
+    version "1.6.0"
+    resolved "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
+    dependencies:
+      inherits "^2.0.3"
+      readable-stream "^2.2.2"
+      typedarray "^0.0.6"
+  
+  connect-history-api-fallback@^1.3.0:
+    version "1.5.0"
+    resolved "http://registry.npm.taobao.org/connect-history-api-fallback/download/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a"
+  
+  connect@^3.6.0:
+    version "3.6.5"
+    resolved "http://registry.npm.taobao.org/connect/download/connect-3.6.5.tgz#fb8dde7ba0763877d0ec9df9dac0b4b40e72c7da"
+    dependencies:
+      debug "2.6.9"
+      finalhandler "1.0.6"
+      parseurl "~1.3.2"
+      utils-merge "1.0.1"
+  
+  console-browserify@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/console-browserify/download/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+    dependencies:
+      date-now "^0.1.4"
+  
+  console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/console-control-strings/download/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+  
+  constants-browserify@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/constants-browserify/download/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+  
+  content-disposition@0.5.2:
+    version "0.5.2"
+    resolved "http://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
+  
+  content-type@~1.0.4:
+    version "1.0.4"
+    resolved "http://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+  
+  convert-source-map@^1.3.0:
+    version "1.5.1"
+    resolved "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+  
+  cookie-signature@1.0.6:
+    version "1.0.6"
+    resolved "http://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+  
+  cookie@0.3.1:
+    version "0.3.1"
+    resolved "http://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+  
+  copy-concurrently@^1.0.0:
+    version "1.0.5"
+    resolved "http://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+    dependencies:
+      aproba "^1.1.1"
+      fs-write-stream-atomic "^1.0.8"
+      iferr "^0.1.5"
+      mkdirp "^0.5.1"
+      rimraf "^2.5.4"
+      run-queue "^1.0.0"
+  
+  copy-webpack-plugin@^4.1.1:
+    version "4.3.1"
+    resolved "http://registry.npm.taobao.org/copy-webpack-plugin/download/copy-webpack-plugin-4.3.1.tgz#19ba6370bf6f8e263cbd66185a2b79f2321a9302"
+    dependencies:
+      cacache "^10.0.1"
+      find-cache-dir "^1.0.0"
+      globby "^7.1.1"
+      is-glob "^4.0.0"
+      loader-utils "^0.2.15"
+      lodash "^4.3.0"
+      minimatch "^3.0.4"
+      p-limit "^1.0.0"
+      pify "^3.0.0"
+      serialize-javascript "^1.4.0"
+  
+  core-js@^2.2.0, core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.1:
+    version "2.5.3"
+    resolved "http://registry.npm.taobao.org/core-js/download/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e"
+  
+  core-object@^3.1.0:
+    version "3.1.5"
+    resolved "http://registry.npm.taobao.org/core-object/download/core-object-3.1.5.tgz#fa627b87502adc98045e44678e9a8ec3b9c0d2a9"
+    dependencies:
+      chalk "^2.0.0"
+  
+  core-util-is@1.0.2, core-util-is@~1.0.0:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+  
+  cosmiconfig@^2.1.0, cosmiconfig@^2.1.1:
+    version "2.2.2"
+    resolved "http://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892"
+    dependencies:
+      is-directory "^0.3.1"
+      js-yaml "^3.4.3"
+      minimist "^1.2.0"
+      object-assign "^4.1.0"
+      os-homedir "^1.0.1"
+      parse-json "^2.2.0"
+      require-from-string "^1.1.0"
+  
+  cosmiconfig@^3.1.0:
+    version "3.1.0"
+    resolved "http://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-3.1.0.tgz#640a94bf9847f321800403cd273af60665c73397"
+    dependencies:
+      is-directory "^0.3.1"
+      js-yaml "^3.9.0"
+      parse-json "^3.0.0"
+      require-from-string "^2.0.1"
+  
+  crc-32@~1.1.1:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/crc-32/download/crc-32-1.1.1.tgz#5d739d5e4c6e352ad8304d73223d483fe55adb8d"
+    dependencies:
+      exit-on-epipe "~1.0.1"
+      printj "~1.1.0"
+  
+  crc32-stream@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/crc32-stream/download/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4"
+    dependencies:
+      crc "^3.4.4"
+      readable-stream "^2.0.0"
+  
+  crc@^3.4.4:
+    version "3.5.0"
+    resolved "http://registry.npm.taobao.org/crc/download/crc-3.5.0.tgz#98b8ba7d489665ba3979f59b21381374101a1964"
+  
+  create-ecdh@^4.0.0:
+    version "4.0.0"
+    resolved "http://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
+    dependencies:
+      bn.js "^4.1.0"
+      elliptic "^6.0.0"
+  
+  create-hash@^1.1.0, create-hash@^1.1.2:
+    version "1.1.3"
+    resolved "http://registry.npm.taobao.org/create-hash/download/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
+    dependencies:
+      cipher-base "^1.0.1"
+      inherits "^2.0.1"
+      ripemd160 "^2.0.0"
+      sha.js "^2.4.0"
+  
+  create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+    version "1.1.6"
+    resolved "http://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
+    dependencies:
+      cipher-base "^1.0.3"
+      create-hash "^1.1.0"
+      inherits "^2.0.1"
+      ripemd160 "^2.0.0"
+      safe-buffer "^5.0.1"
+      sha.js "^2.4.8"
+  
+  cross-spawn@^3.0.0:
+    version "3.0.1"
+    resolved "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
+    dependencies:
+      lru-cache "^4.0.1"
+      which "^1.2.9"
+  
+  cross-spawn@^5.0.1, cross-spawn@^5.1.0:
+    version "5.1.0"
+    resolved "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+    dependencies:
+      lru-cache "^4.0.1"
+      shebang-command "^1.2.0"
+      which "^1.2.9"
+  
+  cryptiles@2.x.x:
+    version "2.0.5"
+    resolved "http://registry.npm.taobao.org/cryptiles/download/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+    dependencies:
+      boom "2.x.x"
+  
+  cryptiles@3.x.x:
+    version "3.1.2"
+    resolved "http://registry.npm.taobao.org/cryptiles/download/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe"
+    dependencies:
+      boom "5.x.x"
+  
+  crypto-browserify@^3.11.0:
+    version "3.12.0"
+    resolved "http://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+    dependencies:
+      browserify-cipher "^1.0.0"
+      browserify-sign "^4.0.0"
+      create-ecdh "^4.0.0"
+      create-hash "^1.1.0"
+      create-hmac "^1.1.0"
+      diffie-hellman "^5.0.0"
+      inherits "^2.0.1"
+      pbkdf2 "^3.0.3"
+      public-encrypt "^4.0.0"
+      randombytes "^2.0.0"
+      randomfill "^1.0.3"
+  
+  css-color-names@0.0.4:
+    version "0.0.4"
+    resolved "http://registry.npm.taobao.org/css-color-names/download/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+  
+  css-loader@^0.28.1:
+    version "0.28.8"
+    resolved "http://registry.npm.taobao.org/css-loader/download/css-loader-0.28.8.tgz#ff36381464dea18fe60f2601a060ba6445886bd5"
+    dependencies:
+      babel-code-frame "^6.26.0"
+      css-selector-tokenizer "^0.7.0"
+      cssnano "^3.10.0"
+      icss-utils "^2.1.0"
+      loader-utils "^1.0.2"
+      lodash.camelcase "^4.3.0"
+      object-assign "^4.1.1"
+      postcss "^5.0.6"
+      postcss-modules-extract-imports "^1.1.0"
+      postcss-modules-local-by-default "^1.2.0"
+      postcss-modules-scope "^1.1.0"
+      postcss-modules-values "^1.3.0"
+      postcss-value-parser "^3.3.0"
+      source-list-map "^2.0.0"
+  
+  css-parse@1.7.x:
+    version "1.7.0"
+    resolved "http://registry.npm.taobao.org/css-parse/download/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b"
+  
+  css-select@^1.1.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/css-select/download/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+    dependencies:
+      boolbase "~1.0.0"
+      css-what "2.1"
+      domutils "1.5.1"
+      nth-check "~1.0.1"
+  
+  css-selector-tokenizer@^0.7.0:
+    version "0.7.0"
+    resolved "http://registry.npm.taobao.org/css-selector-tokenizer/download/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86"
+    dependencies:
+      cssesc "^0.1.0"
+      fastparse "^1.1.1"
+      regexpu-core "^1.0.0"
+  
+  css-what@2.1:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/css-what/download/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
+  
+  cssauron@^1.4.0:
+    version "1.4.0"
+    resolved "http://registry.npm.taobao.org/cssauron/download/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8"
+    dependencies:
+      through X.X.X
+  
+  cssesc@^0.1.0:
+    version "0.1.0"
+    resolved "http://registry.npm.taobao.org/cssesc/download/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
+  
+  cssnano@^3.10.0:
+    version "3.10.0"
+    resolved "http://registry.npm.taobao.org/cssnano/download/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
+    dependencies:
+      autoprefixer "^6.3.1"
+      decamelize "^1.1.2"
+      defined "^1.0.0"
+      has "^1.0.1"
+      object-assign "^4.0.1"
+      postcss "^5.0.14"
+      postcss-calc "^5.2.0"
+      postcss-colormin "^2.1.8"
+      postcss-convert-values "^2.3.4"
+      postcss-discard-comments "^2.0.4"
+      postcss-discard-duplicates "^2.0.1"
+      postcss-discard-empty "^2.0.1"
+      postcss-discard-overridden "^0.1.1"
+      postcss-discard-unused "^2.2.1"
+      postcss-filter-plugins "^2.0.0"
+      postcss-merge-idents "^2.1.5"
+      postcss-merge-longhand "^2.0.1"
+      postcss-merge-rules "^2.0.3"
+      postcss-minify-font-values "^1.0.2"
+      postcss-minify-gradients "^1.0.1"
+      postcss-minify-params "^1.0.4"
+      postcss-minify-selectors "^2.0.4"
+      postcss-normalize-charset "^1.1.0"
+      postcss-normalize-url "^3.0.7"
+      postcss-ordered-values "^2.1.0"
+      postcss-reduce-idents "^2.2.2"
+      postcss-reduce-initial "^1.0.0"
+      postcss-reduce-transforms "^1.0.3"
+      postcss-svgo "^2.1.1"
+      postcss-unique-selectors "^2.0.2"
+      postcss-value-parser "^3.2.3"
+      postcss-zindex "^2.0.1"
+  
+  csso@~2.3.1:
+    version "2.3.2"
+    resolved "http://registry.npm.taobao.org/csso/download/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
+    dependencies:
+      clap "^1.0.9"
+      source-map "^0.5.3"
+  
+  cuint@latest:
+    version "0.2.2"
+    resolved "http://registry.npm.taobao.org/cuint/download/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
+  
+  currently-unhandled@^0.4.1:
+    version "0.4.1"
+    resolved "http://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+    dependencies:
+      array-find-index "^1.0.1"
+  
+  custom-event@~1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/custom-event/download/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425"
+  
+  cyclist@~0.2.2:
+    version "0.2.2"
+    resolved "http://registry.npm.taobao.org/cyclist/download/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
+  
+  d3-array@1, d3-array@~1.2.0:
+    version "1.2.1"
+    resolved "http://registry.npm.taobao.org/d3-array/download/d3-array-1.2.1.tgz#d1ca33de2f6ac31efadb8e050a021d7e2396d5dc"
+  
+  d3-collection@1:
+    version "1.0.4"
+    resolved "http://registry.npm.taobao.org/d3-collection/download/d3-collection-1.0.4.tgz#342dfd12837c90974f33f1cc0a785aea570dcdc2"
+  
+  d3-color@1:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/d3-color/download/d3-color-1.0.3.tgz#bc7643fca8e53a8347e2fbdaffa236796b58509b"
+  
+  d3-composite-projections@~1.2.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/d3-composite-projections/download/d3-composite-projections-1.2.0.tgz#fa0e6f1442f17d04643843a3a883c7d94e0c27c0"
+    dependencies:
+      d3-geo "1.2.4"
+      d3-path "^1.0.1"
+  
+  d3-dsv@~1.0.5:
+    version "1.0.8"
+    resolved "http://registry.npm.taobao.org/d3-dsv/download/d3-dsv-1.0.8.tgz#907e240d57b386618dc56468bacfe76bf19764ae"
+    dependencies:
+      commander "2"
+      iconv-lite "0.4"
+      rw "1"
+  
+  d3-ease@^1.0.3:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/d3-ease/download/d3-ease-1.0.3.tgz#68bfbc349338a380c44d8acc4fbc3304aa2d8c0e"
+  
+  d3-geo-projection@~2.1.2:
+    version "2.1.2"
+    resolved "http://registry.npm.taobao.org/d3-geo-projection/download/d3-geo-projection-2.1.2.tgz#7df8e1e9d046d631c6509f7e531357d4adc24aa3"
+    dependencies:
+      commander "2"
+      d3-array "1"
+      d3-geo "^1.1.0"
+  
+  d3-geo@1.2.4:
+    version "1.2.4"
+    resolved "http://registry.npm.taobao.org/d3-geo/download/d3-geo-1.2.4.tgz#d179f3baa76e623ef1e0d83693db705b7c599006"
+    dependencies:
+      d3-array "1"
+  
+  d3-geo@^1.1.0:
+    version "1.9.1"
+    resolved "http://registry.npm.taobao.org/d3-geo/download/d3-geo-1.9.1.tgz#157e3b0f917379d0f73bebfff3be537f49fa7356"
+    dependencies:
+      d3-array "1"
+  
+  d3-geo@~1.6.4:
+    version "1.6.4"
+    resolved "http://registry.npm.taobao.org/d3-geo/download/d3-geo-1.6.4.tgz#f20e1e461cb1845f5a8be55ab6f876542a7e3199"
+    dependencies:
+      d3-array "1"
+  
+  d3-hexjson@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/d3-hexjson/download/d3-hexjson-1.0.1.tgz#6a23111e8359f1e214f5d0afa379c02b2b67df0b"
+    dependencies:
+      d3-array "1"
+  
+  d3-hierarchy@~1.1.5:
+    version "1.1.5"
+    resolved "http://registry.npm.taobao.org/d3-hierarchy/download/d3-hierarchy-1.1.5.tgz#a1c845c42f84a206bcf1c01c01098ea4ddaa7a26"
+  
+  d3-interpolate@^1.1.5:
+    version "1.1.6"
+    resolved "http://registry.npm.taobao.org/d3-interpolate/download/d3-interpolate-1.1.6.tgz#2cf395ae2381804df08aa1bf766b7f97b5f68fb6"
+    dependencies:
+      d3-color "1"
+  
+  d3-path@1, d3-path@^1.0.1:
+    version "1.0.5"
+    resolved "http://registry.npm.taobao.org/d3-path/download/d3-path-1.0.5.tgz#241eb1849bd9e9e8021c0d0a799f8a0e8e441764"
+  
+  d3-sankey@~0.7.1:
+    version "0.7.1"
+    resolved "http://registry.npm.taobao.org/d3-sankey/download/d3-sankey-0.7.1.tgz#d229832268fc69a7fec84803e96c2256a614c521"
+    dependencies:
+      d3-array "1"
+      d3-collection "1"
+      d3-shape "^1.2.0"
+  
+  d3-shape@^1.2.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/d3-shape/download/d3-shape-1.2.0.tgz#45d01538f064bafd05ea3d6d2cb748fd8c41f777"
+    dependencies:
+      d3-path "1"
+  
+  d3-timer@^1.0.6:
+    version "1.0.7"
+    resolved "http://registry.npm.taobao.org/d3-timer/download/d3-timer-1.0.7.tgz#df9650ca587f6c96607ff4e60cc38229e8dd8531"
+  
+  d3-voronoi@~1.1.2:
+    version "1.1.2"
+    resolved "http://registry.npm.taobao.org/d3-voronoi/download/d3-voronoi-1.1.2.tgz#1687667e8f13a2d158c80c1480c5a29cb0d8973c"
+  
+  d@1:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/d/download/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+    dependencies:
+      es5-ext "^0.10.9"
+  
+  dashdash@^1.12.0:
+    version "1.14.1"
+    resolved "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+    dependencies:
+      assert-plus "^1.0.0"
+  
+  date-fns@^1.27.2:
+    version "1.29.0"
+    resolved "http://registry.npm.taobao.org/date-fns/download/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6"
+  
+  date-now@^0.1.4:
+    version "0.1.4"
+    resolved "http://registry.npm.taobao.org/date-now/download/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+  
+  dateformat@^1.0.11:
+    version "1.0.12"
+    resolved "http://registry.npm.taobao.org/dateformat/download/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9"
+    dependencies:
+      get-stdin "^4.0.1"
+      meow "^3.3.0"
+  
+  debug@*, debug@^3.0.0, debug@^3.1.0:
+    version "3.1.0"
+    resolved "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+    dependencies:
+      ms "2.0.0"
+  
+  debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.6.6, debug@^2.6.8:
+    version "2.6.9"
+    resolved "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+    dependencies:
+      ms "2.0.0"
+  
+  debug@2.2.0:
+    version "2.2.0"
+    resolved "http://registry.npm.taobao.org/debug/download/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+    dependencies:
+      ms "0.7.1"
+  
+  debug@2.3.3:
+    version "2.3.3"
+    resolved "http://registry.npm.taobao.org/debug/download/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c"
+    dependencies:
+      ms "0.7.2"
+  
+  decamelize-keys@^1.0.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/decamelize-keys/download/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
+    dependencies:
+      decamelize "^1.1.0"
+      map-obj "^1.0.0"
+  
+  decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+  
+  dedent@^0.7.0:
+    version "0.7.0"
+    resolved "http://registry.npm.taobao.org/dedent/download/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
+  
+  deep-equal@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+  
+  deep-extend@~0.4.0:
+    version "0.4.2"
+    resolved "http://registry.npm.taobao.org/deep-extend/download/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
+  
+  deep-is@~0.1.3:
+    version "0.1.3"
+    resolved "http://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+  
+  default-require-extensions@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/default-require-extensions/download/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
+    dependencies:
+      strip-bom "^2.0.0"
+  
+  define-properties@^1.1.2:
+    version "1.1.2"
+    resolved "http://registry.npm.taobao.org/define-properties/download/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+    dependencies:
+      foreach "^2.0.5"
+      object-keys "^1.0.8"
+  
+  defined@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/defined/download/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+  
+  del@^2.0.2, del@^2.2.0:
+    version "2.2.2"
+    resolved "http://registry.npm.taobao.org/del/download/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+    dependencies:
+      globby "^5.0.0"
+      is-path-cwd "^1.0.0"
+      is-path-in-cwd "^1.0.0"
+      object-assign "^4.0.1"
+      pify "^2.0.0"
+      pinkie-promise "^2.0.0"
+      rimraf "^2.2.8"
+  
+  del@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/del/download/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5"
+    dependencies:
+      globby "^6.1.0"
+      is-path-cwd "^1.0.0"
+      is-path-in-cwd "^1.0.0"
+      p-map "^1.1.1"
+      pify "^3.0.0"
+      rimraf "^2.2.8"
+  
+  delayed-stream@~1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+  
+  delegates@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+  
+  denodeify@^1.2.1:
+    version "1.2.1"
+    resolved "http://registry.npm.taobao.org/denodeify/download/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631"
+  
+  depd@1.1.1, depd@~1.1.1:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/depd/download/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
+  
+  des.js@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/des.js/download/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+    dependencies:
+      inherits "^2.0.1"
+      minimalistic-assert "^1.0.0"
+  
+  destroy@~1.0.4:
+    version "1.0.4"
+    resolved "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+  
+  detect-indent@^4.0.0:
+    version "4.0.0"
+    resolved "http://registry.npm.taobao.org/detect-indent/download/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+    dependencies:
+      repeating "^2.0.0"
+  
+  detect-libc@^1.0.2:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/detect-libc/download/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+  
+  detect-node@^2.0.3:
+    version "2.0.3"
+    resolved "http://registry.npm.taobao.org/detect-node/download/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127"
+  
+  di@^0.0.1:
+    version "0.0.1"
+    resolved "http://registry.npm.taobao.org/di/download/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c"
+  
+  diff@^3.1.0, diff@^3.2.0:
+    version "3.4.0"
+    resolved "http://registry.npm.taobao.org/diff/download/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c"
+  
+  diffie-hellman@^5.0.0:
+    version "5.0.2"
+    resolved "http://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
+    dependencies:
+      bn.js "^4.1.0"
+      miller-rabin "^4.0.0"
+      randombytes "^2.0.0"
+  
+  dir-glob@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/dir-glob/download/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034"
+    dependencies:
+      arrify "^1.0.1"
+      path-type "^3.0.0"
+  
+  dns-equal@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/dns-equal/download/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
+  
+  dns-packet@^1.0.1:
+    version "1.2.2"
+    resolved "http://registry.npm.taobao.org/dns-packet/download/dns-packet-1.2.2.tgz#a8a26bec7646438963fc86e06f8f8b16d6c8bf7a"
+    dependencies:
+      ip "^1.1.0"
+      safe-buffer "^5.0.1"
+  
+  dns-txt@^2.0.2:
+    version "2.0.2"
+    resolved "http://registry.npm.taobao.org/dns-txt/download/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6"
+    dependencies:
+      buffer-indexof "^1.0.0"
+  
+  dom-converter@~0.1:
+    version "0.1.4"
+    resolved "http://registry.npm.taobao.org/dom-converter/download/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b"
+    dependencies:
+      utila "~0.3"
+  
+  dom-serialize@^2.2.0:
+    version "2.2.1"
+    resolved "http://registry.npm.taobao.org/dom-serialize/download/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b"
+    dependencies:
+      custom-event "~1.0.0"
+      ent "~2.2.0"
+      extend "^3.0.0"
+      void-elements "^2.0.0"
+  
+  dom-serializer@0:
+    version "0.1.0"
+    resolved "http://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
+    dependencies:
+      domelementtype "~1.1.1"
+      entities "~1.1.1"
+  
+  domain-browser@^1.1.1:
+    version "1.1.7"
+    resolved "http://registry.npm.taobao.org/domain-browser/download/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
+  
+  domelementtype@1, domelementtype@^1.3.0:
+    version "1.3.0"
+    resolved "http://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
+  
+  domelementtype@~1.1.1:
+    version "1.1.3"
+    resolved "http://registry.npm.taobao.org/domelementtype/download/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
+  
+  domhandler@2.1:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/domhandler/download/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594"
+    dependencies:
+      domelementtype "1"
+  
+  domhandler@^2.3.0:
+    version "2.4.1"
+    resolved "http://registry.npm.taobao.org/domhandler/download/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259"
+    dependencies:
+      domelementtype "1"
+  
+  domutils@1.1:
+    version "1.1.6"
+    resolved "http://registry.npm.taobao.org/domutils/download/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485"
+    dependencies:
+      domelementtype "1"
+  
+  domutils@1.5.1:
+    version "1.5.1"
+    resolved "http://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+    dependencies:
+      dom-serializer "0"
+      domelementtype "1"
+  
+  domutils@^1.5.1:
+    version "1.6.2"
+    resolved "http://registry.npm.taobao.org/domutils/download/domutils-1.6.2.tgz#1958cc0b4c9426e9ed367fb1c8e854891b0fa3ff"
+    dependencies:
+      dom-serializer "0"
+      domelementtype "1"
+  
+  dot-prop@^4.1.1:
+    version "4.2.0"
+    resolved "http://registry.npm.taobao.org/dot-prop/download/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
+    dependencies:
+      is-obj "^1.0.0"
+  
+  duplexer2@0.0.2:
+    version "0.0.2"
+    resolved "http://registry.npm.taobao.org/duplexer2/download/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
+    dependencies:
+      readable-stream "~1.1.9"
+  
+  duplexer@^0.1.1, duplexer@~0.1.1:
+    version "0.1.1"
+    resolved "http://registry.npm.taobao.org/duplexer/download/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
+  
+  duplexify@^3.1.2, duplexify@^3.4.2:
+    version "3.5.1"
+    resolved "http://registry.npm.taobao.org/duplexify/download/duplexify-3.5.1.tgz#4e1516be68838bc90a49994f0b39a6e5960befcd"
+    dependencies:
+      end-of-stream "^1.0.0"
+      inherits "^2.0.1"
+      readable-stream "^2.0.0"
+      stream-shift "^1.0.0"
+  
+  ecc-jsbn@~0.1.1:
+    version "0.1.1"
+    resolved "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+    dependencies:
+      jsbn "~0.1.0"
+  
+  echarts@^3.8.5:
+    version "3.8.5"
+    resolved "https://registry.yarnpkg.com/echarts/-/echarts-3.8.5.tgz#58e4a51d2743c6fb75257b0dc0a9cf9f5378ac0e"
+    dependencies:
+      zrender "3.7.4"
+  
+  ee-first@1.1.1:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+  
+  ejs@^2.5.6, ejs@^2.5.7:
+    version "2.5.7"
+    resolved "http://registry.npm.taobao.org/ejs/download/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a"
+  
+  electron-releases@^2.1.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/electron-releases/download/electron-releases-2.1.0.tgz#c5614bf811f176ce3c836e368a0625782341fd4e"
+  
+  electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30:
+    version "1.3.30"
+    resolved "http://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.30.tgz#9666f532a64586651fc56a72513692e820d06a80"
+    dependencies:
+      electron-releases "^2.1.0"
+  
+  elegant-spinner@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/elegant-spinner/download/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
+  
+  elliptic@^6.0.0:
+    version "6.4.0"
+    resolved "http://registry.npm.taobao.org/elliptic/download/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+    dependencies:
+      bn.js "^4.4.0"
+      brorand "^1.0.1"
+      hash.js "^1.0.0"
+      hmac-drbg "^1.0.0"
+      inherits "^2.0.1"
+      minimalistic-assert "^1.0.0"
+      minimalistic-crypto-utils "^1.0.0"
+  
+  ember-cli-string-utils@^1.0.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/ember-cli-string-utils/download/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1"
+  
+  emojis-list@^2.0.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+  
+  encodeurl@~1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
+  
+  end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+    version "1.4.0"
+    resolved "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206"
+    dependencies:
+      once "^1.4.0"
+  
+  engine.io-client@1.8.3:
+    version "1.8.3"
+    resolved "http://registry.npm.taobao.org/engine.io-client/download/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab"
+    dependencies:
+      component-emitter "1.2.1"
+      component-inherit "0.0.3"
+      debug "2.3.3"
+      engine.io-parser "1.3.2"
+      has-cors "1.1.0"
+      indexof "0.0.1"
+      parsejson "0.0.3"
+      parseqs "0.0.5"
+      parseuri "0.0.5"
+      ws "1.1.2"
+      xmlhttprequest-ssl "1.5.3"
+      yeast "0.1.2"
+  
+  engine.io-parser@1.3.2:
+    version "1.3.2"
+    resolved "http://registry.npm.taobao.org/engine.io-parser/download/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a"
+    dependencies:
+      after "0.8.2"
+      arraybuffer.slice "0.0.6"
+      base64-arraybuffer "0.1.5"
+      blob "0.0.4"
+      has-binary "0.1.7"
+      wtf-8 "1.0.0"
+  
+  engine.io@1.8.3:
+    version "1.8.3"
+    resolved "http://registry.npm.taobao.org/engine.io/download/engine.io-1.8.3.tgz#8de7f97895d20d39b85f88eeee777b2bd42b13d4"
+    dependencies:
+      accepts "1.3.3"
+      base64id "1.0.0"
+      cookie "0.3.1"
+      debug "2.3.3"
+      engine.io-parser "1.3.2"
+      ws "1.1.2"
+  
+  enhanced-resolve@^3.1.0, enhanced-resolve@^3.4.0:
+    version "3.4.1"
+    resolved "http://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
+    dependencies:
+      graceful-fs "^4.1.2"
+      memory-fs "^0.4.0"
+      object-assign "^4.0.1"
+      tapable "^0.2.7"
+  
+  ent@~2.2.0:
+    version "2.2.0"
+    resolved "http://registry.npm.taobao.org/ent/download/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
+  
+  entities@^1.1.1, entities@~1.1.1:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/entities/download/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+  
+  errno@^0.1.1, errno@^0.1.3, errno@^0.1.4:
+    version "0.1.6"
+    resolved "http://registry.npm.taobao.org/errno/download/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026"
+    dependencies:
+      prr "~1.0.1"
+  
+  error-ex@^1.2.0, error-ex@^1.3.1:
+    version "1.3.1"
+    resolved "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+    dependencies:
+      is-arrayish "^0.2.1"
+  
+  es-abstract@^1.4.3, es-abstract@^1.7.0:
+    version "1.10.0"
+    resolved "http://registry.npm.taobao.org/es-abstract/download/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864"
+    dependencies:
+      es-to-primitive "^1.1.1"
+      function-bind "^1.1.1"
+      has "^1.0.1"
+      is-callable "^1.1.3"
+      is-regex "^1.0.4"
+  
+  es-to-primitive@^1.1.1:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+    dependencies:
+      is-callable "^1.1.1"
+      is-date-object "^1.0.1"
+      is-symbol "^1.0.1"
+  
+  es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
+    version "0.10.37"
+    resolved "http://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.37.tgz#0ee741d148b80069ba27d020393756af257defc3"
+    dependencies:
+      es6-iterator "~2.0.1"
+      es6-symbol "~3.1.1"
+  
+  es6-iterator@^2.0.1, es6-iterator@~2.0.1:
+    version "2.0.3"
+    resolved "http://registry.npm.taobao.org/es6-iterator/download/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+    dependencies:
+      d "1"
+      es5-ext "^0.10.35"
+      es6-symbol "^3.1.1"
+  
+  es6-map@^0.1.3:
+    version "0.1.5"
+    resolved "http://registry.npm.taobao.org/es6-map/download/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+    dependencies:
+      d "1"
+      es5-ext "~0.10.14"
+      es6-iterator "~2.0.1"
+      es6-set "~0.1.5"
+      es6-symbol "~3.1.1"
+      event-emitter "~0.3.5"
+  
+  es6-set@~0.1.5:
+    version "0.1.5"
+    resolved "http://registry.npm.taobao.org/es6-set/download/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+    dependencies:
+      d "1"
+      es5-ext "~0.10.14"
+      es6-iterator "~2.0.1"
+      es6-symbol "3.1.1"
+      event-emitter "~0.3.5"
+  
+  es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
+    version "3.1.1"
+    resolved "http://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+    dependencies:
+      d "1"
+      es5-ext "~0.10.14"
+  
+  es6-weak-map@^2.0.1:
+    version "2.0.2"
+    resolved "http://registry.npm.taobao.org/es6-weak-map/download/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+    dependencies:
+      d "1"
+      es5-ext "^0.10.14"
+      es6-iterator "^2.0.1"
+      es6-symbol "^3.1.1"
+  
+  escape-html@~1.0.3:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+  
+  escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+    version "1.0.5"
+    resolved "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+  
+  escodegen@1.8.x:
+    version "1.8.1"
+    resolved "http://registry.npm.taobao.org/escodegen/download/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018"
+    dependencies:
+      esprima "^2.7.1"
+      estraverse "^1.9.1"
+      esutils "^2.0.2"
+      optionator "^0.8.1"
+    optionalDependencies:
+      source-map "~0.2.0"
+  
+  escope@^3.6.0:
+    version "3.6.0"
+    resolved "http://registry.npm.taobao.org/escope/download/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+    dependencies:
+      es6-map "^0.1.3"
+      es6-weak-map "^2.0.1"
+      esrecurse "^4.1.0"
+      estraverse "^4.1.1"
+  
+  esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1:
+    version "2.7.3"
+    resolved "http://registry.npm.taobao.org/esprima/download/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+  
+  esprima@^4.0.0:
+    version "4.0.0"
+    resolved "http://registry.npm.taobao.org/esprima/download/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+  
+  esrecurse@^4.1.0:
+    version "4.2.0"
+    resolved "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163"
+    dependencies:
+      estraverse "^4.1.0"
+      object-assign "^4.0.1"
+  
+  estraverse@^1.9.1:
+    version "1.9.3"
+    resolved "http://registry.npm.taobao.org/estraverse/download/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
+  
+  estraverse@^4.1.0, estraverse@^4.1.1:
+    version "4.2.0"
+    resolved "http://registry.npm.taobao.org/estraverse/download/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+  
+  esutils@^2.0.2:
+    version "2.0.2"
+    resolved "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+  
+  etag@~1.8.1:
+    version "1.8.1"
+    resolved "http://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+  
+  event-emitter@~0.3.5:
+    version "0.3.5"
+    resolved "http://registry.npm.taobao.org/event-emitter/download/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+    dependencies:
+      d "1"
+      es5-ext "~0.10.14"
+  
+  event-stream@~3.3.0:
+    version "3.3.4"
+    resolved "http://registry.npm.taobao.org/event-stream/download/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571"
+    dependencies:
+      duplexer "~0.1.1"
+      from "~0"
+      map-stream "~0.1.0"
+      pause-stream "0.0.11"
+      split "0.3"
+      stream-combiner "~0.0.4"
+      through "~2.3.1"
+  
+  eventemitter3@1.x.x:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/eventemitter3/download/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
+  
+  events@^1.0.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/events/download/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+  
+  eventsource@0.1.6:
+    version "0.1.6"
+    resolved "http://registry.npm.taobao.org/eventsource/download/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232"
+    dependencies:
+      original ">=0.0.5"
+  
+  evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+    dependencies:
+      md5.js "^1.3.4"
+      safe-buffer "^5.1.1"
+  
+  execa@^0.7.0:
+    version "0.7.0"
+    resolved "http://registry.npm.taobao.org/execa/download/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+    dependencies:
+      cross-spawn "^5.0.1"
+      get-stream "^3.0.0"
+      is-stream "^1.1.0"
+      npm-run-path "^2.0.0"
+      p-finally "^1.0.0"
+      signal-exit "^3.0.0"
+      strip-eof "^1.0.0"
+  
+  execa@^0.8.0:
+    version "0.8.0"
+    resolved "http://registry.npm.taobao.org/execa/download/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da"
+    dependencies:
+      cross-spawn "^5.0.1"
+      get-stream "^3.0.0"
+      is-stream "^1.1.0"
+      npm-run-path "^2.0.0"
+      p-finally "^1.0.0"
+      signal-exit "^3.0.0"
+      strip-eof "^1.0.0"
+  
+  execall@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/execall/download/execall-1.0.0.tgz#73d0904e395b3cab0658b08d09ec25307f29bb73"
+    dependencies:
+      clone-regexp "^1.0.0"
+  
+  exit-hook@^1.0.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/exit-hook/download/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+  
+  exit-on-epipe@~1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/exit-on-epipe/download/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
+  
+  exit@^0.1.2:
+    version "0.1.2"
+    resolved "http://registry.npm.taobao.org/exit/download/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+  
+  expand-braces@^0.1.1:
+    version "0.1.2"
+    resolved "http://registry.npm.taobao.org/expand-braces/download/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea"
+    dependencies:
+      array-slice "^0.2.3"
+      array-unique "^0.2.1"
+      braces "^0.1.2"
+  
+  expand-brackets@^0.1.4:
+    version "0.1.5"
+    resolved "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+    dependencies:
+      is-posix-bracket "^0.1.0"
+  
+  expand-range@^0.1.0:
+    version "0.1.1"
+    resolved "http://registry.npm.taobao.org/expand-range/download/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044"
+    dependencies:
+      is-number "^0.1.1"
+      repeat-string "^0.2.2"
+  
+  expand-range@^1.8.1:
+    version "1.8.2"
+    resolved "http://registry.npm.taobao.org/expand-range/download/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+    dependencies:
+      fill-range "^2.1.0"
+  
+  exports-loader@^0.6.3:
+    version "0.6.4"
+    resolved "http://registry.npm.taobao.org/exports-loader/download/exports-loader-0.6.4.tgz#d70fc6121975b35fc12830cf52754be2740fc886"
+    dependencies:
+      loader-utils "^1.0.2"
+      source-map "0.5.x"
+  
+  express@^4.15.2, express@^4.16.2:
+    version "4.16.2"
+    resolved "http://registry.npm.taobao.org/express/download/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c"
+    dependencies:
+      accepts "~1.3.4"
+      array-flatten "1.1.1"
+      body-parser "1.18.2"
+      content-disposition "0.5.2"
+      content-type "~1.0.4"
+      cookie "0.3.1"
+      cookie-signature "1.0.6"
+      debug "2.6.9"
+      depd "~1.1.1"
+      encodeurl "~1.0.1"
+      escape-html "~1.0.3"
+      etag "~1.8.1"
+      finalhandler "1.1.0"
+      fresh "0.5.2"
+      merge-descriptors "1.0.1"
+      methods "~1.1.2"
+      on-finished "~2.3.0"
+      parseurl "~1.3.2"
+      path-to-regexp "0.1.7"
+      proxy-addr "~2.0.2"
+      qs "6.5.1"
+      range-parser "~1.2.0"
+      safe-buffer "5.1.1"
+      send "0.16.1"
+      serve-static "1.13.1"
+      setprototypeof "1.1.0"
+      statuses "~1.3.1"
+      type-is "~1.6.15"
+      utils-merge "1.0.1"
+      vary "~1.1.2"
+  
+  extend@3, extend@^3.0.0, extend@~3.0.0, extend@~3.0.1:
+    version "3.0.1"
+    resolved "http://registry.npm.taobao.org/extend/download/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+  
+  extglob@^0.3.1:
+    version "0.3.2"
+    resolved "http://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+    dependencies:
+      is-extglob "^1.0.0"
+  
+  extract-text-webpack-plugin@^3.0.2:
+    version "3.0.2"
+    resolved "http://registry.npm.taobao.org/extract-text-webpack-plugin/download/extract-text-webpack-plugin-3.0.2.tgz#5f043eaa02f9750a9258b78c0a6e0dc1408fb2f7"
+    dependencies:
+      async "^2.4.1"
+      loader-utils "^1.1.0"
+      schema-utils "^0.3.0"
+      webpack-sources "^1.0.1"
+  
+  extsprintf@1.3.0:
+    version "1.3.0"
+    resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+  
+  extsprintf@^1.2.0:
+    version "1.4.0"
+    resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+  
+  fancy-log@^1.1.0:
+    version "1.3.2"
+    resolved "http://registry.npm.taobao.org/fancy-log/download/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1"
+    dependencies:
+      ansi-gray "^0.1.1"
+      color-support "^1.1.3"
+      time-stamp "^1.0.0"
+  
+  fast-deep-equal@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
+  
+  fast-json-stable-stringify@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+  
+  fast-levenshtein@~2.0.4:
+    version "2.0.6"
+    resolved "http://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+  
+  fastparse@^1.1.1:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/fastparse/download/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
+  
+  faye-websocket@^0.10.0:
+    version "0.10.0"
+    resolved "http://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
+    dependencies:
+      websocket-driver ">=0.5.1"
+  
+  faye-websocket@~0.11.0:
+    version "0.11.1"
+    resolved "http://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38"
+    dependencies:
+      websocket-driver ">=0.5.1"
+  
+  fecha@~2.3.2:
+    version "2.3.2"
+    resolved "http://registry.npm.taobao.org/fecha/download/fecha-2.3.2.tgz#360f035dd6edd954bc9581f95f2a4a7f2a3505c1"
+  
+  figures@^1.7.0:
+    version "1.7.0"
+    resolved "http://registry.npm.taobao.org/figures/download/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+    dependencies:
+      escape-string-regexp "^1.0.5"
+      object-assign "^4.1.0"
+  
+  file-entry-cache@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+    dependencies:
+      flat-cache "^1.2.1"
+      object-assign "^4.0.1"
+  
+  file-loader@^1.1.5:
+    version "1.1.6"
+    resolved "http://registry.npm.taobao.org/file-loader/download/file-loader-1.1.6.tgz#7b9a8f2c58f00a77fddf49e940f7ac978a3ea0e8"
+    dependencies:
+      loader-utils "^1.0.2"
+      schema-utils "^0.3.0"
+  
+  file-saver@^1.3.3:
+    version "1.3.3"
+    resolved "http://registry.npm.taobao.org/file-saver/download/file-saver-1.3.3.tgz#cdd4c44d3aa264eac2f68ec165bc791c34af1232"
+  
+  filename-regex@^2.0.0:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+  
+  fileset@^2.0.2:
+    version "2.0.3"
+    resolved "http://registry.npm.taobao.org/fileset/download/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
+    dependencies:
+      glob "^7.0.3"
+      minimatch "^3.0.3"
+  
+  filesize@^3.5.9:
+    version "3.5.11"
+    resolved "http://registry.npm.taobao.org/filesize/download/filesize-3.5.11.tgz#1919326749433bb3cf77368bd158caabcc19e9ee"
+  
+  fill-range@^2.1.0:
+    version "2.2.3"
+    resolved "http://registry.npm.taobao.org/fill-range/download/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+    dependencies:
+      is-number "^2.1.0"
+      isobject "^2.0.0"
+      randomatic "^1.1.3"
+      repeat-element "^1.1.2"
+      repeat-string "^1.5.2"
+  
+  finalhandler@1.0.6:
+    version "1.0.6"
+    resolved "http://registry.npm.taobao.org/finalhandler/download/finalhandler-1.0.6.tgz#007aea33d1a4d3e42017f624848ad58d212f814f"
+    dependencies:
+      debug "2.6.9"
+      encodeurl "~1.0.1"
+      escape-html "~1.0.3"
+      on-finished "~2.3.0"
+      parseurl "~1.3.2"
+      statuses "~1.3.1"
+      unpipe "~1.0.0"
+  
+  finalhandler@1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
+    dependencies:
+      debug "2.6.9"
+      encodeurl "~1.0.1"
+      escape-html "~1.0.3"
+      on-finished "~2.3.0"
+      parseurl "~1.3.2"
+      statuses "~1.3.1"
+      unpipe "~1.0.0"
+  
+  find-cache-dir@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+    dependencies:
+      commondir "^1.0.1"
+      make-dir "^1.0.0"
+      pkg-dir "^2.0.0"
+  
+  find-parent-dir@^0.3.0:
+    version "0.3.0"
+    resolved "http://registry.npm.taobao.org/find-parent-dir/download/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54"
+  
+  find-up@^1.0.0:
+    version "1.1.2"
+    resolved "http://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+    dependencies:
+      path-exists "^2.0.0"
+      pinkie-promise "^2.0.0"
+  
+  find-up@^2.0.0, find-up@^2.1.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+    dependencies:
+      locate-path "^2.0.0"
+  
+  flat-cache@^1.2.1:
+    version "1.3.0"
+    resolved "http://registry.npm.taobao.org/flat-cache/download/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
+    dependencies:
+      circular-json "^0.3.1"
+      del "^2.0.2"
+      graceful-fs "^4.1.2"
+      write "^0.2.1"
+  
+  flatten@^1.0.2:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/flatten/download/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
+  
+  flush-write-stream@^1.0.0:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417"
+    dependencies:
+      inherits "^2.0.1"
+      readable-stream "^2.0.4"
+  
+  font-awesome@^4.7.0:
+    version "4.7.0"
+    resolved "http://registry.npm.taobao.org/font-awesome/download/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133"
+  
+  for-in@^0.1.3:
+    version "0.1.8"
+    resolved "http://registry.npm.taobao.org/for-in/download/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
+  
+  for-in@^1.0.1:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+  
+  for-own@^0.1.4:
+    version "0.1.5"
+    resolved "http://registry.npm.taobao.org/for-own/download/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+    dependencies:
+      for-in "^1.0.1"
+  
+  for-own@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/for-own/download/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
+    dependencies:
+      for-in "^1.0.1"
+  
+  foreach@^2.0.5:
+    version "2.0.5"
+    resolved "http://registry.npm.taobao.org/foreach/download/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+  
+  forever-agent@~0.6.1:
+    version "0.6.1"
+    resolved "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+  
+  form-data@~2.1.1:
+    version "2.1.4"
+    resolved "http://registry.npm.taobao.org/form-data/download/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+    dependencies:
+      asynckit "^0.4.0"
+      combined-stream "^1.0.5"
+      mime-types "^2.1.12"
+  
+  form-data@~2.3.1:
+    version "2.3.1"
+    resolved "http://registry.npm.taobao.org/form-data/download/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf"
+    dependencies:
+      asynckit "^0.4.0"
+      combined-stream "^1.0.5"
+      mime-types "^2.1.12"
+  
+  forwarded@~0.1.2:
+    version "0.1.2"
+    resolved "http://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
+  
+  frac@~1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/frac/download/frac-1.1.0.tgz#dc437e9c6a646b60b127d82ac4902464445cc1e3"
+    dependencies:
+      voc "~1.0.0"
+  
+  fresh@0.5.2:
+    version "0.5.2"
+    resolved "http://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+  
+  from2@^2.1.0:
+    version "2.3.0"
+    resolved "http://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+    dependencies:
+      inherits "^2.0.1"
+      readable-stream "^2.0.0"
+  
+  from@~0:
+    version "0.1.7"
+    resolved "http://registry.npm.taobao.org/from/download/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
+  
+  fs-access@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/fs-access/download/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a"
+    dependencies:
+      null-check "^1.0.0"
+  
+  fs-extra@^4.0.0:
+    version "4.0.3"
+    resolved "http://registry.npm.taobao.org/fs-extra/download/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+    dependencies:
+      graceful-fs "^4.1.2"
+      jsonfile "^4.0.0"
+      universalify "^0.1.0"
+  
+  fs-write-stream-atomic@^1.0.8:
+    version "1.0.10"
+    resolved "http://registry.npm.taobao.org/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+    dependencies:
+      graceful-fs "^4.1.2"
+      iferr "^0.1.5"
+      imurmurhash "^0.1.4"
+      readable-stream "1 || 2"
+  
+  fs.realpath@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+  
+  fsevents@^1.0.0:
+    version "1.1.3"
+    resolved "http://registry.npm.taobao.org/fsevents/download/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
+    dependencies:
+      nan "^2.3.0"
+      node-pre-gyp "^0.6.39"
+  
+  fstream-ignore@^1.0.5:
+    version "1.0.5"
+    resolved "http://registry.npm.taobao.org/fstream-ignore/download/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+    dependencies:
+      fstream "^1.0.0"
+      inherits "2"
+      minimatch "^3.0.0"
+  
+  fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
+    version "1.0.11"
+    resolved "http://registry.npm.taobao.org/fstream/download/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+    dependencies:
+      graceful-fs "^4.1.2"
+      inherits "~2.0.0"
+      mkdirp ">=0.5 0"
+      rimraf "2"
+  
+  function-bind@^1.0.2, function-bind@^1.1.1:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+  
+  gauge@~2.7.3:
+    version "2.7.4"
+    resolved "http://registry.npm.taobao.org/gauge/download/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+    dependencies:
+      aproba "^1.0.3"
+      console-control-strings "^1.0.0"
+      has-unicode "^2.0.0"
+      object-assign "^4.1.0"
+      signal-exit "^3.0.0"
+      string-width "^1.0.1"
+      strip-ansi "^3.0.1"
+      wide-align "^1.1.0"
+  
+  gaze@^1.0.0:
+    version "1.1.2"
+    resolved "http://registry.npm.taobao.org/gaze/download/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105"
+    dependencies:
+      globule "^1.0.0"
+  
+  generate-function@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/generate-function/download/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
+  
+  generate-object-property@^1.1.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/generate-object-property/download/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
+    dependencies:
+      is-property "^1.0.0"
+  
+  get-caller-file@^1.0.1:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+  
+  get-own-enumerable-property-symbols@^2.0.1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/get-own-enumerable-property-symbols/download/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b"
+  
+  get-stdin@^4.0.1:
+    version "4.0.1"
+    resolved "http://registry.npm.taobao.org/get-stdin/download/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+  
+  get-stdin@^5.0.1:
+    version "5.0.1"
+    resolved "http://registry.npm.taobao.org/get-stdin/download/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398"
+  
+  get-stream@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+  
+  getpass@^0.1.1:
+    version "0.1.7"
+    resolved "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+    dependencies:
+      assert-plus "^1.0.0"
+  
+  gl-matrix@^2.3.2, gl-matrix@~2.4.0:
+    version "2.4.0"
+    resolved "http://registry.npm.taobao.org/gl-matrix/download/gl-matrix-2.4.0.tgz#2089b13301a29eec822d9d99dffc1f78ee9a3c50"
+  
+  glob-base@^0.3.0:
+    version "0.3.0"
+    resolved "http://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+    dependencies:
+      glob-parent "^2.0.0"
+      is-glob "^2.0.0"
+  
+  glob-parent@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/glob-parent/download/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+    dependencies:
+      is-glob "^2.0.0"
+  
+  glob@7.0.x:
+    version "7.0.6"
+    resolved "http://registry.npm.taobao.org/glob/download/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
+    dependencies:
+      fs.realpath "^1.0.0"
+      inflight "^1.0.4"
+      inherits "2"
+      minimatch "^3.0.2"
+      once "^1.3.0"
+      path-is-absolute "^1.0.0"
+  
+  glob@^5.0.15:
+    version "5.0.15"
+    resolved "http://registry.npm.taobao.org/glob/download/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+    dependencies:
+      inflight "^1.0.4"
+      inherits "2"
+      minimatch "2 || 3"
+      once "^1.3.0"
+      path-is-absolute "^1.0.0"
+  
+  glob@^6.0.4:
+    version "6.0.4"
+    resolved "http://registry.npm.taobao.org/glob/download/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
+    dependencies:
+      inflight "^1.0.4"
+      inherits "2"
+      minimatch "2 || 3"
+      once "^1.3.0"
+      path-is-absolute "^1.0.0"
+  
+  glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1:
+    version "7.1.2"
+    resolved "http://registry.npm.taobao.org/glob/download/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+    dependencies:
+      fs.realpath "^1.0.0"
+      inflight "^1.0.4"
+      inherits "2"
+      minimatch "^3.0.4"
+      once "^1.3.0"
+      path-is-absolute "^1.0.0"
+  
+  globals@^9.18.0:
+    version "9.18.0"
+    resolved "http://registry.npm.taobao.org/globals/download/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+  
+  globby@^5.0.0:
+    version "5.0.0"
+    resolved "http://registry.npm.taobao.org/globby/download/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+    dependencies:
+      array-union "^1.0.1"
+      arrify "^1.0.0"
+      glob "^7.0.3"
+      object-assign "^4.0.1"
+      pify "^2.0.0"
+      pinkie-promise "^2.0.0"
+  
+  globby@^6.1.0:
+    version "6.1.0"
+    resolved "http://registry.npm.taobao.org/globby/download/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
+    dependencies:
+      array-union "^1.0.1"
+      glob "^7.0.3"
+      object-assign "^4.0.1"
+      pify "^2.0.0"
+      pinkie-promise "^2.0.0"
+  
+  globby@^7.0.0, globby@^7.1.1:
+    version "7.1.1"
+    resolved "http://registry.npm.taobao.org/globby/download/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680"
+    dependencies:
+      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"
+  
+  globjoin@^0.1.4:
+    version "0.1.4"
+    resolved "http://registry.npm.taobao.org/globjoin/download/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43"
+  
+  globule@^1.0.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/globule/download/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09"
+    dependencies:
+      glob "~7.1.1"
+      lodash "~4.17.4"
+      minimatch "~3.0.2"
+  
+  glogg@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/glogg/download/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5"
+    dependencies:
+      sparkles "^1.0.0"
+  
+  gonzales-pe@^4.0.3:
+    version "4.2.3"
+    resolved "http://registry.npm.taobao.org/gonzales-pe/download/gonzales-pe-4.2.3.tgz#41091703625433285e0aee3aa47829fc1fbeb6f2"
+    dependencies:
+      minimist "1.1.x"
+  
+  graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+    version "4.1.11"
+    resolved "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+  
+  gulp-util@3.0.7:
+    version "3.0.7"
+    resolved "http://registry.npm.taobao.org/gulp-util/download/gulp-util-3.0.7.tgz#78925c4b8f8b49005ac01a011c557e6218941cbb"
+    dependencies:
+      array-differ "^1.0.0"
+      array-uniq "^1.0.2"
+      beeper "^1.0.0"
+      chalk "^1.0.0"
+      dateformat "^1.0.11"
+      fancy-log "^1.1.0"
+      gulplog "^1.0.0"
+      has-gulplog "^0.1.0"
+      lodash._reescape "^3.0.0"
+      lodash._reevaluate "^3.0.0"
+      lodash._reinterpolate "^3.0.0"
+      lodash.template "^3.0.0"
+      minimist "^1.1.0"
+      multipipe "^0.1.2"
+      object-assign "^3.0.0"
+      replace-ext "0.0.1"
+      through2 "^2.0.0"
+      vinyl "^0.5.0"
+  
+  gulplog@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/gulplog/download/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5"
+    dependencies:
+      glogg "^1.0.0"
+  
+  gzip-size@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/gzip-size/download/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520"
+    dependencies:
+      duplexer "^0.1.1"
+  
+  handle-thing@^1.2.5:
+    version "1.2.5"
+    resolved "http://registry.npm.taobao.org/handle-thing/download/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"
+  
+  handlebars@^4.0.1, handlebars@^4.0.3:
+    version "4.0.11"
+    resolved "http://registry.npm.taobao.org/handlebars/download/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc"
+    dependencies:
+      async "^1.4.0"
+      optimist "^0.6.1"
+      source-map "^0.4.4"
+    optionalDependencies:
+      uglify-js "^2.6"
+  
+  har-schema@^1.0.5:
+    version "1.0.5"
+    resolved "http://registry.npm.taobao.org/har-schema/download/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
+  
+  har-schema@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+  
+  har-validator@~2.0.6:
+    version "2.0.6"
+    resolved "http://registry.npm.taobao.org/har-validator/download/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
+    dependencies:
+      chalk "^1.1.1"
+      commander "^2.9.0"
+      is-my-json-valid "^2.12.4"
+      pinkie-promise "^2.0.0"
+  
+  har-validator@~4.2.1:
+    version "4.2.1"
+    resolved "http://registry.npm.taobao.org/har-validator/download/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+    dependencies:
+      ajv "^4.9.1"
+      har-schema "^1.0.5"
+  
+  har-validator@~5.0.3:
+    version "5.0.3"
+    resolved "http://registry.npm.taobao.org/har-validator/download/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
+    dependencies:
+      ajv "^5.1.0"
+      har-schema "^2.0.0"
+  
+  has-ansi@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+    dependencies:
+      ansi-regex "^2.0.0"
+  
+  has-binary@0.1.7:
+    version "0.1.7"
+    resolved "http://registry.npm.taobao.org/has-binary/download/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c"
+    dependencies:
+      isarray "0.0.1"
+  
+  has-cors@1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/has-cors/download/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
+  
+  has-flag@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+  
+  has-flag@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/has-flag/download/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
+  
+  has-gulplog@^0.1.0:
+    version "0.1.0"
+    resolved "http://registry.npm.taobao.org/has-gulplog/download/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce"
+    dependencies:
+      sparkles "^1.0.0"
+  
+  has-unicode@^2.0.0:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/has-unicode/download/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+  
+  has@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/has/download/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+    dependencies:
+      function-bind "^1.0.2"
+  
+  hash-base@^2.0.0:
+    version "2.0.2"
+    resolved "http://registry.npm.taobao.org/hash-base/download/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
+    dependencies:
+      inherits "^2.0.1"
+  
+  hash-base@^3.0.0:
+    version "3.0.4"
+    resolved "http://registry.npm.taobao.org/hash-base/download/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+    dependencies:
+      inherits "^2.0.1"
+      safe-buffer "^5.0.1"
+  
+  hash.js@^1.0.0, hash.js@^1.0.3:
+    version "1.1.3"
+    resolved "http://registry.npm.taobao.org/hash.js/download/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
+    dependencies:
+      inherits "^2.0.3"
+      minimalistic-assert "^1.0.0"
+  
+  hawk@3.1.3, hawk@~3.1.3:
+    version "3.1.3"
+    resolved "http://registry.npm.taobao.org/hawk/download/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+    dependencies:
+      boom "2.x.x"
+      cryptiles "2.x.x"
+      hoek "2.x.x"
+      sntp "1.x.x"
+  
+  hawk@~6.0.2:
+    version "6.0.2"
+    resolved "http://registry.npm.taobao.org/hawk/download/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038"
+    dependencies:
+      boom "4.x.x"
+      cryptiles "3.x.x"
+      hoek "4.x.x"
+      sntp "2.x.x"
+  
+  he@1.1.x:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/he/download/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
+  
+  hmac-drbg@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+    dependencies:
+      hash.js "^1.0.3"
+      minimalistic-assert "^1.0.0"
+      minimalistic-crypto-utils "^1.0.1"
+  
+  hoek@2.x.x:
+    version "2.16.3"
+    resolved "http://registry.npm.taobao.org/hoek/download/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+  
+  hoek@4.x.x:
+    version "4.2.0"
+    resolved "http://registry.npm.taobao.org/hoek/download/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d"
+  
+  homedir-polyfill@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/homedir-polyfill/download/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc"
+    dependencies:
+      parse-passwd "^1.0.0"
+  
+  hosted-git-info@^2.1.4:
+    version "2.5.0"
+    resolved "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
+  
+  hpack.js@^2.1.6:
+    version "2.1.6"
+    resolved "http://registry.npm.taobao.org/hpack.js/download/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
+    dependencies:
+      inherits "^2.0.1"
+      obuf "^1.0.0"
+      readable-stream "^2.0.1"
+      wbuf "^1.1.0"
+  
+  html-comment-regex@^1.1.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/html-comment-regex/download/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
+  
+  html-entities@^1.2.0:
+    version "1.2.1"
+    resolved "http://registry.npm.taobao.org/html-entities/download/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
+  
+  html-minifier@^3.2.3:
+    version "3.5.8"
+    resolved "http://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.8.tgz#5ccdb1f73a0d654e6090147511f6e6b2ee312700"
+    dependencies:
+      camel-case "3.0.x"
+      clean-css "4.1.x"
+      commander "2.12.x"
+      he "1.1.x"
+      ncname "1.0.x"
+      param-case "2.1.x"
+      relateurl "0.2.x"
+      uglify-js "3.3.x"
+  
+  html-tags@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b"
+  
+  html-webpack-plugin@^2.29.0:
+    version "2.30.1"
+    resolved "http://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-2.30.1.tgz#7f9c421b7ea91ec460f56527d78df484ee7537d5"
+    dependencies:
+      bluebird "^3.4.7"
+      html-minifier "^3.2.3"
+      loader-utils "^0.2.16"
+      lodash "^4.17.3"
+      pretty-error "^2.0.2"
+      toposort "^1.0.0"
+  
+  htmlparser2@^3.9.2:
+    version "3.9.2"
+    resolved "http://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338"
+    dependencies:
+      domelementtype "^1.3.0"
+      domhandler "^2.3.0"
+      domutils "^1.5.1"
+      entities "^1.1.1"
+      inherits "^2.0.1"
+      readable-stream "^2.0.2"
+  
+  htmlparser2@~3.3.0:
+    version "3.3.0"
+    resolved "http://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe"
+    dependencies:
+      domelementtype "1"
+      domhandler "2.1"
+      domutils "1.1"
+      readable-stream "1.0"
+  
+  http-deceiver@^1.2.7:
+    version "1.2.7"
+    resolved "http://registry.npm.taobao.org/http-deceiver/download/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
+  
+  http-errors@1.6.2, http-errors@~1.6.2:
+    version "1.6.2"
+    resolved "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
+    dependencies:
+      depd "1.1.1"
+      inherits "2.0.3"
+      setprototypeof "1.0.3"
+      statuses ">= 1.3.1 < 2"
+  
+  http-parser-js@>=0.4.0:
+    version "0.4.9"
+    resolved "http://registry.npm.taobao.org/http-parser-js/download/http-parser-js-0.4.9.tgz#ea1a04fb64adff0242e9974f297dd4c3cad271e1"
+  
+  http-proxy-middleware@~0.17.4:
+    version "0.17.4"
+    resolved "http://registry.npm.taobao.org/http-proxy-middleware/download/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833"
+    dependencies:
+      http-proxy "^1.16.2"
+      is-glob "^3.1.0"
+      lodash "^4.17.2"
+      micromatch "^2.3.11"
+  
+  http-proxy@^1.13.0, http-proxy@^1.16.2:
+    version "1.16.2"
+    resolved "http://registry.npm.taobao.org/http-proxy/download/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742"
+    dependencies:
+      eventemitter3 "1.x.x"
+      requires-port "1.x.x"
+  
+  http-signature@~1.1.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/http-signature/download/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+    dependencies:
+      assert-plus "^0.2.0"
+      jsprim "^1.2.2"
+      sshpk "^1.7.0"
+  
+  http-signature@~1.2.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+    dependencies:
+      assert-plus "^1.0.0"
+      jsprim "^1.2.2"
+      sshpk "^1.7.0"
+  
+  https-browserify@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+  
+  https-proxy-agent@^1.0.0, https-proxy-agent@~1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/https-proxy-agent/download/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6"
+    dependencies:
+      agent-base "2"
+      debug "2"
+      extend "3"
+  
+  iconv-lite@0.4, iconv-lite@0.4.19:
+    version "0.4.19"
+    resolved "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+  
+  icss-replace-symbols@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/icss-replace-symbols/download/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+  
+  icss-utils@^2.1.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/icss-utils/download/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
+    dependencies:
+      postcss "^6.0.1"
+  
+  ieee754@^1.1.4:
+    version "1.1.8"
+    resolved "http://registry.npm.taobao.org/ieee754/download/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+  
+  iferr@^0.1.5:
+    version "0.1.5"
+    resolved "http://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+  
+  ignore@^3.3.3, ignore@^3.3.5:
+    version "3.3.7"
+    resolved "http://registry.npm.taobao.org/ignore/download/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
+  
+  image-size@~0.5.0:
+    version "0.5.5"
+    resolved "http://registry.npm.taobao.org/image-size/download/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
+  
+  import-local@^0.1.1:
+    version "0.1.1"
+    resolved "http://registry.npm.taobao.org/import-local/download/import-local-0.1.1.tgz#b1179572aacdc11c6a91009fb430dbcab5f668a8"
+    dependencies:
+      pkg-dir "^2.0.0"
+      resolve-cwd "^2.0.0"
+  
+  imurmurhash@^0.1.4:
+    version "0.1.4"
+    resolved "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+  
+  in-publish@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/in-publish/download/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
+  
+  indent-string@^2.1.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/indent-string/download/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+    dependencies:
+      repeating "^2.0.0"
+  
+  indent-string@^3.0.0:
+    version "3.2.0"
+    resolved "http://registry.npm.taobao.org/indent-string/download/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
+  
+  indexes-of@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+  
+  indexof@0.0.1:
+    version "0.0.1"
+    resolved "http://registry.npm.taobao.org/indexof/download/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+  
+  inflight@^1.0.4:
+    version "1.0.6"
+    resolved "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+    dependencies:
+      once "^1.3.0"
+      wrappy "1"
+  
+  inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+    version "2.0.3"
+    resolved "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+  
+  inherits@2.0.1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/inherits/download/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+  
+  ini@^1.3.4, ini@~1.3.0:
+    version "1.3.5"
+    resolved "http://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+  
+  internal-ip@1.2.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/internal-ip/download/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c"
+    dependencies:
+      meow "^3.3.0"
+  
+  interpret@^1.0.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/interpret/download/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
+  
+  invariant@^2.2.2:
+    version "2.2.2"
+    resolved "http://registry.npm.taobao.org/invariant/download/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
+    dependencies:
+      loose-envify "^1.0.0"
+  
+  invert-kv@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+  
+  ip@^1.1.0, ip@^1.1.5:
+    version "1.1.5"
+    resolved "http://registry.npm.taobao.org/ip/download/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+  
+  ipaddr.js@1.5.2:
+    version "1.5.2"
+    resolved "http://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0"
+  
+  is-absolute-url@^2.0.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/is-absolute-url/download/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+  
+  is-alphabetical@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/is-alphabetical/download/is-alphabetical-1.0.1.tgz#c77079cc91d4efac775be1034bf2d243f95e6f08"
+  
+  is-alphanumeric@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/is-alphanumeric/download/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4"
+  
+  is-alphanumerical@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/is-alphanumerical/download/is-alphanumerical-1.0.1.tgz#dfb4aa4d1085e33bdb61c2dee9c80e9c6c19f53b"
+    dependencies:
+      is-alphabetical "^1.0.0"
+      is-decimal "^1.0.0"
+  
+  is-arrayish@^0.2.1:
+    version "0.2.1"
+    resolved "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+  
+  is-binary-path@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+    dependencies:
+      binary-extensions "^1.0.0"
+  
+  is-buffer@^1.0.2, is-buffer@^1.1.4, is-buffer@^1.1.5:
+    version "1.1.6"
+    resolved "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+  
+  is-builtin-module@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+    dependencies:
+      builtin-modules "^1.0.0"
+  
+  is-callable@^1.1.1, is-callable@^1.1.3:
+    version "1.1.3"
+    resolved "http://registry.npm.taobao.org/is-callable/download/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
+  
+  is-date-object@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+  
+  is-decimal@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/is-decimal/download/is-decimal-1.0.1.tgz#f5fb6a94996ad9e8e3761fbfbd091f1fca8c4e82"
+  
+  is-directory@^0.3.1:
+    version "0.3.1"
+    resolved "http://registry.npm.taobao.org/is-directory/download/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+  
+  is-dotfile@^1.0.0:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/is-dotfile/download/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+  
+  is-equal-shallow@^0.1.3:
+    version "0.1.3"
+    resolved "http://registry.npm.taobao.org/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+    dependencies:
+      is-primitive "^2.0.0"
+  
+  is-extendable@^0.1.1:
+    version "0.1.1"
+    resolved "http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+  
+  is-extglob@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+  
+  is-extglob@^2.1.0, is-extglob@^2.1.1:
+    version "2.1.1"
+    resolved "http://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+  
+  is-finite@^1.0.0:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/is-finite/download/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+    dependencies:
+      number-is-nan "^1.0.0"
+  
+  is-fullwidth-code-point@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+    dependencies:
+      number-is-nan "^1.0.0"
+  
+  is-fullwidth-code-point@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+  
+  is-glob@^2.0.0, is-glob@^2.0.1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+    dependencies:
+      is-extglob "^1.0.0"
+  
+  is-glob@^3.1.0:
+    version "3.1.0"
+    resolved "http://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+    dependencies:
+      is-extglob "^2.1.0"
+  
+  is-glob@^4.0.0:
+    version "4.0.0"
+    resolved "http://registry.npm.taobao.org/is-glob/download/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+    dependencies:
+      is-extglob "^2.1.1"
+  
+  is-hexadecimal@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/is-hexadecimal/download/is-hexadecimal-1.0.1.tgz#6e084bbc92061fbb0971ec58b6ce6d404e24da69"
+  
+  is-my-json-valid@^2.12.4:
+    version "2.17.1"
+    resolved "http://registry.npm.taobao.org/is-my-json-valid/download/is-my-json-valid-2.17.1.tgz#3da98914a70a22f0a8563ef1511a246c6fc55471"
+    dependencies:
+      generate-function "^2.0.0"
+      generate-object-property "^1.1.0"
+      jsonpointer "^4.0.0"
+      xtend "^4.0.0"
+  
+  is-number@^0.1.1:
+    version "0.1.1"
+    resolved "http://registry.npm.taobao.org/is-number/download/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806"
+  
+  is-number@^2.1.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+    dependencies:
+      kind-of "^3.0.2"
+  
+  is-number@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+    dependencies:
+      kind-of "^3.0.2"
+  
+  is-obj@^1.0.0, is-obj@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+  
+  is-observable@^0.2.0:
+    version "0.2.0"
+    resolved "http://registry.npm.taobao.org/is-observable/download/is-observable-0.2.0.tgz#b361311d83c6e5d726cabf5e250b0237106f5ae2"
+    dependencies:
+      symbol-observable "^0.2.2"
+  
+  is-path-cwd@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/is-path-cwd/download/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+  
+  is-path-in-cwd@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/is-path-in-cwd/download/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
+    dependencies:
+      is-path-inside "^1.0.0"
+  
+  is-path-inside@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/is-path-inside/download/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
+    dependencies:
+      path-is-inside "^1.0.1"
+  
+  is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+  
+  is-plain-object@^2.0.1:
+    version "2.0.4"
+    resolved "http://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+    dependencies:
+      isobject "^3.0.1"
+  
+  is-posix-bracket@^0.1.0:
+    version "0.1.1"
+    resolved "http://registry.npm.taobao.org/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+  
+  is-primitive@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/is-primitive/download/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+  
+  is-promise@^2.1.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+  
+  is-property@^1.0.0:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/is-property/download/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+  
+  is-regex@^1.0.4:
+    version "1.0.4"
+    resolved "http://registry.npm.taobao.org/is-regex/download/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+    dependencies:
+      has "^1.0.1"
+  
+  is-regexp@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/is-regexp/download/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
+  
+  is-stream@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+  
+  is-supported-regexp-flag@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/is-supported-regexp-flag/download/is-supported-regexp-flag-1.0.0.tgz#8b520c85fae7a253382d4b02652e045576e13bb8"
+  
+  is-svg@^2.0.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/is-svg/download/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
+    dependencies:
+      html-comment-regex "^1.1.0"
+  
+  is-symbol@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+  
+  is-typedarray@~1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+  
+  is-utf8@^0.2.0:
+    version "0.2.1"
+    resolved "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+  
+  is-whitespace-character@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/is-whitespace-character/download/is-whitespace-character-1.0.1.tgz#9ae0176f3282b65457a1992cdb084f8a5f833e3b"
+  
+  is-word-character@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/is-word-character/download/is-word-character-1.0.1.tgz#5a03fa1ea91ace8a6eb0c7cd770eb86d65c8befb"
+  
+  is-wsl@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+  
+  isarray@0.0.1, isarray@~0.0.1:
+    version "0.0.1"
+    resolved "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+  
+  isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+  
+  isbinaryfile@^3.0.0:
+    version "3.0.2"
+    resolved "http://registry.npm.taobao.org/isbinaryfile/download/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621"
+  
+  isexe@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+  
+  isobject@^2.0.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+    dependencies:
+      isarray "1.0.0"
+  
+  isobject@^3.0.1:
+    version "3.0.1"
+    resolved "http://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+  
+  isstream@~0.1.2:
+    version "0.1.2"
+    resolved "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+  
+  istanbul-api@^1.1.14:
+    version "1.2.1"
+    resolved "http://registry.npm.taobao.org/istanbul-api/download/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620"
+    dependencies:
+      async "^2.1.4"
+      fileset "^2.0.2"
+      istanbul-lib-coverage "^1.1.1"
+      istanbul-lib-hook "^1.1.0"
+      istanbul-lib-instrument "^1.9.1"
+      istanbul-lib-report "^1.1.2"
+      istanbul-lib-source-maps "^1.2.2"
+      istanbul-reports "^1.1.3"
+      js-yaml "^3.7.0"
+      mkdirp "^0.5.1"
+      once "^1.4.0"
+  
+  istanbul-instrumenter-loader@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/istanbul-instrumenter-loader/download/istanbul-instrumenter-loader-2.0.0.tgz#e5492900ab0bba835efa8024cb00be9b3eea2700"
+    dependencies:
+      convert-source-map "^1.3.0"
+      istanbul-lib-instrument "^1.1.3"
+      loader-utils "^0.2.16"
+      object-assign "^4.1.0"
+  
+  istanbul-lib-coverage@^1.1.1:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/istanbul-lib-coverage/download/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da"
+  
+  istanbul-lib-hook@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/istanbul-lib-hook/download/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b"
+    dependencies:
+      append-transform "^0.4.0"
+  
+  istanbul-lib-instrument@^1.1.3, istanbul-lib-instrument@^1.9.1:
+    version "1.9.1"
+    resolved "http://registry.npm.taobao.org/istanbul-lib-instrument/download/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e"
+    dependencies:
+      babel-generator "^6.18.0"
+      babel-template "^6.16.0"
+      babel-traverse "^6.18.0"
+      babel-types "^6.18.0"
+      babylon "^6.18.0"
+      istanbul-lib-coverage "^1.1.1"
+      semver "^5.3.0"
+  
+  istanbul-lib-report@^1.1.2:
+    version "1.1.2"
+    resolved "http://registry.npm.taobao.org/istanbul-lib-report/download/istanbul-lib-report-1.1.2.tgz#922be27c13b9511b979bd1587359f69798c1d425"
+    dependencies:
+      istanbul-lib-coverage "^1.1.1"
+      mkdirp "^0.5.1"
+      path-parse "^1.0.5"
+      supports-color "^3.1.2"
+  
+  istanbul-lib-source-maps@^1.2.2:
+    version "1.2.2"
+    resolved "http://registry.npm.taobao.org/istanbul-lib-source-maps/download/istanbul-lib-source-maps-1.2.2.tgz#750578602435f28a0c04ee6d7d9e0f2960e62c1c"
+    dependencies:
+      debug "^3.1.0"
+      istanbul-lib-coverage "^1.1.1"
+      mkdirp "^0.5.1"
+      rimraf "^2.6.1"
+      source-map "^0.5.3"
+  
+  istanbul-reports@^1.1.3:
+    version "1.1.3"
+    resolved "http://registry.npm.taobao.org/istanbul-reports/download/istanbul-reports-1.1.3.tgz#3b9e1e8defb6d18b1d425da8e8b32c5a163f2d10"
+    dependencies:
+      handlebars "^4.0.3"
+  
+  istanbul@0.4.5, istanbul@^0.4.3:
+    version "0.4.5"
+    resolved "http://registry.npm.taobao.org/istanbul/download/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b"
+    dependencies:
+      abbrev "1.0.x"
+      async "1.x"
+      escodegen "1.8.x"
+      esprima "2.7.x"
+      glob "^5.0.15"
+      handlebars "^4.0.1"
+      js-yaml "3.x"
+      mkdirp "0.5.x"
+      nopt "3.x"
+      once "1.x"
+      resolve "1.1.x"
+      supports-color "^3.1.0"
+      which "^1.1.1"
+      wordwrap "^1.0.0"
+  
+  jasmine-core@~2.8.0:
+    version "2.8.0"
+    resolved "http://registry.npm.taobao.org/jasmine-core/download/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e"
+  
+  jasmine-spec-reporter@~4.2.1:
+    version "4.2.1"
+    resolved "http://registry.npm.taobao.org/jasmine-spec-reporter/download/jasmine-spec-reporter-4.2.1.tgz#1d632aec0341670ad324f92ba84b4b32b35e9e22"
+    dependencies:
+      colors "1.1.2"
+  
+  jasmine@^2.5.3:
+    version "2.8.0"
+    resolved "http://registry.npm.taobao.org/jasmine/download/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e"
+    dependencies:
+      exit "^0.1.2"
+      glob "^7.0.6"
+      jasmine-core "~2.8.0"
+  
+  jasminewd2@^2.1.0:
+    version "2.2.0"
+    resolved "http://registry.npm.taobao.org/jasminewd2/download/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e"
+  
+  jest-get-type@^21.2.0:
+    version "21.2.0"
+    resolved "http://registry.npm.taobao.org/jest-get-type/download/jest-get-type-21.2.0.tgz#f6376ab9db4b60d81e39f30749c6c466f40d4a23"
+  
+  jest-validate@^21.1.0:
+    version "21.2.1"
+    resolved "http://registry.npm.taobao.org/jest-validate/download/jest-validate-21.2.1.tgz#cc0cbca653cd54937ba4f2a111796774530dd3c7"
+    dependencies:
+      chalk "^2.0.1"
+      jest-get-type "^21.2.0"
+      leven "^2.1.0"
+      pretty-format "^21.2.1"
+  
+  js-base64@^2.1.8, js-base64@^2.1.9:
+    version "2.4.0"
+    resolved "http://registry.npm.taobao.org/js-base64/download/js-base64-2.4.0.tgz#9e566fee624751a1d720c966cd6226d29d4025aa"
+  
+  js-tokens@^3.0.0, js-tokens@^3.0.2:
+    version "3.0.2"
+    resolved "http://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+  
+  js-yaml@3.x, js-yaml@^3.4.3, js-yaml@^3.7.0, js-yaml@^3.9.0:
+    version "3.10.0"
+    resolved "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
+    dependencies:
+      argparse "^1.0.7"
+      esprima "^4.0.0"
+  
+  js-yaml@~3.7.0:
+    version "3.7.0"
+    resolved "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
+    dependencies:
+      argparse "^1.0.7"
+      esprima "^2.6.0"
+  
+  jsbn@~0.1.0:
+    version "0.1.1"
+    resolved "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+  
+  jsesc@^1.3.0:
+    version "1.3.0"
+    resolved "http://registry.npm.taobao.org/jsesc/download/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+  
+  jsesc@~0.5.0:
+    version "0.5.0"
+    resolved "http://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+  
+  json-loader@^0.5.4:
+    version "0.5.7"
+    resolved "http://registry.npm.taobao.org/json-loader/download/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
+  
+  json-parse-better-errors@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a"
+  
+  json-schema-traverse@^0.3.0:
+    version "0.3.1"
+    resolved "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+  
+  json-schema@0.2.3:
+    version "0.2.3"
+    resolved "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+  
+  json-stable-stringify@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/json-stable-stringify/download/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+    dependencies:
+      jsonify "~0.0.0"
+  
+  json-stringify-safe@~5.0.1:
+    version "5.0.1"
+    resolved "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+  
+  json3@3.3.2, json3@^3.3.2:
+    version "3.3.2"
+    resolved "http://registry.npm.taobao.org/json3/download/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
+  
+  json5@^0.5.0, json5@^0.5.1:
+    version "0.5.1"
+    resolved "http://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+  
+  jsonfile@^4.0.0:
+    version "4.0.0"
+    resolved "http://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+    optionalDependencies:
+      graceful-fs "^4.1.6"
+  
+  jsonify@~0.0.0:
+    version "0.0.0"
+    resolved "http://registry.npm.taobao.org/jsonify/download/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+  
+  jsonpointer@^4.0.0:
+    version "4.0.1"
+    resolved "http://registry.npm.taobao.org/jsonpointer/download/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
+  
+  jsprim@^1.2.2:
+    version "1.4.1"
+    resolved "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+    dependencies:
+      assert-plus "1.0.0"
+      extsprintf "1.3.0"
+      json-schema "0.2.3"
+      verror "1.10.0"
+  
+  karma-chrome-launcher@~2.2.0:
+    version "2.2.0"
+    resolved "http://registry.npm.taobao.org/karma-chrome-launcher/download/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf"
+    dependencies:
+      fs-access "^1.0.0"
+      which "^1.2.1"
+  
+  karma-cli@~1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/karma-cli/download/karma-cli-1.0.1.tgz#ae6c3c58a313a1d00b45164c455b9b86ce17f960"
+    dependencies:
+      resolve "^1.1.6"
+  
+  karma-coverage-istanbul-reporter@^1.3.0:
+    version "1.3.3"
+    resolved "http://registry.npm.taobao.org/karma-coverage-istanbul-reporter/download/karma-coverage-istanbul-reporter-1.3.3.tgz#daf26051d5a0daa5838a4ce81aa4a41724bdf36b"
+    dependencies:
+      istanbul-api "^1.1.14"
+      minimatch "^3.0.4"
+  
+  karma-jasmine-html-reporter@^0.2.2:
+    version "0.2.2"
+    resolved "http://registry.npm.taobao.org/karma-jasmine-html-reporter/download/karma-jasmine-html-reporter-0.2.2.tgz#48a8e5ef18807617ee2b5e33c1194c35b439524c"
+    dependencies:
+      karma-jasmine "^1.0.2"
+  
+  karma-jasmine@^1.0.2, karma-jasmine@~1.1.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/karma-jasmine/download/karma-jasmine-1.1.1.tgz#6fe840e75a11600c9d91e84b33c458e1c46a3529"
+  
+  karma-remap-istanbul@^0.6.0:
+    version "0.6.0"
+    resolved "http://registry.npm.taobao.org/karma-remap-istanbul/download/karma-remap-istanbul-0.6.0.tgz#97f3b770065254f9b4724f2d9be4a3a2e1baf6fc"
+    dependencies:
+      istanbul "^0.4.3"
+      remap-istanbul "^0.9.0"
+  
+  karma-sauce-launcher@^1.2.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/karma-sauce-launcher/download/karma-sauce-launcher-1.2.0.tgz#6f2558ddef3cf56879fa27540c8ae9f8bfd16bca"
+    dependencies:
+      q "^1.5.0"
+      sauce-connect-launcher "^1.2.2"
+      saucelabs "^1.4.0"
+      wd "^1.4.0"
+  
+  karma-source-map-support@^1.2.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/karma-source-map-support/download/karma-source-map-support-1.2.0.tgz#1bf81e7bb4b089627ab352ec4179e117c406a540"
+    dependencies:
+      source-map-support "^0.4.1"
+  
+  karma@~1.7.1:
+    version "1.7.1"
+    resolved "http://registry.npm.taobao.org/karma/download/karma-1.7.1.tgz#85cc08e9e0a22d7ce9cca37c4a1be824f6a2b1ae"
+    dependencies:
+      bluebird "^3.3.0"
+      body-parser "^1.16.1"
+      chokidar "^1.4.1"
+      colors "^1.1.0"
+      combine-lists "^1.0.0"
+      connect "^3.6.0"
+      core-js "^2.2.0"
+      di "^0.0.1"
+      dom-serialize "^2.2.0"
+      expand-braces "^0.1.1"
+      glob "^7.1.1"
+      graceful-fs "^4.1.2"
+      http-proxy "^1.13.0"
+      isbinaryfile "^3.0.0"
+      lodash "^3.8.0"
+      log4js "^0.6.31"
+      mime "^1.3.4"
+      minimatch "^3.0.2"
+      optimist "^0.6.1"
+      qjobs "^1.1.4"
+      range-parser "^1.2.0"
+      rimraf "^2.6.0"
+      safe-buffer "^5.0.1"
+      socket.io "1.7.3"
+      source-map "^0.5.3"
+      tmp "0.0.31"
+      useragent "^2.1.12"
+  
+  killable@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/killable/download/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b"
+  
+  kind-of@^2.0.1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5"
+    dependencies:
+      is-buffer "^1.0.2"
+  
+  kind-of@^3.0.2, kind-of@^3.2.2:
+    version "3.2.2"
+    resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+    dependencies:
+      is-buffer "^1.1.5"
+  
+  kind-of@^4.0.0:
+    version "4.0.0"
+    resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+    dependencies:
+      is-buffer "^1.1.5"
+  
+  known-css-properties@^0.5.0:
+    version "0.5.0"
+    resolved "http://registry.npm.taobao.org/known-css-properties/download/known-css-properties-0.5.0.tgz#6ff66943ed4a5b55657ee095779a91f4536f8084"
+  
+  lazy-cache@^0.2.3:
+    version "0.2.7"
+    resolved "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65"
+  
+  lazy-cache@^1.0.3:
+    version "1.0.4"
+    resolved "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+  
+  lazystream@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/lazystream/download/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
+    dependencies:
+      readable-stream "^2.0.5"
+  
+  lcid@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+    dependencies:
+      invert-kv "^1.0.0"
+  
+  less-loader@^4.0.5:
+    version "4.0.5"
+    resolved "http://registry.npm.taobao.org/less-loader/download/less-loader-4.0.5.tgz#ae155a7406cac6acd293d785587fcff0f478c4dd"
+    dependencies:
+      clone "^2.1.1"
+      loader-utils "^1.1.0"
+      pify "^2.3.0"
+  
+  less@^2.7.2:
+    version "2.7.3"
+    resolved "http://registry.npm.taobao.org/less/download/less-2.7.3.tgz#cc1260f51c900a9ec0d91fb6998139e02507b63b"
+    optionalDependencies:
+      errno "^0.1.1"
+      graceful-fs "^4.1.2"
+      image-size "~0.5.0"
+      mime "^1.2.11"
+      mkdirp "^0.5.0"
+      promise "^7.1.1"
+      request "2.81.0"
+      source-map "^0.5.3"
+  
+  leven@^2.1.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/leven/download/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
+  
+  levn@~0.3.0:
+    version "0.3.0"
+    resolved "http://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+    dependencies:
+      prelude-ls "~1.1.2"
+      type-check "~0.3.2"
+  
+  license-webpack-plugin@^1.0.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/license-webpack-plugin/download/license-webpack-plugin-1.1.1.tgz#76b2cedccc78f139fd7877e576f756cfc141b8c2"
+    dependencies:
+      ejs "^2.5.7"
+  
+  lint-staged@^5.0.0:
+    version "5.0.0"
+    resolved "http://registry.npm.taobao.org/lint-staged/download/lint-staged-5.0.0.tgz#f1c670e03e2fdf3f3d0eb81f72d3bcf658770e54"
+    dependencies:
+      app-root-path "^2.0.0"
+      chalk "^2.1.0"
+      commander "^2.11.0"
+      cosmiconfig "^3.1.0"
+      dedent "^0.7.0"
+      execa "^0.8.0"
+      find-parent-dir "^0.3.0"
+      is-glob "^4.0.0"
+      jest-validate "^21.1.0"
+      listr "^0.13.0"
+      lodash "^4.17.4"
+      log-symbols "^2.0.0"
+      minimatch "^3.0.0"
+      npm-which "^3.0.1"
+      p-map "^1.1.1"
+      path-is-inside "^1.0.2"
+      pify "^3.0.0"
+      staged-git-files "0.0.4"
+      stringify-object "^3.2.0"
+  
+  listr-silent-renderer@^1.1.1:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/listr-silent-renderer/download/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e"
+  
+  listr-update-renderer@^0.4.0:
+    version "0.4.0"
+    resolved "http://registry.npm.taobao.org/listr-update-renderer/download/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7"
+    dependencies:
+      chalk "^1.1.3"
+      cli-truncate "^0.2.1"
+      elegant-spinner "^1.0.1"
+      figures "^1.7.0"
+      indent-string "^3.0.0"
+      log-symbols "^1.0.2"
+      log-update "^1.0.2"
+      strip-ansi "^3.0.1"
+  
+  listr-verbose-renderer@^0.4.0:
+    version "0.4.1"
+    resolved "http://registry.npm.taobao.org/listr-verbose-renderer/download/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35"
+    dependencies:
+      chalk "^1.1.3"
+      cli-cursor "^1.0.2"
+      date-fns "^1.27.2"
+      figures "^1.7.0"
+  
+  listr@^0.13.0:
+    version "0.13.0"
+    resolved "http://registry.npm.taobao.org/listr/download/listr-0.13.0.tgz#20bb0ba30bae660ee84cc0503df4be3d5623887d"
+    dependencies:
+      chalk "^1.1.3"
+      cli-truncate "^0.2.1"
+      figures "^1.7.0"
+      indent-string "^2.1.0"
+      is-observable "^0.2.0"
+      is-promise "^2.1.0"
+      is-stream "^1.1.0"
+      listr-silent-renderer "^1.1.1"
+      listr-update-renderer "^0.4.0"
+      listr-verbose-renderer "^0.4.0"
+      log-symbols "^1.0.2"
+      log-update "^1.0.2"
+      ora "^0.2.3"
+      p-map "^1.1.1"
+      rxjs "^5.4.2"
+      stream-to-observable "^0.2.0"
+      strip-ansi "^3.0.1"
+  
+  load-json-file@^1.0.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+    dependencies:
+      graceful-fs "^4.1.2"
+      parse-json "^2.2.0"
+      pify "^2.0.0"
+      pinkie-promise "^2.0.0"
+      strip-bom "^2.0.0"
+  
+  load-json-file@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+    dependencies:
+      graceful-fs "^4.1.2"
+      parse-json "^2.2.0"
+      pify "^2.0.0"
+      strip-bom "^3.0.0"
+  
+  load-json-file@^4.0.0:
+    version "4.0.0"
+    resolved "http://registry.npm.taobao.org/load-json-file/download/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
+    dependencies:
+      graceful-fs "^4.1.2"
+      parse-json "^4.0.0"
+      pify "^3.0.0"
+      strip-bom "^3.0.0"
+  
+  loader-runner@^2.3.0:
+    version "2.3.0"
+    resolved "http://registry.npm.taobao.org/loader-runner/download/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+  
+  loader-utils@1.1.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/loader-utils/download/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+    dependencies:
+      big.js "^3.1.3"
+      emojis-list "^2.0.0"
+      json5 "^0.5.0"
+  
+  loader-utils@^0.2.15, loader-utils@^0.2.16, loader-utils@~0.2.2:
+    version "0.2.17"
+    resolved "http://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
+    dependencies:
+      big.js "^3.1.3"
+      emojis-list "^2.0.0"
+      json5 "^0.5.0"
+      object-assign "^4.0.1"
+  
+  locate-path@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+    dependencies:
+      p-locate "^2.0.0"
+      path-exists "^3.0.0"
+  
+  lodash._basecopy@^3.0.0:
+    version "3.0.1"
+    resolved "http://registry.npm.taobao.org/lodash._basecopy/download/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
+  
+  lodash._basetostring@^3.0.0:
+    version "3.0.1"
+    resolved "http://registry.npm.taobao.org/lodash._basetostring/download/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5"
+  
+  lodash._basevalues@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/lodash._basevalues/download/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7"
+  
+  lodash._getnative@^3.0.0:
+    version "3.9.1"
+    resolved "http://registry.npm.taobao.org/lodash._getnative/download/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+  
+  lodash._isiterateecall@^3.0.0:
+    version "3.0.9"
+    resolved "http://registry.npm.taobao.org/lodash._isiterateecall/download/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
+  
+  lodash._reescape@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/lodash._reescape/download/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a"
+  
+  lodash._reevaluate@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/lodash._reevaluate/download/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed"
+  
+  lodash._reinterpolate@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/lodash._reinterpolate/download/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
+  
+  lodash._root@^3.0.0:
+    version "3.0.1"
+    resolved "http://registry.npm.taobao.org/lodash._root/download/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
+  
+  lodash.assign@^4.2.0:
+    version "4.2.0"
+    resolved "http://registry.npm.taobao.org/lodash.assign/download/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
+  
+  lodash.camelcase@^4.3.0:
+    version "4.3.0"
+    resolved "http://registry.npm.taobao.org/lodash.camelcase/download/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+  
+  lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0:
+    version "4.5.0"
+    resolved "http://registry.npm.taobao.org/lodash.clonedeep/download/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+  
+  lodash.escape@^3.0.0:
+    version "3.2.0"
+    resolved "http://registry.npm.taobao.org/lodash.escape/download/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
+    dependencies:
+      lodash._root "^3.0.0"
+  
+  lodash.isarguments@^3.0.0:
+    version "3.1.0"
+    resolved "http://registry.npm.taobao.org/lodash.isarguments/download/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
+  
+  lodash.isarray@^3.0.0:
+    version "3.0.4"
+    resolved "http://registry.npm.taobao.org/lodash.isarray/download/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
+  
+  lodash.keys@^3.0.0:
+    version "3.1.2"
+    resolved "http://registry.npm.taobao.org/lodash.keys/download/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
+    dependencies:
+      lodash._getnative "^3.0.0"
+      lodash.isarguments "^3.0.0"
+      lodash.isarray "^3.0.0"
+  
+  lodash.memoize@^4.1.2:
+    version "4.1.2"
+    resolved "http://registry.npm.taobao.org/lodash.memoize/download/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+  
+  lodash.mergewith@^4.6.0:
+    version "4.6.0"
+    resolved "http://registry.npm.taobao.org/lodash.mergewith/download/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55"
+  
+  lodash.restparam@^3.0.0:
+    version "3.6.1"
+    resolved "http://registry.npm.taobao.org/lodash.restparam/download/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
+  
+  lodash.tail@^4.1.1:
+    version "4.1.1"
+    resolved "http://registry.npm.taobao.org/lodash.tail/download/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
+  
+  lodash.template@^3.0.0:
+    version "3.6.2"
+    resolved "http://registry.npm.taobao.org/lodash.template/download/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
+    dependencies:
+      lodash._basecopy "^3.0.0"
+      lodash._basetostring "^3.0.0"
+      lodash._basevalues "^3.0.0"
+      lodash._isiterateecall "^3.0.0"
+      lodash._reinterpolate "^3.0.0"
+      lodash.escape "^3.0.0"
+      lodash.keys "^3.0.0"
+      lodash.restparam "^3.0.0"
+      lodash.templatesettings "^3.0.0"
+  
+  lodash.templatesettings@^3.0.0:
+    version "3.1.1"
+    resolved "http://registry.npm.taobao.org/lodash.templatesettings/download/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5"
+    dependencies:
+      lodash._reinterpolate "^3.0.0"
+      lodash.escape "^3.0.0"
+  
+  lodash.uniq@^4.5.0:
+    version "4.5.0"
+    resolved "http://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+  
+  lodash@4.16.2:
+    version "4.16.2"
+    resolved "http://registry.npm.taobao.org/lodash/download/lodash-4.16.2.tgz#3e626db827048a699281a8a125226326cfc0e652"
+  
+  lodash@4.17.4, lodash@^4.0.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.16.6, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.8.0, lodash@~4.17.4:
+    version "4.17.4"
+    resolved "http://registry.npm.taobao.org/lodash/download/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
+  
+  lodash@^3.8.0:
+    version "3.10.1"
+    resolved "http://registry.npm.taobao.org/lodash/download/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+  
+  log-symbols@^1.0.2:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/log-symbols/download/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
+    dependencies:
+      chalk "^1.0.0"
+  
+  log-symbols@^2.0.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/log-symbols/download/log-symbols-2.1.0.tgz#f35fa60e278832b538dc4dddcbb478a45d3e3be6"
+    dependencies:
+      chalk "^2.0.1"
+  
+  log-update@^1.0.2:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/log-update/download/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1"
+    dependencies:
+      ansi-escapes "^1.0.0"
+      cli-cursor "^1.0.2"
+  
+  log4js@^0.6.31:
+    version "0.6.38"
+    resolved "http://registry.npm.taobao.org/log4js/download/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd"
+    dependencies:
+      readable-stream "~1.0.2"
+      semver "~4.3.3"
+  
+  loglevel@^1.4.1:
+    version "1.6.0"
+    resolved "http://registry.npm.taobao.org/loglevel/download/loglevel-1.6.0.tgz#ae0caa561111498c5ba13723d6fb631d24003934"
+  
+  longest-streak@^2.0.1:
+    version "2.0.2"
+    resolved "http://registry.npm.taobao.org/longest-streak/download/longest-streak-2.0.2.tgz#2421b6ba939a443bb9ffebf596585a50b4c38e2e"
+  
+  longest@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+  
+  loose-envify@^1.0.0:
+    version "1.3.1"
+    resolved "http://registry.npm.taobao.org/loose-envify/download/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+    dependencies:
+      js-tokens "^3.0.0"
+  
+  loud-rejection@^1.0.0:
+    version "1.6.0"
+    resolved "http://registry.npm.taobao.org/loud-rejection/download/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+    dependencies:
+      currently-unhandled "^0.4.1"
+      signal-exit "^3.0.0"
+  
+  lower-case@^1.1.1:
+    version "1.1.4"
+    resolved "http://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
+  
+  lru-cache@2.2.x:
+    version "2.2.4"
+    resolved "http://registry.npm.taobao.org/lru-cache/download/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d"
+  
+  lru-cache@^4.0.1, lru-cache@^4.1.1:
+    version "4.1.1"
+    resolved "http://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
+    dependencies:
+      pseudomap "^1.0.2"
+      yallist "^2.1.2"
+  
+  macaddress@^0.2.8:
+    version "0.2.8"
+    resolved "http://registry.npm.taobao.org/macaddress/download/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12"
+  
+  magic-string@^0.22.3:
+    version "0.22.4"
+    resolved "http://registry.npm.taobao.org/magic-string/download/magic-string-0.22.4.tgz#31039b4e40366395618c1d6cf8193c53917475ff"
+    dependencies:
+      vlq "^0.2.1"
+  
+  make-dir@^1.0.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/make-dir/download/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51"
+    dependencies:
+      pify "^3.0.0"
+  
+  make-error@^1.1.1:
+    version "1.3.2"
+    resolved "http://registry.npm.taobao.org/make-error/download/make-error-1.3.2.tgz#8762ffad2444dd8ff1f7c819629fa28e24fea1c4"
+  
+  map-obj@^1.0.0, map-obj@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+  
+  map-obj@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/map-obj/download/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9"
+  
+  map-stream@~0.1.0:
+    version "0.1.0"
+    resolved "http://registry.npm.taobao.org/map-stream/download/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194"
+  
+  markdown-escapes@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/markdown-escapes/download/markdown-escapes-1.0.1.tgz#1994df2d3af4811de59a6714934c2b2292734518"
+  
+  markdown-table@^1.1.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/markdown-table/download/markdown-table-1.1.1.tgz#4b3dd3a133d1518b8ef0dbc709bf2a1b4824bc8c"
+  
+  math-expression-evaluator@^1.2.14:
+    version "1.2.17"
+    resolved "http://registry.npm.taobao.org/math-expression-evaluator/download/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"
+  
+  mathml-tag-names@^2.0.1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/mathml-tag-names/download/mathml-tag-names-2.0.1.tgz#8d41268168bf86d1102b98109e28e531e7a34578"
+  
+  md5.js@^1.3.4:
+    version "1.3.4"
+    resolved "http://registry.npm.taobao.org/md5.js/download/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+    dependencies:
+      hash-base "^3.0.0"
+      inherits "^2.0.1"
+  
+  mdast-util-compact@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/mdast-util-compact/download/mdast-util-compact-1.0.1.tgz#cdb5f84e2b6a2d3114df33bd05d9cb32e3c4083a"
+    dependencies:
+      unist-util-modify-children "^1.0.0"
+      unist-util-visit "^1.1.0"
+  
+  media-typer@0.3.0:
+    version "0.3.0"
+    resolved "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+  
+  mem@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/mem/download/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+    dependencies:
+      mimic-fn "^1.0.0"
+  
+  memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1:
+    version "0.4.1"
+    resolved "http://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+    dependencies:
+      errno "^0.1.3"
+      readable-stream "^2.0.1"
+  
+  memorystream@^0.3.1:
+    version "0.3.1"
+    resolved "http://registry.npm.taobao.org/memorystream/download/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
+  
+  meow@^3.3.0, meow@^3.7.0:
+    version "3.7.0"
+    resolved "http://registry.npm.taobao.org/meow/download/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+    dependencies:
+      camelcase-keys "^2.0.0"
+      decamelize "^1.1.2"
+      loud-rejection "^1.0.0"
+      map-obj "^1.0.1"
+      minimist "^1.1.3"
+      normalize-package-data "^2.3.4"
+      object-assign "^4.0.1"
+      read-pkg-up "^1.0.1"
+      redent "^1.0.0"
+      trim-newlines "^1.0.0"
+  
+  meow@^4.0.0:
+    version "4.0.0"
+    resolved "http://registry.npm.taobao.org/meow/download/meow-4.0.0.tgz#fd5855dd008db5b92c552082db1c307cba20b29d"
+    dependencies:
+      camelcase-keys "^4.0.0"
+      decamelize-keys "^1.0.0"
+      loud-rejection "^1.0.0"
+      minimist "^1.1.3"
+      minimist-options "^3.0.1"
+      normalize-package-data "^2.3.4"
+      read-pkg-up "^3.0.0"
+      redent "^2.0.0"
+      trim-newlines "^2.0.0"
+  
+  merge-descriptors@1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+  
+  methods@~1.1.2:
+    version "1.1.2"
+    resolved "http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+  
+  micromatch@^2.1.5, micromatch@^2.3.11:
+    version "2.3.11"
+    resolved "http://registry.npm.taobao.org/micromatch/download/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+    dependencies:
+      arr-diff "^2.0.0"
+      array-unique "^0.2.1"
+      braces "^1.8.2"
+      expand-brackets "^0.1.4"
+      extglob "^0.3.1"
+      filename-regex "^2.0.0"
+      is-extglob "^1.0.0"
+      is-glob "^2.0.1"
+      kind-of "^3.0.2"
+      normalize-path "^2.0.1"
+      object.omit "^2.0.0"
+      parse-glob "^3.0.4"
+      regex-cache "^0.4.2"
+  
+  miller-rabin@^4.0.0:
+    version "4.0.1"
+    resolved "http://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+    dependencies:
+      bn.js "^4.0.0"
+      brorand "^1.0.1"
+  
+  "mime-db@>= 1.30.0 < 2":
+    version "1.32.0"
+    resolved "http://registry.npm.taobao.org/mime-db/download/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414"
+  
+  mime-db@~1.30.0:
+    version "1.30.0"
+    resolved "http://registry.npm.taobao.org/mime-db/download/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
+  
+  mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7:
+    version "2.1.17"
+    resolved "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
+    dependencies:
+      mime-db "~1.30.0"
+  
+  mime@1.4.1:
+    version "1.4.1"
+    resolved "http://registry.npm.taobao.org/mime/download/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
+  
+  mime@^1.2.11, mime@^1.3.4, mime@^1.4.1, mime@^1.5.0:
+    version "1.6.0"
+    resolved "http://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+  
+  mimic-fn@^1.0.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18"
+  
+  minimalistic-assert@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
+  
+  minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+  
+  "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
+    version "3.0.4"
+    resolved "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+    dependencies:
+      brace-expansion "^1.1.7"
+  
+  minimist-options@^3.0.1:
+    version "3.0.2"
+    resolved "http://registry.npm.taobao.org/minimist-options/download/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954"
+    dependencies:
+      arrify "^1.0.1"
+      is-plain-obj "^1.1.0"
+  
+  minimist@0.0.8:
+    version "0.0.8"
+    resolved "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+  
+  minimist@1.1.x:
+    version "1.1.3"
+    resolved "http://registry.npm.taobao.org/minimist/download/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8"
+  
+  minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+  
+  minimist@~0.0.1:
+    version "0.0.10"
+    resolved "http://registry.npm.taobao.org/minimist/download/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+  
+  mississippi@^1.3.0:
+    version "1.3.0"
+    resolved "http://registry.npm.taobao.org/mississippi/download/mississippi-1.3.0.tgz#d201583eb12327e3c5c1642a404a9cacf94e34f5"
+    dependencies:
+      concat-stream "^1.5.0"
+      duplexify "^3.4.2"
+      end-of-stream "^1.1.0"
+      flush-write-stream "^1.0.0"
+      from2 "^2.1.0"
+      parallel-transform "^1.1.0"
+      pump "^1.0.0"
+      pumpify "^1.3.3"
+      stream-each "^1.1.0"
+      through2 "^2.0.0"
+  
+  mixin-object@^2.0.1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/mixin-object/download/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
+    dependencies:
+      for-in "^0.1.3"
+      is-extendable "^0.1.1"
+  
+  mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+    version "0.5.1"
+    resolved "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+    dependencies:
+      minimist "0.0.8"
+  
+  mobx-angular@>=1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/mobx-angular/download/mobx-angular-2.0.1.tgz#2638d091618080693bbed02c5df8cd714b52c167"
+  
+  mobx@>=3:
+    version "3.4.1"
+    resolved "http://registry.npm.taobao.org/mobx/download/mobx-3.4.1.tgz#37abe5ee882d401828d9f26c6c1a2f47614bbbef"
+  
+  mockjs@^1.0.1-beta3:
+    version "1.0.1-beta3"
+    resolved "http://registry.npm.taobao.org/mockjs/download/mockjs-1.0.1-beta3.tgz#d234f3c27256397564f2c955142e891909537209"
+    dependencies:
+      commander "*"
+  
+  moment@^2.18.1, moment@^2.19.3:
+    version "2.20.1"
+    resolved "http://registry.npm.taobao.org/moment/download/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd"
+  
+  move-concurrently@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/move-concurrently/download/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+    dependencies:
+      aproba "^1.1.1"
+      copy-concurrently "^1.0.0"
+      fs-write-stream-atomic "^1.0.8"
+      mkdirp "^0.5.1"
+      rimraf "^2.5.4"
+      run-queue "^1.0.3"
+  
+  ms@0.7.1:
+    version "0.7.1"
+    resolved "http://registry.npm.taobao.org/ms/download/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
+  
+  ms@0.7.2:
+    version "0.7.2"
+    resolved "http://registry.npm.taobao.org/ms/download/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
+  
+  ms@2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+  
+  multicast-dns-service-types@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
+  
+  multicast-dns@^6.0.1:
+    version "6.2.1"
+    resolved "http://registry.npm.taobao.org/multicast-dns/download/multicast-dns-6.2.1.tgz#c5035defa9219d30640558a49298067352098060"
+    dependencies:
+      dns-packet "^1.0.1"
+      thunky "^0.1.0"
+  
+  multipipe@^0.1.2:
+    version "0.1.2"
+    resolved "http://registry.npm.taobao.org/multipipe/download/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b"
+    dependencies:
+      duplexer2 "0.0.2"
+  
+  nan@^2.3.0, nan@^2.3.2:
+    version "2.8.0"
+    resolved "http://registry.npm.taobao.org/nan/download/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a"
+  
+  ncname@1.0.x:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/ncname/download/ncname-1.0.0.tgz#5b57ad18b1ca092864ef62b0b1ed8194f383b71c"
+    dependencies:
+      xml-char-classes "^1.0.0"
+  
+  negotiator@0.6.1:
+    version "0.6.1"
+    resolved "http://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+  
+  ng-clipboard-antd@^2.0.1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/ng-clipboard-antd/download/ng-clipboard-antd-2.0.1.tgz#2f200b8d22ecb6d5360408d6985df3f51abd7cf6"
+    dependencies:
+      "@angular/animations" "^5.0.0"
+      "@angular/common" "^5.0.0"
+      "@angular/compiler" "^5.0.0"
+      "@angular/core" "^5.0.0"
+      "@angular/forms" "^5.0.0"
+      "@angular/http" "^5.0.0"
+      "@angular/platform-browser" "^5.0.0"
+      "@angular/platform-browser-dynamic" "^5.0.0"
+      "@angular/router" "^5.0.0"
+      core-js "^2.4.1"
+      ng-zorro-antd "^0.6.7"
+      ngx-highlight-js "^1.0.3"
+      rxjs "^5.5.2"
+      zone.js "^0.8.14"
+  
+  ng-tree-antd@^2.0.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/ng-tree-antd/download/ng-tree-antd-2.1.0.tgz#4cbb93ad3c7a2bddc6c329d788e767777481dcbb"
+    dependencies:
+      "@angular/animations" "^5.0.0"
+      "@angular/common" "^5.0.0"
+      "@angular/compiler" "^5.0.0"
+      "@angular/core" "^5.0.0"
+      "@angular/forms" "^5.0.0"
+      "@angular/http" "^5.0.0"
+      "@angular/platform-browser" "^5.0.0"
+      "@angular/platform-browser-dynamic" "^5.0.0"
+      "@angular/router" "^5.0.0"
+      core-js "^2.4.1"
+      ngx-highlight-js "^1.0.3"
+      rxjs "^5.5.2"
+      zone.js "^0.8.14"
+  
+  ng-zorro-antd-extra@^1.1.6:
+    version "1.1.6"
+    resolved "http://registry.npm.taobao.org/ng-zorro-antd-extra/download/ng-zorro-antd-extra-1.1.6.tgz#b69ba30603843ffd6ded09a46dd2038542251e40"
+  
+  ng-zorro-antd@^0.6.5, ng-zorro-antd@^0.6.7:
+    version "0.6.10"
+    resolved "http://registry.npm.taobao.org/ng-zorro-antd/download/ng-zorro-antd-0.6.10.tgz#0cf5ec5cb94e10226a2b2becff67debf0c8ad860"
+    dependencies:
+      "@angular/cdk" "^5.0.0"
+      moment "^2.18.1"
+      tslib "^1.7.1"
+  
+  ng2-dnd@^5.0.0:
+    version "5.0.2"
+    resolved "http://registry.npm.taobao.org/ng2-dnd/download/ng2-dnd-5.0.2.tgz#862278ac7dedfa14f5783bbf34014d5d73dfefb4"
+  
+  ng2-file-upload@^1.2.1:
+    version "1.3.0"
+    resolved "http://registry.npm.taobao.org/ng2-file-upload/download/ng2-file-upload-1.3.0.tgz#d90f8f568f62383462175f8bdfa0096b131f277a"
+  
+  ng2-img-cropper@^0.9.0:
+    version "0.9.0"
+    resolved "http://registry.npm.taobao.org/ng2-img-cropper/download/ng2-img-cropper-0.9.0.tgz#305337e669c4e5adc876d628dcae0bca4d10d1c3"
+  
+  ngx-color-picker@^5.0.0:
+    version "5.3.0"
+    resolved "http://registry.npm.taobao.org/ngx-color-picker/download/ngx-color-picker-5.3.0.tgz#49d64ecd391e39429b8d1dbc8701f18a4efffd3e"
+  
+  ngx-countdown@^2.0.0:
+    version "2.0.4"
+    resolved "http://registry.npm.taobao.org/ngx-countdown/download/ngx-countdown-2.0.4.tgz#b0c0266da4aa24efc057f99f2e19a03142133cc0"
+  
+  ngx-highlight-js@^1.0.3:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/ngx-highlight-js/download/ngx-highlight-js-1.0.3.tgz#b46ef9069d443baae7a43e5e4217d64fb8049003"
+  
+  ngx-tinymce@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/ngx-tinymce/download/ngx-tinymce-1.0.1.tgz#a5f04f71a6a393a8363690530c4d832fc39fc9f2"
+    dependencies:
+      "@angular/animations" "^5.0.0"
+      "@angular/common" "^5.0.0"
+      "@angular/compiler" "^5.0.0"
+      "@angular/core" "^5.0.0"
+      "@angular/forms" "^5.0.0"
+      "@angular/http" "^5.0.0"
+      "@angular/platform-browser" "^5.0.0"
+      "@angular/platform-browser-dynamic" "^5.0.0"
+      "@angular/router" "^5.0.0"
+      core-js "^2.4.1"
+      ngx-highlight-js "^1.0.3"
+      rxjs "^5.5.2"
+      zone.js "^0.8.14"
+  
+  ngx-ueditor@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/ngx-ueditor/download/ngx-ueditor-1.1.0.tgz#0766acc6a8e8205661131c97be49c1e991c97c6c"
+    dependencies:
+      "@angular/animations" "^5.0.0"
+      "@angular/common" "^5.0.0"
+      "@angular/compiler" "^5.0.0"
+      "@angular/core" "^5.0.0"
+      "@angular/forms" "^5.0.0"
+      "@angular/http" "^5.0.0"
+      "@angular/platform-browser" "^5.0.0"
+      "@angular/platform-browser-dynamic" "^5.0.0"
+      "@angular/router" "^5.0.0"
+      core-js "^2.4.1"
+      ngx-highlight-js "^1.0.3"
+      rxjs "^5.5.2"
+      zone.js "^0.8.14"
+  
+  no-case@^2.2.0:
+    version "2.3.2"
+    resolved "http://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
+    dependencies:
+      lower-case "^1.1.1"
+  
+  node-forge@0.6.33:
+    version "0.6.33"
+    resolved "http://registry.npm.taobao.org/node-forge/download/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc"
+  
+  node-gyp@^3.3.1:
+    version "3.6.2"
+    resolved "http://registry.npm.taobao.org/node-gyp/download/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60"
+    dependencies:
+      fstream "^1.0.0"
+      glob "^7.0.3"
+      graceful-fs "^4.1.2"
+      minimatch "^3.0.2"
+      mkdirp "^0.5.0"
+      nopt "2 || 3"
+      npmlog "0 || 1 || 2 || 3 || 4"
+      osenv "0"
+      request "2"
+      rimraf "2"
+      semver "~5.3.0"
+      tar "^2.0.0"
+      which "1"
+  
+  node-libs-browser@^2.0.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+    dependencies:
+      assert "^1.1.1"
+      browserify-zlib "^0.2.0"
+      buffer "^4.3.0"
+      console-browserify "^1.1.0"
+      constants-browserify "^1.0.0"
+      crypto-browserify "^3.11.0"
+      domain-browser "^1.1.1"
+      events "^1.0.0"
+      https-browserify "^1.0.0"
+      os-browserify "^0.3.0"
+      path-browserify "0.0.0"
+      process "^0.11.10"
+      punycode "^1.2.4"
+      querystring-es3 "^0.2.0"
+      readable-stream "^2.3.3"
+      stream-browserify "^2.0.1"
+      stream-http "^2.7.2"
+      string_decoder "^1.0.0"
+      timers-browserify "^2.0.4"
+      tty-browserify "0.0.0"
+      url "^0.11.0"
+      util "^0.10.3"
+      vm-browserify "0.0.4"
+  
+  node-modules-path@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/node-modules-path/download/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8"
+  
+  node-pre-gyp@^0.6.39:
+    version "0.6.39"
+    resolved "http://registry.npm.taobao.org/node-pre-gyp/download/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649"
+    dependencies:
+      detect-libc "^1.0.2"
+      hawk "3.1.3"
+      mkdirp "^0.5.1"
+      nopt "^4.0.1"
+      npmlog "^4.0.2"
+      rc "^1.1.7"
+      request "2.81.0"
+      rimraf "^2.6.1"
+      semver "^5.3.0"
+      tar "^2.2.1"
+      tar-pack "^3.4.0"
+  
+  node-sass@^4.3.0:
+    version "4.7.2"
+    resolved "http://registry.npm.taobao.org/node-sass/download/node-sass-4.7.2.tgz#9366778ba1469eb01438a9e8592f4262bcb6794e"
+    dependencies:
+      async-foreach "^0.1.3"
+      chalk "^1.1.1"
+      cross-spawn "^3.0.0"
+      gaze "^1.0.0"
+      get-stdin "^4.0.1"
+      glob "^7.0.3"
+      in-publish "^2.0.0"
+      lodash.assign "^4.2.0"
+      lodash.clonedeep "^4.3.2"
+      lodash.mergewith "^4.6.0"
+      meow "^3.7.0"
+      mkdirp "^0.5.1"
+      nan "^2.3.2"
+      node-gyp "^3.3.1"
+      npmlog "^4.0.0"
+      request "~2.79.0"
+      sass-graph "^2.2.4"
+      stdout-stream "^1.4.0"
+      "true-case-path" "^1.0.2"
+  
+  "nopt@2 || 3", nopt@3.x:
+    version "3.0.6"
+    resolved "http://registry.npm.taobao.org/nopt/download/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+    dependencies:
+      abbrev "1"
+  
+  nopt@^4.0.1:
+    version "4.0.1"
+    resolved "http://registry.npm.taobao.org/nopt/download/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+    dependencies:
+      abbrev "1"
+      osenv "^0.1.4"
+  
+  normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+    version "2.4.0"
+    resolved "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+    dependencies:
+      hosted-git-info "^2.1.4"
+      is-builtin-module "^1.0.0"
+      semver "2 || 3 || 4 || 5"
+      validate-npm-package-license "^3.0.1"
+  
+  normalize-path@^2.0.0, normalize-path@^2.0.1:
+    version "2.1.1"
+    resolved "http://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+    dependencies:
+      remove-trailing-separator "^1.0.1"
+  
+  normalize-range@^0.1.2:
+    version "0.1.2"
+    resolved "http://registry.npm.taobao.org/normalize-range/download/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+  
+  normalize-selector@^0.2.0:
+    version "0.2.0"
+    resolved "http://registry.npm.taobao.org/normalize-selector/download/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03"
+  
+  normalize-url@^1.4.0:
+    version "1.9.1"
+    resolved "http://registry.npm.taobao.org/normalize-url/download/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
+    dependencies:
+      object-assign "^4.0.1"
+      prepend-http "^1.0.0"
+      query-string "^4.1.0"
+      sort-keys "^1.0.0"
+  
+  npm-path@^2.0.2:
+    version "2.0.4"
+    resolved "http://registry.npm.taobao.org/npm-path/download/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64"
+    dependencies:
+      which "^1.2.10"
+  
+  npm-run-all@^4.1.1:
+    version "4.1.2"
+    resolved "http://registry.npm.taobao.org/npm-run-all/download/npm-run-all-4.1.2.tgz#90d62d078792d20669139e718621186656cea056"
+    dependencies:
+      ansi-styles "^3.2.0"
+      chalk "^2.1.0"
+      cross-spawn "^5.1.0"
+      memorystream "^0.3.1"
+      minimatch "^3.0.4"
+      ps-tree "^1.1.0"
+      read-pkg "^3.0.0"
+      shell-quote "^1.6.1"
+      string.prototype.padend "^3.0.0"
+  
+  npm-run-path@^2.0.0:
+    version "2.0.2"
+    resolved "http://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+    dependencies:
+      path-key "^2.0.0"
+  
+  npm-which@^3.0.1:
+    version "3.0.1"
+    resolved "http://registry.npm.taobao.org/npm-which/download/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa"
+    dependencies:
+      commander "^2.9.0"
+      npm-path "^2.0.2"
+      which "^1.2.10"
+  
+  "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
+    version "4.1.2"
+    resolved "http://registry.npm.taobao.org/npmlog/download/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+    dependencies:
+      are-we-there-yet "~1.1.2"
+      console-control-strings "~1.1.0"
+      gauge "~2.7.3"
+      set-blocking "~2.0.0"
+  
+  nth-check@~1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/nth-check/download/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
+    dependencies:
+      boolbase "~1.0.0"
+  
+  null-check@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/null-check/download/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd"
+  
+  num2fraction@^1.2.2:
+    version "1.2.2"
+    resolved "http://registry.npm.taobao.org/num2fraction/download/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+  
+  number-is-nan@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+  
+  oauth-sign@~0.8.1, oauth-sign@~0.8.2:
+    version "0.8.2"
+    resolved "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+  
+  object-assign@4.1.0:
+    version "4.1.0"
+    resolved "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0"
+  
+  object-assign@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/object-assign/download/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
+  
+  object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+    version "4.1.1"
+    resolved "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+  
+  object-component@0.0.3:
+    version "0.0.3"
+    resolved "http://registry.npm.taobao.org/object-component/download/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
+  
+  object-keys@^1.0.8:
+    version "1.0.11"
+    resolved "http://registry.npm.taobao.org/object-keys/download/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
+  
+  object.omit@^2.0.0:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/object.omit/download/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+    dependencies:
+      for-own "^0.1.4"
+      is-extendable "^0.1.1"
+  
+  obuf@^1.0.0, obuf@^1.1.1:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/obuf/download/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e"
+  
+  on-finished@~2.3.0:
+    version "2.3.0"
+    resolved "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+    dependencies:
+      ee-first "1.1.1"
+  
+  on-headers@~1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/on-headers/download/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
+  
+  once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
+    version "1.4.0"
+    resolved "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+    dependencies:
+      wrappy "1"
+  
+  onetime@^1.0.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/onetime/download/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+  
+  opener@^1.4.3:
+    version "1.4.3"
+    resolved "http://registry.npm.taobao.org/opener/download/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8"
+  
+  opn@^5.1.0, opn@~5.1.0:
+    version "5.1.0"
+    resolved "http://registry.npm.taobao.org/opn/download/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519"
+    dependencies:
+      is-wsl "^1.1.0"
+  
+  optimist@^0.6.1, optimist@~0.6.0:
+    version "0.6.1"
+    resolved "http://registry.npm.taobao.org/optimist/download/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+    dependencies:
+      minimist "~0.0.1"
+      wordwrap "~0.0.2"
+  
+  optionator@^0.8.1:
+    version "0.8.2"
+    resolved "http://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+    dependencies:
+      deep-is "~0.1.3"
+      fast-levenshtein "~2.0.4"
+      levn "~0.3.0"
+      prelude-ls "~1.1.2"
+      type-check "~0.3.2"
+      wordwrap "~1.0.0"
+  
+  options@>=0.0.5:
+    version "0.0.6"
+    resolved "http://registry.npm.taobao.org/options/download/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
+  
+  ora@^0.2.3:
+    version "0.2.3"
+    resolved "http://registry.npm.taobao.org/ora/download/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4"
+    dependencies:
+      chalk "^1.1.1"
+      cli-cursor "^1.0.2"
+      cli-spinners "^0.1.2"
+      object-assign "^4.0.1"
+  
+  original@>=0.0.5:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/original/download/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b"
+    dependencies:
+      url-parse "1.0.x"
+  
+  os-browserify@^0.3.0:
+    version "0.3.0"
+    resolved "http://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+  
+  os-homedir@^1.0.0, os-homedir@^1.0.1:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+  
+  os-locale@^1.4.0:
+    version "1.4.0"
+    resolved "http://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+    dependencies:
+      lcid "^1.0.0"
+  
+  os-locale@^2.0.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/os-locale/download/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+    dependencies:
+      execa "^0.7.0"
+      lcid "^1.0.0"
+      mem "^1.1.0"
+  
+  os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+  
+  osenv@0, osenv@^0.1.4:
+    version "0.1.4"
+    resolved "http://registry.npm.taobao.org/osenv/download/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
+    dependencies:
+      os-homedir "^1.0.0"
+      os-tmpdir "^1.0.0"
+  
+  p-finally@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+  
+  p-limit@^1.0.0, p-limit@^1.1.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/p-limit/download/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c"
+    dependencies:
+      p-try "^1.0.0"
+  
+  p-locate@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+    dependencies:
+      p-limit "^1.1.0"
+  
+  p-map@^1.1.1:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/p-map/download/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
+  
+  p-try@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+  
+  pako@~1.0.5:
+    version "1.0.6"
+    resolved "http://registry.npm.taobao.org/pako/download/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+  
+  parallel-transform@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/parallel-transform/download/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
+    dependencies:
+      cyclist "~0.2.2"
+      inherits "^2.0.3"
+      readable-stream "^2.1.5"
+  
+  param-case@2.1.x:
+    version "2.1.1"
+    resolved "http://registry.npm.taobao.org/param-case/download/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
+    dependencies:
+      no-case "^2.2.0"
+  
+  parse-asn1@^5.0.0:
+    version "5.1.0"
+    resolved "http://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712"
+    dependencies:
+      asn1.js "^4.0.0"
+      browserify-aes "^1.0.0"
+      create-hash "^1.1.0"
+      evp_bytestokey "^1.0.0"
+      pbkdf2 "^3.0.3"
+  
+  parse-entities@^1.0.2:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/parse-entities/download/parse-entities-1.1.1.tgz#8112d88471319f27abae4d64964b122fe4e1b890"
+    dependencies:
+      character-entities "^1.0.0"
+      character-entities-legacy "^1.0.0"
+      character-reference-invalid "^1.0.0"
+      is-alphanumerical "^1.0.0"
+      is-decimal "^1.0.0"
+      is-hexadecimal "^1.0.0"
+  
+  parse-glob@^3.0.4:
+    version "3.0.4"
+    resolved "http://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+    dependencies:
+      glob-base "^0.3.0"
+      is-dotfile "^1.0.0"
+      is-extglob "^1.0.0"
+      is-glob "^2.0.0"
+  
+  parse-json@^2.2.0:
+    version "2.2.0"
+    resolved "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+    dependencies:
+      error-ex "^1.2.0"
+  
+  parse-json@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/parse-json/download/parse-json-3.0.0.tgz#fa6f47b18e23826ead32f263e744d0e1e847fb13"
+    dependencies:
+      error-ex "^1.3.1"
+  
+  parse-json@^4.0.0:
+    version "4.0.0"
+    resolved "http://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+    dependencies:
+      error-ex "^1.3.1"
+      json-parse-better-errors "^1.0.1"
+  
+  parse-passwd@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/parse-passwd/download/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
+  
+  parse-svg-path@~0.1.1:
+    version "0.1.2"
+    resolved "http://registry.npm.taobao.org/parse-svg-path/download/parse-svg-path-0.1.2.tgz#7a7ec0d1eb06fa5325c7d3e009b859a09b5d49eb"
+  
+  parsejson@0.0.3:
+    version "0.0.3"
+    resolved "http://registry.npm.taobao.org/parsejson/download/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab"
+    dependencies:
+      better-assert "~1.0.0"
+  
+  parseqs@0.0.5:
+    version "0.0.5"
+    resolved "http://registry.npm.taobao.org/parseqs/download/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
+    dependencies:
+      better-assert "~1.0.0"
+  
+  parseuri@0.0.5:
+    version "0.0.5"
+    resolved "http://registry.npm.taobao.org/parseuri/download/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
+    dependencies:
+      better-assert "~1.0.0"
+  
+  parseurl@~1.3.2:
+    version "1.3.2"
+    resolved "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
+  
+  path-browserify@0.0.0:
+    version "0.0.0"
+    resolved "http://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+  
+  path-exists@^2.0.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+    dependencies:
+      pinkie-promise "^2.0.0"
+  
+  path-exists@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+  
+  path-is-absolute@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+  
+  path-is-inside@^1.0.1, path-is-inside@^1.0.2:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+  
+  path-key@^2.0.0:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+  
+  path-parse@^1.0.5:
+    version "1.0.5"
+    resolved "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+  
+  path-to-regexp@0.1.7:
+    version "0.1.7"
+    resolved "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+  
+  path-type@^1.0.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+    dependencies:
+      graceful-fs "^4.1.2"
+      pify "^2.0.0"
+      pinkie-promise "^2.0.0"
+  
+  path-type@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+    dependencies:
+      pify "^2.0.0"
+  
+  path-type@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+    dependencies:
+      pify "^3.0.0"
+  
+  pause-stream@0.0.11:
+    version "0.0.11"
+    resolved "http://registry.npm.taobao.org/pause-stream/download/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445"
+    dependencies:
+      through "~2.3"
+  
+  pbkdf2@^3.0.3:
+    version "3.0.14"
+    resolved "http://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade"
+    dependencies:
+      create-hash "^1.1.2"
+      create-hmac "^1.1.4"
+      ripemd160 "^2.0.1"
+      safe-buffer "^5.0.1"
+      sha.js "^2.4.8"
+  
+  performance-now@^0.2.0:
+    version "0.2.0"
+    resolved "http://registry.npm.taobao.org/performance-now/download/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
+  
+  performance-now@^2.1.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+  
+  pify@^2.0.0, pify@^2.3.0:
+    version "2.3.0"
+    resolved "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+  
+  pify@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+  
+  pinkie-promise@^2.0.0:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+    dependencies:
+      pinkie "^2.0.0"
+  
+  pinkie@^2.0.0:
+    version "2.0.4"
+    resolved "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+  
+  pkg-dir@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/pkg-dir/download/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+    dependencies:
+      find-up "^2.1.0"
+  
+  point-at-length@~1.0.2:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/point-at-length/download/point-at-length-1.0.2.tgz#9176d8d6d7c8162f12b646f707db9f0ea728125e"
+    dependencies:
+      abs-svg-path "~0.1.1"
+      isarray "~0.0.1"
+      parse-svg-path "~0.1.1"
+  
+  portfinder@^1.0.9, portfinder@~1.0.12:
+    version "1.0.13"
+    resolved "http://registry.npm.taobao.org/portfinder/download/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9"
+    dependencies:
+      async "^1.5.2"
+      debug "^2.2.0"
+      mkdirp "0.5.x"
+  
+  postcss-calc@^5.2.0:
+    version "5.3.1"
+    resolved "http://registry.npm.taobao.org/postcss-calc/download/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
+    dependencies:
+      postcss "^5.0.2"
+      postcss-message-helpers "^2.0.0"
+      reduce-css-calc "^1.2.6"
+  
+  postcss-colormin@^2.1.8:
+    version "2.2.2"
+    resolved "http://registry.npm.taobao.org/postcss-colormin/download/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b"
+    dependencies:
+      colormin "^1.0.5"
+      postcss "^5.0.13"
+      postcss-value-parser "^3.2.3"
+  
+  postcss-convert-values@^2.3.4:
+    version "2.6.1"
+    resolved "http://registry.npm.taobao.org/postcss-convert-values/download/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d"
+    dependencies:
+      postcss "^5.0.11"
+      postcss-value-parser "^3.1.2"
+  
+  postcss-custom-properties@^6.1.0:
+    version "6.2.0"
+    resolved "http://registry.npm.taobao.org/postcss-custom-properties/download/postcss-custom-properties-6.2.0.tgz#5d929a7f06e9b84e0f11334194c0ba9a30acfbe9"
+    dependencies:
+      balanced-match "^1.0.0"
+      postcss "^6.0.13"
+  
+  postcss-discard-comments@^2.0.4:
+    version "2.0.4"
+    resolved "http://registry.npm.taobao.org/postcss-discard-comments/download/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d"
+    dependencies:
+      postcss "^5.0.14"
+  
+  postcss-discard-duplicates@^2.0.1:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/postcss-discard-duplicates/download/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932"
+    dependencies:
+      postcss "^5.0.4"
+  
+  postcss-discard-empty@^2.0.1:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/postcss-discard-empty/download/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5"
+    dependencies:
+      postcss "^5.0.14"
+  
+  postcss-discard-overridden@^0.1.1:
+    version "0.1.1"
+    resolved "http://registry.npm.taobao.org/postcss-discard-overridden/download/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58"
+    dependencies:
+      postcss "^5.0.16"
+  
+  postcss-discard-unused@^2.2.1:
+    version "2.2.3"
+    resolved "http://registry.npm.taobao.org/postcss-discard-unused/download/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433"
+    dependencies:
+      postcss "^5.0.14"
+      uniqs "^2.0.0"
+  
+  postcss-filter-plugins@^2.0.0:
+    version "2.0.2"
+    resolved "http://registry.npm.taobao.org/postcss-filter-plugins/download/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c"
+    dependencies:
+      postcss "^5.0.4"
+      uniqid "^4.0.0"
+  
+  postcss-html@^0.12.0:
+    version "0.12.0"
+    resolved "http://registry.npm.taobao.org/postcss-html/download/postcss-html-0.12.0.tgz#39b6adb4005dfc5464df7999c0f81c95bced7e50"
+    dependencies:
+      htmlparser2 "^3.9.2"
+      remark "^8.0.0"
+      unist-util-find-all-after "^1.0.1"
+  
+  postcss-less@^1.1.0:
+    version "1.1.3"
+    resolved "http://registry.npm.taobao.org/postcss-less/download/postcss-less-1.1.3.tgz#6930525271bfe38d5793d33ac09c1a546b87bb51"
+    dependencies:
+      postcss "^5.2.16"
+  
+  postcss-load-config@^1.2.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/postcss-load-config/download/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a"
+    dependencies:
+      cosmiconfig "^2.1.0"
+      object-assign "^4.1.0"
+      postcss-load-options "^1.2.0"
+      postcss-load-plugins "^2.3.0"
+  
+  postcss-load-options@^1.2.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/postcss-load-options/download/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c"
+    dependencies:
+      cosmiconfig "^2.1.0"
+      object-assign "^4.1.0"
+  
+  postcss-load-plugins@^2.3.0:
+    version "2.3.0"
+    resolved "http://registry.npm.taobao.org/postcss-load-plugins/download/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92"
+    dependencies:
+      cosmiconfig "^2.1.1"
+      object-assign "^4.1.0"
+  
+  postcss-loader@^2.0.8:
+    version "2.0.10"
+    resolved "http://registry.npm.taobao.org/postcss-loader/download/postcss-loader-2.0.10.tgz#090db0540140bd56a7a7f717c41bc29aeef4c674"
+    dependencies:
+      loader-utils "^1.1.0"
+      postcss "^6.0.0"
+      postcss-load-config "^1.2.0"
+      schema-utils "^0.3.0"
+  
+  postcss-media-query-parser@^0.2.3:
+    version "0.2.3"
+    resolved "http://registry.npm.taobao.org/postcss-media-query-parser/download/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244"
+  
+  postcss-merge-idents@^2.1.5:
+    version "2.1.7"
+    resolved "http://registry.npm.taobao.org/postcss-merge-idents/download/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270"
+    dependencies:
+      has "^1.0.1"
+      postcss "^5.0.10"
+      postcss-value-parser "^3.1.1"
+  
+  postcss-merge-longhand@^2.0.1:
+    version "2.0.2"
+    resolved "http://registry.npm.taobao.org/postcss-merge-longhand/download/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658"
+    dependencies:
+      postcss "^5.0.4"
+  
+  postcss-merge-rules@^2.0.3:
+    version "2.1.2"
+    resolved "http://registry.npm.taobao.org/postcss-merge-rules/download/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721"
+    dependencies:
+      browserslist "^1.5.2"
+      caniuse-api "^1.5.2"
+      postcss "^5.0.4"
+      postcss-selector-parser "^2.2.2"
+      vendors "^1.0.0"
+  
+  postcss-message-helpers@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/postcss-message-helpers/download/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e"
+  
+  postcss-minify-font-values@^1.0.2:
+    version "1.0.5"
+    resolved "http://registry.npm.taobao.org/postcss-minify-font-values/download/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69"
+    dependencies:
+      object-assign "^4.0.1"
+      postcss "^5.0.4"
+      postcss-value-parser "^3.0.2"
+  
+  postcss-minify-gradients@^1.0.1:
+    version "1.0.5"
+    resolved "http://registry.npm.taobao.org/postcss-minify-gradients/download/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1"
+    dependencies:
+      postcss "^5.0.12"
+      postcss-value-parser "^3.3.0"
+  
+  postcss-minify-params@^1.0.4:
+    version "1.2.2"
+    resolved "http://registry.npm.taobao.org/postcss-minify-params/download/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3"
+    dependencies:
+      alphanum-sort "^1.0.1"
+      postcss "^5.0.2"
+      postcss-value-parser "^3.0.2"
+      uniqs "^2.0.0"
+  
+  postcss-minify-selectors@^2.0.4:
+    version "2.1.1"
+    resolved "http://registry.npm.taobao.org/postcss-minify-selectors/download/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf"
+    dependencies:
+      alphanum-sort "^1.0.2"
+      has "^1.0.1"
+      postcss "^5.0.14"
+      postcss-selector-parser "^2.0.0"
+  
+  postcss-modules-extract-imports@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb"
+    dependencies:
+      postcss "^6.0.1"
+  
+  postcss-modules-local-by-default@^1.2.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
+    dependencies:
+      css-selector-tokenizer "^0.7.0"
+      postcss "^6.0.1"
+  
+  postcss-modules-scope@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
+    dependencies:
+      css-selector-tokenizer "^0.7.0"
+      postcss "^6.0.1"
+  
+  postcss-modules-values@^1.3.0:
+    version "1.3.0"
+    resolved "http://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
+    dependencies:
+      icss-replace-symbols "^1.1.0"
+      postcss "^6.0.1"
+  
+  postcss-normalize-charset@^1.1.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/postcss-normalize-charset/download/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1"
+    dependencies:
+      postcss "^5.0.5"
+  
+  postcss-normalize-url@^3.0.7:
+    version "3.0.8"
+    resolved "http://registry.npm.taobao.org/postcss-normalize-url/download/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222"
+    dependencies:
+      is-absolute-url "^2.0.0"
+      normalize-url "^1.4.0"
+      postcss "^5.0.14"
+      postcss-value-parser "^3.2.3"
+  
+  postcss-ordered-values@^2.1.0:
+    version "2.2.3"
+    resolved "http://registry.npm.taobao.org/postcss-ordered-values/download/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d"
+    dependencies:
+      postcss "^5.0.4"
+      postcss-value-parser "^3.0.1"
+  
+  postcss-reduce-idents@^2.2.2:
+    version "2.4.0"
+    resolved "http://registry.npm.taobao.org/postcss-reduce-idents/download/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3"
+    dependencies:
+      postcss "^5.0.4"
+      postcss-value-parser "^3.0.2"
+  
+  postcss-reduce-initial@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/postcss-reduce-initial/download/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea"
+    dependencies:
+      postcss "^5.0.4"
+  
+  postcss-reduce-transforms@^1.0.3:
+    version "1.0.4"
+    resolved "http://registry.npm.taobao.org/postcss-reduce-transforms/download/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1"
+    dependencies:
+      has "^1.0.1"
+      postcss "^5.0.8"
+      postcss-value-parser "^3.0.1"
+  
+  postcss-reporter@^5.0.0:
+    version "5.0.0"
+    resolved "http://registry.npm.taobao.org/postcss-reporter/download/postcss-reporter-5.0.0.tgz#a14177fd1342829d291653f2786efd67110332c3"
+    dependencies:
+      chalk "^2.0.1"
+      lodash "^4.17.4"
+      log-symbols "^2.0.0"
+      postcss "^6.0.8"
+  
+  postcss-resolve-nested-selector@^0.1.1:
+    version "0.1.1"
+    resolved "http://registry.npm.taobao.org/postcss-resolve-nested-selector/download/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e"
+  
+  postcss-safe-parser@^3.0.1:
+    version "3.0.1"
+    resolved "http://registry.npm.taobao.org/postcss-safe-parser/download/postcss-safe-parser-3.0.1.tgz#b753eff6c7c0aea5e8375fbe4cde8bf9063ff142"
+    dependencies:
+      postcss "^6.0.6"
+  
+  postcss-sass@^0.2.0:
+    version "0.2.0"
+    resolved "http://registry.npm.taobao.org/postcss-sass/download/postcss-sass-0.2.0.tgz#e55516441e9526ba4b380a730d3a02e9eaa78c7a"
+    dependencies:
+      gonzales-pe "^4.0.3"
+      postcss "^6.0.6"
+  
+  postcss-scss@^1.0.2:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/postcss-scss/download/postcss-scss-1.0.3.tgz#4c00ab440fc1c994134e3d4e600c23341af6cd27"
+    dependencies:
+      postcss "^6.0.15"
+  
+  postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2:
+    version "2.2.3"
+    resolved "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90"
+    dependencies:
+      flatten "^1.0.2"
+      indexes-of "^1.0.1"
+      uniq "^1.0.1"
+  
+  postcss-selector-parser@^3.1.0:
+    version "3.1.1"
+    resolved "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865"
+    dependencies:
+      dot-prop "^4.1.1"
+      indexes-of "^1.0.1"
+      uniq "^1.0.1"
+  
+  postcss-svgo@^2.1.1:
+    version "2.1.6"
+    resolved "http://registry.npm.taobao.org/postcss-svgo/download/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d"
+    dependencies:
+      is-svg "^2.0.0"
+      postcss "^5.0.14"
+      postcss-value-parser "^3.2.3"
+      svgo "^0.7.0"
+  
+  postcss-unique-selectors@^2.0.2:
+    version "2.0.2"
+    resolved "http://registry.npm.taobao.org/postcss-unique-selectors/download/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d"
+    dependencies:
+      alphanum-sort "^1.0.1"
+      postcss "^5.0.4"
+      uniqs "^2.0.0"
+  
+  postcss-url@^7.1.2:
+    version "7.3.0"
+    resolved "http://registry.npm.taobao.org/postcss-url/download/postcss-url-7.3.0.tgz#cf2f45e06743cf43cfea25309f81cbc003dc783f"
+    dependencies:
+      mime "^1.4.1"
+      minimatch "^3.0.4"
+      mkdirp "^0.5.0"
+      postcss "^6.0.1"
+      xxhashjs "^0.2.1"
+  
+  postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0:
+    version "3.3.0"
+    resolved "http://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15"
+  
+  postcss-zindex@^2.0.1:
+    version "2.2.0"
+    resolved "http://registry.npm.taobao.org/postcss-zindex/download/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22"
+    dependencies:
+      has "^1.0.1"
+      postcss "^5.0.4"
+      uniqs "^2.0.0"
+  
+  postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16:
+    version "5.2.18"
+    resolved "http://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
+    dependencies:
+      chalk "^1.1.3"
+      js-base64 "^2.1.9"
+      source-map "^0.5.6"
+      supports-color "^3.2.3"
+  
+  postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.13, postcss@^6.0.14, postcss@^6.0.15, postcss@^6.0.6, postcss@^6.0.8:
+    version "6.0.16"
+    resolved "http://registry.npm.taobao.org/postcss/download/postcss-6.0.16.tgz#112e2fe2a6d2109be0957687243170ea5589e146"
+    dependencies:
+      chalk "^2.3.0"
+      source-map "^0.6.1"
+      supports-color "^5.1.0"
+  
+  prelude-ls@~1.1.2:
+    version "1.1.2"
+    resolved "http://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+  
+  prepend-http@^1.0.0:
+    version "1.0.4"
+    resolved "http://registry.npm.taobao.org/prepend-http/download/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+  
+  preserve@^0.2.0:
+    version "0.2.0"
+    resolved "http://registry.npm.taobao.org/preserve/download/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+  
+  pretty-error@^2.0.2:
+    version "2.1.1"
+    resolved "http://registry.npm.taobao.org/pretty-error/download/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"
+    dependencies:
+      renderkid "^2.0.1"
+      utila "~0.4"
+  
+  pretty-format@^21.2.1:
+    version "21.2.1"
+    resolved "http://registry.npm.taobao.org/pretty-format/download/pretty-format-21.2.1.tgz#ae5407f3cf21066cd011aa1ba5fce7b6a2eddb36"
+    dependencies:
+      ansi-regex "^3.0.0"
+      ansi-styles "^3.2.0"
+  
+  printj@~1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/printj/download/printj-1.1.0.tgz#85487b5e8f96763b0b4a253613bef9dd9b387e3c"
+  
+  process-nextick-args@~1.0.6:
+    version "1.0.7"
+    resolved "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+  
+  process@^0.11.10:
+    version "0.11.10"
+    resolved "http://registry.npm.taobao.org/process/download/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+  
+  promise-inflight@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+  
+  promise@^7.1.1:
+    version "7.3.1"
+    resolved "http://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
+    dependencies:
+      asap "~2.0.3"
+  
+  protractor@~5.1.2:
+    version "5.1.2"
+    resolved "http://registry.npm.taobao.org/protractor/download/protractor-5.1.2.tgz#9b221741709a4c62d5cd53c6aadd54a71137e95f"
+    dependencies:
+      "@types/node" "^6.0.46"
+      "@types/q" "^0.0.32"
+      "@types/selenium-webdriver" "~2.53.39"
+      blocking-proxy "0.0.5"
+      chalk "^1.1.3"
+      glob "^7.0.3"
+      jasmine "^2.5.3"
+      jasminewd2 "^2.1.0"
+      optimist "~0.6.0"
+      q "1.4.1"
+      saucelabs "~1.3.0"
+      selenium-webdriver "3.0.1"
+      source-map-support "~0.4.0"
+      webdriver-js-extender "^1.0.0"
+      webdriver-manager "^12.0.6"
+  
+  proxy-addr@~2.0.2:
+    version "2.0.2"
+    resolved "http://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec"
+    dependencies:
+      forwarded "~0.1.2"
+      ipaddr.js "1.5.2"
+  
+  prr@~1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+  
+  ps-tree@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/ps-tree/download/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014"
+    dependencies:
+      event-stream "~3.3.0"
+  
+  pseudomap@^1.0.2:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+  
+  public-encrypt@^4.0.0:
+    version "4.0.0"
+    resolved "http://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
+    dependencies:
+      bn.js "^4.1.0"
+      browserify-rsa "^4.0.0"
+      create-hash "^1.1.0"
+      parse-asn1 "^5.0.0"
+      randombytes "^2.0.1"
+  
+  pump@^1.0.0:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/pump/download/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954"
+    dependencies:
+      end-of-stream "^1.1.0"
+      once "^1.3.1"
+  
+  pumpify@^1.3.3:
+    version "1.3.5"
+    resolved "http://registry.npm.taobao.org/pumpify/download/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b"
+    dependencies:
+      duplexify "^3.1.2"
+      inherits "^2.0.1"
+      pump "^1.0.0"
+  
+  punycode@1.3.2:
+    version "1.3.2"
+    resolved "http://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+  
+  punycode@^1.2.4, punycode@^1.4.1:
+    version "1.4.1"
+    resolved "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+  
+  q@1.4.1:
+    version "1.4.1"
+    resolved "http://registry.npm.taobao.org/q/download/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e"
+  
+  q@^1.1.2, q@^1.4.1, q@^1.5.0:
+    version "1.5.1"
+    resolved "http://registry.npm.taobao.org/q/download/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+  
+  qjobs@^1.1.4:
+    version "1.1.5"
+    resolved "http://registry.npm.taobao.org/qjobs/download/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73"
+  
+  qs@6.5.1, qs@~6.5.1:
+    version "6.5.1"
+    resolved "http://registry.npm.taobao.org/qs/download/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
+  
+  qs@~6.3.0:
+    version "6.3.2"
+    resolved "http://registry.npm.taobao.org/qs/download/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
+  
+  qs@~6.4.0:
+    version "6.4.0"
+    resolved "http://registry.npm.taobao.org/qs/download/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
+  
+  query-string@^4.1.0:
+    version "4.3.4"
+    resolved "http://registry.npm.taobao.org/query-string/download/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
+    dependencies:
+      object-assign "^4.1.0"
+      strict-uri-encode "^1.0.0"
+  
+  querystring-es3@^0.2.0:
+    version "0.2.1"
+    resolved "http://registry.npm.taobao.org/querystring-es3/download/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+  
+  querystring@0.2.0:
+    version "0.2.0"
+    resolved "http://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+  
+  querystringify@0.0.x:
+    version "0.0.4"
+    resolved "http://registry.npm.taobao.org/querystringify/download/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c"
+  
+  querystringify@~1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/querystringify/download/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb"
+  
+  quick-lru@^1.0.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/quick-lru/download/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
+  
+  randomatic@^1.1.3:
+    version "1.1.7"
+    resolved "http://registry.npm.taobao.org/randomatic/download/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
+    dependencies:
+      is-number "^3.0.0"
+      kind-of "^4.0.0"
+  
+  randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+    version "2.0.5"
+    resolved "http://registry.npm.taobao.org/randombytes/download/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79"
+    dependencies:
+      safe-buffer "^5.1.0"
+  
+  randomfill@^1.0.3:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/randomfill/download/randomfill-1.0.3.tgz#b96b7df587f01dd91726c418f30553b1418e3d62"
+    dependencies:
+      randombytes "^2.0.5"
+      safe-buffer "^5.1.0"
+  
+  range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/range-parser/download/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+  
+  raw-body@2.3.2:
+    version "2.3.2"
+    resolved "http://registry.npm.taobao.org/raw-body/download/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
+    dependencies:
+      bytes "3.0.0"
+      http-errors "1.6.2"
+      iconv-lite "0.4.19"
+      unpipe "1.0.0"
+  
+  raw-loader@^0.5.1:
+    version "0.5.1"
+    resolved "http://registry.npm.taobao.org/raw-loader/download/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
+  
+  rc@^1.1.7:
+    version "1.2.3"
+    resolved "http://registry.npm.taobao.org/rc/download/rc-1.2.3.tgz#51575a900f8dd68381c710b4712c2154c3e2035b"
+    dependencies:
+      deep-extend "~0.4.0"
+      ini "~1.3.0"
+      minimist "^1.2.0"
+      strip-json-comments "~2.0.1"
+  
+  read-pkg-up@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+    dependencies:
+      find-up "^1.0.0"
+      read-pkg "^1.0.0"
+  
+  read-pkg-up@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+    dependencies:
+      find-up "^2.0.0"
+      read-pkg "^2.0.0"
+  
+  read-pkg-up@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
+    dependencies:
+      find-up "^2.0.0"
+      read-pkg "^3.0.0"
+  
+  read-pkg@^1.0.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+    dependencies:
+      load-json-file "^1.0.0"
+      normalize-package-data "^2.3.2"
+      path-type "^1.0.0"
+  
+  read-pkg@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/read-pkg/download/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+    dependencies:
+      load-json-file "^2.0.0"
+      normalize-package-data "^2.3.2"
+      path-type "^2.0.0"
+  
+  read-pkg@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/read-pkg/download/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
+    dependencies:
+      load-json-file "^4.0.0"
+      normalize-package-data "^2.3.2"
+      path-type "^3.0.0"
+  
+  "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.2.9, readable-stream@^2.3.3:
+    version "2.3.3"
+    resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
+    dependencies:
+      core-util-is "~1.0.0"
+      inherits "~2.0.3"
+      isarray "~1.0.0"
+      process-nextick-args "~1.0.6"
+      safe-buffer "~5.1.1"
+      string_decoder "~1.0.3"
+      util-deprecate "~1.0.1"
+  
+  readable-stream@1.0, readable-stream@~1.0.2:
+    version "1.0.34"
+    resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+    dependencies:
+      core-util-is "~1.0.0"
+      inherits "~2.0.1"
+      isarray "0.0.1"
+      string_decoder "~0.10.x"
+  
+  readable-stream@~1.1.9:
+    version "1.1.14"
+    resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+    dependencies:
+      core-util-is "~1.0.0"
+      inherits "~2.0.1"
+      isarray "0.0.1"
+      string_decoder "~0.10.x"
+  
+  readable-stream@~2.0.0:
+    version "2.0.6"
+    resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
+    dependencies:
+      core-util-is "~1.0.0"
+      inherits "~2.0.1"
+      isarray "~1.0.0"
+      process-nextick-args "~1.0.6"
+      string_decoder "~0.10.x"
+      util-deprecate "~1.0.1"
+  
+  readdirp@^2.0.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/readdirp/download/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+    dependencies:
+      graceful-fs "^4.1.2"
+      minimatch "^3.0.2"
+      readable-stream "^2.0.2"
+      set-immediate-shim "^1.0.1"
+  
+  redent@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/redent/download/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+    dependencies:
+      indent-string "^2.1.0"
+      strip-indent "^1.0.1"
+  
+  redent@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/redent/download/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa"
+    dependencies:
+      indent-string "^3.0.0"
+      strip-indent "^2.0.0"
+  
+  reduce-css-calc@^1.2.6:
+    version "1.3.0"
+    resolved "http://registry.npm.taobao.org/reduce-css-calc/download/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
+    dependencies:
+      balanced-match "^0.4.2"
+      math-expression-evaluator "^1.2.14"
+      reduce-function-call "^1.0.1"
+  
+  reduce-function-call@^1.0.1:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/reduce-function-call/download/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99"
+    dependencies:
+      balanced-match "^0.4.2"
+  
+  reflect-metadata@^0.1.2:
+    version "0.1.10"
+    resolved "http://registry.npm.taobao.org/reflect-metadata/download/reflect-metadata-0.1.10.tgz#b4f83704416acad89988c9b15635d47e03b9344a"
+  
+  regenerate@^1.2.1:
+    version "1.3.3"
+    resolved "http://registry.npm.taobao.org/regenerate/download/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
+  
+  regenerator-runtime@^0.11.0:
+    version "0.11.1"
+    resolved "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+  
+  regex-cache@^0.4.2:
+    version "0.4.4"
+    resolved "http://registry.npm.taobao.org/regex-cache/download/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+    dependencies:
+      is-equal-shallow "^0.1.3"
+  
+  regexpu-core@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/regexpu-core/download/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
+    dependencies:
+      regenerate "^1.2.1"
+      regjsgen "^0.2.0"
+      regjsparser "^0.1.4"
+  
+  regjsgen@^0.2.0:
+    version "0.2.0"
+    resolved "http://registry.npm.taobao.org/regjsgen/download/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+  
+  regjsparser@^0.1.4:
+    version "0.1.5"
+    resolved "http://registry.npm.taobao.org/regjsparser/download/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+    dependencies:
+      jsesc "~0.5.0"
+  
+  regression@~2.0.0:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/regression/download/regression-2.0.1.tgz#8d29c3e8224a10850c35e337e85a8b2fac3b0c87"
+  
+  relateurl@0.2.x:
+    version "0.2.7"
+    resolved "http://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+  
+  remap-istanbul@^0.9.0:
+    version "0.9.5"
+    resolved "http://registry.npm.taobao.org/remap-istanbul/download/remap-istanbul-0.9.5.tgz#a18617b1f31eec5a7dbee77538298b775606aaa8"
+    dependencies:
+      amdefine "^1.0.0"
+      gulp-util "3.0.7"
+      istanbul "0.4.5"
+      minimatch "^3.0.3"
+      source-map ">=0.5.6"
+      through2 "2.0.1"
+  
+  remark-parse@^4.0.0:
+    version "4.0.0"
+    resolved "http://registry.npm.taobao.org/remark-parse/download/remark-parse-4.0.0.tgz#99f1f049afac80382366e2e0d0bd55429dd45d8b"
+    dependencies:
+      collapse-white-space "^1.0.2"
+      is-alphabetical "^1.0.0"
+      is-decimal "^1.0.0"
+      is-whitespace-character "^1.0.0"
+      is-word-character "^1.0.0"
+      markdown-escapes "^1.0.0"
+      parse-entities "^1.0.2"
+      repeat-string "^1.5.4"
+      state-toggle "^1.0.0"
+      trim "0.0.1"
+      trim-trailing-lines "^1.0.0"
+      unherit "^1.0.4"
+      unist-util-remove-position "^1.0.0"
+      vfile-location "^2.0.0"
+      xtend "^4.0.1"
+  
+  remark-stringify@^4.0.0:
+    version "4.0.0"
+    resolved "http://registry.npm.taobao.org/remark-stringify/download/remark-stringify-4.0.0.tgz#4431884c0418f112da44991b4e356cfe37facd87"
+    dependencies:
+      ccount "^1.0.0"
+      is-alphanumeric "^1.0.0"
+      is-decimal "^1.0.0"
+      is-whitespace-character "^1.0.0"
+      longest-streak "^2.0.1"
+      markdown-escapes "^1.0.0"
+      markdown-table "^1.1.0"
+      mdast-util-compact "^1.0.0"
+      parse-entities "^1.0.2"
+      repeat-string "^1.5.4"
+      state-toggle "^1.0.0"
+      stringify-entities "^1.0.1"
+      unherit "^1.0.4"
+      xtend "^4.0.1"
+  
+  remark@^8.0.0:
+    version "8.0.0"
+    resolved "http://registry.npm.taobao.org/remark/download/remark-8.0.0.tgz#287b6df2fe1190e263c1d15e486d3fa835594d6d"
+    dependencies:
+      remark-parse "^4.0.0"
+      remark-stringify "^4.0.0"
+      unified "^6.0.0"
+  
+  remove-trailing-separator@^1.0.1:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+  
+  renderkid@^2.0.1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/renderkid/download/renderkid-2.0.1.tgz#898cabfc8bede4b7b91135a3ffd323e58c0db319"
+    dependencies:
+      css-select "^1.1.0"
+      dom-converter "~0.1"
+      htmlparser2 "~3.3.0"
+      strip-ansi "^3.0.0"
+      utila "~0.3"
+  
+  repeat-element@^1.1.2:
+    version "1.1.2"
+    resolved "http://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+  
+  repeat-string@^0.2.2:
+    version "0.2.2"
+    resolved "http://registry.npm.taobao.org/repeat-string/download/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae"
+  
+  repeat-string@^1.5.2, repeat-string@^1.5.4:
+    version "1.6.1"
+    resolved "http://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+  
+  repeating@^2.0.0:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+    dependencies:
+      is-finite "^1.0.0"
+  
+  replace-ext@0.0.1:
+    version "0.0.1"
+    resolved "http://registry.npm.taobao.org/replace-ext/download/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
+  
+  replace-ext@1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/replace-ext/download/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
+  
+  request@2, request@^2.78.0:
+    version "2.83.0"
+    resolved "http://registry.npm.taobao.org/request/download/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
+    dependencies:
+      aws-sign2 "~0.7.0"
+      aws4 "^1.6.0"
+      caseless "~0.12.0"
+      combined-stream "~1.0.5"
+      extend "~3.0.1"
+      forever-agent "~0.6.1"
+      form-data "~2.3.1"
+      har-validator "~5.0.3"
+      hawk "~6.0.2"
+      http-signature "~1.2.0"
+      is-typedarray "~1.0.0"
+      isstream "~0.1.2"
+      json-stringify-safe "~5.0.1"
+      mime-types "~2.1.17"
+      oauth-sign "~0.8.2"
+      performance-now "^2.1.0"
+      qs "~6.5.1"
+      safe-buffer "^5.1.1"
+      stringstream "~0.0.5"
+      tough-cookie "~2.3.3"
+      tunnel-agent "^0.6.0"
+      uuid "^3.1.0"
+  
+  request@2.79.0, request@~2.79.0:
+    version "2.79.0"
+    resolved "http://registry.npm.taobao.org/request/download/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
+    dependencies:
+      aws-sign2 "~0.6.0"
+      aws4 "^1.2.1"
+      caseless "~0.11.0"
+      combined-stream "~1.0.5"
+      extend "~3.0.0"
+      forever-agent "~0.6.1"
+      form-data "~2.1.1"
+      har-validator "~2.0.6"
+      hawk "~3.1.3"
+      http-signature "~1.1.0"
+      is-typedarray "~1.0.0"
+      isstream "~0.1.2"
+      json-stringify-safe "~5.0.1"
+      mime-types "~2.1.7"
+      oauth-sign "~0.8.1"
+      qs "~6.3.0"
+      stringstream "~0.0.4"
+      tough-cookie "~2.3.0"
+      tunnel-agent "~0.4.1"
+      uuid "^3.0.0"
+  
+  request@2.81.0:
+    version "2.81.0"
+    resolved "http://registry.npm.taobao.org/request/download/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
+    dependencies:
+      aws-sign2 "~0.6.0"
+      aws4 "^1.2.1"
+      caseless "~0.12.0"
+      combined-stream "~1.0.5"
+      extend "~3.0.0"
+      forever-agent "~0.6.1"
+      form-data "~2.1.1"
+      har-validator "~4.2.1"
+      hawk "~3.1.3"
+      http-signature "~1.1.0"
+      is-typedarray "~1.0.0"
+      isstream "~0.1.2"
+      json-stringify-safe "~5.0.1"
+      mime-types "~2.1.7"
+      oauth-sign "~0.8.1"
+      performance-now "^0.2.0"
+      qs "~6.4.0"
+      safe-buffer "^5.0.1"
+      stringstream "~0.0.4"
+      tough-cookie "~2.3.0"
+      tunnel-agent "^0.6.0"
+      uuid "^3.0.0"
+  
+  require-directory@^2.1.1:
+    version "2.1.1"
+    resolved "http://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+  
+  require-from-string@^1.1.0:
+    version "1.2.1"
+    resolved "http://registry.npm.taobao.org/require-from-string/download/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418"
+  
+  require-from-string@^2.0.1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/require-from-string/download/require-from-string-2.0.1.tgz#c545233e9d7da6616e9d59adfb39fc9f588676ff"
+  
+  require-main-filename@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+  
+  requires-port@1.0.x, requires-port@1.x.x, requires-port@~1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+  
+  resolve-cwd@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+    dependencies:
+      resolve-from "^3.0.0"
+  
+  resolve-from@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+  
+  resolve-from@^4.0.0:
+    version "4.0.0"
+    resolved "http://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+  
+  resolve@1.1.x:
+    version "1.1.7"
+    resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+  
+  resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2:
+    version "1.5.0"
+    resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
+    dependencies:
+      path-parse "^1.0.5"
+  
+  restore-cursor@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/restore-cursor/download/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+    dependencies:
+      exit-hook "^1.0.0"
+      onetime "^1.0.0"
+  
+  right-align@^0.1.1:
+    version "0.1.3"
+    resolved "http://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+    dependencies:
+      align-text "^0.1.1"
+  
+  rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1:
+    version "2.6.2"
+    resolved "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+    dependencies:
+      glob "^7.0.5"
+  
+  ripemd160@^2.0.0, ripemd160@^2.0.1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
+    dependencies:
+      hash-base "^2.0.0"
+      inherits "^2.0.1"
+  
+  run-queue@^1.0.0, run-queue@^1.0.3:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+    dependencies:
+      aproba "^1.1.1"
+  
+  rw@1:
+    version "1.3.3"
+    resolved "http://registry.npm.taobao.org/rw/download/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
+  
+  rxjs@^5.4.2, rxjs@^5.5.2, rxjs@^5.5.5:
+    version "5.5.6"
+    resolved "http://registry.npm.taobao.org/rxjs/download/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02"
+    dependencies:
+      symbol-observable "1.0.1"
+  
+  safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+    version "5.1.1"
+    resolved "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+  
+  sass-graph@^2.2.4:
+    version "2.2.4"
+    resolved "http://registry.npm.taobao.org/sass-graph/download/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
+    dependencies:
+      glob "^7.0.0"
+      lodash "^4.0.0"
+      scss-tokenizer "^0.2.3"
+      yargs "^7.0.0"
+  
+  sass-loader@^6.0.3:
+    version "6.0.6"
+    resolved "http://registry.npm.taobao.org/sass-loader/download/sass-loader-6.0.6.tgz#e9d5e6c1f155faa32a4b26d7a9b7107c225e40f9"
+    dependencies:
+      async "^2.1.5"
+      clone-deep "^0.3.0"
+      loader-utils "^1.0.1"
+      lodash.tail "^4.1.1"
+      pify "^3.0.0"
+  
+  sauce-connect-launcher@^1.2.2:
+    version "1.2.3"
+    resolved "http://registry.npm.taobao.org/sauce-connect-launcher/download/sauce-connect-launcher-1.2.3.tgz#d2f931ad7ae8fdabf1968a440e7b20417aca7f86"
+    dependencies:
+      adm-zip "~0.4.3"
+      async "^2.1.2"
+      https-proxy-agent "~1.0.0"
+      lodash "^4.16.6"
+      rimraf "^2.5.4"
+  
+  saucelabs@^1.4.0:
+    version "1.4.0"
+    resolved "http://registry.npm.taobao.org/saucelabs/download/saucelabs-1.4.0.tgz#b934a9af9da2874b3f40aae1fcde50a4466f5f38"
+    dependencies:
+      https-proxy-agent "^1.0.0"
+  
+  saucelabs@~1.3.0:
+    version "1.3.0"
+    resolved "http://registry.npm.taobao.org/saucelabs/download/saucelabs-1.3.0.tgz#d240e8009df7fa87306ec4578a69ba3b5c424fee"
+    dependencies:
+      https-proxy-agent "^1.0.0"
+  
+  sax@0.5.x:
+    version "0.5.8"
+    resolved "http://registry.npm.taobao.org/sax/download/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
+  
+  sax@0.6.x:
+    version "0.6.1"
+    resolved "http://registry.npm.taobao.org/sax/download/sax-0.6.1.tgz#563b19c7c1de892e09bfc4f2fc30e3c27f0952b9"
+  
+  sax@>=0.6.0, sax@~1.2.1:
+    version "1.2.4"
+    resolved "http://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+  
+  schema-utils@^0.3.0:
+    version "0.3.0"
+    resolved "http://registry.npm.taobao.org/schema-utils/download/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf"
+    dependencies:
+      ajv "^5.0.0"
+  
+  schema-utils@^0.4.2:
+    version "0.4.3"
+    resolved "http://registry.npm.taobao.org/schema-utils/download/schema-utils-0.4.3.tgz#e2a594d3395834d5e15da22b48be13517859458e"
+    dependencies:
+      ajv "^5.0.0"
+      ajv-keywords "^2.1.0"
+  
+  screenfull@^3.3.1:
+    version "3.3.2"
+    resolved "http://registry.npm.taobao.org/screenfull/download/screenfull-3.3.2.tgz#a6adf3b3f5556da812725385880600f5b39fbf25"
+  
+  scss-tokenizer@^0.2.3:
+    version "0.2.3"
+    resolved "http://registry.npm.taobao.org/scss-tokenizer/download/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
+    dependencies:
+      js-base64 "^2.1.8"
+      source-map "^0.4.2"
+  
+  select-hose@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/select-hose/download/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
+  
+  selenium-webdriver@3.0.1:
+    version "3.0.1"
+    resolved "http://registry.npm.taobao.org/selenium-webdriver/download/selenium-webdriver-3.0.1.tgz#a2dea5da4a97f6672e89e7ca7276cefa365147a7"
+    dependencies:
+      adm-zip "^0.4.7"
+      rimraf "^2.5.4"
+      tmp "0.0.30"
+      xml2js "^0.4.17"
+  
+  selenium-webdriver@^2.53.2:
+    version "2.53.3"
+    resolved "http://registry.npm.taobao.org/selenium-webdriver/download/selenium-webdriver-2.53.3.tgz#d29ff5a957dff1a1b49dc457756e4e4bfbdce085"
+    dependencies:
+      adm-zip "0.4.4"
+      rimraf "^2.2.8"
+      tmp "0.0.24"
+      ws "^1.0.1"
+      xml2js "0.4.4"
+  
+  selfsigned@^1.9.1:
+    version "1.10.1"
+    resolved "http://registry.npm.taobao.org/selfsigned/download/selfsigned-1.10.1.tgz#bf8cb7b83256c4551e31347c6311778db99eec52"
+    dependencies:
+      node-forge "0.6.33"
+  
+  semver-dsl@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/semver-dsl/download/semver-dsl-1.0.1.tgz#d3678de5555e8a61f629eed025366ae5f27340a0"
+    dependencies:
+      semver "^5.3.0"
+  
+  "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0:
+    version "5.4.1"
+    resolved "http://registry.npm.taobao.org/semver/download/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
+  
+  semver@~4.3.3:
+    version "4.3.6"
+    resolved "http://registry.npm.taobao.org/semver/download/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
+  
+  semver@~5.0.1:
+    version "5.0.3"
+    resolved "http://registry.npm.taobao.org/semver/download/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a"
+  
+  semver@~5.3.0:
+    version "5.3.0"
+    resolved "http://registry.npm.taobao.org/semver/download/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+  
+  send@0.16.1:
+    version "0.16.1"
+    resolved "http://registry.npm.taobao.org/send/download/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3"
+    dependencies:
+      debug "2.6.9"
+      depd "~1.1.1"
+      destroy "~1.0.4"
+      encodeurl "~1.0.1"
+      escape-html "~1.0.3"
+      etag "~1.8.1"
+      fresh "0.5.2"
+      http-errors "~1.6.2"
+      mime "1.4.1"
+      ms "2.0.0"
+      on-finished "~2.3.0"
+      range-parser "~1.2.0"
+      statuses "~1.3.1"
+  
+  serialize-javascript@^1.4.0:
+    version "1.4.0"
+    resolved "http://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005"
+  
+  serve-index@^1.7.2:
+    version "1.9.1"
+    resolved "http://registry.npm.taobao.org/serve-index/download/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
+    dependencies:
+      accepts "~1.3.4"
+      batch "0.6.1"
+      debug "2.6.9"
+      escape-html "~1.0.3"
+      http-errors "~1.6.2"
+      mime-types "~2.1.17"
+      parseurl "~1.3.2"
+  
+  serve-static@1.13.1:
+    version "1.13.1"
+    resolved "http://registry.npm.taobao.org/serve-static/download/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719"
+    dependencies:
+      encodeurl "~1.0.1"
+      escape-html "~1.0.3"
+      parseurl "~1.3.2"
+      send "0.16.1"
+  
+  set-blocking@^2.0.0, set-blocking@~2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+  
+  set-immediate-shim@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/set-immediate-shim/download/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+  
+  setimmediate@^1.0.4:
+    version "1.0.5"
+    resolved "http://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+  
+  setprototypeof@1.0.3:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+  
+  setprototypeof@1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+  
+  sha.js@^2.4.0, sha.js@^2.4.8:
+    version "2.4.9"
+    resolved "http://registry.npm.taobao.org/sha.js/download/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d"
+    dependencies:
+      inherits "^2.0.1"
+      safe-buffer "^5.0.1"
+  
+  shallow-clone@^0.1.2:
+    version "0.1.2"
+    resolved "http://registry.npm.taobao.org/shallow-clone/download/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060"
+    dependencies:
+      is-extendable "^0.1.1"
+      kind-of "^2.0.1"
+      lazy-cache "^0.2.3"
+      mixin-object "^2.0.1"
+  
+  shebang-command@^1.2.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+    dependencies:
+      shebang-regex "^1.0.0"
+  
+  shebang-regex@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+  
+  shell-quote@^1.6.1:
+    version "1.6.1"
+    resolved "http://registry.npm.taobao.org/shell-quote/download/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+    dependencies:
+      array-filter "~0.0.0"
+      array-map "~0.0.0"
+      array-reduce "~0.0.0"
+      jsonify "~0.0.0"
+  
+  signal-exit@^3.0.0:
+    version "3.0.2"
+    resolved "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+  
+  silent-error@^1.0.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/silent-error/download/silent-error-1.1.0.tgz#2209706f1c850a9f1d10d0d840918b46f26e1bc9"
+    dependencies:
+      debug "^2.2.0"
+  
+  simple-line-icons@^2.4.1:
+    version "2.4.1"
+    resolved "http://registry.npm.taobao.org/simple-line-icons/download/simple-line-icons-2.4.1.tgz#b75bc5a0d87e530928c2ccda5735274bb256f234"
+  
+  simple-statistics@~4.1.0:
+    version "4.1.1"
+    resolved "http://registry.npm.taobao.org/simple-statistics/download/simple-statistics-4.1.1.tgz#533c48d48336ba3d350d8135f20fa7138acb0c7d"
+  
+  slash@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+  
+  slice-ansi@0.0.4:
+    version "0.0.4"
+    resolved "http://registry.npm.taobao.org/slice-ansi/download/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+  
+  slice-ansi@1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/slice-ansi/download/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
+    dependencies:
+      is-fullwidth-code-point "^2.0.0"
+  
+  sntp@1.x.x:
+    version "1.0.9"
+    resolved "http://registry.npm.taobao.org/sntp/download/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+    dependencies:
+      hoek "2.x.x"
+  
+  sntp@2.x.x:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/sntp/download/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
+    dependencies:
+      hoek "4.x.x"
+  
+  socket.io-adapter@0.5.0:
+    version "0.5.0"
+    resolved "http://registry.npm.taobao.org/socket.io-adapter/download/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b"
+    dependencies:
+      debug "2.3.3"
+      socket.io-parser "2.3.1"
+  
+  socket.io-client@1.7.3:
+    version "1.7.3"
+    resolved "http://registry.npm.taobao.org/socket.io-client/download/socket.io-client-1.7.3.tgz#b30e86aa10d5ef3546601c09cde4765e381da377"
+    dependencies:
+      backo2 "1.0.2"
+      component-bind "1.0.0"
+      component-emitter "1.2.1"
+      debug "2.3.3"
+      engine.io-client "1.8.3"
+      has-binary "0.1.7"
+      indexof "0.0.1"
+      object-component "0.0.3"
+      parseuri "0.0.5"
+      socket.io-parser "2.3.1"
+      to-array "0.1.4"
+  
+  socket.io-parser@2.3.1:
+    version "2.3.1"
+    resolved "http://registry.npm.taobao.org/socket.io-parser/download/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0"
+    dependencies:
+      component-emitter "1.1.2"
+      debug "2.2.0"
+      isarray "0.0.1"
+      json3 "3.3.2"
+  
+  socket.io@1.7.3:
+    version "1.7.3"
+    resolved "http://registry.npm.taobao.org/socket.io/download/socket.io-1.7.3.tgz#b8af9caba00949e568e369f1327ea9be9ea2461b"
+    dependencies:
+      debug "2.3.3"
+      engine.io "1.8.3"
+      has-binary "0.1.7"
+      object-assign "4.1.0"
+      socket.io-adapter "0.5.0"
+      socket.io-client "1.7.3"
+      socket.io-parser "2.3.1"
+  
+  sockjs-client@1.1.4:
+    version "1.1.4"
+    resolved "http://registry.npm.taobao.org/sockjs-client/download/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12"
+    dependencies:
+      debug "^2.6.6"
+      eventsource "0.1.6"
+      faye-websocket "~0.11.0"
+      inherits "^2.0.1"
+      json3 "^3.3.2"
+      url-parse "^1.1.8"
+  
+  sockjs@0.3.18:
+    version "0.3.18"
+    resolved "http://registry.npm.taobao.org/sockjs/download/sockjs-0.3.18.tgz#d9b289316ca7df77595ef299e075f0f937eb4207"
+    dependencies:
+      faye-websocket "^0.10.0"
+      uuid "^2.0.2"
+  
+  sort-keys@^1.0.0:
+    version "1.1.2"
+    resolved "http://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+    dependencies:
+      is-plain-obj "^1.0.0"
+  
+  source-list-map@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+  
+  source-list-map@~0.1.7:
+    version "0.1.8"
+    resolved "http://registry.npm.taobao.org/source-list-map/download/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106"
+  
+  source-map-loader@^0.2.0:
+    version "0.2.3"
+    resolved "http://registry.npm.taobao.org/source-map-loader/download/source-map-loader-0.2.3.tgz#d4b0c8cd47d54edce3e6bfa0f523f452b5b0e521"
+    dependencies:
+      async "^2.5.0"
+      loader-utils "~0.2.2"
+      source-map "~0.6.1"
+  
+  source-map-support@^0.4.0, source-map-support@^0.4.1, source-map-support@^0.4.2, source-map-support@~0.4.0:
+    version "0.4.18"
+    resolved "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+    dependencies:
+      source-map "^0.5.6"
+  
+  source-map@0.1.x:
+    version "0.1.43"
+    resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
+    dependencies:
+      amdefine ">=0.0.4"
+  
+  source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1:
+    version "0.5.7"
+    resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+  
+  source-map@>=0.5.6, source-map@^0.6.1, source-map@~0.6.1:
+    version "0.6.1"
+    resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+  
+  source-map@^0.4.2, source-map@^0.4.4, source-map@~0.4.1:
+    version "0.4.4"
+    resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+    dependencies:
+      amdefine ">=0.0.4"
+  
+  source-map@~0.2.0:
+    version "0.2.0"
+    resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d"
+    dependencies:
+      amdefine ">=0.0.4"
+  
+  sparkles@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/sparkles/download/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3"
+  
+  spdx-correct@~1.0.0:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
+    dependencies:
+      spdx-license-ids "^1.0.2"
+  
+  spdx-expression-parse@~1.0.0:
+    version "1.0.4"
+    resolved "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
+  
+  spdx-license-ids@^1.0.2:
+    version "1.2.2"
+    resolved "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
+  
+  spdy-transport@^2.0.18:
+    version "2.0.20"
+    resolved "http://registry.npm.taobao.org/spdy-transport/download/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d"
+    dependencies:
+      debug "^2.6.8"
+      detect-node "^2.0.3"
+      hpack.js "^2.1.6"
+      obuf "^1.1.1"
+      readable-stream "^2.2.9"
+      safe-buffer "^5.0.1"
+      wbuf "^1.7.2"
+  
+  spdy@^3.4.1:
+    version "3.4.7"
+    resolved "http://registry.npm.taobao.org/spdy/download/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc"
+    dependencies:
+      debug "^2.6.8"
+      handle-thing "^1.2.5"
+      http-deceiver "^1.2.7"
+      safe-buffer "^5.0.1"
+      select-hose "^2.0.0"
+      spdy-transport "^2.0.18"
+  
+  specificity@^0.3.1:
+    version "0.3.2"
+    resolved "http://registry.npm.taobao.org/specificity/download/specificity-0.3.2.tgz#99e6511eceef0f8d9b57924937aac2cb13d13c42"
+  
+  split@0.3:
+    version "0.3.3"
+    resolved "http://registry.npm.taobao.org/split/download/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f"
+    dependencies:
+      through "2"
+  
+  sprintf-js@^1.0.3:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c"
+  
+  sprintf-js@~1.0.2:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+  
+  ssf@~0.10.1:
+    version "0.10.1"
+    resolved "http://registry.npm.taobao.org/ssf/download/ssf-0.10.1.tgz#f23d82b63792ef56089089c1cd0c848e911cdba6"
+    dependencies:
+      frac "~1.1.0"
+  
+  sshpk@^1.7.0:
+    version "1.13.1"
+    resolved "http://registry.npm.taobao.org/sshpk/download/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
+    dependencies:
+      asn1 "~0.2.3"
+      assert-plus "^1.0.0"
+      dashdash "^1.12.0"
+      getpass "^0.1.1"
+    optionalDependencies:
+      bcrypt-pbkdf "^1.0.0"
+      ecc-jsbn "~0.1.1"
+      jsbn "~0.1.0"
+      tweetnacl "~0.14.0"
+  
+  ssri@^5.0.0:
+    version "5.0.0"
+    resolved "http://registry.npm.taobao.org/ssri/download/ssri-5.0.0.tgz#13c19390b606c821f2a10d02b351c1729b94d8cf"
+    dependencies:
+      safe-buffer "^5.1.0"
+  
+  staged-git-files@0.0.4:
+    version "0.0.4"
+    resolved "http://registry.npm.taobao.org/staged-git-files/download/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35"
+  
+  state-toggle@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/state-toggle/download/state-toggle-1.0.0.tgz#d20f9a616bb4f0c3b98b91922d25b640aa2bc425"
+  
+  "statuses@>= 1.3.1 < 2":
+    version "1.4.0"
+    resolved "http://registry.npm.taobao.org/statuses/download/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+  
+  statuses@~1.3.1:
+    version "1.3.1"
+    resolved "http://registry.npm.taobao.org/statuses/download/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
+  
+  stdout-stream@^1.4.0:
+    version "1.4.0"
+    resolved "http://registry.npm.taobao.org/stdout-stream/download/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b"
+    dependencies:
+      readable-stream "^2.0.1"
+  
+  stream-browserify@^2.0.1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+    dependencies:
+      inherits "~2.0.1"
+      readable-stream "^2.0.2"
+  
+  stream-combiner@~0.0.4:
+    version "0.0.4"
+    resolved "http://registry.npm.taobao.org/stream-combiner/download/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14"
+    dependencies:
+      duplexer "~0.1.1"
+  
+  stream-each@^1.1.0:
+    version "1.2.2"
+    resolved "http://registry.npm.taobao.org/stream-each/download/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd"
+    dependencies:
+      end-of-stream "^1.1.0"
+      stream-shift "^1.0.0"
+  
+  stream-http@^2.7.2:
+    version "2.7.2"
+    resolved "http://registry.npm.taobao.org/stream-http/download/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad"
+    dependencies:
+      builtin-status-codes "^3.0.0"
+      inherits "^2.0.1"
+      readable-stream "^2.2.6"
+      to-arraybuffer "^1.0.0"
+      xtend "^4.0.0"
+  
+  stream-shift@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+  
+  stream-to-observable@^0.2.0:
+    version "0.2.0"
+    resolved "http://registry.npm.taobao.org/stream-to-observable/download/stream-to-observable-0.2.0.tgz#59d6ea393d87c2c0ddac10aa0d561bc6ba6f0e10"
+    dependencies:
+      any-observable "^0.2.0"
+  
+  strict-uri-encode@^1.0.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+  
+  string-width@^1.0.1, string-width@^1.0.2:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+    dependencies:
+      code-point-at "^1.0.0"
+      is-fullwidth-code-point "^1.0.0"
+      strip-ansi "^3.0.0"
+  
+  string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
+    version "2.1.1"
+    resolved "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+    dependencies:
+      is-fullwidth-code-point "^2.0.0"
+      strip-ansi "^4.0.0"
+  
+  string.prototype.padend@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/string.prototype.padend/download/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0"
+    dependencies:
+      define-properties "^1.1.2"
+      es-abstract "^1.4.3"
+      function-bind "^1.0.2"
+  
+  string_decoder@^1.0.0, string_decoder@~1.0.3:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
+    dependencies:
+      safe-buffer "~5.1.0"
+  
+  string_decoder@~0.10.x:
+    version "0.10.31"
+    resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+  
+  stringify-entities@^1.0.1:
+    version "1.3.1"
+    resolved "http://registry.npm.taobao.org/stringify-entities/download/stringify-entities-1.3.1.tgz#b150ec2d72ac4c1b5f324b51fb6b28c9cdff058c"
+    dependencies:
+      character-entities-html4 "^1.0.0"
+      character-entities-legacy "^1.0.0"
+      is-alphanumerical "^1.0.0"
+      is-hexadecimal "^1.0.0"
+  
+  stringify-object@^3.2.0:
+    version "3.2.1"
+    resolved "http://registry.npm.taobao.org/stringify-object/download/stringify-object-3.2.1.tgz#2720c2eff940854c819f6ee252aaeb581f30624d"
+    dependencies:
+      get-own-enumerable-property-symbols "^2.0.1"
+      is-obj "^1.0.1"
+      is-regexp "^1.0.0"
+  
+  stringstream@~0.0.4, stringstream@~0.0.5:
+    version "0.0.5"
+    resolved "http://registry.npm.taobao.org/stringstream/download/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
+  
+  strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+    version "3.0.1"
+    resolved "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+    dependencies:
+      ansi-regex "^2.0.0"
+  
+  strip-ansi@^4.0.0:
+    version "4.0.0"
+    resolved "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+    dependencies:
+      ansi-regex "^3.0.0"
+  
+  strip-bom@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+    dependencies:
+      is-utf8 "^0.2.0"
+  
+  strip-bom@^3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+  
+  strip-eof@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+  
+  strip-indent@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/strip-indent/download/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+    dependencies:
+      get-stdin "^4.0.1"
+  
+  strip-indent@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/strip-indent/download/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
+  
+  strip-json-comments@^2.0.0, strip-json-comments@~2.0.1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+  
+  style-loader@^0.13.1:
+    version "0.13.2"
+    resolved "http://registry.npm.taobao.org/style-loader/download/style-loader-0.13.2.tgz#74533384cf698c7104c7951150b49717adc2f3bb"
+    dependencies:
+      loader-utils "^1.0.2"
+  
+  style-search@^0.1.0:
+    version "0.1.0"
+    resolved "http://registry.npm.taobao.org/style-search/download/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902"
+  
+  stylelint-config-recommended@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/stylelint-config-recommended/download/stylelint-config-recommended-1.0.0.tgz#752c17fc68fa64cd5e7589e24f6e46e77e14a735"
+  
+  stylelint-config-standard@^17.0.0:
+    version "17.0.0"
+    resolved "http://registry.npm.taobao.org/stylelint-config-standard/download/stylelint-config-standard-17.0.0.tgz#42103a090054ee2a3dde9ecaed55e5d4d9d059fc"
+    dependencies:
+      stylelint-config-recommended "^1.0.0"
+  
+  stylelint@^8.2.0:
+    version "8.4.0"
+    resolved "http://registry.npm.taobao.org/stylelint/download/stylelint-8.4.0.tgz#c2dbaeb17236917819f9206e1c0df5fddf6f83c3"
+    dependencies:
+      autoprefixer "^7.1.2"
+      balanced-match "^1.0.0"
+      chalk "^2.0.1"
+      cosmiconfig "^3.1.0"
+      debug "^3.0.0"
+      execall "^1.0.0"
+      file-entry-cache "^2.0.0"
+      get-stdin "^5.0.1"
+      globby "^7.0.0"
+      globjoin "^0.1.4"
+      html-tags "^2.0.0"
+      ignore "^3.3.3"
+      imurmurhash "^0.1.4"
+      known-css-properties "^0.5.0"
+      lodash "^4.17.4"
+      log-symbols "^2.0.0"
+      mathml-tag-names "^2.0.1"
+      meow "^4.0.0"
+      micromatch "^2.3.11"
+      normalize-selector "^0.2.0"
+      pify "^3.0.0"
+      postcss "^6.0.6"
+      postcss-html "^0.12.0"
+      postcss-less "^1.1.0"
+      postcss-media-query-parser "^0.2.3"
+      postcss-reporter "^5.0.0"
+      postcss-resolve-nested-selector "^0.1.1"
+      postcss-safe-parser "^3.0.1"
+      postcss-sass "^0.2.0"
+      postcss-scss "^1.0.2"
+      postcss-selector-parser "^3.1.0"
+      postcss-value-parser "^3.3.0"
+      resolve-from "^4.0.0"
+      specificity "^0.3.1"
+      string-width "^2.1.0"
+      style-search "^0.1.0"
+      sugarss "^1.0.0"
+      svg-tags "^1.0.0"
+      table "^4.0.1"
+  
+  stylus-loader@^3.0.1:
+    version "3.0.1"
+    resolved "http://registry.npm.taobao.org/stylus-loader/download/stylus-loader-3.0.1.tgz#77f4b34fd030d25b2617bcf5513db5b0730c4089"
+    dependencies:
+      loader-utils "^1.0.2"
+      lodash.clonedeep "^4.5.0"
+      when "~3.6.x"
+  
+  stylus@^0.54.5:
+    version "0.54.5"
+    resolved "http://registry.npm.taobao.org/stylus/download/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79"
+    dependencies:
+      css-parse "1.7.x"
+      debug "*"
+      glob "7.0.x"
+      mkdirp "0.5.x"
+      sax "0.5.x"
+      source-map "0.1.x"
+  
+  sugarss@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/sugarss/download/sugarss-1.0.1.tgz#be826d9003e0f247735f92365dc3fd7f1bae9e44"
+    dependencies:
+      postcss "^6.0.14"
+  
+  supports-color@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+  
+  supports-color@^3.1.0, supports-color@^3.1.2, supports-color@^3.2.3:
+    version "3.2.3"
+    resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+    dependencies:
+      has-flag "^1.0.0"
+  
+  supports-color@^4.0.0, supports-color@^4.2.1:
+    version "4.5.0"
+    resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
+    dependencies:
+      has-flag "^2.0.0"
+  
+  supports-color@^5.1.0:
+    version "5.1.0"
+    resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-5.1.0.tgz#058a021d1b619f7ddf3980d712ea3590ce7de3d5"
+    dependencies:
+      has-flag "^2.0.0"
+  
+  svg-tags@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
+  
+  svgo@^0.7.0:
+    version "0.7.2"
+    resolved "http://registry.npm.taobao.org/svgo/download/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
+    dependencies:
+      coa "~1.0.1"
+      colors "~1.1.2"
+      csso "~2.3.1"
+      js-yaml "~3.7.0"
+      mkdirp "~0.5.1"
+      sax "~1.2.1"
+      whet.extend "~0.9.9"
+  
+  sweetalert2@^7.0.0:
+    version "7.3.5"
+    resolved "http://registry.npm.taobao.org/sweetalert2/download/sweetalert2-7.3.5.tgz#fc900404660aa107dccd0ca4c9c8e918187ec5aa"
+  
+  symbol-observable@1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/symbol-observable/download/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
+  
+  symbol-observable@^0.2.2:
+    version "0.2.4"
+    resolved "http://registry.npm.taobao.org/symbol-observable/download/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40"
+  
+  table@^4.0.1:
+    version "4.0.2"
+    resolved "http://registry.npm.taobao.org/table/download/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
+    dependencies:
+      ajv "^5.2.3"
+      ajv-keywords "^2.1.0"
+      chalk "^2.1.0"
+      lodash "^4.17.4"
+      slice-ansi "1.0.0"
+      string-width "^2.1.1"
+  
+  tapable@^0.2.7:
+    version "0.2.8"
+    resolved "http://registry.npm.taobao.org/tapable/download/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
+  
+  tar-pack@^3.4.0:
+    version "3.4.1"
+    resolved "http://registry.npm.taobao.org/tar-pack/download/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f"
+    dependencies:
+      debug "^2.2.0"
+      fstream "^1.0.10"
+      fstream-ignore "^1.0.5"
+      once "^1.3.3"
+      readable-stream "^2.1.4"
+      rimraf "^2.5.1"
+      tar "^2.2.1"
+      uid-number "^0.0.6"
+  
+  tar-stream@^1.5.0:
+    version "1.5.5"
+    resolved "http://registry.npm.taobao.org/tar-stream/download/tar-stream-1.5.5.tgz#5cad84779f45c83b1f2508d96b09d88c7218af55"
+    dependencies:
+      bl "^1.0.0"
+      end-of-stream "^1.0.0"
+      readable-stream "^2.0.0"
+      xtend "^4.0.0"
+  
+  tar@^2.0.0, tar@^2.2.1:
+    version "2.2.1"
+    resolved "http://registry.npm.taobao.org/tar/download/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
+    dependencies:
+      block-stream "*"
+      fstream "^1.0.2"
+      inherits "2"
+  
+  through2@2.0.1:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/through2/download/through2-2.0.1.tgz#384e75314d49f32de12eebb8136b8eb6b5d59da9"
+    dependencies:
+      readable-stream "~2.0.0"
+      xtend "~4.0.0"
+  
+  through2@^2.0.0:
+    version "2.0.3"
+    resolved "http://registry.npm.taobao.org/through2/download/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+    dependencies:
+      readable-stream "^2.1.5"
+      xtend "~4.0.1"
+  
+  through@2, through@X.X.X, through@~2.3, through@~2.3.1:
+    version "2.3.8"
+    resolved "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+  
+  thunky@^0.1.0:
+    version "0.1.0"
+    resolved "http://registry.npm.taobao.org/thunky/download/thunky-0.1.0.tgz#bf30146824e2b6e67b0f2d7a4ac8beb26908684e"
+  
+  time-stamp@^1.0.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/time-stamp/download/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
+  
+  time-stamp@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/time-stamp/download/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357"
+  
+  timers-browserify@^2.0.4:
+    version "2.0.4"
+    resolved "http://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6"
+    dependencies:
+      setimmediate "^1.0.4"
+  
+  tmp@0.0.24:
+    version "0.0.24"
+    resolved "http://registry.npm.taobao.org/tmp/download/tmp-0.0.24.tgz#d6a5e198d14a9835cc6f2d7c3d9e302428c8cf12"
+  
+  tmp@0.0.30:
+    version "0.0.30"
+    resolved "http://registry.npm.taobao.org/tmp/download/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed"
+    dependencies:
+      os-tmpdir "~1.0.1"
+  
+  tmp@0.0.31:
+    version "0.0.31"
+    resolved "http://registry.npm.taobao.org/tmp/download/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7"
+    dependencies:
+      os-tmpdir "~1.0.1"
+  
+  tmp@0.0.x:
+    version "0.0.33"
+    resolved "http://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+    dependencies:
+      os-tmpdir "~1.0.2"
+  
+  to-array@0.1.4:
+    version "0.1.4"
+    resolved "http://registry.npm.taobao.org/to-array/download/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
+  
+  to-arraybuffer@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+  
+  to-fast-properties@^1.0.3:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+  
+  topojson-client@~3.0.0:
+    version "3.0.0"
+    resolved "http://registry.npm.taobao.org/topojson-client/download/topojson-client-3.0.0.tgz#1f99293a77ef42a448d032a81aa982b73f360d2f"
+    dependencies:
+      commander "2"
+  
+  toposort@^1.0.0:
+    version "1.0.6"
+    resolved "http://registry.npm.taobao.org/toposort/download/toposort-1.0.6.tgz#c31748e55d210effc00fdcdc7d6e68d7d7bb9cec"
+  
+  tough-cookie@~2.3.0, tough-cookie@~2.3.3:
+    version "2.3.3"
+    resolved "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
+    dependencies:
+      punycode "^1.4.1"
+  
+  tree-kill@^1.0.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/tree-kill/download/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36"
+  
+  trim-newlines@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/trim-newlines/download/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+  
+  trim-newlines@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/trim-newlines/download/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20"
+  
+  trim-right@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/trim-right/download/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+  
+  trim-trailing-lines@^1.0.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/trim-trailing-lines/download/trim-trailing-lines-1.1.0.tgz#7aefbb7808df9d669f6da2e438cac8c46ada7684"
+  
+  trim@0.0.1:
+    version "0.0.1"
+    resolved "http://registry.npm.taobao.org/trim/download/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
+  
+  trough@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/trough/download/trough-1.0.1.tgz#a9fd8b0394b0ae8fff82e0633a0a36ccad5b5f86"
+  
+  "true-case-path@^1.0.2":
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/true-case-path/download/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62"
+    dependencies:
+      glob "^6.0.4"
+  
+  ts-node@~3.2.0:
+    version "3.2.2"
+    resolved "http://registry.npm.taobao.org/ts-node/download/ts-node-3.2.2.tgz#bbd28e38af4aaa3e96076c466e1b220197c1a3ce"
+    dependencies:
+      arrify "^1.0.0"
+      chalk "^2.0.0"
+      diff "^3.1.0"
+      make-error "^1.1.1"
+      minimist "^1.2.0"
+      mkdirp "^0.5.1"
+      source-map-support "^0.4.0"
+      tsconfig "^6.0.0"
+      v8flags "^3.0.0"
+      yn "^2.0.0"
+  
+  tsconfig@^6.0.0:
+    version "6.0.0"
+    resolved "http://registry.npm.taobao.org/tsconfig/download/tsconfig-6.0.0.tgz#6b0e8376003d7af1864f8df8f89dd0059ffcd032"
+    dependencies:
+      strip-bom "^3.0.0"
+      strip-json-comments "^2.0.0"
+  
+  tsickle@^0.25.5:
+    version "0.25.6"
+    resolved "http://registry.npm.taobao.org/tsickle/download/tsickle-0.25.6.tgz#b595db16b236721824eeeda8bb262365b47ef334"
+    dependencies:
+      minimist "^1.2.0"
+      mkdirp "^0.5.1"
+      source-map "^0.5.6"
+      source-map-support "^0.4.2"
+  
+  tslib@^1.7.1, tslib@^1.8.1:
+    version "1.8.1"
+    resolved "http://registry.npm.taobao.org/tslib/download/tslib-1.8.1.tgz#6946af2d1d651a7b1863b531d6e5afa41aa44eac"
+  
+  tslint@~5.7.0:
+    version "5.7.0"
+    resolved "http://registry.npm.taobao.org/tslint/download/tslint-5.7.0.tgz#c25e0d0c92fa1201c2bc30e844e08e682b4f3552"
+    dependencies:
+      babel-code-frame "^6.22.0"
+      colors "^1.1.2"
+      commander "^2.9.0"
+      diff "^3.2.0"
+      glob "^7.1.1"
+      minimatch "^3.0.4"
+      resolve "^1.3.2"
+      semver "^5.3.0"
+      tslib "^1.7.1"
+      tsutils "^2.8.1"
+  
+  tsutils@^2.8.1:
+    version "2.16.0"
+    resolved "http://registry.npm.taobao.org/tsutils/download/tsutils-2.16.0.tgz#ad8e83f47bef4f7d24d173cc6cd180990c831105"
+    dependencies:
+      tslib "^1.8.1"
+  
+  tty-browserify@0.0.0:
+    version "0.0.0"
+    resolved "http://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+  
+  tunnel-agent@^0.6.0:
+    version "0.6.0"
+    resolved "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+    dependencies:
+      safe-buffer "^5.0.1"
+  
+  tunnel-agent@~0.4.1:
+    version "0.4.3"
+    resolved "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
+  
+  tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+    version "0.14.5"
+    resolved "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+  
+  type-check@~0.3.2:
+    version "0.3.2"
+    resolved "http://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+    dependencies:
+      prelude-ls "~1.1.2"
+  
+  type-is@~1.6.15:
+    version "1.6.15"
+    resolved "http://registry.npm.taobao.org/type-is/download/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
+    dependencies:
+      media-typer "0.3.0"
+      mime-types "~2.1.15"
+  
+  typedarray@^0.0.6:
+    version "0.0.6"
+    resolved "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+  
+  typescript@~2.5.0:
+    version "2.5.3"
+    resolved "http://registry.npm.taobao.org/typescript/download/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d"
+  
+  typescript@~2.6.1:
+    version "2.6.2"
+    resolved "http://registry.npm.taobao.org/typescript/download/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4"
+  
+  uglify-es@^3.3.4:
+    version "3.3.5"
+    resolved "http://registry.npm.taobao.org/uglify-es/download/uglify-es-3.3.5.tgz#cf7e695da81999f85196b15e2978862f13212f88"
+    dependencies:
+      commander "~2.12.1"
+      source-map "~0.6.1"
+  
+  uglify-js@3.3.x:
+    version "3.3.5"
+    resolved "http://registry.npm.taobao.org/uglify-js/download/uglify-js-3.3.5.tgz#4c4143dfe08e8825746675cc49a6874a933b543e"
+    dependencies:
+      commander "~2.12.1"
+      source-map "~0.6.1"
+  
+  uglify-js@^2.6, uglify-js@^2.8.29:
+    version "2.8.29"
+    resolved "http://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+    dependencies:
+      source-map "~0.5.1"
+      yargs "~3.10.0"
+    optionalDependencies:
+      uglify-to-browserify "~1.0.0"
+  
+  uglify-to-browserify@~1.0.0:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+  
+  uglifyjs-webpack-plugin@^0.4.6:
+    version "0.4.6"
+    resolved "http://registry.npm.taobao.org/uglifyjs-webpack-plugin/download/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309"
+    dependencies:
+      source-map "^0.5.6"
+      uglify-js "^2.8.29"
+      webpack-sources "^1.0.1"
+  
+  uglifyjs-webpack-plugin@^1.1.5:
+    version "1.1.6"
+    resolved "http://registry.npm.taobao.org/uglifyjs-webpack-plugin/download/uglifyjs-webpack-plugin-1.1.6.tgz#f4ba8449edcf17835c18ba6ae99b9d610857fb19"
+    dependencies:
+      cacache "^10.0.1"
+      find-cache-dir "^1.0.0"
+      schema-utils "^0.4.2"
+      serialize-javascript "^1.4.0"
+      source-map "^0.6.1"
+      uglify-es "^3.3.4"
+      webpack-sources "^1.1.0"
+      worker-farm "^1.5.2"
+  
+  uid-number@^0.0.6:
+    version "0.0.6"
+    resolved "http://registry.npm.taobao.org/uid-number/download/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
+  
+  ultron@1.0.x:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/ultron/download/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
+  
+  ultron@~1.1.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/ultron/download/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+  
+  underscore.string@3.3.4:
+    version "3.3.4"
+    resolved "http://registry.npm.taobao.org/underscore.string/download/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db"
+    dependencies:
+      sprintf-js "^1.0.3"
+      util-deprecate "^1.0.2"
+  
+  unherit@^1.0.4:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/unherit/download/unherit-1.1.0.tgz#6b9aaedfbf73df1756ad9e316dd981885840cd7d"
+    dependencies:
+      inherits "^2.0.1"
+      xtend "^4.0.1"
+  
+  unified@^6.0.0:
+    version "6.1.6"
+    resolved "http://registry.npm.taobao.org/unified/download/unified-6.1.6.tgz#5ea7f807a0898f1f8acdeefe5f25faa010cc42b1"
+    dependencies:
+      bail "^1.0.0"
+      extend "^3.0.0"
+      is-plain-obj "^1.1.0"
+      trough "^1.0.0"
+      vfile "^2.0.0"
+      x-is-function "^1.0.4"
+      x-is-string "^0.1.0"
+  
+  uniq@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+  
+  uniqid@^4.0.0:
+    version "4.1.1"
+    resolved "http://registry.npm.taobao.org/uniqid/download/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1"
+    dependencies:
+      macaddress "^0.2.8"
+  
+  uniqs@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/uniqs/download/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+  
+  unique-filename@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/unique-filename/download/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3"
+    dependencies:
+      unique-slug "^2.0.0"
+  
+  unique-slug@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab"
+    dependencies:
+      imurmurhash "^0.1.4"
+  
+  unist-util-find-all-after@^1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/unist-util-find-all-after/download/unist-util-find-all-after-1.0.1.tgz#4e5512abfef7e0616781aecf7b1ed751c00af908"
+    dependencies:
+      unist-util-is "^2.0.0"
+  
+  unist-util-is@^2.0.0, unist-util-is@^2.1.1:
+    version "2.1.1"
+    resolved "http://registry.npm.taobao.org/unist-util-is/download/unist-util-is-2.1.1.tgz#0c312629e3f960c66e931e812d3d80e77010947b"
+  
+  unist-util-modify-children@^1.0.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/unist-util-modify-children/download/unist-util-modify-children-1.1.1.tgz#66d7e6a449e6f67220b976ab3cb8b5ebac39e51d"
+    dependencies:
+      array-iterate "^1.0.0"
+  
+  unist-util-remove-position@^1.0.0:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/unist-util-remove-position/download/unist-util-remove-position-1.1.1.tgz#5a85c1555fc1ba0c101b86707d15e50fa4c871bb"
+    dependencies:
+      unist-util-visit "^1.1.0"
+  
+  unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1:
+    version "1.1.1"
+    resolved "http://registry.npm.taobao.org/unist-util-stringify-position/download/unist-util-stringify-position-1.1.1.tgz#3ccbdc53679eed6ecf3777dd7f5e3229c1b6aa3c"
+  
+  unist-util-visit@^1.1.0:
+    version "1.3.0"
+    resolved "http://registry.npm.taobao.org/unist-util-visit/download/unist-util-visit-1.3.0.tgz#41ca7c82981fd1ce6c762aac397fc24e35711444"
+    dependencies:
+      unist-util-is "^2.1.1"
+  
+  universalify@^0.1.0:
+    version "0.1.1"
+    resolved "http://registry.npm.taobao.org/universalify/download/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7"
+  
+  unpipe@1.0.0, unpipe@~1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+  
+  upper-case@^1.1.1:
+    version "1.1.3"
+    resolved "http://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
+  
+  url-loader@^0.6.2:
+    version "0.6.2"
+    resolved "http://registry.npm.taobao.org/url-loader/download/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7"
+    dependencies:
+      loader-utils "^1.0.2"
+      mime "^1.4.1"
+      schema-utils "^0.3.0"
+  
+  url-parse@1.0.x:
+    version "1.0.5"
+    resolved "http://registry.npm.taobao.org/url-parse/download/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b"
+    dependencies:
+      querystringify "0.0.x"
+      requires-port "1.0.x"
+  
+  url-parse@^1.1.8:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/url-parse/download/url-parse-1.2.0.tgz#3a19e8aaa6d023ddd27dcc44cb4fc8f7fec23986"
+    dependencies:
+      querystringify "~1.0.0"
+      requires-port "~1.0.0"
+  
+  url@^0.11.0:
+    version "0.11.0"
+    resolved "http://registry.npm.taobao.org/url/download/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+    dependencies:
+      punycode "1.3.2"
+      querystring "0.2.0"
+  
+  urlgrey@0.4.4:
+    version "0.4.4"
+    resolved "http://registry.npm.taobao.org/urlgrey/download/urlgrey-0.4.4.tgz#892fe95960805e85519f1cd4389f2cb4cbb7652f"
+  
+  useragent@^2.1.12:
+    version "2.2.1"
+    resolved "http://registry.npm.taobao.org/useragent/download/useragent-2.2.1.tgz#cf593ef4f2d175875e8bb658ea92e18a4fd06d8e"
+    dependencies:
+      lru-cache "2.2.x"
+      tmp "0.0.x"
+  
+  util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+  
+  util@0.10.3, util@^0.10.3:
+    version "0.10.3"
+    resolved "http://registry.npm.taobao.org/util/download/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+    dependencies:
+      inherits "2.0.1"
+  
+  utila@~0.3:
+    version "0.3.3"
+    resolved "http://registry.npm.taobao.org/utila/download/utila-0.3.3.tgz#d7e8e7d7e309107092b05f8d9688824d633a4226"
+  
+  utila@~0.4:
+    version "0.4.0"
+    resolved "http://registry.npm.taobao.org/utila/download/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
+  
+  utils-merge@1.0.1:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+  
+  uuid@^2.0.2:
+    version "2.0.3"
+    resolved "http://registry.npm.taobao.org/uuid/download/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
+  
+  uuid@^3.0.0, uuid@^3.1.0:
+    version "3.1.0"
+    resolved "http://registry.npm.taobao.org/uuid/download/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
+  
+  v8flags@^3.0.0:
+    version "3.0.1"
+    resolved "http://registry.npm.taobao.org/v8flags/download/v8flags-3.0.1.tgz#dce8fc379c17d9f2c9e9ed78d89ce00052b1b76b"
+    dependencies:
+      homedir-polyfill "^1.0.1"
+  
+  validate-npm-package-license@^3.0.1:
+    version "3.0.1"
+    resolved "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
+    dependencies:
+      spdx-correct "~1.0.0"
+      spdx-expression-parse "~1.0.0"
+  
+  vargs@0.1.0:
+    version "0.1.0"
+    resolved "http://registry.npm.taobao.org/vargs/download/vargs-0.1.0.tgz#6b6184da6520cc3204ce1b407cac26d92609ebff"
+  
+  vary@~1.1.2:
+    version "1.1.2"
+    resolved "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+  
+  vendors@^1.0.0:
+    version "1.0.1"
+    resolved "http://registry.npm.taobao.org/vendors/download/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22"
+  
+  verror@1.10.0:
+    version "1.10.0"
+    resolved "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+    dependencies:
+      assert-plus "^1.0.0"
+      core-util-is "1.0.2"
+      extsprintf "^1.2.0"
+  
+  vfile-location@^2.0.0:
+    version "2.0.2"
+    resolved "http://registry.npm.taobao.org/vfile-location/download/vfile-location-2.0.2.tgz#d3675c59c877498e492b4756ff65e4af1a752255"
+  
+  vfile-message@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/vfile-message/download/vfile-message-1.0.0.tgz#a6adb0474ea400fa25d929f1d673abea6a17e359"
+    dependencies:
+      unist-util-stringify-position "^1.1.1"
+  
+  vfile@^2.0.0:
+    version "2.3.0"
+    resolved "http://registry.npm.taobao.org/vfile/download/vfile-2.3.0.tgz#e62d8e72b20e83c324bc6c67278ee272488bf84a"
+    dependencies:
+      is-buffer "^1.1.4"
+      replace-ext "1.0.0"
+      unist-util-stringify-position "^1.0.0"
+      vfile-message "^1.0.0"
+  
+  vinyl@^0.5.0:
+    version "0.5.3"
+    resolved "http://registry.npm.taobao.org/vinyl/download/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde"
+    dependencies:
+      clone "^1.0.0"
+      clone-stats "^0.0.1"
+      replace-ext "0.0.1"
+  
+  vlq@^0.2.1:
+    version "0.2.3"
+    resolved "http://registry.npm.taobao.org/vlq/download/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26"
+  
+  vm-browserify@0.0.4:
+    version "0.0.4"
+    resolved "http://registry.npm.taobao.org/vm-browserify/download/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+    dependencies:
+      indexof "0.0.1"
+  
+  voc@~1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/voc/download/voc-1.0.0.tgz#5465c0ce11d0881f7d8e36d8ca587043f33a25ae"
+  
+  void-elements@^2.0.0:
+    version "2.0.1"
+    resolved "http://registry.npm.taobao.org/void-elements/download/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
+  
+  walkdir@^0.0.11:
+    version "0.0.11"
+    resolved "http://registry.npm.taobao.org/walkdir/download/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532"
+  
+  watchpack@^1.4.0:
+    version "1.4.0"
+    resolved "http://registry.npm.taobao.org/watchpack/download/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac"
+    dependencies:
+      async "^2.1.2"
+      chokidar "^1.7.0"
+      graceful-fs "^4.1.2"
+  
+  wbuf@^1.1.0, wbuf@^1.7.2:
+    version "1.7.2"
+    resolved "http://registry.npm.taobao.org/wbuf/download/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe"
+    dependencies:
+      minimalistic-assert "^1.0.0"
+  
+  wd@^1.4.0:
+    version "1.5.0"
+    resolved "http://registry.npm.taobao.org/wd/download/wd-1.5.0.tgz#45c96a16ff9f8c0f9e7ca90f806a8b48bd0034d6"
+    dependencies:
+      archiver "1.3.0"
+      async "2.0.1"
+      lodash "4.16.2"
+      mkdirp "^0.5.1"
+      q "1.4.1"
+      request "2.79.0"
+      underscore.string "3.3.4"
+      vargs "0.1.0"
+  
+  weather-icons@^1.3.2:
+    version "1.3.2"
+    resolved "http://registry.npm.taobao.org/weather-icons/download/weather-icons-1.3.2.tgz#8ac000f92858427252b80cc57a06bfa827900ac0"
+  
+  webdriver-js-extender@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/webdriver-js-extender/download/webdriver-js-extender-1.0.0.tgz#81c533a9e33d5bfb597b4e63e2cdb25b54777515"
+    dependencies:
+      "@types/selenium-webdriver" "^2.53.35"
+      selenium-webdriver "^2.53.2"
+  
+  webdriver-manager@^12.0.6:
+    version "12.0.6"
+    resolved "http://registry.npm.taobao.org/webdriver-manager/download/webdriver-manager-12.0.6.tgz#3df1a481977010b4cbf8c9d85c7a577828c0e70b"
+    dependencies:
+      adm-zip "^0.4.7"
+      chalk "^1.1.1"
+      del "^2.2.0"
+      glob "^7.0.3"
+      ini "^1.3.4"
+      minimist "^1.2.0"
+      q "^1.4.1"
+      request "^2.78.0"
+      rimraf "^2.5.2"
+      semver "^5.3.0"
+      xml2js "^0.4.17"
+  
+  webpack-bundle-analyzer@^2.9.2:
+    version "2.9.2"
+    resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.9.2.tgz#63ed86eb71cc4cda86f68e685a84530ba0126449"
+    dependencies:
+      acorn "^5.1.1"
+      chalk "^1.1.3"
+      commander "^2.9.0"
+      ejs "^2.5.6"
+      express "^4.15.2"
+      filesize "^3.5.9"
+      gzip-size "^3.0.0"
+      lodash "^4.17.4"
+      mkdirp "^0.5.1"
+      opener "^1.4.3"
+      ws "^4.0.0"
+  
+  webpack-core@^0.6.8:
+    version "0.6.9"
+    resolved "http://registry.npm.taobao.org/webpack-core/download/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2"
+    dependencies:
+      source-list-map "~0.1.7"
+      source-map "~0.4.1"
+  
+  webpack-dev-middleware@^1.11.0, webpack-dev-middleware@~1.12.0:
+    version "1.12.2"
+    resolved "http://registry.npm.taobao.org/webpack-dev-middleware/download/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e"
+    dependencies:
+      memory-fs "~0.4.1"
+      mime "^1.5.0"
+      path-is-absolute "^1.0.0"
+      range-parser "^1.0.3"
+      time-stamp "^2.0.0"
+  
+  webpack-dev-server@~2.9.3:
+    version "2.9.7"
+    resolved "http://registry.npm.taobao.org/webpack-dev-server/download/webpack-dev-server-2.9.7.tgz#100ad6a14775478924d417ca6dcfb9d52a98faed"
+    dependencies:
+      ansi-html "0.0.7"
+      array-includes "^3.0.3"
+      bonjour "^3.5.0"
+      chokidar "^1.6.0"
+      compression "^1.5.2"
+      connect-history-api-fallback "^1.3.0"
+      debug "^3.1.0"
+      del "^3.0.0"
+      express "^4.16.2"
+      html-entities "^1.2.0"
+      http-proxy-middleware "~0.17.4"
+      import-local "^0.1.1"
+      internal-ip "1.2.0"
+      ip "^1.1.5"
+      killable "^1.0.0"
+      loglevel "^1.4.1"
+      opn "^5.1.0"
+      portfinder "^1.0.9"
+      selfsigned "^1.9.1"
+      serve-index "^1.7.2"
+      sockjs "0.3.18"
+      sockjs-client "1.1.4"
+      spdy "^3.4.1"
+      strip-ansi "^3.0.1"
+      supports-color "^4.2.1"
+      webpack-dev-middleware "^1.11.0"
+      yargs "^6.6.0"
+  
+  webpack-merge@^4.1.0:
+    version "4.1.1"
+    resolved "http://registry.npm.taobao.org/webpack-merge/download/webpack-merge-4.1.1.tgz#f1197a0a973e69c6fbeeb6d658219aa8c0c13555"
+    dependencies:
+      lodash "^4.17.4"
+  
+  webpack-sources@^1.0.0, webpack-sources@^1.0.1, webpack-sources@^1.1.0:
+    version "1.1.0"
+    resolved "http://registry.npm.taobao.org/webpack-sources/download/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
+    dependencies:
+      source-list-map "^2.0.0"
+      source-map "~0.6.1"
+  
+  webpack-subresource-integrity@^1.0.1:
+    version "1.0.3"
+    resolved "http://registry.npm.taobao.org/webpack-subresource-integrity/download/webpack-subresource-integrity-1.0.3.tgz#c0606d40090b070cde428bec8df3603216e472eb"
+    dependencies:
+      webpack-core "^0.6.8"
+  
+  webpack@~3.10.0:
+    version "3.10.0"
+    resolved "http://registry.npm.taobao.org/webpack/download/webpack-3.10.0.tgz#5291b875078cf2abf42bdd23afe3f8f96c17d725"
+    dependencies:
+      acorn "^5.0.0"
+      acorn-dynamic-import "^2.0.0"
+      ajv "^5.1.5"
+      ajv-keywords "^2.0.0"
+      async "^2.1.2"
+      enhanced-resolve "^3.4.0"
+      escope "^3.6.0"
+      interpret "^1.0.0"
+      json-loader "^0.5.4"
+      json5 "^0.5.1"
+      loader-runner "^2.3.0"
+      loader-utils "^1.1.0"
+      memory-fs "~0.4.1"
+      mkdirp "~0.5.0"
+      node-libs-browser "^2.0.0"
+      source-map "^0.5.3"
+      supports-color "^4.2.1"
+      tapable "^0.2.7"
+      uglifyjs-webpack-plugin "^0.4.6"
+      watchpack "^1.4.0"
+      webpack-sources "^1.0.1"
+      yargs "^8.0.2"
+  
+  websocket-driver@>=0.5.1:
+    version "0.7.0"
+    resolved "http://registry.npm.taobao.org/websocket-driver/download/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb"
+    dependencies:
+      http-parser-js ">=0.4.0"
+      websocket-extensions ">=0.1.1"
+  
+  websocket-extensions@>=0.1.1:
+    version "0.1.3"
+    resolved "http://registry.npm.taobao.org/websocket-extensions/download/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
+  
+  when@~3.6.x:
+    version "3.6.4"
+    resolved "http://registry.npm.taobao.org/when/download/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e"
+  
+  whet.extend@~0.9.9:
+    version "0.9.9"
+    resolved "http://registry.npm.taobao.org/whet.extend/download/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
+  
+  which-module@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+  
+  which-module@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+  
+  which@1, which@^1.1.1, which@^1.2.1, which@^1.2.10, which@^1.2.9:
+    version "1.3.0"
+    resolved "http://registry.npm.taobao.org/which/download/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
+    dependencies:
+      isexe "^2.0.0"
+  
+  wide-align@^1.1.0:
+    version "1.1.2"
+    resolved "http://registry.npm.taobao.org/wide-align/download/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
+    dependencies:
+      string-width "^1.0.2"
+  
+  window-size@0.1.0:
+    version "0.1.0"
+    resolved "http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+  
+  wolfy87-eventemitter@^5.1.0, wolfy87-eventemitter@~5.2.4:
+    version "5.2.4"
+    resolved "http://registry.npm.taobao.org/wolfy87-eventemitter/download/wolfy87-eventemitter-5.2.4.tgz#5021d2952d3611cbcd195149711d9b595cd11d48"
+  
+  wolfy87-eventemitter@~5.1.0:
+    version "5.1.0"
+    resolved "http://registry.npm.taobao.org/wolfy87-eventemitter/download/wolfy87-eventemitter-5.1.0.tgz#35c1ac0dd1ac0c15e35d981508fc22084a13a011"
+  
+  wordwrap@0.0.2:
+    version "0.0.2"
+    resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+  
+  wordwrap@^1.0.0, wordwrap@~1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+  
+  wordwrap@~0.0.2:
+    version "0.0.3"
+    resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+  
+  worker-farm@^1.5.2:
+    version "1.5.2"
+    resolved "http://registry.npm.taobao.org/worker-farm/download/worker-farm-1.5.2.tgz#32b312e5dc3d5d45d79ef44acc2587491cd729ae"
+    dependencies:
+      errno "^0.1.4"
+      xtend "^4.0.1"
+  
+  wrap-ansi@^2.0.0:
+    version "2.1.0"
+    resolved "http://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+    dependencies:
+      string-width "^1.0.1"
+      strip-ansi "^3.0.1"
+  
+  wrappy@1:
+    version "1.0.2"
+    resolved "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+  
+  write@^0.2.1:
+    version "0.2.1"
+    resolved "http://registry.npm.taobao.org/write/download/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+    dependencies:
+      mkdirp "^0.5.1"
+  
+  ws@1.1.2:
+    version "1.1.2"
+    resolved "http://registry.npm.taobao.org/ws/download/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f"
+    dependencies:
+      options ">=0.0.5"
+      ultron "1.0.x"
+  
+  ws@^1.0.1:
+    version "1.1.5"
+    resolved "http://registry.npm.taobao.org/ws/download/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51"
+    dependencies:
+      options ">=0.0.5"
+      ultron "1.0.x"
+  
+  ws@^4.0.0:
+    version "4.0.0"
+    resolved "http://registry.npm.taobao.org/ws/download/ws-4.0.0.tgz#bfe1da4c08eeb9780b986e0e4d10eccd7345999f"
+    dependencies:
+      async-limiter "~1.0.0"
+      safe-buffer "~5.1.0"
+      ultron "~1.1.0"
+  
+  wtf-8@1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/wtf-8/download/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a"
+  
+  x-is-function@^1.0.4:
+    version "1.0.4"
+    resolved "http://registry.npm.taobao.org/x-is-function/download/x-is-function-1.0.4.tgz#5d294dc3d268cbdd062580e0c5df77a391d1fa1e"
+  
+  x-is-string@^0.1.0:
+    version "0.1.0"
+    resolved "http://registry.npm.taobao.org/x-is-string/download/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82"
+  
+  xlsx@^0.11.16:
+    version "0.11.17"
+    resolved "http://registry.npm.taobao.org/xlsx/download/xlsx-0.11.17.tgz#507461fb9783ad0afe1cf751aeb59956e93232da"
+    dependencies:
+      adler-32 "~1.1.0"
+      cfb "~1.0.1"
+      codepage "~1.11.0"
+      commander "~2.11.0"
+      crc-32 "~1.1.1"
+      exit-on-epipe "~1.0.1"
+      ssf "~0.10.1"
+  
+  xml-char-classes@^1.0.0:
+    version "1.0.0"
+    resolved "http://registry.npm.taobao.org/xml-char-classes/download/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d"
+  
+  xml2js@0.4.4:
+    version "0.4.4"
+    resolved "http://registry.npm.taobao.org/xml2js/download/xml2js-0.4.4.tgz#3111010003008ae19240eba17497b57c729c555d"
+    dependencies:
+      sax "0.6.x"
+      xmlbuilder ">=1.0.0"
+  
+  xml2js@^0.4.17:
+    version "0.4.19"
+    resolved "http://registry.npm.taobao.org/xml2js/download/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
+    dependencies:
+      sax ">=0.6.0"
+      xmlbuilder "~9.0.1"
+  
+  xmlbuilder@>=1.0.0, xmlbuilder@~9.0.1:
+    version "9.0.4"
+    resolved "http://registry.npm.taobao.org/xmlbuilder/download/xmlbuilder-9.0.4.tgz#519cb4ca686d005a8420d3496f3f0caeecca580f"
+  
+  xmlhttprequest-ssl@1.5.3:
+    version "1.5.3"
+    resolved "http://registry.npm.taobao.org/xmlhttprequest-ssl/download/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d"
+  
+  xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1:
+    version "4.0.1"
+    resolved "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+  
+  xxhashjs@^0.2.1:
+    version "0.2.1"
+    resolved "http://registry.npm.taobao.org/xxhashjs/download/xxhashjs-0.2.1.tgz#9bbe9be896142976dfa34c061b2d068c43d30de0"
+    dependencies:
+      cuint latest
+  
+  y18n@^3.2.1:
+    version "3.2.1"
+    resolved "http://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+  
+  yallist@^2.1.2:
+    version "2.1.2"
+    resolved "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+  
+  yargs-parser@^4.2.0:
+    version "4.2.1"
+    resolved "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
+    dependencies:
+      camelcase "^3.0.0"
+  
+  yargs-parser@^5.0.0:
+    version "5.0.0"
+    resolved "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
+    dependencies:
+      camelcase "^3.0.0"
+  
+  yargs-parser@^7.0.0:
+    version "7.0.0"
+    resolved "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+    dependencies:
+      camelcase "^4.1.0"
+  
+  yargs@^6.6.0:
+    version "6.6.0"
+    resolved "http://registry.npm.taobao.org/yargs/download/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
+    dependencies:
+      camelcase "^3.0.0"
+      cliui "^3.2.0"
+      decamelize "^1.1.1"
+      get-caller-file "^1.0.1"
+      os-locale "^1.4.0"
+      read-pkg-up "^1.0.1"
+      require-directory "^2.1.1"
+      require-main-filename "^1.0.1"
+      set-blocking "^2.0.0"
+      string-width "^1.0.2"
+      which-module "^1.0.0"
+      y18n "^3.2.1"
+      yargs-parser "^4.2.0"
+  
+  yargs@^7.0.0:
+    version "7.1.0"
+    resolved "http://registry.npm.taobao.org/yargs/download/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
+    dependencies:
+      camelcase "^3.0.0"
+      cliui "^3.2.0"
+      decamelize "^1.1.1"
+      get-caller-file "^1.0.1"
+      os-locale "^1.4.0"
+      read-pkg-up "^1.0.1"
+      require-directory "^2.1.1"
+      require-main-filename "^1.0.1"
+      set-blocking "^2.0.0"
+      string-width "^1.0.2"
+      which-module "^1.0.0"
+      y18n "^3.2.1"
+      yargs-parser "^5.0.0"
+  
+  yargs@^8.0.2:
+    version "8.0.2"
+    resolved "http://registry.npm.taobao.org/yargs/download/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
+    dependencies:
+      camelcase "^4.1.0"
+      cliui "^3.2.0"
+      decamelize "^1.1.1"
+      get-caller-file "^1.0.1"
+      os-locale "^2.0.0"
+      read-pkg-up "^2.0.0"
+      require-directory "^2.1.1"
+      require-main-filename "^1.0.1"
+      set-blocking "^2.0.0"
+      string-width "^2.0.0"
+      which-module "^2.0.0"
+      y18n "^3.2.1"
+      yargs-parser "^7.0.0"
+  
+  yargs@~3.10.0:
+    version "3.10.0"
+    resolved "http://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+    dependencies:
+      camelcase "^1.0.2"
+      cliui "^2.1.0"
+      decamelize "^1.0.0"
+      window-size "0.1.0"
+  
+  yeast@0.1.2:
+    version "0.1.2"
+    resolved "http://registry.npm.taobao.org/yeast/download/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
+  
+  yn@^2.0.0:
+    version "2.0.0"
+    resolved "http://registry.npm.taobao.org/yn/download/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
+  
+  zip-stream@^1.1.0:
+    version "1.2.0"
+    resolved "http://registry.npm.taobao.org/zip-stream/download/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04"
+    dependencies:
+      archiver-utils "^1.3.0"
+      compress-commons "^1.2.0"
+      lodash "^4.8.0"
+      readable-stream "^2.0.0"
+  
+  zone.js@^0.8.14, zone.js@^0.8.18:
+    version "0.8.19"
+    resolved "http://registry.npm.taobao.org/zone.js/download/zone.js-0.8.19.tgz#a4b522cd9e8b7b616a638c297d720d4c7f292f71"
+  
+  zrender@3.7.4:
+    version "3.7.4"
+    resolved "https://registry.yarnpkg.com/zrender/-/zrender-3.7.4.tgz#f847d53948481ef6d42906d1ea9aeec7acbefdf2"
+
+Trace: 
+  Error: ENOENT: no such file or directory, copyfile 'C:\Users\fengxiang\AppData\Local\Yarn\cache\v1\npm-ultron-1.1.1-9fe1536a10a664a65266a1e3ccf85fd36302bc9c\package.json' -> 'E:\git\angular\screen-frontend\node_modules\webpack-bundle-analyzer\node_modules\ultron\package.json'
diff --git a/yarn.lock b/yarn.lock
index fa0b00c..bd91a1a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4,7 +4,7 @@
 
 "@angular-devkit/build-optimizer@0.3.2":
   version "0.3.2"
-  resolved "http://registry.npm.taobao.org/@angular-devkit/build-optimizer/download/@angular-devkit/build-optimizer-0.3.2.tgz#77d4d1e4fcd09575f0200e2d6d21c1a3f995096f"
+  resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.3.2.tgz#77d4d1e4fcd09575f0200e2d6d21c1a3f995096f"
   dependencies:
     loader-utils "^1.1.0"
     source-map "^0.5.6"
@@ -13,7 +13,7 @@
 
 "@angular-devkit/core@0.3.2":
   version "0.3.2"
-  resolved "http://registry.npm.taobao.org/@angular-devkit/core/download/@angular-devkit/core-0.3.2.tgz#b6fd6aa2e4f4ac3c39478198ba91a53d4c0f88d5"
+  resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-0.3.2.tgz#b6fd6aa2e4f4ac3c39478198ba91a53d4c0f88d5"
   dependencies:
     ajv "~5.5.1"
     chokidar "^1.7.0"
@@ -22,32 +22,32 @@
 
 "@angular-devkit/schematics@0.3.2":
   version "0.3.2"
-  resolved "http://registry.npm.taobao.org/@angular-devkit/schematics/download/@angular-devkit/schematics-0.3.2.tgz#09a2268fad61f4f956f42db87913b8748c512a78"
+  resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-0.3.2.tgz#09a2268fad61f4f956f42db87913b8748c512a78"
   dependencies:
     "@ngtools/json-schema" "^1.1.0"
     rxjs "^5.5.6"
 
-"@angular/animations@^5.0.0", "@angular/animations@^5.2.0":
-  version "5.2.11"
-  resolved "http://registry.npm.taobao.org/@angular/animations/download/@angular/animations-5.2.11.tgz#2bd3fe9e72916ca28de9bfaaddf0cb936565a0b8"
+"@angular/animations@^5.0.0":
+  version "5.1.3"
+  resolved "http://registry.npm.taobao.org/@angular/animations/download/@angular/animations-5.1.3.tgz#3af3073bfdfeac61d7e6058257b3b19c97183a96"
   dependencies:
     tslib "^1.7.1"
 
 "@angular/cdk@^5.0.0":
-  version "5.2.5"
-  resolved "http://registry.npm.taobao.org/@angular/cdk/download/@angular/cdk-5.2.5.tgz#cae2b12e1990a692dd267a73fdb1d49db37f9604"
+  version "5.0.4"
+  resolved "http://registry.npm.taobao.org/@angular/cdk/download/@angular/cdk-5.0.4.tgz#f76a268e404f41aff0e908b21e7de9a5dfc07150"
   dependencies:
     tslib "^1.7.1"
 
-"@angular/cli@^1.5.2":
-  version "1.7.4"
-  resolved "http://registry.npm.taobao.org/@angular/cli/download/@angular/cli-1.7.4.tgz#b6c31b5fc6f8ea07e55b1b01a26422f5358a4ea6"
+"@angular/cli@^1.7.1":
+  version "1.7.1"
+  resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-1.7.1.tgz#3a9d0b8314d4c54226f941beeb53071385c294e0"
   dependencies:
     "@angular-devkit/build-optimizer" "0.3.2"
     "@angular-devkit/core" "0.3.2"
     "@angular-devkit/schematics" "0.3.2"
     "@ngtools/json-schema" "1.2.0"
-    "@ngtools/webpack" "1.10.2"
+    "@ngtools/webpack" "1.10.1"
     "@schematics/angular" "0.3.2"
     "@schematics/package-update" "0.3.2"
     ajv "^6.1.1"
@@ -55,7 +55,7 @@
     cache-loader "^1.2.0"
     chalk "~2.2.0"
     circular-dependency-plugin "^4.2.1"
-    clean-css "^4.1.11"
+    clean-css "^4.1.9"
     common-tags "^1.3.1"
     copy-webpack-plugin "~4.4.1"
     core-object "^3.1.0"
@@ -104,64 +104,64 @@
   optionalDependencies:
     node-sass "^4.7.2"
 
-"@angular/common@^5.0.0", "@angular/common@^5.2.0":
-  version "5.2.11"
-  resolved "http://registry.npm.taobao.org/@angular/common/download/@angular/common-5.2.11.tgz#ee7520b02510a2868f30b1f91897102d48324edf"
+"@angular/common@^5.0.0":
+  version "5.1.3"
+  resolved "http://registry.npm.taobao.org/@angular/common/download/@angular/common-5.1.3.tgz#db517c00a95f72885eb2091098eaed4f95494a63"
   dependencies:
     tslib "^1.7.1"
 
 "@angular/compiler-cli@^5.0.0":
-  version "5.2.11"
-  resolved "http://registry.npm.taobao.org/@angular/compiler-cli/download/@angular/compiler-cli-5.2.11.tgz#71a2885ac394a3c7a407c6ba0b920b52d73add99"
+  version "5.1.3"
+  resolved "http://registry.npm.taobao.org/@angular/compiler-cli/download/@angular/compiler-cli-5.1.3.tgz#e9cfd183a8a12fddad0188d2b7e4e9a45f302d82"
   dependencies:
     chokidar "^1.4.2"
     minimist "^1.2.0"
     reflect-metadata "^0.1.2"
-    tsickle "^0.27.2"
+    tsickle "^0.25.5"
 
-"@angular/compiler@^5.0.0", "@angular/compiler@^5.2.0":
-  version "5.2.11"
-  resolved "http://registry.npm.taobao.org/@angular/compiler/download/@angular/compiler-5.2.11.tgz#ca2c38cda6ddde52b5948b8cff6551ff19d5e9de"
+"@angular/compiler@^5.0.0":
+  version "5.1.3"
+  resolved "http://registry.npm.taobao.org/@angular/compiler/download/@angular/compiler-5.1.3.tgz#125008477895aee1bf71294bf981a4ba184c1e59"
   dependencies:
     tslib "^1.7.1"
 
-"@angular/core@^5.0.0", "@angular/core@^5.2.0":
-  version "5.2.11"
-  resolved "http://registry.npm.taobao.org/@angular/core/download/@angular/core-5.2.11.tgz#0e38fdf4fa038a3c168c72952682f2ee3721f1a3"
+"@angular/core@^5.0.0":
+  version "5.1.3"
+  resolved "http://registry.npm.taobao.org/@angular/core/download/@angular/core-5.1.3.tgz#b739f69834c344285250a384d0c203dd36778a37"
   dependencies:
     tslib "^1.7.1"
 
-"@angular/forms@^5.0.0", "@angular/forms@^5.2.0":
-  version "5.2.11"
-  resolved "http://registry.npm.taobao.org/@angular/forms/download/@angular/forms-5.2.11.tgz#712534fa317e194caa452d0c1a8efc72f5e040d6"
+"@angular/forms@^5.0.0":
+  version "5.1.3"
+  resolved "http://registry.npm.taobao.org/@angular/forms/download/@angular/forms-5.1.3.tgz#fe4c0c37c504e78c85f8e50db6e098705fa72f4c"
   dependencies:
     tslib "^1.7.1"
 
-"@angular/http@^5.0.0", "@angular/http@^5.2.0":
-  version "5.2.11"
-  resolved "http://registry.npm.taobao.org/@angular/http/download/@angular/http-5.2.11.tgz#2b649983c954ae754f6f39060e2d83da0bf352ad"
+"@angular/http@^5.0.0":
+  version "5.1.3"
+  resolved "http://registry.npm.taobao.org/@angular/http/download/@angular/http-5.1.3.tgz#eeea2a6760fa54449a967fb5abdd473736c5c989"
   dependencies:
     tslib "^1.7.1"
 
 "@angular/language-service@^5.0.0":
-  version "5.2.11"
-  resolved "http://registry.npm.taobao.org/@angular/language-service/download/@angular/language-service-5.2.11.tgz#6e119ada2c0271a65d9b8fae61fcdd5f1938766b"
+  version "5.1.3"
+  resolved "http://registry.npm.taobao.org/@angular/language-service/download/@angular/language-service-5.1.3.tgz#b55f295943133e33940ff71e6bb0afa93d7f4d36"
 
-"@angular/platform-browser-dynamic@^5.0.0", "@angular/platform-browser-dynamic@^5.2.0":
-  version "5.2.11"
-  resolved "http://registry.npm.taobao.org/@angular/platform-browser-dynamic/download/@angular/platform-browser-dynamic-5.2.11.tgz#1b2a9de4af207bee7040400f61c01a44e929c308"
+"@angular/platform-browser-dynamic@^5.0.0":
+  version "5.1.3"
+  resolved "http://registry.npm.taobao.org/@angular/platform-browser-dynamic/download/@angular/platform-browser-dynamic-5.1.3.tgz#ad37e4dbd5251e7ea256ad9323fe11c848d04050"
   dependencies:
     tslib "^1.7.1"
 
-"@angular/platform-browser@^5.0.0", "@angular/platform-browser@^5.2.0":
-  version "5.2.11"
-  resolved "http://registry.npm.taobao.org/@angular/platform-browser/download/@angular/platform-browser-5.2.11.tgz#5be379f96d74b4ebe84a447633ed5279cb7e641e"
+"@angular/platform-browser@^5.0.0":
+  version "5.1.3"
+  resolved "http://registry.npm.taobao.org/@angular/platform-browser/download/@angular/platform-browser-5.1.3.tgz#5abe7809009eff6bff3bf89faba96fe066fb2036"
   dependencies:
     tslib "^1.7.1"
 
-"@angular/router@^5.0.0", "@angular/router@^5.2.0":
-  version "5.2.11"
-  resolved "http://registry.npm.taobao.org/@angular/router/download/@angular/router-5.2.11.tgz#65a902daea923086ec728817c43d87becd99d7a7"
+"@angular/router@^5.0.0":
+  version "5.1.3"
+  resolved "http://registry.npm.taobao.org/@angular/router/download/@angular/router-5.1.3.tgz#69627d7186e4ab8e7d4058c4400f82d3899ebd7a"
   dependencies:
     tslib "^1.7.1"
 
@@ -175,122 +175,86 @@
   version "2.1.3"
   resolved "http://registry.npm.taobao.org/@angularclass/hmr/download/@angularclass/hmr-2.1.3.tgz#34e658ed3da37f23b0a200e2da5a89be92bb209f"
 
-"@antv/adjust@~0.0.2":
-  version "0.0.3"
-  resolved "http://registry.npm.taobao.org/@antv/adjust/download/@antv/adjust-0.0.3.tgz#61bfd468ac697cddca373fc03c256ad4bb875154"
+"@antv/data-set@^0.8.5":
+  version "0.8.5"
+  resolved "https://registry.yarnpkg.com/@antv/data-set/-/data-set-0.8.5.tgz#9ab5f53b7ac078f52211db6cefd0c6a42822bd0e"
   dependencies:
-    "@antv/util" "~1.0.6"
-
-"@antv/attr@~0.0.3":
-  version "0.0.3"
-  resolved "http://registry.npm.taobao.org/@antv/attr/download/@antv/attr-0.0.3.tgz#8842379320505c5bf0a0d3a2fd519e38565ea70d"
-  dependencies:
-    "@antv/util" "~1.0.6"
-
-"@antv/data-set@^0.7.0":
-  version "0.7.0"
-  resolved "http://registry.npm.taobao.org/@antv/data-set/download/@antv/data-set-0.7.0.tgz#0e1ab3c88abe83ad668600de4e18b1637c0621a3"
-  dependencies:
-    d3-array "^1.2.0"
-    d3-composite-projections "^1.2.0"
-    d3-dsv "^1.0.5"
-    d3-geo "^1.6.4"
-    d3-geo-projection "^2.1.2"
-    d3-hierarchy "^1.1.5"
-    d3-sankey "^0.7.1"
-    d3-voronoi "^1.1.2"
-    lodash "^4.17.4"
-    point-at-length "^1.0.2"
-    regression "^2.0.0"
-    simple-statistics "^4.1.0"
-    topojson-client "^3.0.0"
-    wolfy87-eventemitter "^5.1.0"
-
-"@antv/g2-plugin-slider@^2.0.3":
-  version "2.0.3"
-  resolved "http://registry.npm.taobao.org/@antv/g2-plugin-slider/download/@antv/g2-plugin-slider-2.0.3.tgz#34a298642a945be3f2f11703bc7a2b3fbc9b32bc"
-
-"@antv/g2@^3.2.2":
-  version "3.2.2"
-  resolved "http://registry.npm.taobao.org/@antv/g2/download/@antv/g2-3.2.2.tgz#fa754b88327a101ec3c3e8149fa8a66fce5fa313"
-  dependencies:
-    "@antv/adjust" "~0.0.2"
-    "@antv/attr" "~0.0.3"
-    "@antv/g" "~3.0.0-beta.8"
-    "@antv/interaction" "~0.0.5"
-    "@antv/scale" "~0.0.1"
-    "@antv/util" "~1.0.8"
-    gl-matrix "~2.6.1"
-    venn.js "~0.2.20"
+    d3-array "~1.2.0"
+    d3-composite-projections "~1.2.0"
+    d3-dsv "~1.0.5"
+    d3-geo "~1.6.4"
+    d3-geo-projection "~2.1.2"
+    d3-hexjson "^1.0.1"
+    d3-hierarchy "~1.1.5"
+    d3-sankey "~0.7.1"
+    d3-voronoi "~1.1.2"
+    lodash "~4.17.4"
+    point-at-length "~1.0.2"
+    regression "~2.0.0"
+    simple-statistics "~4.1.0"
+    topojson-client "~3.0.0"
     wolfy87-eventemitter "~5.1.0"
 
-"@antv/g@^3.0.0-beta.4":
-  version "3.0.0-beta.4"
-  resolved "http://registry.npm.taobao.org/@antv/g/download/@antv/g-3.0.0-beta.4.tgz#55a4e3f8611b65e1812044e4a4e40fb3ecc8b1b2"
+"@antv/g2-plugin-slider@^2.0.1":
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/@antv/g2-plugin-slider/-/g2-plugin-slider-2.0.1.tgz#45cf6da6f2050fabe64166a213674422afe4eebf"
+
+"@antv/g2@^3.0.5-beta.3":
+  version "3.0.5-beta.3"
+  resolved "https://registry.yarnpkg.com/@antv/g2/-/g2-3.0.5-beta.3.tgz#1cbdf3a6fbf1bcbccf848fb3efd3ab7c5c70c9a0"
   dependencies:
-    "@antv/util" "~1.0.2"
+    "@antv/g" "~2.0.5"
+    fecha "~2.3.2"
+    gl-matrix "~2.4.0"
+    lodash "~4.17.4"
+    wolfy87-eventemitter "~5.2.4"
+
+"@antv/g@~2.0.5":
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/@antv/g/-/g-2.0.6.tgz#88a85b5899eae6f3d51f016894b51e39356e56b1"
+  dependencies:
     d3-ease "~1.0.3"
     d3-interpolate "~1.1.5"
     d3-timer "~1.0.6"
-    gl-matrix "~2.6.1"
+    gl-matrix "~2.3.2"
+    lodash "~4.17.4"
     wolfy87-eventemitter "~5.1.0"
 
-"@antv/g@~3.0.0-beta.8":
-  version "3.0.0-beta.8"
-  resolved "http://registry.npm.taobao.org/@antv/g/download/@antv/g-3.0.0-beta.8.tgz#1bbe00d29c0a6690a6d2e0e7a78405fa8eb01489"
-  dependencies:
-    "@antv/util" "~1.0.2"
-    d3-ease "~1.0.3"
-    d3-interpolate "~1.1.5"
-    d3-timer "~1.0.6"
-    gl-matrix "~2.6.1"
-    wolfy87-eventemitter "~5.1.0"
+"@delon/abc@0.6.6":
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/@delon/abc/-/abc-0.6.6.tgz#9749082a2fbc64096d6df9de4efc730bc54a3473"
 
-"@antv/interaction@~0.0.5":
-  version "0.0.5"
-  resolved "http://registry.npm.taobao.org/@antv/interaction/download/@antv/interaction-0.0.5.tgz#8455e72afe3523bc478e4c58dd6e1e361f614255"
-  dependencies:
-    "@antv/g" "^3.0.0-beta.4"
-    "@antv/util" "~1.0.7"
+"@delon/acl@0.6.6":
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/@delon/acl/-/acl-0.6.6.tgz#c7181ce8b691ff404c28dd4578bfb71a30d88dfe"
 
-"@antv/scale@~0.0.1":
-  version "0.0.1"
-  resolved "http://registry.npm.taobao.org/@antv/scale/download/@antv/scale-0.0.1.tgz#e544c037fac0038cbcab89343cb799318605600d"
-  dependencies:
-    "@antv/util" "~1.0.6"
-    fecha "~2.3.3"
+"@delon/auth@0.6.6":
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/@delon/auth/-/auth-0.6.6.tgz#0ad68abb18ae215c9bf5a409d3f7e8826227326f"
 
-"@antv/util@~1.0.2", "@antv/util@~1.0.6", "@antv/util@~1.0.7", "@antv/util@~1.0.8":
-  version "1.0.8"
-  resolved "http://registry.npm.taobao.org/@antv/util/download/@antv/util-1.0.8.tgz#96755c0bd18856eecdc44b072c2b080f4b798094"
+"@delon/cache@0.6.6":
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/@delon/cache/-/cache-0.6.6.tgz#7249ab3611ecf0b785932008540b3149c8e725f2"
 
-"@delon/abc@^0.3.0-rc.1":
-  version "0.3.2"
-  resolved "http://registry.npm.taobao.org/@delon/abc/download/@delon/abc-0.3.2.tgz#b0de2df6f262ae283721c40ea3806137ac172dd0"
+"@delon/cli@^0.6.6":
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/@delon/cli/-/cli-0.6.6.tgz#0e17ac163c12a2f6c73ac32f5bf919624b31b33f"
 
-"@delon/acl@^0.3.0-rc.1":
-  version "0.3.2"
-  resolved "http://registry.npm.taobao.org/@delon/acl/download/@delon/acl-0.3.2.tgz#f9a507cbc2acb092d35c5ec51b402b4823bed466"
-
-"@delon/auth@^0.3.0-rc.1":
-  version "0.3.2"
-  resolved "http://registry.npm.taobao.org/@delon/auth/download/@delon/auth-0.3.2.tgz#59b0273a8a17ad3e893633c8bd83de15d913eb9a"
-
-"@delon/theme@^0.3.0-rc.1":
-  version "0.3.2"
-  resolved "http://registry.npm.taobao.org/@delon/theme/download/@delon/theme-0.3.2.tgz#7e7924c8c7524d937171b4ea08ff74f6be950be2"
+"@delon/theme@0.6.6":
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/@delon/theme/-/theme-0.6.6.tgz#de3439d709bdc3bac312f3f21b4a09d9ccc25467"
 
 "@ngtools/json-schema@1.2.0":
   version "1.2.0"
-  resolved "http://registry.npm.taobao.org/@ngtools/json-schema/download/@ngtools/json-schema-1.2.0.tgz#06e5ecd29e9a37d260a447dd873ea2becd228c4f"
+  resolved "https://registry.yarnpkg.com/@ngtools/json-schema/-/json-schema-1.2.0.tgz#06e5ecd29e9a37d260a447dd873ea2becd228c4f"
 
 "@ngtools/json-schema@^1.1.0":
   version "1.1.0"
   resolved "http://registry.npm.taobao.org/@ngtools/json-schema/download/@ngtools/json-schema-1.1.0.tgz#c3a0c544d62392acc2813a42c8a0dc6f58f86922"
 
-"@ngtools/webpack@1.10.2":
-  version "1.10.2"
-  resolved "http://registry.npm.taobao.org/@ngtools/webpack/download/@ngtools/webpack-1.10.2.tgz#373705fd19992b36e996203480b1d412e942c8d6"
+"@ngtools/webpack@1.10.1":
+  version "1.10.1"
+  resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-1.10.1.tgz#0af9de19a9716ce0247b6aad83ba9c5702766a03"
   dependencies:
     chalk "~2.2.0"
     enhanced-resolve "^3.1.0"
@@ -302,8 +266,8 @@
     webpack-sources "^1.1.0"
 
 "@ngx-translate/core@^9.0.0":
-  version "9.1.1"
-  resolved "http://registry.npm.taobao.org/@ngx-translate/core/download/@ngx-translate/core-9.1.1.tgz#ae103928836b8a9e069fd2e2e76fa2198cc7e628"
+  version "9.0.2"
+  resolved "http://registry.npm.taobao.org/@ngx-translate/core/download/@ngx-translate/core-9.0.2.tgz#d4cab861e3ea8ea14a6df5dcd744dfeb29fb15e2"
 
 "@ngx-translate/http-loader@^2.0.0":
   version "2.0.1"
@@ -311,21 +275,21 @@
 
 "@schematics/angular@0.3.2":
   version "0.3.2"
-  resolved "http://registry.npm.taobao.org/@schematics/angular/download/@schematics/angular-0.3.2.tgz#be209a032a3e4577992d94fbaa14bd4bfde485e2"
+  resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-0.3.2.tgz#be209a032a3e4577992d94fbaa14bd4bfde485e2"
   dependencies:
     typescript "~2.6.2"
 
 "@schematics/package-update@0.3.2":
   version "0.3.2"
-  resolved "http://registry.npm.taobao.org/@schematics/package-update/download/@schematics/package-update-0.3.2.tgz#c5a299ceba8b9e56f3e1f804f86f07664ec6e01c"
+  resolved "https://registry.yarnpkg.com/@schematics/package-update/-/package-update-0.3.2.tgz#c5a299ceba8b9e56f3e1f804f86f07664ec6e01c"
   dependencies:
     rxjs "^5.5.6"
     semver "^5.3.0"
     semver-intersect "^1.1.2"
 
 "@types/jasmine@*":
-  version "2.8.8"
-  resolved "http://registry.npm.taobao.org/@types/jasmine/download/@types/jasmine-2.8.8.tgz#bf53a7d193ea8b03867a38bfdb4fbb0e0bf066c9"
+  version "2.8.3"
+  resolved "http://registry.npm.taobao.org/@types/jasmine/download/@types/jasmine-2.8.3.tgz#f910edc67d69393d562d10f8f3d205ea3f3306bf"
 
 "@types/jasmine@~2.6.0":
   version "2.6.3"
@@ -337,9 +301,27 @@
   dependencies:
     "@types/jasmine" "*"
 
+"@types/jquery@^3.3.0":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.0.tgz#6316ac20a1a13c5d521a2dc661befc7184f73f5b"
+
+"@types/jszip@^3.1.2":
+  version "3.1.3"
+  resolved "http://registry.npm.taobao.org/@types/jszip/download/@types/jszip-3.1.3.tgz#5567e9f0a31012341cedcc707175f2c28a430005"
+  dependencies:
+    "@types/node" "*"
+
+"@types/mockjs@^1.0.0":
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/@types/mockjs/download/@types/mockjs-1.0.0.tgz#a696e1f64c92e7bd6af6343bf8350d1b9d12b388"
+
+"@types/node@*":
+  version "9.3.0"
+  resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-9.3.0.tgz#3a129cda7c4e5df2409702626892cb4b96546dd5"
+
 "@types/node@^6.0.46", "@types/node@~6.0.60":
-  version "6.0.114"
-  resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-6.0.114.tgz#c42cd56479f32bc1576a5cb19f8a208da9a2b052"
+  version "6.0.96"
+  resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-6.0.96.tgz#7bf0bf40d6ce51e93762cc47d010c8cc5ebb2179"
 
 "@types/q@^0.0.32":
   version "0.0.32"
@@ -368,11 +350,11 @@
     mime-types "~2.1.11"
     negotiator "0.6.1"
 
-accepts@~1.3.4, accepts@~1.3.5:
-  version "1.3.5"
-  resolved "http://registry.npm.taobao.org/accepts/download/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
+accepts@~1.3.4:
+  version "1.3.4"
+  resolved "http://registry.npm.taobao.org/accepts/download/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f"
   dependencies:
-    mime-types "~2.1.18"
+    mime-types "~2.1.16"
     negotiator "0.6.1"
 
 acorn-dynamic-import@^2.0.0:
@@ -385,17 +367,28 @@
   version "4.0.13"
   resolved "http://registry.npm.taobao.org/acorn/download/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
 
-acorn@^5.0.0, acorn@^5.3.0:
-  version "5.7.1"
-  resolved "http://registry.npm.taobao.org/acorn/download/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+acorn@^5.0.0:
+  version "5.3.0"
+  resolved "http://registry.npm.taobao.org/acorn/download/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822"
+
+acorn@^5.3.0:
+  version "5.4.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102"
+
+adler-32@~1.1.0:
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/adler-32/download/adler-32-1.1.0.tgz#03551a5c7f0edfbd4fc8fa12a6814978eab651c3"
+  dependencies:
+    exit-on-epipe "~1.0.1"
+    printj "~1.1.0"
 
 adm-zip@0.4.4:
   version "0.4.4"
   resolved "http://registry.npm.taobao.org/adm-zip/download/adm-zip-0.4.4.tgz#a61ed5ae6905c3aea58b3a657d25033091052736"
 
-adm-zip@^0.4.7, adm-zip@^0.4.9, adm-zip@~0.4.3:
-  version "0.4.11"
-  resolved "http://registry.npm.taobao.org/adm-zip/download/adm-zip-0.4.11.tgz#2aa54c84c4b01a9d0fb89bb11982a51f13e3d62a"
+adm-zip@^0.4.7, adm-zip@~0.4.3:
+  version "0.4.7"
+  resolved "http://registry.npm.taobao.org/adm-zip/download/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1"
 
 after@0.8.2:
   version "0.8.2"
@@ -408,15 +401,13 @@
     extend "~3.0.0"
     semver "~5.0.1"
 
-agent-base@^4.1.0:
-  version "4.2.1"
-  resolved "http://registry.npm.taobao.org/agent-base/download/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
-  dependencies:
-    es6-promisify "^5.0.0"
+ajv-keywords@^2.1.0:
+  version "2.1.1"
+  resolved "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
 
-ajv-keywords@^3.0.0, ajv-keywords@^3.1.0:
-  version "3.2.0"
-  resolved "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
+ajv-keywords@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be"
 
 ajv@^4.9.1:
   version "4.11.8"
@@ -425,7 +416,7 @@
     co "^4.6.0"
     json-stable-stringify "^1.0.1"
 
-ajv@^5.0.0, ajv@^5.1.0, ajv@~5.5.1:
+ajv@^5.0.0, ajv@^5.1.0, ajv@^5.2.3, ajv@~5.5.1:
   version "5.5.2"
   resolved "http://registry.npm.taobao.org/ajv/download/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
   dependencies:
@@ -434,14 +425,13 @@
     fast-json-stable-stringify "^2.0.0"
     json-schema-traverse "^0.3.0"
 
-ajv@^6.0.1, ajv@^6.1.0, ajv@^6.1.1:
-  version "6.5.2"
-  resolved "http://registry.npm.taobao.org/ajv/download/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360"
+ajv@^6.1.0, ajv@^6.1.1:
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.2.0.tgz#afac295bbaa0152449e522742e4547c1ae9328d2"
   dependencies:
-    fast-deep-equal "^2.0.1"
+    fast-deep-equal "^1.0.0"
     fast-json-stable-stringify "^2.0.0"
-    json-schema-traverse "^0.4.1"
-    uri-js "^4.2.1"
+    json-schema-traverse "^0.3.0"
 
 align-text@^0.1.1, align-text@^0.1.3:
   version "0.1.4"
@@ -455,21 +445,33 @@
   version "1.0.1"
   resolved "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
 
-angular-baidu-maps@^1.0.1:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/angular-baidu-maps/download/angular-baidu-maps-1.0.1.tgz#000f206b1992336baca42cc7a4ae8575726a96b9"
-
 angular-qq-maps@^1.0.1:
   version "1.0.1"
   resolved "http://registry.npm.taobao.org/angular-qq-maps/download/angular-qq-maps-1.0.1.tgz#ba4f312f501bb208837081ed9dd7e595ba53c810"
 
-angular-tree-component@^6.1.0:
-  version "6.1.0"
-  resolved "http://registry.npm.taobao.org/angular-tree-component/download/angular-tree-component-6.1.0.tgz#9d9a6b28a6881c2072cd6306b55229579e894071"
+angular-split@^1.0.0-rc.0:
+  version "1.0.0-rc.0"
+  resolved "http://registry.npm.taobao.org/angular-split/download/angular-split-1.0.0-rc.0.tgz#d7ec2fcb2166ce0e63babe000e18126e6ee9a407"
+  dependencies:
+    tslib "^1.7.1"
+
+angular-tree-component@^7.0.1:
+  version "7.0.1"
+  resolved "http://registry.npm.taobao.org/angular-tree-component/download/angular-tree-component-7.0.1.tgz#fc8d0e72d8c34b87131a3ba2bd32ad20945689ac"
   dependencies:
     lodash "4.17.4"
     mobx ">=3"
     mobx-angular ">=1"
+
+angular2-baidu-map@^4.3.2:
+  version "4.3.2"
+  resolved "http://registry.npm.taobao.org/angular2-baidu-map/download/angular2-baidu-map-4.3.2.tgz#bd85d10692e863f97479b640071ef59fe5b1e001"
+  dependencies:
+    tslib "^1.7.1"
+
+angular2-cookie@^1.2.6:
+  version "1.2.6"
+  resolved "https://registry.yarnpkg.com/angular2-cookie/-/angular2-cookie-1.2.6.tgz#8fa845531e777adb042fe2f339c0040f6ddbf09d"
 
 ansi-escapes@^1.0.0:
   version "1.4.0"
@@ -497,9 +499,9 @@
   version "2.2.1"
   resolved "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
 
-ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1:
-  version "3.2.1"
-  resolved "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ansi-styles@^3.1.0, ansi-styles@^3.2.0:
+  version "3.2.0"
+  resolved "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88"
   dependencies:
     color-convert "^1.9.0"
 
@@ -520,20 +522,20 @@
 
 anymatch@^2.0.0:
   version "2.0.0"
-  resolved "http://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
   dependencies:
     micromatch "^3.1.4"
     normalize-path "^2.1.1"
 
 app-root-path@^2.0.0, app-root-path@^2.0.1:
-  version "2.1.0"
-  resolved "http://registry.npm.taobao.org/app-root-path/download/app-root-path-2.1.0.tgz#98bf6599327ecea199309866e8140368fd2e646a"
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/app-root-path/download/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46"
 
-append-transform@^1.0.0:
-  version "1.0.0"
-  resolved "http://registry.npm.taobao.org/append-transform/download/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab"
+append-transform@^0.4.0:
+  version "0.4.0"
+  resolved "http://registry.npm.taobao.org/append-transform/download/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
   dependencies:
-    default-require-extensions "^2.0.0"
+    default-require-extensions "^1.0.0"
 
 aproba@^1.0.3, aproba@^1.1.1:
   version "1.2.0"
@@ -550,9 +552,9 @@
     normalize-path "^2.0.0"
     readable-stream "^2.0.0"
 
-archiver@2.1.1:
-  version "2.1.1"
-  resolved "http://registry.npm.taobao.org/archiver/download/archiver-2.1.1.tgz#ff662b4a78201494a3ee544d3a33fe7496509ebc"
+archiver@1.3.0:
+  version "1.3.0"
+  resolved "http://registry.npm.taobao.org/archiver/download/archiver-1.3.0.tgz#4f2194d6d8f99df3f531e6881f14f15d55faaf22"
   dependencies:
     archiver-utils "^1.3.0"
     async "^2.0.0"
@@ -561,22 +563,23 @@
     lodash "^4.8.0"
     readable-stream "^2.0.0"
     tar-stream "^1.5.0"
-    zip-stream "^1.2.0"
+    walkdir "^0.0.11"
+    zip-stream "^1.1.0"
 
 are-we-there-yet@~1.1.2:
-  version "1.1.5"
-  resolved "http://registry.npm.taobao.org/are-we-there-yet/download/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+  version "1.1.4"
+  resolved "http://registry.npm.taobao.org/are-we-there-yet/download/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
   dependencies:
     delegates "^1.0.0"
     readable-stream "^2.0.6"
 
 argparse@^1.0.7:
-  version "1.0.10"
-  resolved "http://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+  version "1.0.9"
+  resolved "http://registry.npm.taobao.org/argparse/download/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
   dependencies:
     sprintf-js "~1.0.2"
 
-argv@^0.0.2:
+argv@0.0.2:
   version "0.0.2"
   resolved "http://registry.npm.taobao.org/argv/download/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab"
 
@@ -588,7 +591,7 @@
 
 arr-diff@^4.0.0:
   version "4.0.0"
-  resolved "http://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
 
 arr-flatten@^1.0.1, arr-flatten@^1.1.0:
   version "1.1.0"
@@ -596,7 +599,7 @@
 
 arr-union@^3.1.0:
   version "3.1.0"
-  resolved "http://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
 
 array-differ@^1.0.0:
   version "1.0.0"
@@ -626,8 +629,8 @@
     es-abstract "^1.7.0"
 
 array-iterate@^1.0.0:
-  version "1.1.2"
-  resolved "http://registry.npm.taobao.org/array-iterate/download/array-iterate-1.1.2.tgz#f66a57e84426f8097f4197fbb6c051b8e5cdf7d8"
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/array-iterate/download/array-iterate-1.1.1.tgz#865bf7f8af39d6b0982c60902914ac76bc0108f6"
 
 array-map@~0.0.0:
   version "0.0.0"
@@ -657,7 +660,7 @@
 
 array-unique@^0.3.2:
   version "0.3.2"
-  resolved "http://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
 
 arraybuffer.slice@0.0.6:
   version "0.0.6"
@@ -672,8 +675,8 @@
   resolved "http://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
 
 asn1.js@^4.0.0:
-  version "4.10.1"
-  resolved "http://registry.npm.taobao.org/asn1.js/download/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+  version "4.9.2"
+  resolved "http://registry.npm.taobao.org/asn1.js/download/asn1.js-4.9.2.tgz#8117ef4f7ed87cd8f89044b5bff97ac243a16c9a"
   dependencies:
     bn.js "^4.0.0"
     inherits "^2.0.1"
@@ -699,7 +702,7 @@
 
 assign-symbols@^1.0.0:
   version "1.0.0"
-  resolved "http://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
 
 async-each@^1.0.0:
   version "1.0.1"
@@ -723,23 +726,34 @@
   dependencies:
     lodash "^4.8.0"
 
-async@^2.0.0, async@^2.1.2, async@^2.1.4, async@^2.4.1:
-  version "2.6.1"
-  resolved "http://registry.npm.taobao.org/async/download/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
+async@^2.0.0, async@^2.1.2, async@^2.1.4, async@^2.1.5, async@^2.4.1:
+  version "2.6.0"
+  resolved "http://registry.npm.taobao.org/async/download/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4"
   dependencies:
-    lodash "^4.17.10"
+    lodash "^4.14.0"
 
 asynckit@^0.4.0:
   version "0.4.0"
   resolved "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
 
-atob@^2.1.1:
-  version "2.1.1"
-  resolved "http://registry.npm.taobao.org/atob/download/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a"
+atob@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d"
 
-autoprefixer@^7.1.2, autoprefixer@^7.2.3:
+autoprefixer@^7.1.2:
+  version "7.2.4"
+  resolved "http://registry.npm.taobao.org/autoprefixer/download/autoprefixer-7.2.4.tgz#29b367c03876a29bfd3721260d945e3545666c8d"
+  dependencies:
+    browserslist "^2.10.2"
+    caniuse-lite "^1.0.30000784"
+    normalize-range "^0.1.2"
+    num2fraction "^1.2.2"
+    postcss "^6.0.15"
+    postcss-value-parser "^3.2.3"
+
+autoprefixer@^7.2.3:
   version "7.2.6"
-  resolved "http://registry.npm.taobao.org/autoprefixer/download/autoprefixer-7.2.6.tgz#256672f86f7c735da849c4f07d008abb056067dc"
+  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.2.6.tgz#256672f86f7c735da849c4f07d008abb056067dc"
   dependencies:
     browserslist "^2.11.3"
     caniuse-lite "^1.0.30000805"
@@ -757,8 +771,8 @@
   resolved "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
 
 aws4@^1.2.1, aws4@^1.6.0:
-  version "1.7.0"
-  resolved "http://registry.npm.taobao.org/aws4/download/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289"
+  version "1.6.0"
+  resolved "http://registry.npm.taobao.org/aws4/download/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
 
 babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
   version "6.26.0"
@@ -769,8 +783,8 @@
     js-tokens "^3.0.2"
 
 babel-generator@^6.18.0:
-  version "6.26.1"
-  resolved "http://registry.npm.taobao.org/babel-generator/download/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+  version "6.26.0"
+  resolved "http://registry.npm.taobao.org/babel-generator/download/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5"
   dependencies:
     babel-messages "^6.23.0"
     babel-runtime "^6.26.0"
@@ -778,7 +792,7 @@
     detect-indent "^4.0.0"
     jsesc "^1.3.0"
     lodash "^4.17.4"
-    source-map "^0.5.7"
+    source-map "^0.5.6"
     trim-right "^1.0.1"
 
 babel-messages@^6.23.0:
@@ -836,8 +850,8 @@
   resolved "http://registry.npm.taobao.org/backo2/download/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
 
 bail@^1.0.0:
-  version "1.0.3"
-  resolved "http://registry.npm.taobao.org/bail/download/bail-1.0.3.tgz#63cfb9ddbac829b02a3128cd53224be78e6c21a3"
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/bail/download/bail-1.0.2.tgz#f7d6c1731630a9f9f0d4d35ed1f962e2074a1764"
 
 balanced-match@^1.0.0:
   version "1.0.0"
@@ -848,8 +862,8 @@
   resolved "http://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
 
 base64-js@^1.0.2:
-  version "1.3.0"
-  resolved "http://registry.npm.taobao.org/base64-js/download/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+  version "1.2.1"
+  resolved "http://registry.npm.taobao.org/base64-js/download/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886"
 
 base64id@1.0.0:
   version "1.0.0"
@@ -857,7 +871,7 @@
 
 base@^0.11.1:
   version "0.11.2"
-  resolved "http://registry.npm.taobao.org/base/download/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
   dependencies:
     cache-base "^1.0.1"
     class-utils "^0.3.5"
@@ -872,8 +886,8 @@
   resolved "http://registry.npm.taobao.org/batch/download/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
 
 bcrypt-pbkdf@^1.0.0:
-  version "1.0.2"
-  resolved "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
   dependencies:
     tweetnacl "^0.14.3"
 
@@ -888,8 +902,8 @@
     callsite "1.0.0"
 
 bfj-node4@^5.2.0:
-  version "5.3.1"
-  resolved "http://registry.npm.taobao.org/bfj-node4/download/bfj-node4-5.3.1.tgz#e23d8b27057f1d0214fc561142ad9db998f26830"
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/bfj-node4/-/bfj-node4-5.2.0.tgz#bd08350353f81d808d6a8352a15f5d9fb74ddec6"
   dependencies:
     bluebird "^3.5.1"
     check-types "^7.3.0"
@@ -904,11 +918,10 @@
   resolved "http://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
 
 bl@^1.0.0:
-  version "1.2.2"
-  resolved "http://registry.npm.taobao.org/bl/download/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
+  version "1.2.1"
+  resolved "http://registry.npm.taobao.org/bl/download/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e"
   dependencies:
-    readable-stream "^2.3.5"
-    safe-buffer "^5.1.1"
+    readable-stream "^2.0.5"
 
 blob@0.0.4:
   version "0.0.4"
@@ -926,7 +939,7 @@
   dependencies:
     minimist "^1.2.0"
 
-bluebird@^3.3.0, bluebird@^3.4.7, bluebird@^3.5.1:
+bluebird@^3.3.0, bluebird@^3.4.7, bluebird@^3.5.0, bluebird@^3.5.1:
   version "3.5.1"
   resolved "http://registry.npm.taobao.org/bluebird/download/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
 
@@ -934,7 +947,7 @@
   version "4.11.8"
   resolved "http://registry.npm.taobao.org/bn.js/download/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
 
-body-parser@1.18.2:
+body-parser@1.18.2, body-parser@^1.16.1:
   version "1.18.2"
   resolved "http://registry.npm.taobao.org/body-parser/download/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
   dependencies:
@@ -948,21 +961,6 @@
     qs "6.5.1"
     raw-body "2.3.2"
     type-is "~1.6.15"
-
-body-parser@^1.16.1:
-  version "1.18.3"
-  resolved "http://registry.npm.taobao.org/body-parser/download/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4"
-  dependencies:
-    bytes "3.0.0"
-    content-type "~1.0.4"
-    debug "2.6.9"
-    depd "~1.1.2"
-    http-errors "~1.6.3"
-    iconv-lite "0.4.23"
-    on-finished "~2.3.0"
-    qs "6.5.2"
-    raw-body "2.3.3"
-    type-is "~1.6.16"
 
 bonjour@^3.5.0:
   version "3.5.0"
@@ -998,8 +996,8 @@
     hoek "4.x.x"
 
 brace-expansion@^1.1.7:
-  version "1.1.11"
-  resolved "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  version "1.1.8"
+  resolved "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
   dependencies:
     balanced-match "^1.0.0"
     concat-map "0.0.1"
@@ -1019,14 +1017,16 @@
     repeat-element "^1.1.2"
 
 braces@^2.3.0, braces@^2.3.1:
-  version "2.3.2"
-  resolved "http://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb"
   dependencies:
     arr-flatten "^1.1.0"
     array-unique "^0.3.2"
+    define-property "^1.0.0"
     extend-shallow "^2.0.1"
     fill-range "^4.0.0"
     isobject "^3.0.1"
+    kind-of "^6.0.2"
     repeat-element "^1.1.2"
     snapdragon "^0.8.1"
     snapdragon-node "^2.0.1"
@@ -1038,8 +1038,8 @@
   resolved "http://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
 
 browserify-aes@^1.0.0, browserify-aes@^1.0.4:
-  version "1.2.0"
-  resolved "http://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f"
   dependencies:
     buffer-xor "^1.0.3"
     cipher-base "^1.0.0"
@@ -1049,16 +1049,16 @@
     safe-buffer "^5.0.1"
 
 browserify-cipher@^1.0.0:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
   dependencies:
     browserify-aes "^1.0.4"
     browserify-des "^1.0.0"
     evp_bytestokey "^1.0.0"
 
 browserify-des@^1.0.0:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.1.tgz#3343124db6d7ad53e26a8826318712bdc8450f9c"
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
   dependencies:
     cipher-base "^1.0.1"
     des.js "^1.0.0"
@@ -1089,35 +1089,23 @@
   dependencies:
     pako "~1.0.5"
 
+browserslist@^2.10.2:
+  version "2.11.0"
+  resolved "http://registry.npm.taobao.org/browserslist/download/browserslist-2.11.0.tgz#50350d6873a82ebe0f3ae5483658c571ae5f9d7d"
+  dependencies:
+    caniuse-lite "^1.0.30000784"
+    electron-to-chromium "^1.3.30"
+
 browserslist@^2.11.3:
   version "2.11.3"
-  resolved "http://registry.npm.taobao.org/browserslist/download/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2"
   dependencies:
     caniuse-lite "^1.0.30000792"
     electron-to-chromium "^1.3.30"
 
-buffer-alloc-unsafe@^1.1.0:
-  version "1.1.0"
-  resolved "http://registry.npm.taobao.org/buffer-alloc-unsafe/download/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
-
-buffer-alloc@^1.1.0:
-  version "1.2.0"
-  resolved "http://registry.npm.taobao.org/buffer-alloc/download/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
-  dependencies:
-    buffer-alloc-unsafe "^1.1.0"
-    buffer-fill "^1.0.0"
-
 buffer-crc32@^0.2.1:
   version "0.2.13"
   resolved "http://registry.npm.taobao.org/buffer-crc32/download/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
-
-buffer-fill@^1.0.0:
-  version "1.0.0"
-  resolved "http://registry.npm.taobao.org/buffer-fill/download/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
-
-buffer-from@^1.0.0:
-  version "1.1.0"
-  resolved "http://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04"
 
 buffer-indexof@^1.0.0:
   version "1.1.1"
@@ -1147,27 +1135,27 @@
   version "3.0.0"
   resolved "http://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
 
-cacache@^10.0.1, cacache@^10.0.4:
-  version "10.0.4"
-  resolved "http://registry.npm.taobao.org/cacache/download/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
+cacache@^10.0.1:
+  version "10.0.2"
+  resolved "http://registry.npm.taobao.org/cacache/download/cacache-10.0.2.tgz#105a93a162bbedf3a25da42e1939ed99ffb145f8"
   dependencies:
-    bluebird "^3.5.1"
+    bluebird "^3.5.0"
     chownr "^1.0.1"
     glob "^7.1.2"
     graceful-fs "^4.1.11"
     lru-cache "^4.1.1"
-    mississippi "^2.0.0"
+    mississippi "^1.3.0"
     mkdirp "^0.5.1"
     move-concurrently "^1.0.1"
     promise-inflight "^1.0.1"
-    rimraf "^2.6.2"
-    ssri "^5.2.4"
+    rimraf "^2.6.1"
+    ssri "^5.0.0"
     unique-filename "^1.1.0"
-    y18n "^4.0.0"
+    y18n "^3.2.1"
 
 cache-base@^1.0.1:
   version "1.0.1"
-  resolved "http://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
   dependencies:
     collection-visit "^1.0.0"
     component-emitter "^1.2.1"
@@ -1180,12 +1168,12 @@
     unset-value "^1.0.0"
 
 cache-loader@^1.2.0:
-  version "1.2.2"
-  resolved "http://registry.npm.taobao.org/cache-loader/download/cache-loader-1.2.2.tgz#6d5c38ded959a09cc5d58190ab5af6f73bd353f5"
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-1.2.1.tgz#e171d5670188788c08af51b07cb52f40e8b157a2"
   dependencies:
+    async "^2.4.1"
     loader-utils "^1.1.0"
     mkdirp "^0.5.1"
-    neo-async "^2.5.0"
     schema-utils "^0.4.2"
 
 callsite@1.0.0:
@@ -1230,17 +1218,25 @@
   version "4.1.0"
   resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
 
+caniuse-lite@^1.0.30000784:
+  version "1.0.30000789"
+  resolved "http://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30000789.tgz#2e3d937b267133f63635ef7f441fac66360fc889"
+
 caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805:
-  version "1.0.30000865"
-  resolved "http://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25"
+  version "1.0.30000810"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000810.tgz#47585fffce0e9f3593a6feea4673b945424351d9"
+
+caseless@~0.11.0:
+  version "0.11.0"
+  resolved "http://registry.npm.taobao.org/caseless/download/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
 
 caseless@~0.12.0:
   version "0.12.0"
   resolved "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
 
 ccount@^1.0.0:
-  version "1.0.3"
-  resolved "http://registry.npm.taobao.org/ccount/download/ccount-1.0.3.tgz#f1cec43f332e2ea5a569fd46f9f5bde4e6102aff"
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/ccount/download/ccount-1.0.2.tgz#53b6a2f815bb77b9c2871f7b9a72c3a25f1d8e89"
 
 center-align@^0.1.1:
   version "0.1.3"
@@ -1248,6 +1244,13 @@
   dependencies:
     align-text "^0.1.3"
     lazy-cache "^1.0.3"
+
+cfb@~1.0.1:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/cfb/download/cfb-1.0.1.tgz#557bb24f67dae78803785a1595d365bc82c5fab4"
+  dependencies:
+    commander "^2.12.1"
+    printj "~1.1.0"
 
 chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
   version "1.1.3"
@@ -1259,13 +1262,21 @@
     strip-ansi "^3.0.0"
     supports-color "^2.0.0"
 
-chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1:
-  version "2.4.1"
-  resolved "http://registry.npm.taobao.org/chalk/download/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0:
+  version "2.3.0"
+  resolved "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba"
   dependencies:
-    ansi-styles "^3.2.1"
+    ansi-styles "^3.1.0"
     escape-string-regexp "^1.0.5"
-    supports-color "^5.3.0"
+    supports-color "^4.0.0"
+
+chalk@^2.3.1:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796"
+  dependencies:
+    ansi-styles "^3.2.0"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.2.0"
 
 chalk@~2.2.0:
   version "2.2.2"
@@ -1276,24 +1287,24 @@
     supports-color "^4.0.0"
 
 character-entities-html4@^1.0.0:
-  version "1.1.2"
-  resolved "http://registry.npm.taobao.org/character-entities-html4/download/character-entities-html4-1.1.2.tgz#c44fdde3ce66b52e8d321d6c1bf46101f0150610"
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/character-entities-html4/download/character-entities-html4-1.1.1.tgz#359a2a4a0f7e29d3dc2ac99bdbe21ee39438ea50"
 
 character-entities-legacy@^1.0.0:
-  version "1.1.2"
-  resolved "http://registry.npm.taobao.org/character-entities-legacy/download/character-entities-legacy-1.1.2.tgz#7c6defb81648498222c9855309953d05f4d63a9c"
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/character-entities-legacy/download/character-entities-legacy-1.1.1.tgz#f40779df1a101872bb510a3d295e1fccf147202f"
 
 character-entities@^1.0.0:
-  version "1.2.2"
-  resolved "http://registry.npm.taobao.org/character-entities/download/character-entities-1.2.2.tgz#58c8f371c0774ef0ba9b2aca5f00d8f100e6e363"
+  version "1.2.1"
+  resolved "http://registry.npm.taobao.org/character-entities/download/character-entities-1.2.1.tgz#f76871be5ef66ddb7f8f8e3478ecc374c27d6dca"
 
 character-reference-invalid@^1.0.0:
-  version "1.1.2"
-  resolved "http://registry.npm.taobao.org/character-reference-invalid/download/character-reference-invalid-1.1.2.tgz#21e421ad3d84055952dab4a43a04e73cd425d3ed"
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/character-reference-invalid/download/character-reference-invalid-1.1.1.tgz#942835f750e4ec61a308e60c2ef8cc1011202efc"
 
 check-types@^7.3.0:
-  version "7.4.0"
-  resolved "http://registry.npm.taobao.org/check-types/download/check-types-7.4.0.tgz#0378ec1b9616ec71f774931a3c6516fad8c152f4"
+  version "7.3.0"
+  resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.3.0.tgz#468f571a4435c24248f5fd0cb0e8d87c3c341e7d"
 
 chokidar@^1.4.1, chokidar@^1.4.2, chokidar@^1.7.0:
   version "1.7.0"
@@ -1310,9 +1321,9 @@
   optionalDependencies:
     fsevents "^1.0.0"
 
-chokidar@^2.0.0, chokidar@^2.0.2:
-  version "2.0.4"
-  resolved "http://registry.npm.taobao.org/chokidar/download/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26"
+chokidar@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.2.tgz#4dc65139eeb2714977735b6a35d06e97b494dfd7"
   dependencies:
     anymatch "^2.0.0"
     async-each "^1.0.0"
@@ -1321,13 +1332,12 @@
     inherits "^2.0.1"
     is-binary-path "^1.0.0"
     is-glob "^4.0.0"
-    lodash.debounce "^4.0.8"
     normalize-path "^2.1.1"
     path-is-absolute "^1.0.0"
     readdirp "^2.0.0"
-    upath "^1.0.5"
+    upath "^1.0.0"
   optionalDependencies:
-    fsevents "^1.2.2"
+    fsevents "^1.0.0"
 
 chownr@^1.0.1:
   version "1.0.1"
@@ -1341,8 +1351,8 @@
     safe-buffer "^5.0.1"
 
 circular-dependency-plugin@^4.2.1:
-  version "4.4.0"
-  resolved "http://registry.npm.taobao.org/circular-dependency-plugin/download/circular-dependency-plugin-4.4.0.tgz#f8a1a746a3f6c8e57f4dae9b54d991cd2a582f5d"
+  version "4.3.0"
+  resolved "http://registry.npm.taobao.org/circular-dependency-plugin/download/circular-dependency-plugin-4.3.0.tgz#2a12824e584546e1aeea5865b7bf234a11c4a695"
 
 circular-json@^0.3.1:
   version "0.3.3"
@@ -1350,16 +1360,16 @@
 
 class-utils@^0.3.5:
   version "0.3.6"
-  resolved "http://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
   dependencies:
     arr-union "^3.1.0"
     define-property "^0.2.5"
     isobject "^3.0.0"
     static-extend "^0.1.1"
 
-clean-css@4.1.x, clean-css@^4.1.11:
-  version "4.1.11"
-  resolved "http://registry.npm.taobao.org/clean-css/download/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a"
+clean-css@4.1.x, clean-css@^4.1.9:
+  version "4.1.9"
+  resolved "http://registry.npm.taobao.org/clean-css/download/clean-css-4.1.9.tgz#35cee8ae7687a49b98034f70de00c4edd3826301"
   dependencies:
     source-map "0.5.x"
 
@@ -1396,18 +1406,18 @@
     strip-ansi "^3.0.1"
     wrap-ansi "^2.0.0"
 
-clone-deep@^2.0.1:
-  version "2.0.2"
-  resolved "http://registry.npm.taobao.org/clone-deep/download/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713"
+clone-deep@^0.3.0:
+  version "0.3.0"
+  resolved "http://registry.npm.taobao.org/clone-deep/download/clone-deep-0.3.0.tgz#348c61ae9cdbe0edfe053d91ff4cc521d790ede8"
   dependencies:
     for-own "^1.0.0"
-    is-plain-object "^2.0.4"
-    kind-of "^6.0.0"
-    shallow-clone "^1.0.0"
+    is-plain-object "^2.0.1"
+    kind-of "^3.2.2"
+    shallow-clone "^0.1.2"
 
 clone-regexp@^1.0.0:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/clone-regexp/download/clone-regexp-1.0.1.tgz#051805cd33173375d82118fc0918606da39fd60f"
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/clone-regexp/download/clone-regexp-1.0.0.tgz#eae0a2413f55c0942f818c229fefce845d7f3b1c"
   dependencies:
     is-regexp "^1.0.0"
     is-supported-regexp-flag "^1.0.0"
@@ -1417,8 +1427,8 @@
   resolved "http://registry.npm.taobao.org/clone-stats/download/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
 
 clone@^1.0.0:
-  version "1.0.4"
-  resolved "http://registry.npm.taobao.org/clone/download/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+  version "1.0.3"
+  resolved "http://registry.npm.taobao.org/clone/download/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f"
 
 clone@^2.1.1:
   version "2.1.1"
@@ -1433,13 +1443,12 @@
   resolved "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
 
 codecov@^3.0.0:
-  version "3.0.4"
-  resolved "http://registry.npm.taobao.org/codecov/download/codecov-3.0.4.tgz#37f2bf9ed71086923aac7496d982e32e5899dfd8"
+  version "3.0.0"
+  resolved "http://registry.npm.taobao.org/codecov/download/codecov-3.0.0.tgz#c273b8c4f12945723e8dc9d25803d89343e5f28e"
   dependencies:
-    argv "^0.0.2"
-    ignore-walk "^3.0.1"
-    request "^2.87.0"
-    urlgrey "^0.4.4"
+    argv "0.0.2"
+    request "2.81.0"
+    urlgrey "0.4.4"
 
 codelyzer@~4.0.1:
   version "4.0.2"
@@ -1452,38 +1461,42 @@
     source-map "^0.5.6"
     sprintf-js "^1.0.3"
 
+codepage@~1.11.0:
+  version "1.11.1"
+  resolved "http://registry.npm.taobao.org/codepage/download/codepage-1.11.1.tgz#86472397ea5b2cdbb07b77016a512477a3cb8823"
+  dependencies:
+    commander "~2.11.0"
+    exit-on-epipe "~1.0.1"
+    voc "~1.0.0"
+
 collapse-white-space@^1.0.2:
-  version "1.0.4"
-  resolved "http://registry.npm.taobao.org/collapse-white-space/download/collapse-white-space-1.0.4.tgz#ce05cf49e54c3277ae573036a26851ba430a0091"
+  version "1.0.3"
+  resolved "http://registry.npm.taobao.org/collapse-white-space/download/collapse-white-space-1.0.3.tgz#4b906f670e5a963a87b76b0e1689643341b6023c"
 
 collection-visit@^1.0.0:
   version "1.0.0"
-  resolved "http://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
   dependencies:
     map-visit "^1.0.0"
     object-visit "^1.0.0"
 
 color-convert@^1.9.0:
-  version "1.9.2"
-  resolved "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147"
+  version "1.9.1"
+  resolved "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed"
   dependencies:
-    color-name "1.1.1"
+    color-name "^1.1.1"
 
-color-name@1.1.1:
-  version "1.1.1"
-  resolved "http://registry.npm.taobao.org/color-name/download/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689"
+color-name@^1.1.1:
+  version "1.1.3"
+  resolved "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
 
 color-support@^1.1.3:
   version "1.1.3"
   resolved "http://registry.npm.taobao.org/color-support/download/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
 
-colors@1.1.2:
+colors@1.1.2, colors@^1.1.0, colors@^1.1.2:
   version "1.1.2"
   resolved "http://registry.npm.taobao.org/colors/download/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
-
-colors@^1.1.0, colors@^1.1.2:
-  version "1.3.0"
-  resolved "http://registry.npm.taobao.org/colors/download/colors-1.3.0.tgz#5f20c9fef6945cb1134260aab33bfbdc8295e04e"
 
 combine-lists@^1.0.0:
   version "1.0.1"
@@ -1491,31 +1504,33 @@
   dependencies:
     lodash "^4.5.0"
 
-combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
-  version "1.0.6"
-  resolved "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+  version "1.0.5"
+  resolved "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
   dependencies:
     delayed-stream "~1.0.0"
 
-commander@2, commander@2.16.x, commander@^2.11.0, commander@^2.13.0, commander@^2.9.0, commander@~2.16.0:
-  version "2.16.0"
-  resolved "http://registry.npm.taobao.org/commander/download/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50"
+commander@*, commander@2, commander@2.12.x, commander@^2.11.0, commander@^2.12.1, commander@^2.9.0, commander@~2.12.1:
+  version "2.12.2"
+  resolved "http://registry.npm.taobao.org/commander/download/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555"
 
-commander@~2.13.0:
-  version "2.13.0"
-  resolved "http://registry.npm.taobao.org/commander/download/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
+commander@^2.13.0:
+  version "2.14.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa"
+
+commander@~2.11.0:
+  version "2.11.0"
+  resolved "http://registry.npm.taobao.org/commander/download/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
 
 common-tags@^1.3.1:
-  version "1.8.0"
-  resolved "http://registry.npm.taobao.org/common-tags/download/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
+  version "1.7.0"
+  resolved "http://registry.npm.taobao.org/common-tags/download/common-tags-1.7.0.tgz#2457c9d6c64f22b250c84c11c9b3f98b428f3083"
+  dependencies:
+    babel-runtime "^6.26.0"
 
 commondir@^1.0.1:
   version "1.0.1"
   resolved "http://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
-
-compare-versions@^3.1.0:
-  version "3.3.0"
-  resolved "http://registry.npm.taobao.org/compare-versions/download/compare-versions-3.3.0.tgz#af93ea705a96943f622ab309578b9b90586f39c3"
 
 component-bind@1.0.0:
   version "1.0.0"
@@ -1527,7 +1542,7 @@
 
 component-emitter@1.2.1, component-emitter@^1.2.1:
   version "1.2.1"
-  resolved "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
 
 component-inherit@0.0.3:
   version "0.0.3"
@@ -1542,19 +1557,19 @@
     normalize-path "^2.0.0"
     readable-stream "^2.0.0"
 
-compressible@~2.0.13:
-  version "2.0.14"
-  resolved "http://registry.npm.taobao.org/compressible/download/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7"
+compressible@~2.0.11:
+  version "2.0.12"
+  resolved "http://registry.npm.taobao.org/compressible/download/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66"
   dependencies:
-    mime-db ">= 1.34.0 < 2"
+    mime-db ">= 1.30.0 < 2"
 
 compression@^1.5.2:
-  version "1.7.2"
-  resolved "http://registry.npm.taobao.org/compression/download/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69"
+  version "1.7.1"
+  resolved "http://registry.npm.taobao.org/compression/download/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db"
   dependencies:
     accepts "~1.3.4"
     bytes "3.0.0"
-    compressible "~2.0.13"
+    compressible "~2.0.11"
     debug "2.6.9"
     on-headers "~1.0.1"
     safe-buffer "5.1.1"
@@ -1565,10 +1580,9 @@
   resolved "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
 
 concat-stream@^1.5.0:
-  version "1.6.2"
-  resolved "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+  version "1.6.0"
+  resolved "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
   dependencies:
-    buffer-from "^1.0.0"
     inherits "^2.0.3"
     readable-stream "^2.2.2"
     typedarray "^0.0.6"
@@ -1578,11 +1592,11 @@
   resolved "http://registry.npm.taobao.org/connect-history-api-fallback/download/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a"
 
 connect@^3.6.0:
-  version "3.6.6"
-  resolved "http://registry.npm.taobao.org/connect/download/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524"
+  version "3.6.5"
+  resolved "http://registry.npm.taobao.org/connect/download/connect-3.6.5.tgz#fb8dde7ba0763877d0ec9df9dac0b4b40e72c7da"
   dependencies:
     debug "2.6.9"
-    finalhandler "1.1.0"
+    finalhandler "1.0.6"
     parseurl "~1.3.2"
     utils-merge "1.0.1"
 
@@ -1608,13 +1622,9 @@
   version "1.0.4"
   resolved "http://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
 
-contour_plot@^0.0.1:
-  version "0.0.1"
-  resolved "http://registry.npm.taobao.org/contour_plot/download/contour_plot-0.0.1.tgz#475870f032b8e338412aa5fc507880f0bf495c77"
-
 convert-source-map@^1.5.0:
   version "1.5.1"
-  resolved "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
 
 cookie-signature@1.0.6:
   version "1.0.6"
@@ -1637,24 +1647,24 @@
 
 copy-descriptor@^0.1.0:
   version "0.1.1"
-  resolved "http://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
 
 copy-webpack-plugin@~4.4.1:
-  version "4.4.3"
-  resolved "http://registry.npm.taobao.org/copy-webpack-plugin/download/copy-webpack-plugin-4.4.3.tgz#65d56fb9e1936b39e129f9aa2aec097ce1fd44be"
+  version "4.4.2"
+  resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.4.2.tgz#c92bcd7df4d5e42c51398cc36b23820d0d10446a"
   dependencies:
     cacache "^10.0.1"
     find-cache-dir "^1.0.0"
     globby "^7.1.1"
     is-glob "^4.0.0"
-    loader-utils "^1.1.0"
+    loader-utils "^0.2.15"
     minimatch "^3.0.4"
     p-limit "^1.0.0"
     serialize-javascript "^1.4.0"
 
 core-js@^2.2.0, core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.1:
-  version "2.5.7"
-  resolved "http://registry.npm.taobao.org/core-js/download/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
+  version "2.5.3"
+  resolved "http://registry.npm.taobao.org/core-js/download/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e"
 
 core-object@^3.1.0:
   version "3.1.5"
@@ -1666,6 +1676,18 @@
   version "1.0.2"
   resolved "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
 
+cosmiconfig@^2.1.0, cosmiconfig@^2.1.1:
+  version "2.2.2"
+  resolved "http://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892"
+  dependencies:
+    is-directory "^0.3.1"
+    js-yaml "^3.4.3"
+    minimist "^1.2.0"
+    object-assign "^4.1.0"
+    os-homedir "^1.0.1"
+    parse-json "^2.2.0"
+    require-from-string "^1.1.0"
+
 cosmiconfig@^3.1.0:
   version "3.1.0"
   resolved "http://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-3.1.0.tgz#640a94bf9847f321800403cd273af60665c73397"
@@ -1675,14 +1697,12 @@
     parse-json "^3.0.0"
     require-from-string "^2.0.1"
 
-cosmiconfig@^4.0.0:
-  version "4.0.0"
-  resolved "http://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc"
+crc-32@~1.1.1:
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/crc-32/download/crc-32-1.1.1.tgz#5d739d5e4c6e352ad8304d73223d483fe55adb8d"
   dependencies:
-    is-directory "^0.3.1"
-    js-yaml "^3.9.0"
-    parse-json "^4.0.0"
-    require-from-string "^2.0.1"
+    exit-on-epipe "~1.0.1"
+    printj "~1.1.0"
 
 crc32-stream@^2.0.0:
   version "2.0.0"
@@ -1696,25 +1716,24 @@
   resolved "http://registry.npm.taobao.org/crc/download/crc-3.5.0.tgz#98b8ba7d489665ba3979f59b21381374101a1964"
 
 create-ecdh@^4.0.0:
-  version "4.0.3"
-  resolved "http://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+  version "4.0.0"
+  resolved "http://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
   dependencies:
     bn.js "^4.1.0"
     elliptic "^6.0.0"
 
 create-hash@^1.1.0, create-hash@^1.1.2:
-  version "1.2.0"
-  resolved "http://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+  version "1.1.3"
+  resolved "http://registry.npm.taobao.org/create-hash/download/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
   dependencies:
     cipher-base "^1.0.1"
     inherits "^2.0.1"
-    md5.js "^1.3.4"
-    ripemd160 "^2.0.1"
+    ripemd160 "^2.0.0"
     sha.js "^2.4.0"
 
 create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
-  version "1.1.7"
-  resolved "http://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+  version "1.1.6"
+  resolved "http://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
   dependencies:
     cipher-base "^1.0.3"
     create-hash "^1.1.0"
@@ -1730,21 +1749,11 @@
     lru-cache "^4.0.1"
     which "^1.2.9"
 
-cross-spawn@^5.0.1:
+cross-spawn@^5.0.1, cross-spawn@^5.1.0:
   version "5.1.0"
   resolved "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
   dependencies:
     lru-cache "^4.0.1"
-    shebang-command "^1.2.0"
-    which "^1.2.9"
-
-cross-spawn@^6.0.4:
-  version "6.0.5"
-  resolved "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
-  dependencies:
-    nice-try "^1.0.4"
-    path-key "^2.0.1"
-    semver "^5.5.0"
     shebang-command "^1.2.0"
     which "^1.2.9"
 
@@ -1811,7 +1820,7 @@
   version "0.1.0"
   resolved "http://registry.npm.taobao.org/cssesc/download/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
 
-cuint@^0.2.2:
+cuint@latest:
   version "0.2.2"
   resolved "http://registry.npm.taobao.org/cuint/download/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
 
@@ -1829,7 +1838,7 @@
   version "0.2.2"
   resolved "http://registry.npm.taobao.org/cyclist/download/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
 
-d3-array@1, d3-array@^1.2.0:
+d3-array@1, d3-array@~1.2.0:
   version "1.2.1"
   resolved "http://registry.npm.taobao.org/d3-array/download/d3-array-1.2.1.tgz#d1ca33de2f6ac31efadb8e050a021d7e2396d5dc"
 
@@ -1838,21 +1847,17 @@
   resolved "http://registry.npm.taobao.org/d3-collection/download/d3-collection-1.0.4.tgz#342dfd12837c90974f33f1cc0a785aea570dcdc2"
 
 d3-color@1:
-  version "1.2.0"
-  resolved "http://registry.npm.taobao.org/d3-color/download/d3-color-1.2.0.tgz#d1ea19db5859c86854586276ec892cf93148459a"
+  version "1.0.3"
+  resolved "http://registry.npm.taobao.org/d3-color/download/d3-color-1.0.3.tgz#bc7643fca8e53a8347e2fbdaffa236796b58509b"
 
-d3-composite-projections@^1.2.0:
+d3-composite-projections@~1.2.0:
   version "1.2.0"
   resolved "http://registry.npm.taobao.org/d3-composite-projections/download/d3-composite-projections-1.2.0.tgz#fa0e6f1442f17d04643843a3a883c7d94e0c27c0"
   dependencies:
     d3-geo "1.2.4"
     d3-path "^1.0.1"
 
-d3-dispatch@1:
-  version "1.0.3"
-  resolved "http://registry.npm.taobao.org/d3-dispatch/download/d3-dispatch-1.0.3.tgz#46e1491eaa9b58c358fce5be4e8bed626e7871f8"
-
-d3-dsv@^1.0.5:
+d3-dsv@~1.0.5:
   version "1.0.8"
   resolved "http://registry.npm.taobao.org/d3-dsv/download/d3-dsv-1.0.8.tgz#907e240d57b386618dc56468bacfe76bf19764ae"
   dependencies:
@@ -1860,17 +1865,17 @@
     iconv-lite "0.4"
     rw "1"
 
-d3-ease@1, d3-ease@~1.0.3:
+d3-ease@~1.0.3:
   version "1.0.3"
-  resolved "http://registry.npm.taobao.org/d3-ease/download/d3-ease-1.0.3.tgz#68bfbc349338a380c44d8acc4fbc3304aa2d8c0e"
+  resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.3.tgz#68bfbc349338a380c44d8acc4fbc3304aa2d8c0e"
 
-d3-geo-projection@^2.1.2:
-  version "2.4.0"
-  resolved "http://registry.npm.taobao.org/d3-geo-projection/download/d3-geo-projection-2.4.0.tgz#52a114561a589f211cd212d5b19d9c330cce15d7"
+d3-geo-projection@~2.1.2:
+  version "2.1.2"
+  resolved "http://registry.npm.taobao.org/d3-geo-projection/download/d3-geo-projection-2.1.2.tgz#7df8e1e9d046d631c6509f7e531357d4adc24aa3"
   dependencies:
     commander "2"
     d3-array "1"
-    d3-geo "^1.10.0"
+    d3-geo "^1.1.0"
 
 d3-geo@1.2.4:
   version "1.2.4"
@@ -1878,25 +1883,31 @@
   dependencies:
     d3-array "1"
 
-d3-geo@^1.10.0, d3-geo@^1.6.4:
-  version "1.10.0"
-  resolved "http://registry.npm.taobao.org/d3-geo/download/d3-geo-1.10.0.tgz#2972d18014f1e38fc1f8bb6d545377bdfb00c9ab"
+d3-geo@^1.1.0:
+  version "1.9.1"
+  resolved "http://registry.npm.taobao.org/d3-geo/download/d3-geo-1.9.1.tgz#157e3b0f917379d0f73bebfff3be537f49fa7356"
   dependencies:
     d3-array "1"
 
-d3-hierarchy@^1.1.5:
-  version "1.1.6"
-  resolved "http://registry.npm.taobao.org/d3-hierarchy/download/d3-hierarchy-1.1.6.tgz#842c1372090f870b7ea013ebae5c0c8d9f56229c"
-
-d3-interpolate@1:
-  version "1.2.0"
-  resolved "http://registry.npm.taobao.org/d3-interpolate/download/d3-interpolate-1.2.0.tgz#40d81bd8e959ff021c5ea7545bc79b8d22331c41"
+d3-geo@~1.6.4:
+  version "1.6.4"
+  resolved "http://registry.npm.taobao.org/d3-geo/download/d3-geo-1.6.4.tgz#f20e1e461cb1845f5a8be55ab6f876542a7e3199"
   dependencies:
-    d3-color "1"
+    d3-array "1"
+
+d3-hexjson@^1.0.1:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/d3-hexjson/download/d3-hexjson-1.0.1.tgz#6a23111e8359f1e214f5d0afa379c02b2b67df0b"
+  dependencies:
+    d3-array "1"
+
+d3-hierarchy@~1.1.5:
+  version "1.1.5"
+  resolved "http://registry.npm.taobao.org/d3-hierarchy/download/d3-hierarchy-1.1.5.tgz#a1c845c42f84a206bcf1c01c01098ea4ddaa7a26"
 
 d3-interpolate@~1.1.5:
   version "1.1.6"
-  resolved "http://registry.npm.taobao.org/d3-interpolate/download/d3-interpolate-1.1.6.tgz#2cf395ae2381804df08aa1bf766b7f97b5f68fb6"
+  resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.1.6.tgz#2cf395ae2381804df08aa1bf766b7f97b5f68fb6"
   dependencies:
     d3-color "1"
 
@@ -1904,7 +1915,7 @@
   version "1.0.5"
   resolved "http://registry.npm.taobao.org/d3-path/download/d3-path-1.0.5.tgz#241eb1849bd9e9e8021c0d0a799f8a0e8e441764"
 
-d3-sankey@^0.7.1:
+d3-sankey@~0.7.1:
   version "0.7.1"
   resolved "http://registry.npm.taobao.org/d3-sankey/download/d3-sankey-0.7.1.tgz#d229832268fc69a7fec84803e96c2256a614c521"
   dependencies:
@@ -1912,32 +1923,17 @@
     d3-collection "1"
     d3-shape "^1.2.0"
 
-d3-selection@^1.0.2, d3-selection@^1.1.0:
-  version "1.3.0"
-  resolved "http://registry.npm.taobao.org/d3-selection/download/d3-selection-1.3.0.tgz#d53772382d3dc4f7507bfb28bcd2d6aed2a0ad6d"
-
 d3-shape@^1.2.0:
   version "1.2.0"
   resolved "http://registry.npm.taobao.org/d3-shape/download/d3-shape-1.2.0.tgz#45d01538f064bafd05ea3d6d2cb748fd8c41f777"
   dependencies:
     d3-path "1"
 
-d3-timer@1, d3-timer@~1.0.6:
+d3-timer@~1.0.6:
   version "1.0.7"
-  resolved "http://registry.npm.taobao.org/d3-timer/download/d3-timer-1.0.7.tgz#df9650ca587f6c96607ff4e60cc38229e8dd8531"
+  resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.7.tgz#df9650ca587f6c96607ff4e60cc38229e8dd8531"
 
-d3-transition@^1.0.1:
-  version "1.1.1"
-  resolved "http://registry.npm.taobao.org/d3-transition/download/d3-transition-1.1.1.tgz#d8ef89c3b848735b060e54a39b32aaebaa421039"
-  dependencies:
-    d3-color "1"
-    d3-dispatch "1"
-    d3-ease "1"
-    d3-interpolate "1"
-    d3-selection "^1.1.0"
-    d3-timer "1"
-
-d3-voronoi@^1.1.2:
+d3-voronoi@~1.1.2:
   version "1.1.2"
   resolved "http://registry.npm.taobao.org/d3-voronoi/download/d3-voronoi-1.1.2.tgz#1687667e8f13a2d158c80c1480c5a29cb0d8973c"
 
@@ -1974,7 +1970,7 @@
   dependencies:
     ms "2.0.0"
 
-debug@2, debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8:
+debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8:
   version "2.6.9"
   resolved "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
   dependencies:
@@ -2005,29 +2001,29 @@
 
 decode-uri-component@^0.2.0:
   version "0.2.0"
-  resolved "http://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
 
 dedent@^0.7.0:
   version "0.7.0"
   resolved "http://registry.npm.taobao.org/dedent/download/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
 
-deep-equal@^1.0.1, deep-equal@~1.0.1:
+deep-equal@^1.0.1:
   version "1.0.1"
   resolved "http://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
 
-deep-extend@^0.6.0:
-  version "0.6.0"
-  resolved "http://registry.npm.taobao.org/deep-extend/download/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+deep-extend@~0.4.0:
+  version "0.4.2"
+  resolved "http://registry.npm.taobao.org/deep-extend/download/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
 
 deep-is@~0.1.3:
   version "0.1.3"
   resolved "http://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
 
-default-require-extensions@^2.0.0:
-  version "2.0.0"
-  resolved "http://registry.npm.taobao.org/default-require-extensions/download/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7"
+default-require-extensions@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/default-require-extensions/download/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
   dependencies:
-    strip-bom "^3.0.0"
+    strip-bom "^2.0.0"
 
 define-properties@^1.1.2:
   version "1.1.2"
@@ -2038,26 +2034,22 @@
 
 define-property@^0.2.5:
   version "0.2.5"
-  resolved "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
   dependencies:
     is-descriptor "^0.1.0"
 
 define-property@^1.0.0:
   version "1.0.0"
-  resolved "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
   dependencies:
     is-descriptor "^1.0.0"
 
 define-property@^2.0.2:
   version "2.0.2"
-  resolved "http://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
   dependencies:
     is-descriptor "^1.0.2"
     isobject "^3.0.1"
-
-defined@~1.0.0:
-  version "1.0.0"
-  resolved "http://registry.npm.taobao.org/defined/download/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
 
 del@^2.0.2, del@^2.2.0:
   version "2.2.2"
@@ -2094,13 +2086,9 @@
   version "1.2.1"
   resolved "http://registry.npm.taobao.org/denodeify/download/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631"
 
-depd@1.1.1:
+depd@1.1.1, depd@~1.1.1:
   version "1.1.1"
   resolved "http://registry.npm.taobao.org/depd/download/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
-
-depd@~1.1.1, depd@~1.1.2:
-  version "1.1.2"
-  resolved "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
 
 des.js@^1.0.0:
   version "1.0.0"
@@ -2132,12 +2120,12 @@
   resolved "http://registry.npm.taobao.org/di/download/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c"
 
 diff@^3.1.0, diff@^3.2.0:
-  version "3.5.0"
-  resolved "http://registry.npm.taobao.org/diff/download/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+  version "3.4.0"
+  resolved "http://registry.npm.taobao.org/diff/download/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c"
 
 diffie-hellman@^5.0.0:
-  version "5.0.3"
-  resolved "http://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+  version "5.0.2"
+  resolved "http://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
   dependencies:
     bn.js "^4.1.0"
     miller-rabin "^4.0.0"
@@ -2154,9 +2142,9 @@
   version "1.0.0"
   resolved "http://registry.npm.taobao.org/dns-equal/download/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
 
-dns-packet@^1.3.1:
-  version "1.3.1"
-  resolved "http://registry.npm.taobao.org/dns-packet/download/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a"
+dns-packet@^1.0.1:
+  version "1.2.2"
+  resolved "http://registry.npm.taobao.org/dns-packet/download/dns-packet-1.2.2.tgz#a8a26bec7646438963fc86e06f8f8b16d6c8bf7a"
   dependencies:
     ip "^1.1.0"
     safe-buffer "^5.0.1"
@@ -2190,8 +2178,8 @@
     entities "~1.1.1"
 
 domain-browser@^1.1.1:
-  version "1.2.0"
-  resolved "http://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+  version "1.1.7"
+  resolved "http://registry.npm.taobao.org/domain-browser/download/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
 
 domelementtype@1, domelementtype@^1.3.0:
   version "1.3.0"
@@ -2208,8 +2196,8 @@
     domelementtype "1"
 
 domhandler@^2.3.0:
-  version "2.4.2"
-  resolved "http://registry.npm.taobao.org/domhandler/download/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+  version "2.4.1"
+  resolved "http://registry.npm.taobao.org/domhandler/download/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259"
   dependencies:
     domelementtype "1"
 
@@ -2227,8 +2215,8 @@
     domelementtype "1"
 
 domutils@^1.5.1:
-  version "1.7.0"
-  resolved "http://registry.npm.taobao.org/domutils/download/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+  version "1.6.2"
+  resolved "http://registry.npm.taobao.org/domutils/download/domutils-1.6.2.tgz#1958cc0b4c9426e9ed367fb1c8e854891b0fa3ff"
   dependencies:
     dom-serializer "0"
     domelementtype "1"
@@ -2249,9 +2237,9 @@
   version "0.1.1"
   resolved "http://registry.npm.taobao.org/duplexer/download/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
 
-duplexify@^3.4.2, duplexify@^3.6.0:
-  version "3.6.0"
-  resolved "http://registry.npm.taobao.org/duplexify/download/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410"
+duplexify@^3.1.2, duplexify@^3.4.2:
+  version "3.5.1"
+  resolved "http://registry.npm.taobao.org/duplexify/download/duplexify-3.5.1.tgz#4e1516be68838bc90a49994f0b39a6e5960befcd"
   dependencies:
     end-of-stream "^1.0.0"
     inherits "^2.0.1"
@@ -2264,17 +2252,29 @@
   dependencies:
     jsbn "~0.1.0"
 
+echarts@^4.0.4:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/echarts/-/echarts-4.0.4.tgz#36aa8a47d33543d3dfe6a7bc1228ddc3a1e41157"
+  dependencies:
+    zrender "4.0.3"
+
 ee-first@1.1.1:
   version "1.1.1"
   resolved "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
 
 ejs@^2.5.7:
-  version "2.6.1"
-  resolved "http://registry.npm.taobao.org/ejs/download/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
+  version "2.5.7"
+  resolved "http://registry.npm.taobao.org/ejs/download/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a"
+
+electron-releases@^2.1.0:
+  version "2.1.0"
+  resolved "http://registry.npm.taobao.org/electron-releases/download/electron-releases-2.1.0.tgz#c5614bf811f176ce3c836e368a0625782341fd4e"
 
 electron-to-chromium@^1.3.30:
-  version "1.3.52"
-  resolved "http://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0"
+  version "1.3.30"
+  resolved "http://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.30.tgz#9666f532a64586651fc56a72513692e820d06a80"
+  dependencies:
+    electron-releases "^2.1.0"
 
 elegant-spinner@^1.0.1:
   version "1.0.1"
@@ -2300,13 +2300,13 @@
   version "2.1.0"
   resolved "http://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
 
-encodeurl@~1.0.1, encodeurl@~1.0.2:
-  version "1.0.2"
-  resolved "http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+encodeurl@~1.0.1:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
 
 end-of-stream@^1.0.0, end-of-stream@^1.1.0:
-  version "1.4.1"
-  resolved "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
+  version "1.4.0"
+  resolved "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206"
   dependencies:
     once "^1.4.0"
 
@@ -2366,21 +2366,21 @@
   version "1.1.1"
   resolved "http://registry.npm.taobao.org/entities/download/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
 
-errno@^0.1.1, errno@^0.1.3, errno@~0.1.7:
-  version "0.1.7"
-  resolved "http://registry.npm.taobao.org/errno/download/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+errno@^0.1.1, errno@^0.1.3, errno@^0.1.4:
+  version "0.1.6"
+  resolved "http://registry.npm.taobao.org/errno/download/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026"
   dependencies:
     prr "~1.0.1"
 
 error-ex@^1.2.0, error-ex@^1.3.1:
-  version "1.3.2"
-  resolved "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+  version "1.3.1"
+  resolved "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
   dependencies:
     is-arrayish "^0.2.1"
 
-es-abstract@^1.4.3, es-abstract@^1.5.0, es-abstract@^1.7.0:
-  version "1.12.0"
-  resolved "http://registry.npm.taobao.org/es-abstract/download/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
+es-abstract@^1.4.3, es-abstract@^1.7.0:
+  version "1.10.0"
+  resolved "http://registry.npm.taobao.org/es-abstract/download/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864"
   dependencies:
     es-to-primitive "^1.1.1"
     function-bind "^1.1.1"
@@ -2397,14 +2397,13 @@
     is-symbol "^1.0.1"
 
 es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
-  version "0.10.45"
-  resolved "http://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653"
+  version "0.10.37"
+  resolved "http://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.37.tgz#0ee741d148b80069ba27d020393756af257defc3"
   dependencies:
-    es6-iterator "~2.0.3"
+    es6-iterator "~2.0.1"
     es6-symbol "~3.1.1"
-    next-tick "1"
 
-es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
+es6-iterator@^2.0.1, es6-iterator@~2.0.1:
   version "2.0.3"
   resolved "http://registry.npm.taobao.org/es6-iterator/download/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
   dependencies:
@@ -2422,16 +2421,6 @@
     es6-set "~0.1.5"
     es6-symbol "~3.1.1"
     event-emitter "~0.3.5"
-
-es6-promise@^4.0.3:
-  version "4.2.4"
-  resolved "http://registry.npm.taobao.org/es6-promise/download/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29"
-
-es6-promisify@^5.0.0:
-  version "5.0.0"
-  resolved "http://registry.npm.taobao.org/es6-promisify/download/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
-  dependencies:
-    es6-promise "^4.0.3"
 
 es6-set@~0.1.5:
   version "0.1.5"
@@ -2496,10 +2485,11 @@
   resolved "http://registry.npm.taobao.org/esprima/download/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
 
 esrecurse@^4.1.0:
-  version "4.2.1"
-  resolved "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+  version "4.2.0"
+  resolved "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163"
   dependencies:
     estraverse "^4.1.0"
+    object-assign "^4.0.1"
 
 estraverse@^1.9.1:
   version "1.9.3"
@@ -2536,9 +2526,9 @@
     stream-combiner "~0.0.4"
     through "~2.3.1"
 
-eventemitter3@^3.0.0:
-  version "3.1.0"
-  resolved "http://registry.npm.taobao.org/eventemitter3/download/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163"
+eventemitter3@1.x.x:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/eventemitter3/download/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
 
 events@^1.0.0:
   version "1.1.1"
@@ -2591,6 +2581,10 @@
   version "1.1.1"
   resolved "http://registry.npm.taobao.org/exit-hook/download/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
 
+exit-on-epipe@~1.0.1:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/exit-on-epipe/download/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
+
 exit@^0.1.2:
   version "0.1.2"
   resolved "http://registry.npm.taobao.org/exit/download/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
@@ -2611,7 +2605,7 @@
 
 expand-brackets@^2.1.4:
   version "2.1.4"
-  resolved "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
   dependencies:
     debug "^2.3.3"
     define-property "^0.2.5"
@@ -2635,10 +2629,10 @@
     fill-range "^2.1.0"
 
 express@^4.16.2:
-  version "4.16.3"
-  resolved "http://registry.npm.taobao.org/express/download/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53"
+  version "4.16.2"
+  resolved "http://registry.npm.taobao.org/express/download/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c"
   dependencies:
-    accepts "~1.3.5"
+    accepts "~1.3.4"
     array-flatten "1.1.1"
     body-parser "1.18.2"
     content-disposition "0.5.2"
@@ -2646,38 +2640,38 @@
     cookie "0.3.1"
     cookie-signature "1.0.6"
     debug "2.6.9"
-    depd "~1.1.2"
-    encodeurl "~1.0.2"
+    depd "~1.1.1"
+    encodeurl "~1.0.1"
     escape-html "~1.0.3"
     etag "~1.8.1"
-    finalhandler "1.1.1"
+    finalhandler "1.1.0"
     fresh "0.5.2"
     merge-descriptors "1.0.1"
     methods "~1.1.2"
     on-finished "~2.3.0"
     parseurl "~1.3.2"
     path-to-regexp "0.1.7"
-    proxy-addr "~2.0.3"
+    proxy-addr "~2.0.2"
     qs "6.5.1"
     range-parser "~1.2.0"
     safe-buffer "5.1.1"
-    send "0.16.2"
-    serve-static "1.13.2"
+    send "0.16.1"
+    serve-static "1.13.1"
     setprototypeof "1.1.0"
-    statuses "~1.4.0"
-    type-is "~1.6.16"
+    statuses "~1.3.1"
+    type-is "~1.6.15"
     utils-merge "1.0.1"
     vary "~1.1.2"
 
 extend-shallow@^2.0.1:
   version "2.0.1"
-  resolved "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
   dependencies:
     is-extendable "^0.1.0"
 
 extend-shallow@^3.0.0, extend-shallow@^3.0.2:
   version "3.0.2"
-  resolved "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
   dependencies:
     assign-symbols "^1.0.0"
     is-extendable "^1.0.1"
@@ -2694,7 +2688,7 @@
 
 extglob@^2.0.4:
   version "2.0.4"
-  resolved "http://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
   dependencies:
     array-unique "^0.3.2"
     define-property "^1.0.0"
@@ -2731,12 +2725,8 @@
     time-stamp "^1.0.0"
 
 fast-deep-equal@^1.0.0:
-  version "1.1.0"
-  resolved "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
-
-fast-deep-equal@^2.0.1:
-  version "2.0.1"
-  resolved "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
 
 fast-json-stable-stringify@^2.0.0:
   version "2.0.0"
@@ -2762,9 +2752,9 @@
   dependencies:
     websocket-driver ">=0.5.1"
 
-fecha@~2.3.3:
-  version "2.3.3"
-  resolved "http://registry.npm.taobao.org/fecha/download/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd"
+fecha@~2.3.2:
+  version "2.3.2"
+  resolved "http://registry.npm.taobao.org/fecha/download/fecha-2.3.2.tgz#360f035dd6edd954bc9581f95f2a4a7f2a3505c1"
 
 figures@^1.7.0:
   version "1.7.0"
@@ -2781,15 +2771,15 @@
     object-assign "^4.0.1"
 
 file-loader@^1.1.5:
-  version "1.1.11"
-  resolved "http://registry.npm.taobao.org/file-loader/download/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8"
+  version "1.1.6"
+  resolved "http://registry.npm.taobao.org/file-loader/download/file-loader-1.1.6.tgz#7b9a8f2c58f00a77fddf49e940f7ac978a3ea0e8"
   dependencies:
     loader-utils "^1.0.2"
-    schema-utils "^0.4.5"
+    schema-utils "^0.3.0"
 
 file-saver@^1.3.3:
-  version "1.3.8"
-  resolved "http://registry.npm.taobao.org/file-saver/download/file-saver-1.3.8.tgz#e68a30c7cb044e2fb362b428469feb291c2e09d8"
+  version "1.3.3"
+  resolved "http://registry.npm.taobao.org/file-saver/download/file-saver-1.3.3.tgz#cdd4c44d3aa264eac2f68ec165bc791c34af1232"
 
 filename-regex@^2.0.0:
   version "2.0.1"
@@ -2803,27 +2793,39 @@
     minimatch "^3.0.3"
 
 filesize@^3.5.11:
-  version "3.6.1"
-  resolved "http://registry.npm.taobao.org/filesize/download/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.0.tgz#22d079615624bb6fd3c04026120628a41b3f4efa"
 
 fill-range@^2.1.0:
-  version "2.2.4"
-  resolved "http://registry.npm.taobao.org/fill-range/download/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
+  version "2.2.3"
+  resolved "http://registry.npm.taobao.org/fill-range/download/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
   dependencies:
     is-number "^2.1.0"
     isobject "^2.0.0"
-    randomatic "^3.0.0"
+    randomatic "^1.1.3"
     repeat-element "^1.1.2"
     repeat-string "^1.5.2"
 
 fill-range@^4.0.0:
   version "4.0.0"
-  resolved "http://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
   dependencies:
     extend-shallow "^2.0.1"
     is-number "^3.0.0"
     repeat-string "^1.6.1"
     to-regex-range "^2.1.0"
+
+finalhandler@1.0.6:
+  version "1.0.6"
+  resolved "http://registry.npm.taobao.org/finalhandler/download/finalhandler-1.0.6.tgz#007aea33d1a4d3e42017f624848ad58d212f814f"
+  dependencies:
+    debug "2.6.9"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    on-finished "~2.3.0"
+    parseurl "~1.3.2"
+    statuses "~1.3.1"
+    unpipe "~1.0.0"
 
 finalhandler@1.1.0:
   version "1.1.0"
@@ -2835,18 +2837,6 @@
     on-finished "~2.3.0"
     parseurl "~1.3.2"
     statuses "~1.3.1"
-    unpipe "~1.0.0"
-
-finalhandler@1.1.1:
-  version "1.1.1"
-  resolved "http://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
-  dependencies:
-    debug "2.6.9"
-    encodeurl "~1.0.2"
-    escape-html "~1.0.3"
-    on-finished "~2.3.0"
-    parseurl "~1.3.2"
-    statuses "~1.4.0"
     unpipe "~1.0.0"
 
 find-cache-dir@^1.0.0:
@@ -2884,37 +2874,15 @@
     write "^0.2.1"
 
 flush-write-stream@^1.0.0:
-  version "1.0.3"
-  resolved "http://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd"
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417"
   dependencies:
     inherits "^2.0.1"
     readable-stream "^2.0.4"
 
-fmin@0.0.2:
-  version "0.0.2"
-  resolved "http://registry.npm.taobao.org/fmin/download/fmin-0.0.2.tgz#59bbb40d43ffdc1c94cd00a568c41f95f1973017"
-  dependencies:
-    contour_plot "^0.0.1"
-    json2module "^0.0.3"
-    rollup "^0.25.8"
-    tape "^4.5.1"
-    uglify-js "^2.6.2"
-
-follow-redirects@^1.0.0:
-  version "1.5.1"
-  resolved "http://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.5.1.tgz#67a8f14f5a1f67f962c2c46469c79eaec0a90291"
-  dependencies:
-    debug "^3.1.0"
-
 font-awesome@^4.7.0:
   version "4.7.0"
   resolved "http://registry.npm.taobao.org/font-awesome/download/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133"
-
-for-each@~0.3.3:
-  version "0.3.3"
-  resolved "http://registry.npm.taobao.org/for-each/download/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
-  dependencies:
-    is-callable "^1.1.3"
 
 for-in@^0.1.3:
   version "0.1.8"
@@ -2953,20 +2921,26 @@
     mime-types "^2.1.12"
 
 form-data@~2.3.1:
-  version "2.3.2"
-  resolved "http://registry.npm.taobao.org/form-data/download/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099"
+  version "2.3.1"
+  resolved "http://registry.npm.taobao.org/form-data/download/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf"
   dependencies:
     asynckit "^0.4.0"
-    combined-stream "1.0.6"
+    combined-stream "^1.0.5"
     mime-types "^2.1.12"
 
 forwarded@~0.1.2:
   version "0.1.2"
   resolved "http://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
 
+frac@~1.1.0:
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/frac/download/frac-1.1.0.tgz#dc437e9c6a646b60b127d82ac4902464445cc1e3"
+  dependencies:
+    voc "~1.0.0"
+
 fragment-cache@^0.2.1:
   version "0.2.1"
-  resolved "http://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
   dependencies:
     map-cache "^0.2.2"
 
@@ -2991,10 +2965,6 @@
   dependencies:
     null-check "^1.0.0"
 
-fs-constants@^1.0.0:
-  version "1.0.0"
-  resolved "http://registry.npm.taobao.org/fs-constants/download/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
-
 fs-extra@^4.0.0:
   version "4.0.3"
   resolved "http://registry.npm.taobao.org/fs-extra/download/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
@@ -3002,12 +2972,6 @@
     graceful-fs "^4.1.2"
     jsonfile "^4.0.0"
     universalify "^0.1.0"
-
-fs-minipass@^1.2.5:
-  version "1.2.5"
-  resolved "http://registry.npm.taobao.org/fs-minipass/download/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
-  dependencies:
-    minipass "^2.2.1"
 
 fs-write-stream-atomic@^1.0.8:
   version "1.0.10"
@@ -3022,14 +2986,22 @@
   version "1.0.0"
   resolved "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
 
-fsevents@^1.0.0, fsevents@^1.2.2:
-  version "1.2.4"
-  resolved "http://registry.npm.taobao.org/fsevents/download/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+fsevents@^1.0.0:
+  version "1.1.3"
+  resolved "http://registry.npm.taobao.org/fsevents/download/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
   dependencies:
-    nan "^2.9.2"
-    node-pre-gyp "^0.10.0"
+    nan "^2.3.0"
+    node-pre-gyp "^0.6.39"
 
-fstream@^1.0.0, fstream@^1.0.2:
+fstream-ignore@^1.0.5:
+  version "1.0.5"
+  resolved "http://registry.npm.taobao.org/fstream-ignore/download/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+  dependencies:
+    fstream "^1.0.0"
+    inherits "2"
+    minimatch "^3.0.0"
+
+fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
   version "1.0.11"
   resolved "http://registry.npm.taobao.org/fstream/download/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
   dependencies:
@@ -3038,7 +3010,7 @@
     mkdirp ">=0.5 0"
     rimraf "2"
 
-function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1:
+function-bind@^1.0.2, function-bind@^1.1.1:
   version "1.1.1"
   resolved "http://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
 
@@ -3056,14 +3028,24 @@
     wide-align "^1.1.0"
 
 gaze@^1.0.0:
-  version "1.1.3"
-  resolved "http://registry.npm.taobao.org/gaze/download/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
+  version "1.1.2"
+  resolved "http://registry.npm.taobao.org/gaze/download/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105"
   dependencies:
     globule "^1.0.0"
 
+generate-function@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/generate-function/download/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
+
+generate-object-property@^1.1.0:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/generate-object-property/download/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
+  dependencies:
+    is-property "^1.0.0"
+
 get-caller-file@^1.0.1:
-  version "1.0.3"
-  resolved "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
 
 get-own-enumerable-property-symbols@^2.0.1:
   version "2.0.1"
@@ -3083,7 +3065,7 @@
 
 get-value@^2.0.3, get-value@^2.0.6:
   version "2.0.6"
-  resolved "http://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
 
 getpass@^0.1.1:
   version "0.1.7"
@@ -3091,9 +3073,13 @@
   dependencies:
     assert-plus "^1.0.0"
 
-gl-matrix@~2.6.1:
-  version "2.6.1"
-  resolved "http://registry.npm.taobao.org/gl-matrix/download/gl-matrix-2.6.1.tgz#1bc7f7b396f4ae80abdb4db9a98cd07d170b9004"
+gl-matrix@~2.3.2:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-2.3.2.tgz#aac808c74af7d5db05fe04cb60ca1a0fcb174d74"
+
+gl-matrix@~2.4.0:
+  version "2.4.0"
+  resolved "http://registry.npm.taobao.org/gl-matrix/download/gl-matrix-2.4.0.tgz#2089b13301a29eec822d9d99dffc1f78ee9a3c50"
 
 glob-base@^0.3.0:
   version "0.3.0"
@@ -3110,7 +3096,7 @@
 
 glob-parent@^3.1.0:
   version "3.1.0"
-  resolved "http://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
   dependencies:
     is-glob "^3.1.0"
     path-dirname "^1.0.0"
@@ -3146,7 +3132,7 @@
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1, glob@~7.1.2:
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1:
   version "7.1.2"
   resolved "http://registry.npm.taobao.org/glob/download/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
   dependencies:
@@ -3198,16 +3184,16 @@
   resolved "http://registry.npm.taobao.org/globjoin/download/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43"
 
 globule@^1.0.0:
-  version "1.2.1"
-  resolved "http://registry.npm.taobao.org/globule/download/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d"
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/globule/download/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09"
   dependencies:
     glob "~7.1.1"
-    lodash "~4.17.10"
+    lodash "~4.17.4"
     minimatch "~3.0.2"
 
 glogg@^1.0.0:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/glogg/download/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810"
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/glogg/download/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5"
   dependencies:
     sparkles "^1.0.0"
 
@@ -3252,7 +3238,7 @@
 
 gzip-size@^4.1.0:
   version "4.1.0"
-  resolved "http://registry.npm.taobao.org/gzip-size/download/gzip-size-4.1.0.tgz#8ae096257eabe7d69c45be2b67c448124ffb517c"
+  resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-4.1.0.tgz#8ae096257eabe7d69c45be2b67c448124ffb517c"
   dependencies:
     duplexer "^0.1.1"
     pify "^3.0.0"
@@ -3278,6 +3264,15 @@
 har-schema@^2.0.0:
   version "2.0.0"
   resolved "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+
+har-validator@~2.0.6:
+  version "2.0.6"
+  resolved "http://registry.npm.taobao.org/har-validator/download/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
+  dependencies:
+    chalk "^1.1.1"
+    commander "^2.9.0"
+    is-my-json-valid "^2.12.4"
+    pinkie-promise "^2.0.0"
 
 har-validator@~4.2.1:
   version "4.2.1"
@@ -3319,7 +3314,7 @@
 
 has-flag@^3.0.0:
   version "3.0.0"
-  resolved "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
 
 has-gulplog@^0.1.0:
   version "0.1.0"
@@ -3333,7 +3328,7 @@
 
 has-value@^0.3.1:
   version "0.3.1"
-  resolved "http://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
   dependencies:
     get-value "^2.0.3"
     has-values "^0.1.4"
@@ -3341,7 +3336,7 @@
 
 has-value@^1.0.0:
   version "1.0.0"
-  resolved "http://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
   dependencies:
     get-value "^2.0.6"
     has-values "^1.0.0"
@@ -3349,20 +3344,26 @@
 
 has-values@^0.1.4:
   version "0.1.4"
-  resolved "http://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
 
 has-values@^1.0.0:
   version "1.0.0"
-  resolved "http://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
   dependencies:
     is-number "^3.0.0"
     kind-of "^4.0.0"
 
-has@^1.0.1, has@~1.0.3:
-  version "1.0.3"
-  resolved "http://registry.npm.taobao.org/has/download/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+has@^1.0.1:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/has/download/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
   dependencies:
-    function-bind "^1.1.1"
+    function-bind "^1.0.2"
+
+hash-base@^2.0.0:
+  version "2.0.2"
+  resolved "http://registry.npm.taobao.org/hash-base/download/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
+  dependencies:
+    inherits "^2.0.1"
 
 hash-base@^3.0.0:
   version "3.0.4"
@@ -3372,13 +3373,13 @@
     safe-buffer "^5.0.1"
 
 hash.js@^1.0.0, hash.js@^1.0.3:
-  version "1.1.5"
-  resolved "http://registry.npm.taobao.org/hash.js/download/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812"
+  version "1.1.3"
+  resolved "http://registry.npm.taobao.org/hash.js/download/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
   dependencies:
     inherits "^2.0.3"
-    minimalistic-assert "^1.0.1"
+    minimalistic-assert "^1.0.0"
 
-hawk@~3.1.3:
+hawk@3.1.3, hawk@~3.1.3:
   version "3.1.3"
   resolved "http://registry.npm.taobao.org/hawk/download/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
   dependencies:
@@ -3413,8 +3414,8 @@
   resolved "http://registry.npm.taobao.org/hoek/download/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
 
 hoek@4.x.x:
-  version "4.2.1"
-  resolved "http://registry.npm.taobao.org/hoek/download/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb"
+  version "4.2.0"
+  resolved "http://registry.npm.taobao.org/hoek/download/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d"
 
 homedir-polyfill@^1.0.1:
   version "1.0.1"
@@ -3423,8 +3424,8 @@
     parse-passwd "^1.0.0"
 
 hosted-git-info@^2.1.4:
-  version "2.7.1"
-  resolved "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
+  version "2.5.0"
+  resolved "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
 
 hpack.js@^2.1.6:
   version "2.1.6"
@@ -3440,16 +3441,17 @@
   resolved "http://registry.npm.taobao.org/html-entities/download/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
 
 html-minifier@^3.2.3:
-  version "3.5.18"
-  resolved "http://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.18.tgz#fc8b02826cbbafc6de19a103c41c830a91cffe5a"
+  version "3.5.8"
+  resolved "http://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.8.tgz#5ccdb1f73a0d654e6090147511f6e6b2ee312700"
   dependencies:
     camel-case "3.0.x"
     clean-css "4.1.x"
-    commander "2.16.x"
+    commander "2.12.x"
     he "1.1.x"
+    ncname "1.0.x"
     param-case "2.1.x"
     relateurl "0.2.x"
-    uglify-js "3.4.x"
+    uglify-js "3.3.x"
 
 html-tags@^2.0.0:
   version "2.0.0"
@@ -3490,7 +3492,7 @@
   version "1.2.7"
   resolved "http://registry.npm.taobao.org/http-deceiver/download/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
 
-http-errors@1.6.2:
+http-errors@1.6.2, http-errors@~1.6.2:
   version "1.6.2"
   resolved "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
   dependencies:
@@ -3499,18 +3501,9 @@
     setprototypeof "1.0.3"
     statuses ">= 1.3.1 < 2"
 
-http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
-  version "1.6.3"
-  resolved "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
-  dependencies:
-    depd "~1.1.2"
-    inherits "2.0.3"
-    setprototypeof "1.1.0"
-    statuses ">= 1.4.0 < 2"
-
 http-parser-js@>=0.4.0:
-  version "0.4.13"
-  resolved "http://registry.npm.taobao.org/http-parser-js/download/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137"
+  version "0.4.9"
+  resolved "http://registry.npm.taobao.org/http-parser-js/download/http-parser-js-0.4.9.tgz#ea1a04fb64adff0242e9974f297dd4c3cad271e1"
 
 http-proxy-middleware@~0.17.4:
   version "0.17.4"
@@ -3522,12 +3515,11 @@
     micromatch "^2.3.11"
 
 http-proxy@^1.13.0, http-proxy@^1.16.2:
-  version "1.17.0"
-  resolved "http://registry.npm.taobao.org/http-proxy/download/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a"
+  version "1.16.2"
+  resolved "http://registry.npm.taobao.org/http-proxy/download/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742"
   dependencies:
-    eventemitter3 "^3.0.0"
-    follow-redirects "^1.0.0"
-    requires-port "^1.0.0"
+    eventemitter3 "1.x.x"
+    requires-port "1.x.x"
 
 http-signature@~1.1.0:
   version "1.1.1"
@@ -3549,7 +3541,7 @@
   version "1.0.0"
   resolved "http://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
 
-https-proxy-agent@^1.0.0:
+https-proxy-agent@^1.0.0, https-proxy-agent@~1.0.0:
   version "1.0.0"
   resolved "http://registry.npm.taobao.org/https-proxy-agent/download/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6"
   dependencies:
@@ -3557,60 +3549,29 @@
     debug "2"
     extend "3"
 
-https-proxy-agent@^2.2.1:
-  version "2.2.1"
-  resolved "http://registry.npm.taobao.org/https-proxy-agent/download/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
-  dependencies:
-    agent-base "^4.1.0"
-    debug "^3.1.0"
-
-iconv-lite@0.4, iconv-lite@0.4.23, iconv-lite@^0.4.4:
-  version "0.4.23"
-  resolved "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
-  dependencies:
-    safer-buffer ">= 2.1.2 < 3"
-
-iconv-lite@0.4.19:
+iconv-lite@0.4, iconv-lite@0.4.19:
   version "0.4.19"
   resolved "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
 
 ieee754@^1.1.4:
-  version "1.1.12"
-  resolved "http://registry.npm.taobao.org/ieee754/download/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
+  version "1.1.8"
+  resolved "http://registry.npm.taobao.org/ieee754/download/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
 
 iferr@^0.1.5:
   version "0.1.5"
   resolved "http://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
 
-ignore-walk@^3.0.1:
-  version "3.0.1"
-  resolved "http://registry.npm.taobao.org/ignore-walk/download/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
-  dependencies:
-    minimatch "^3.0.4"
-
 ignore@^3.3.3, ignore@^3.3.5:
-  version "3.3.10"
-  resolved "http://registry.npm.taobao.org/ignore/download/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
+  version "3.3.7"
+  resolved "http://registry.npm.taobao.org/ignore/download/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
 
 image-size@~0.5.0:
   version "0.5.5"
   resolved "http://registry.npm.taobao.org/image-size/download/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
 
-import-cwd@^2.0.0:
-  version "2.1.0"
-  resolved "http://registry.npm.taobao.org/import-cwd/download/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
-  dependencies:
-    import-from "^2.1.0"
-
-import-from@^2.1.0:
-  version "2.1.0"
-  resolved "http://registry.npm.taobao.org/import-from/download/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
-  dependencies:
-    resolve-from "^3.0.0"
-
 import-local@^1.0.0:
   version "1.0.0"
-  resolved "http://registry.npm.taobao.org/import-local/download/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"
+  resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"
   dependencies:
     pkg-dir "^2.0.0"
     resolve-cwd "^2.0.0"
@@ -3671,8 +3632,8 @@
   resolved "http://registry.npm.taobao.org/interpret/download/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
 
 invariant@^2.2.2:
-  version "2.2.4"
-  resolved "http://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+  version "2.2.2"
+  resolved "http://registry.npm.taobao.org/invariant/download/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
   dependencies:
     loose-envify "^1.0.0"
 
@@ -3684,33 +3645,33 @@
   version "1.1.5"
   resolved "http://registry.npm.taobao.org/ip/download/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
 
-ipaddr.js@1.6.0:
-  version "1.6.0"
-  resolved "http://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b"
+ipaddr.js@1.5.2:
+  version "1.5.2"
+  resolved "http://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0"
 
 is-accessor-descriptor@^0.1.6:
   version "0.1.6"
-  resolved "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
   dependencies:
     kind-of "^3.0.2"
 
 is-accessor-descriptor@^1.0.0:
   version "1.0.0"
-  resolved "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
   dependencies:
     kind-of "^6.0.0"
 
 is-alphabetical@^1.0.0:
-  version "1.0.2"
-  resolved "http://registry.npm.taobao.org/is-alphabetical/download/is-alphabetical-1.0.2.tgz#1fa6e49213cb7885b75d15862fb3f3d96c884f41"
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/is-alphabetical/download/is-alphabetical-1.0.1.tgz#c77079cc91d4efac775be1034bf2d243f95e6f08"
 
 is-alphanumeric@^1.0.0:
   version "1.0.0"
   resolved "http://registry.npm.taobao.org/is-alphanumeric/download/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4"
 
 is-alphanumerical@^1.0.0:
-  version "1.0.2"
-  resolved "http://registry.npm.taobao.org/is-alphanumerical/download/is-alphanumerical-1.0.2.tgz#1138e9ae5040158dc6ff76b820acd6b7a181fd40"
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/is-alphanumerical/download/is-alphanumerical-1.0.1.tgz#dfb4aa4d1085e33bdb61c2dee9c80e9c6c19f53b"
   dependencies:
     is-alphabetical "^1.0.0"
     is-decimal "^1.0.0"
@@ -3725,7 +3686,7 @@
   dependencies:
     binary-extensions "^1.0.0"
 
-is-buffer@^1.1.4, is-buffer@^1.1.5:
+is-buffer@^1.0.2, is-buffer@^1.1.4, is-buffer@^1.1.5:
   version "1.1.6"
   resolved "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
 
@@ -3736,18 +3697,18 @@
     builtin-modules "^1.0.0"
 
 is-callable@^1.1.1, is-callable@^1.1.3:
-  version "1.1.4"
-  resolved "http://registry.npm.taobao.org/is-callable/download/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
+  version "1.1.3"
+  resolved "http://registry.npm.taobao.org/is-callable/download/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
 
 is-data-descriptor@^0.1.4:
   version "0.1.4"
-  resolved "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
   dependencies:
     kind-of "^3.0.2"
 
 is-data-descriptor@^1.0.0:
   version "1.0.0"
-  resolved "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
   dependencies:
     kind-of "^6.0.0"
 
@@ -3756,12 +3717,12 @@
   resolved "http://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
 
 is-decimal@^1.0.0:
-  version "1.0.2"
-  resolved "http://registry.npm.taobao.org/is-decimal/download/is-decimal-1.0.2.tgz#894662d6a8709d307f3a276ca4339c8fa5dff0ff"
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/is-decimal/download/is-decimal-1.0.1.tgz#f5fb6a94996ad9e8e3761fbfbd091f1fca8c4e82"
 
 is-descriptor@^0.1.0:
   version "0.1.6"
-  resolved "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
   dependencies:
     is-accessor-descriptor "^0.1.6"
     is-data-descriptor "^0.1.4"
@@ -3769,7 +3730,7 @@
 
 is-descriptor@^1.0.0, is-descriptor@^1.0.2:
   version "1.0.2"
-  resolved "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
   dependencies:
     is-accessor-descriptor "^1.0.0"
     is-data-descriptor "^1.0.0"
@@ -3795,7 +3756,7 @@
 
 is-extendable@^1.0.1:
   version "1.0.1"
-  resolved "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
   dependencies:
     is-plain-object "^2.0.4"
 
@@ -3842,8 +3803,17 @@
     is-extglob "^2.1.1"
 
 is-hexadecimal@^1.0.0:
-  version "1.0.2"
-  resolved "http://registry.npm.taobao.org/is-hexadecimal/download/is-hexadecimal-1.0.2.tgz#b6e710d7d07bb66b98cb8cece5c9b4921deeb835"
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/is-hexadecimal/download/is-hexadecimal-1.0.1.tgz#6e084bbc92061fbb0971ec58b6ce6d404e24da69"
+
+is-my-json-valid@^2.12.4:
+  version "2.17.1"
+  resolved "http://registry.npm.taobao.org/is-my-json-valid/download/is-my-json-valid-2.17.1.tgz#3da98914a70a22f0a8563ef1511a246c6fc55471"
+  dependencies:
+    generate-function "^2.0.0"
+    generate-object-property "^1.1.0"
+    jsonpointer "^4.0.0"
+    xtend "^4.0.0"
 
 is-number@^0.1.1:
   version "0.1.1"
@@ -3863,7 +3833,7 @@
 
 is-number@^4.0.0:
   version "4.0.0"
-  resolved "http://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
 
 is-obj@^1.0.0, is-obj@^1.0.1:
   version "1.0.1"
@@ -3875,13 +3845,19 @@
   dependencies:
     symbol-observable "^0.2.2"
 
+is-odd@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24"
+  dependencies:
+    is-number "^4.0.0"
+
 is-path-cwd@^1.0.0:
   version "1.0.0"
   resolved "http://registry.npm.taobao.org/is-path-cwd/download/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
 
 is-path-in-cwd@^1.0.0:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/is-path-in-cwd/download/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52"
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/is-path-in-cwd/download/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
   dependencies:
     is-path-inside "^1.0.0"
 
@@ -3913,6 +3889,10 @@
   version "2.1.0"
   resolved "http://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
 
+is-property@^1.0.0:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/is-property/download/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+
 is-regex@^1.0.4:
   version "1.0.4"
   resolved "http://registry.npm.taobao.org/is-regex/download/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
@@ -3928,8 +3908,8 @@
   resolved "http://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
 
 is-supported-regexp-flag@^1.0.0:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/is-supported-regexp-flag/download/is-supported-regexp-flag-1.0.1.tgz#21ee16518d2c1dd3edd3e9a0d57e50207ac364ca"
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/is-supported-regexp-flag/download/is-supported-regexp-flag-1.0.0.tgz#8b520c85fae7a253382d4b02652e045576e13bb8"
 
 is-symbol@^1.0.1:
   version "1.0.1"
@@ -3944,16 +3924,16 @@
   resolved "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
 
 is-whitespace-character@^1.0.0:
-  version "1.0.2"
-  resolved "http://registry.npm.taobao.org/is-whitespace-character/download/is-whitespace-character-1.0.2.tgz#ede53b4c6f6fb3874533751ec9280d01928d03ed"
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/is-whitespace-character/download/is-whitespace-character-1.0.1.tgz#9ae0176f3282b65457a1992cdb084f8a5f833e3b"
 
 is-windows@^1.0.2:
   version "1.0.2"
-  resolved "http://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
 
 is-word-character@^1.0.0:
-  version "1.0.2"
-  resolved "http://registry.npm.taobao.org/is-word-character/download/is-word-character-1.0.2.tgz#46a5dac3f2a1840898b91e576cd40d493f3ae553"
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/is-word-character/download/is-word-character-1.0.1.tgz#5a03fa1ea91ace8a6eb0c7cd770eb86d65c8befb"
 
 is-wsl@^1.1.0:
   version "1.1.0"
@@ -3989,76 +3969,91 @@
   version "0.1.2"
   resolved "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
 
-istanbul-api@^1.3.1:
-  version "1.3.1"
-  resolved "http://registry.npm.taobao.org/istanbul-api/download/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954"
+istanbul-api@^1.1.14:
+  version "1.2.1"
+  resolved "http://registry.npm.taobao.org/istanbul-api/download/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620"
   dependencies:
     async "^2.1.4"
-    compare-versions "^3.1.0"
     fileset "^2.0.2"
-    istanbul-lib-coverage "^1.2.0"
-    istanbul-lib-hook "^1.2.0"
-    istanbul-lib-instrument "^1.10.1"
-    istanbul-lib-report "^1.1.4"
-    istanbul-lib-source-maps "^1.2.4"
-    istanbul-reports "^1.3.0"
+    istanbul-lib-coverage "^1.1.1"
+    istanbul-lib-hook "^1.1.0"
+    istanbul-lib-instrument "^1.9.1"
+    istanbul-lib-report "^1.1.2"
+    istanbul-lib-source-maps "^1.2.2"
+    istanbul-reports "^1.1.3"
     js-yaml "^3.7.0"
     mkdirp "^0.5.1"
     once "^1.4.0"
 
 istanbul-instrumenter-loader@^3.0.0:
-  version "3.0.1"
-  resolved "http://registry.npm.taobao.org/istanbul-instrumenter-loader/download/istanbul-instrumenter-loader-3.0.1.tgz#9957bd59252b373fae5c52b7b5188e6fde2a0949"
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.0.tgz#9f553923b22360bac95e617aaba01add1f7db0b2"
   dependencies:
     convert-source-map "^1.5.0"
     istanbul-lib-instrument "^1.7.3"
     loader-utils "^1.1.0"
     schema-utils "^0.3.0"
 
-istanbul-lib-coverage@^1.2.0:
-  version "1.2.0"
-  resolved "http://registry.npm.taobao.org/istanbul-lib-coverage/download/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341"
+istanbul-lib-coverage@^1.1.1:
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/istanbul-lib-coverage/download/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da"
 
-istanbul-lib-hook@^1.2.0:
-  version "1.2.1"
-  resolved "http://registry.npm.taobao.org/istanbul-lib-hook/download/istanbul-lib-hook-1.2.1.tgz#f614ec45287b2a8fc4f07f5660af787575601805"
+istanbul-lib-coverage@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.2.tgz#4113c8ff6b7a40a1ef7350b01016331f63afde14"
+
+istanbul-lib-hook@^1.1.0:
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/istanbul-lib-hook/download/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b"
   dependencies:
-    append-transform "^1.0.0"
+    append-transform "^0.4.0"
 
-istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.7.3:
-  version "1.10.1"
-  resolved "http://registry.npm.taobao.org/istanbul-lib-instrument/download/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b"
+istanbul-lib-instrument@^1.7.3:
+  version "1.9.2"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.2.tgz#84905bf47f7e0b401d6b840da7bad67086b4aab6"
   dependencies:
     babel-generator "^6.18.0"
     babel-template "^6.16.0"
     babel-traverse "^6.18.0"
     babel-types "^6.18.0"
     babylon "^6.18.0"
-    istanbul-lib-coverage "^1.2.0"
+    istanbul-lib-coverage "^1.1.2"
     semver "^5.3.0"
 
-istanbul-lib-report@^1.1.4:
-  version "1.1.4"
-  resolved "http://registry.npm.taobao.org/istanbul-lib-report/download/istanbul-lib-report-1.1.4.tgz#e886cdf505c4ebbd8e099e4396a90d0a28e2acb5"
+istanbul-lib-instrument@^1.9.1:
+  version "1.9.1"
+  resolved "http://registry.npm.taobao.org/istanbul-lib-instrument/download/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e"
   dependencies:
-    istanbul-lib-coverage "^1.2.0"
+    babel-generator "^6.18.0"
+    babel-template "^6.16.0"
+    babel-traverse "^6.18.0"
+    babel-types "^6.18.0"
+    babylon "^6.18.0"
+    istanbul-lib-coverage "^1.1.1"
+    semver "^5.3.0"
+
+istanbul-lib-report@^1.1.2:
+  version "1.1.2"
+  resolved "http://registry.npm.taobao.org/istanbul-lib-report/download/istanbul-lib-report-1.1.2.tgz#922be27c13b9511b979bd1587359f69798c1d425"
+  dependencies:
+    istanbul-lib-coverage "^1.1.1"
     mkdirp "^0.5.1"
     path-parse "^1.0.5"
     supports-color "^3.1.2"
 
-istanbul-lib-source-maps@^1.2.4:
-  version "1.2.5"
-  resolved "http://registry.npm.taobao.org/istanbul-lib-source-maps/download/istanbul-lib-source-maps-1.2.5.tgz#ffe6be4e7ab86d3603e4290d54990b14506fc9b1"
+istanbul-lib-source-maps@^1.2.2:
+  version "1.2.2"
+  resolved "http://registry.npm.taobao.org/istanbul-lib-source-maps/download/istanbul-lib-source-maps-1.2.2.tgz#750578602435f28a0c04ee6d7d9e0f2960e62c1c"
   dependencies:
     debug "^3.1.0"
-    istanbul-lib-coverage "^1.2.0"
+    istanbul-lib-coverage "^1.1.1"
     mkdirp "^0.5.1"
     rimraf "^2.6.1"
     source-map "^0.5.3"
 
-istanbul-reports@^1.3.0:
-  version "1.3.0"
-  resolved "http://registry.npm.taobao.org/istanbul-reports/download/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554"
+istanbul-reports@^1.1.3:
+  version "1.1.3"
+  resolved "http://registry.npm.taobao.org/istanbul-reports/download/istanbul-reports-1.1.3.tgz#3b9e1e8defb6d18b1d425da8e8b32c5a163f2d10"
   dependencies:
     handlebars "^4.0.3"
 
@@ -4085,10 +4080,6 @@
   version "2.8.0"
   resolved "http://registry.npm.taobao.org/jasmine-core/download/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e"
 
-jasmine-core@~2.99.0:
-  version "2.99.1"
-  resolved "http://registry.npm.taobao.org/jasmine-core/download/jasmine-core-2.99.1.tgz#e6400df1e6b56e130b61c4bcd093daa7f6e8ca15"
-
 jasmine-spec-reporter@~4.2.1:
   version "4.2.1"
   resolved "http://registry.npm.taobao.org/jasmine-spec-reporter/download/jasmine-spec-reporter-4.2.1.tgz#1d632aec0341670ad324f92ba84b4b32b35e9e22"
@@ -4096,12 +4087,12 @@
     colors "1.1.2"
 
 jasmine@^2.5.3:
-  version "2.99.0"
-  resolved "http://registry.npm.taobao.org/jasmine/download/jasmine-2.99.0.tgz#8ca72d102e639b867c6489856e0e18a9c7aa42b7"
+  version "2.8.0"
+  resolved "http://registry.npm.taobao.org/jasmine/download/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e"
   dependencies:
     exit "^0.1.2"
     glob "^7.0.6"
-    jasmine-core "~2.99.0"
+    jasmine-core "~2.8.0"
 
 jasminewd2@^2.1.0:
   version "2.2.0"
@@ -4120,21 +4111,21 @@
     leven "^2.1.0"
     pretty-format "^21.2.1"
 
+jquery@^3.3.1:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca"
+
 js-base64@^2.1.8, js-base64@^2.1.9:
-  version "2.4.5"
-  resolved "http://registry.npm.taobao.org/js-base64/download/js-base64-2.4.5.tgz#e293cd3c7c82f070d700fc7a1ca0a2e69f101f92"
+  version "2.4.0"
+  resolved "http://registry.npm.taobao.org/js-base64/download/js-base64-2.4.0.tgz#9e566fee624751a1d720c966cd6226d29d4025aa"
 
-"js-tokens@^3.0.0 || ^4.0.0":
-  version "4.0.0"
-  resolved "http://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
-
-js-tokens@^3.0.2:
+js-tokens@^3.0.0, js-tokens@^3.0.2:
   version "3.0.2"
   resolved "http://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
 
-js-yaml@3.x, js-yaml@^3.7.0, js-yaml@^3.9.0:
-  version "3.12.0"
-  resolved "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
+js-yaml@3.x, js-yaml@^3.4.3, js-yaml@^3.7.0, js-yaml@^3.9.0:
+  version "3.10.0"
+  resolved "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
   dependencies:
     argparse "^1.0.7"
     esprima "^4.0.0"
@@ -4156,16 +4147,12 @@
   resolved "http://registry.npm.taobao.org/json-loader/download/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
 
 json-parse-better-errors@^1.0.1:
-  version "1.0.2"
-  resolved "http://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a"
 
 json-schema-traverse@^0.3.0:
   version "0.3.1"
   resolved "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
-
-json-schema-traverse@^0.4.1:
-  version "0.4.1"
-  resolved "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
 
 json-schema@0.2.3:
   version "0.2.3"
@@ -4180,12 +4167,6 @@
 json-stringify-safe@~5.0.1:
   version "5.0.1"
   resolved "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
-
-json2module@^0.0.3:
-  version "0.0.3"
-  resolved "http://registry.npm.taobao.org/json2module/download/json2module-0.0.3.tgz#00fb5f4a9b7adfc3f0647c29cb17bcd1979be9b2"
-  dependencies:
-    rw "^1.3.2"
 
 json3@3.3.2, json3@^3.3.2:
   version "3.3.2"
@@ -4204,6 +4185,10 @@
 jsonify@~0.0.0:
   version "0.0.0"
   resolved "http://registry.npm.taobao.org/jsonify/download/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsonpointer@^4.0.0:
+  version "4.0.1"
+  resolved "http://registry.npm.taobao.org/jsonpointer/download/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
 
 jsprim@^1.2.2:
   version "1.4.1"
@@ -4228,10 +4213,10 @@
     resolve "^1.1.6"
 
 karma-coverage-istanbul-reporter@^1.3.0:
-  version "1.4.3"
-  resolved "http://registry.npm.taobao.org/karma-coverage-istanbul-reporter/download/karma-coverage-istanbul-reporter-1.4.3.tgz#3b5dff4664fa5b8d5196b9889e3f61c1fa2b80d9"
+  version "1.3.3"
+  resolved "http://registry.npm.taobao.org/karma-coverage-istanbul-reporter/download/karma-coverage-istanbul-reporter-1.3.3.tgz#daf26051d5a0daa5838a4ce81aa4a41724bdf36b"
   dependencies:
-    istanbul-api "^1.3.1"
+    istanbul-api "^1.1.14"
     minimatch "^3.0.4"
 
 karma-jasmine-html-reporter@^0.2.2:
@@ -4241,8 +4226,8 @@
     karma-jasmine "^1.0.2"
 
 karma-jasmine@^1.0.2, karma-jasmine@~1.1.0:
-  version "1.1.2"
-  resolved "http://registry.npm.taobao.org/karma-jasmine/download/karma-jasmine-1.1.2.tgz#394f2b25ffb4a644b9ada6f22d443e2fd08886c3"
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/karma-jasmine/download/karma-jasmine-1.1.1.tgz#6fe840e75a11600c9d91e84b33c458e1c46a3529"
 
 karma-remap-istanbul@^0.6.0:
   version "0.6.0"
@@ -4261,10 +4246,10 @@
     wd "^1.4.0"
 
 karma-source-map-support@^1.2.0:
-  version "1.3.0"
-  resolved "http://registry.npm.taobao.org/karma-source-map-support/download/karma-source-map-support-1.3.0.tgz#36dd4d8ca154b62ace95696236fae37caf0a7dde"
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/karma-source-map-support/download/karma-source-map-support-1.2.0.tgz#1bf81e7bb4b089627ab352ec4179e117c406a540"
   dependencies:
-    source-map-support "^0.5.5"
+    source-map-support "^0.4.1"
 
 karma@~1.7.1:
   version "1.7.1"
@@ -4302,7 +4287,13 @@
   version "1.0.0"
   resolved "http://registry.npm.taobao.org/killable/download/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b"
 
-kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+kind-of@^2.0.1:
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5"
+  dependencies:
+    is-buffer "^1.0.2"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0, kind-of@^3.2.2:
   version "3.2.2"
   resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
   dependencies:
@@ -4316,19 +4307,29 @@
 
 kind-of@^5.0.0:
   version "5.1.0"
-  resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
 
 kind-of@^6.0.0, kind-of@^6.0.2:
   version "6.0.2"
-  resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
 
 known-css-properties@^0.5.0:
   version "0.5.0"
   resolved "http://registry.npm.taobao.org/known-css-properties/download/known-css-properties-0.5.0.tgz#6ff66943ed4a5b55657ee095779a91f4536f8084"
 
+lazy-cache@^0.2.3:
+  version "0.2.7"
+  resolved "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65"
+
 lazy-cache@^1.0.3:
   version "1.0.4"
   resolved "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lazy-cache@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264"
+  dependencies:
+    set-getter "^0.1.0"
 
 lazystream@^1.0.0:
   version "1.0.0"
@@ -4343,12 +4344,12 @@
     invert-kv "^1.0.0"
 
 less-loader@^4.0.5:
-  version "4.1.0"
-  resolved "http://registry.npm.taobao.org/less-loader/download/less-loader-4.1.0.tgz#2c1352c5b09a4f84101490274fd51674de41363e"
+  version "4.0.5"
+  resolved "http://registry.npm.taobao.org/less-loader/download/less-loader-4.0.5.tgz#ae155a7406cac6acd293d785587fcff0f478c4dd"
   dependencies:
     clone "^2.1.1"
     loader-utils "^1.1.0"
-    pify "^3.0.0"
+    pify "^2.3.0"
 
 less@^2.7.2:
   version "2.7.3"
@@ -4375,8 +4376,8 @@
     type-check "~0.3.2"
 
 license-webpack-plugin@^1.0.0:
-  version "1.3.1"
-  resolved "http://registry.npm.taobao.org/license-webpack-plugin/download/license-webpack-plugin-1.3.1.tgz#688b76472188ef597918b7cae3eec7dc2fa5a0e8"
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/license-webpack-plugin/download/license-webpack-plugin-1.1.1.tgz#76b2cedccc78f139fd7877e576f756cfc141b8c2"
   dependencies:
     ejs "^2.5.7"
 
@@ -4492,7 +4493,7 @@
     emojis-list "^2.0.0"
     json5 "^0.5.0"
 
-loader-utils@^0.2.16:
+loader-utils@^0.2.15, loader-utils@^0.2.16:
   version "0.2.17"
   resolved "http://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
   dependencies:
@@ -4552,10 +4553,6 @@
   version "4.5.0"
   resolved "http://registry.npm.taobao.org/lodash.clonedeep/download/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
 
-lodash.debounce@^4.0.8:
-  version "4.0.8"
-  resolved "http://registry.npm.taobao.org/lodash.debounce/download/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
-
 lodash.escape@^3.0.0:
   version "3.2.0"
   resolved "http://registry.npm.taobao.org/lodash.escape/download/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
@@ -4579,8 +4576,8 @@
     lodash.isarray "^3.0.0"
 
 lodash.mergewith@^4.6.0:
-  version "4.6.1"
-  resolved "http://registry.npm.taobao.org/lodash.mergewith/download/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927"
+  version "4.6.0"
+  resolved "http://registry.npm.taobao.org/lodash.mergewith/download/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55"
 
 lodash.restparam@^3.0.0:
   version "3.6.1"
@@ -4611,11 +4608,11 @@
     lodash._reinterpolate "^3.0.0"
     lodash.escape "^3.0.0"
 
-lodash@4.17.10, lodash@^4.0.0, lodash@^4.11.1, lodash@^4.16.6, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.5.0, lodash@^4.8.0, lodash@~4.17.10:
-  version "4.17.10"
-  resolved "http://registry.npm.taobao.org/lodash/download/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+lodash@4.16.2:
+  version "4.16.2"
+  resolved "http://registry.npm.taobao.org/lodash/download/lodash-4.16.2.tgz#3e626db827048a699281a8a125226326cfc0e652"
 
-lodash@4.17.4:
+lodash@4.17.4, lodash@^4.0.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.16.6, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.5.0, lodash@^4.8.0, lodash@~4.17.4:
   version "4.17.4"
   resolved "http://registry.npm.taobao.org/lodash/download/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
 
@@ -4630,8 +4627,8 @@
     chalk "^1.0.0"
 
 log-symbols@^2.0.0:
-  version "2.2.0"
-  resolved "http://registry.npm.taobao.org/log-symbols/download/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
+  version "2.1.0"
+  resolved "http://registry.npm.taobao.org/log-symbols/download/log-symbols-2.1.0.tgz#f35fa60e278832b538dc4dddcbb478a45d3e3be6"
   dependencies:
     chalk "^2.0.1"
 
@@ -4650,8 +4647,8 @@
     semver "~4.3.3"
 
 loglevel@^1.4.1:
-  version "1.6.1"
-  resolved "http://registry.npm.taobao.org/loglevel/download/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa"
+  version "1.6.0"
+  resolved "http://registry.npm.taobao.org/loglevel/download/loglevel-1.6.0.tgz#ae0caa561111498c5ba13723d6fb631d24003934"
 
 longest-streak@^2.0.1:
   version "2.0.2"
@@ -4662,10 +4659,10 @@
   resolved "http://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
 
 loose-envify@^1.0.0:
-  version "1.4.0"
-  resolved "http://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+  version "1.3.1"
+  resolved "http://registry.npm.taobao.org/loose-envify/download/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
   dependencies:
-    js-tokens "^3.0.0 || ^4.0.0"
+    js-tokens "^3.0.0"
 
 loud-rejection@^1.0.0:
   version "1.6.0"
@@ -4678,32 +4675,36 @@
   version "1.1.4"
   resolved "http://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
 
-lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.1:
-  version "4.1.3"
-  resolved "http://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+lru-cache@2.2.x:
+  version "2.2.4"
+  resolved "http://registry.npm.taobao.org/lru-cache/download/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d"
+
+lru-cache@^4.0.1, lru-cache@^4.1.1:
+  version "4.1.1"
+  resolved "http://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
   dependencies:
     pseudomap "^1.0.2"
     yallist "^2.1.2"
 
 magic-string@^0.22.3:
-  version "0.22.5"
-  resolved "http://registry.npm.taobao.org/magic-string/download/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e"
+  version "0.22.4"
+  resolved "http://registry.npm.taobao.org/magic-string/download/magic-string-0.22.4.tgz#31039b4e40366395618c1d6cf8193c53917475ff"
   dependencies:
-    vlq "^0.2.2"
+    vlq "^0.2.1"
 
 make-dir@^1.0.0:
-  version "1.3.0"
-  resolved "http://registry.npm.taobao.org/make-dir/download/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/make-dir/download/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51"
   dependencies:
     pify "^3.0.0"
 
 make-error@^1.1.1:
-  version "1.3.4"
-  resolved "http://registry.npm.taobao.org/make-error/download/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535"
+  version "1.3.2"
+  resolved "http://registry.npm.taobao.org/make-error/download/make-error-1.3.2.tgz#8762ffad2444dd8ff1f7c819629fa28e24fea1c4"
 
 map-cache@^0.2.2:
   version "0.2.2"
-  resolved "http://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
 
 map-obj@^1.0.0, map-obj@^1.0.1:
   version "1.0.1"
@@ -4719,25 +4720,21 @@
 
 map-visit@^1.0.0:
   version "1.0.0"
-  resolved "http://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
   dependencies:
     object-visit "^1.0.0"
 
 markdown-escapes@^1.0.0:
-  version "1.0.2"
-  resolved "http://registry.npm.taobao.org/markdown-escapes/download/markdown-escapes-1.0.2.tgz#e639cbde7b99c841c0bacc8a07982873b46d2122"
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/markdown-escapes/download/markdown-escapes-1.0.1.tgz#1994df2d3af4811de59a6714934c2b2292734518"
 
 markdown-table@^1.1.0:
-  version "1.1.2"
-  resolved "http://registry.npm.taobao.org/markdown-table/download/markdown-table-1.1.2.tgz#c78db948fa879903a41bce522e3b96f801c63786"
-
-math-random@^1.0.1:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/math-random/download/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac"
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/markdown-table/download/markdown-table-1.1.1.tgz#4b3dd3a133d1518b8ef0dbc709bf2a1b4824bc8c"
 
 mathml-tag-names@^2.0.1:
-  version "2.1.0"
-  resolved "http://registry.npm.taobao.org/mathml-tag-names/download/mathml-tag-names-2.1.0.tgz#490b70e062ee24636536e3d9481e333733d00f2c"
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/mathml-tag-names/download/mathml-tag-names-2.0.1.tgz#8d41268168bf86d1102b98109e28e531e7a34578"
 
 md5.js@^1.3.4:
   version "1.3.4"
@@ -4790,8 +4787,8 @@
     trim-newlines "^1.0.0"
 
 meow@^4.0.0:
-  version "4.0.1"
-  resolved "http://registry.npm.taobao.org/meow/download/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975"
+  version "4.0.0"
+  resolved "http://registry.npm.taobao.org/meow/download/meow-4.0.0.tgz#fd5855dd008db5b92c552082db1c307cba20b29d"
   dependencies:
     camelcase-keys "^4.0.0"
     decamelize-keys "^1.0.0"
@@ -4830,8 +4827,8 @@
     regex-cache "^0.4.2"
 
 micromatch@^3.1.4:
-  version "3.1.10"
-  resolved "http://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+  version "3.1.9"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.9.tgz#15dc93175ae39e52e93087847096effc73efcf89"
   dependencies:
     arr-diff "^4.0.0"
     array-unique "^0.3.2"
@@ -4845,7 +4842,7 @@
     object.pick "^1.3.0"
     regex-not "^1.0.0"
     snapdragon "^0.8.1"
-    to-regex "^3.0.2"
+    to-regex "^3.0.1"
 
 miller-rabin@^4.0.0:
   version "4.0.1"
@@ -4854,19 +4851,19 @@
     bn.js "^4.0.0"
     brorand "^1.0.1"
 
-"mime-db@>= 1.34.0 < 2":
-  version "1.34.0"
-  resolved "http://registry.npm.taobao.org/mime-db/download/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a"
+"mime-db@>= 1.30.0 < 2":
+  version "1.32.0"
+  resolved "http://registry.npm.taobao.org/mime-db/download/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414"
 
-mime-db@~1.33.0:
-  version "1.33.0"
-  resolved "http://registry.npm.taobao.org/mime-db/download/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
+mime-db@~1.30.0:
+  version "1.30.0"
+  resolved "http://registry.npm.taobao.org/mime-db/download/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
 
-mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7:
-  version "2.1.18"
-  resolved "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
+mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7:
+  version "2.1.17"
+  resolved "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
   dependencies:
-    mime-db "~1.33.0"
+    mime-db "~1.30.0"
 
 mime@1.4.1:
   version "1.4.1"
@@ -4877,12 +4874,12 @@
   resolved "http://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
 
 mimic-fn@^1.0.0:
-  version "1.2.0"
-  resolved "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18"
 
-minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+minimalistic-assert@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
 
 minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
   version "1.0.1"
@@ -4909,7 +4906,7 @@
   version "1.1.3"
   resolved "http://registry.npm.taobao.org/minimist/download/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8"
 
-minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0:
+minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
   version "1.2.0"
   resolved "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
 
@@ -4917,22 +4914,9 @@
   version "0.0.10"
   resolved "http://registry.npm.taobao.org/minimist/download/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
 
-minipass@^2.2.1, minipass@^2.3.3:
-  version "2.3.3"
-  resolved "http://registry.npm.taobao.org/minipass/download/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
-  dependencies:
-    safe-buffer "^5.1.2"
-    yallist "^3.0.0"
-
-minizlib@^1.1.0:
-  version "1.1.0"
-  resolved "http://registry.npm.taobao.org/minizlib/download/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
-  dependencies:
-    minipass "^2.2.1"
-
-mississippi@^2.0.0:
-  version "2.0.0"
-  resolved "http://registry.npm.taobao.org/mississippi/download/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
+mississippi@^1.3.0:
+  version "1.3.0"
+  resolved "http://registry.npm.taobao.org/mississippi/download/mississippi-1.3.0.tgz#d201583eb12327e3c5c1642a404a9cacf94e34f5"
   dependencies:
     concat-stream "^1.5.0"
     duplexify "^3.4.2"
@@ -4940,14 +4924,14 @@
     flush-write-stream "^1.0.0"
     from2 "^2.1.0"
     parallel-transform "^1.1.0"
-    pump "^2.0.1"
+    pump "^1.0.0"
     pumpify "^1.3.3"
     stream-each "^1.1.0"
     through2 "^2.0.0"
 
 mixin-deep@^1.2.0:
   version "1.3.1"
-  resolved "http://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
   dependencies:
     for-in "^1.0.2"
     is-extendable "^1.0.1"
@@ -4966,16 +4950,22 @@
     minimist "0.0.8"
 
 mobx-angular@>=1:
-  version "3.0.1"
-  resolved "http://registry.npm.taobao.org/mobx-angular/download/mobx-angular-3.0.1.tgz#881379acea563c0767550d1f7801ab3434449bb1"
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/mobx-angular/download/mobx-angular-2.0.1.tgz#2638d091618080693bbed02c5df8cd714b52c167"
 
 mobx@>=3:
-  version "5.0.3"
-  resolved "http://registry.npm.taobao.org/mobx/download/mobx-5.0.3.tgz#53b97f2a0f9b0dd7774c96249f81bf2d513d8e1c"
+  version "3.4.1"
+  resolved "http://registry.npm.taobao.org/mobx/download/mobx-3.4.1.tgz#37abe5ee882d401828d9f26c6c1a2f47614bbbef"
+
+mockjs@^1.0.1-beta3:
+  version "1.0.1-beta3"
+  resolved "http://registry.npm.taobao.org/mockjs/download/mockjs-1.0.1-beta3.tgz#d234f3c27256397564f2c955142e891909537209"
+  dependencies:
+    commander "*"
 
 moment@^2.18.1, moment@^2.19.3:
-  version "2.22.2"
-  resolved "http://registry.npm.taobao.org/moment/download/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66"
+  version "2.20.1"
+  resolved "http://registry.npm.taobao.org/moment/download/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd"
 
 move-concurrently@^1.0.1:
   version "1.0.1"
@@ -5005,11 +4995,11 @@
   resolved "http://registry.npm.taobao.org/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
 
 multicast-dns@^6.0.1:
-  version "6.2.3"
-  resolved "http://registry.npm.taobao.org/multicast-dns/download/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229"
+  version "6.2.1"
+  resolved "http://registry.npm.taobao.org/multicast-dns/download/multicast-dns-6.2.1.tgz#c5035defa9219d30640558a49298067352098060"
   dependencies:
-    dns-packet "^1.3.1"
-    thunky "^1.0.2"
+    dns-packet "^1.0.1"
+    thunky "^0.1.0"
 
 multipipe@^0.1.2:
   version "0.1.2"
@@ -5017,19 +5007,20 @@
   dependencies:
     duplexer2 "0.0.2"
 
-nan@^2.10.0, nan@^2.9.2:
-  version "2.10.0"
-  resolved "http://registry.npm.taobao.org/nan/download/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
+nan@^2.3.0, nan@^2.3.2:
+  version "2.8.0"
+  resolved "http://registry.npm.taobao.org/nan/download/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a"
 
 nanomatch@^1.2.9:
-  version "1.2.13"
-  resolved "http://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+  version "1.2.9"
+  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2"
   dependencies:
     arr-diff "^4.0.0"
     array-unique "^0.3.2"
     define-property "^2.0.2"
     extend-shallow "^3.0.2"
     fragment-cache "^0.2.1"
+    is-odd "^2.0.0"
     is-windows "^1.0.2"
     kind-of "^6.0.2"
     object.pick "^1.3.0"
@@ -5037,29 +5028,38 @@
     snapdragon "^0.8.1"
     to-regex "^3.0.1"
 
-needle@^2.2.1:
-  version "2.2.1"
-  resolved "http://registry.npm.taobao.org/needle/download/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
+ncname@1.0.x:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/ncname/download/ncname-1.0.0.tgz#5b57ad18b1ca092864ef62b0b1ed8194f383b71c"
   dependencies:
-    debug "^2.1.2"
-    iconv-lite "^0.4.4"
-    sax "^1.2.4"
+    xml-char-classes "^1.0.0"
 
 negotiator@0.6.1:
   version "0.6.1"
   resolved "http://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
 
-neo-async@^2.5.0:
-  version "2.5.1"
-  resolved "http://registry.npm.taobao.org/neo-async/download/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
+ng-clipboard-antd@^2.0.1:
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/ng-clipboard-antd/download/ng-clipboard-antd-2.0.1.tgz#2f200b8d22ecb6d5360408d6985df3f51abd7cf6"
+  dependencies:
+    "@angular/animations" "^5.0.0"
+    "@angular/common" "^5.0.0"
+    "@angular/compiler" "^5.0.0"
+    "@angular/core" "^5.0.0"
+    "@angular/forms" "^5.0.0"
+    "@angular/http" "^5.0.0"
+    "@angular/platform-browser" "^5.0.0"
+    "@angular/platform-browser-dynamic" "^5.0.0"
+    "@angular/router" "^5.0.0"
+    core-js "^2.4.1"
+    ng-zorro-antd "^0.6.7"
+    ngx-highlight-js "^1.0.3"
+    rxjs "^5.5.2"
+    zone.js "^0.8.14"
 
-next-tick@1:
-  version "1.0.0"
-  resolved "http://registry.npm.taobao.org/next-tick/download/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
-
-ng-tree-antd@^2.0.0:
-  version "2.2.3"
-  resolved "http://registry.npm.taobao.org/ng-tree-antd/download/ng-tree-antd-2.2.3.tgz#4e0da89a7e619f293f147af5dc5844f285ab5970"
+ng-tree-antd@^2.2.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/ng-tree-antd/-/ng-tree-antd-2.2.2.tgz#a28ee1adaa194c3429e49999daaab32f97124175"
   dependencies:
     "@angular/animations" "^5.0.0"
     "@angular/common" "^5.0.0"
@@ -5075,13 +5075,21 @@
     rxjs "^5.5.2"
     zone.js "^0.8.14"
 
-ng-zorro-antd-extra@^1.1.3:
+ng-zorro-antd-extra@^1.1.7:
   version "1.1.7"
-  resolved "http://registry.npm.taobao.org/ng-zorro-antd-extra/download/ng-zorro-antd-extra-1.1.7.tgz#0e0579cac2c8dc3ac566e1f49a4b0ca7f0186b50"
+  resolved "https://registry.yarnpkg.com/ng-zorro-antd-extra/-/ng-zorro-antd-extra-1.1.7.tgz#0e0579cac2c8dc3ac566e1f49a4b0ca7f0186b50"
 
-ng-zorro-antd@^0.6.5:
+ng-zorro-antd@^0.6.15:
   version "0.6.15"
-  resolved "http://registry.npm.taobao.org/ng-zorro-antd/download/ng-zorro-antd-0.6.15.tgz#acef41a30febce835b871d52cd47d042ac2ed443"
+  resolved "https://registry.yarnpkg.com/ng-zorro-antd/-/ng-zorro-antd-0.6.15.tgz#acef41a30febce835b871d52cd47d042ac2ed443"
+  dependencies:
+    "@angular/cdk" "^5.0.0"
+    moment "^2.18.1"
+    tslib "^1.7.1"
+
+ng-zorro-antd@^0.6.7:
+  version "0.6.10"
+  resolved "http://registry.npm.taobao.org/ng-zorro-antd/download/ng-zorro-antd-0.6.10.tgz#0cf5ec5cb94e10226a2b2becff67debf0c8ad860"
   dependencies:
     "@angular/cdk" "^5.0.0"
     moment "^2.18.1"
@@ -5091,53 +5099,61 @@
   version "5.0.2"
   resolved "http://registry.npm.taobao.org/ng2-dnd/download/ng2-dnd-5.0.2.tgz#862278ac7dedfa14f5783bbf34014d5d73dfefb4"
 
-ng2-file-upload@^1.2.1:
-  version "1.3.0"
-  resolved "http://registry.npm.taobao.org/ng2-file-upload/download/ng2-file-upload-1.3.0.tgz#d90f8f568f62383462175f8bdfa0096b131f277a"
-
 ng2-img-cropper@^0.9.0:
   version "0.9.0"
   resolved "http://registry.npm.taobao.org/ng2-img-cropper/download/ng2-img-cropper-0.9.0.tgz#305337e669c4e5adc876d628dcae0bca4d10d1c3"
 
-ngx-bootstrap@^2.0.3:
-  version "2.0.5"
-  resolved "http://registry.npm.taobao.org/ngx-bootstrap/download/ngx-bootstrap-2.0.5.tgz#83aab39d1e4fe811fad2b34f7927f9ce19d68daa"
-
 ngx-color-picker@^5.0.0:
-  version "5.3.8"
-  resolved "http://registry.npm.taobao.org/ngx-color-picker/download/ngx-color-picker-5.3.8.tgz#dd19767d9808a817471b57b3772082827a6ddb96"
+  version "5.3.0"
+  resolved "http://registry.npm.taobao.org/ngx-color-picker/download/ngx-color-picker-5.3.0.tgz#49d64ecd391e39429b8d1dbc8701f18a4efffd3e"
 
 ngx-countdown@^2.0.0:
-  version "2.1.0"
-  resolved "http://registry.npm.taobao.org/ngx-countdown/download/ngx-countdown-2.1.0.tgz#b3cd90c0ad8f146584a2a17729576ac46cc4e27e"
-  dependencies:
-    "@angular/animations" "^5.2.0"
-    "@angular/common" "^5.2.0"
-    "@angular/compiler" "^5.2.0"
-    "@angular/core" "^5.2.0"
-    "@angular/forms" "^5.2.0"
-    "@angular/http" "^5.2.0"
-    "@angular/platform-browser" "^5.2.0"
-    "@angular/platform-browser-dynamic" "^5.2.0"
-    "@angular/router" "^5.2.0"
-    core-js "^2.4.1"
-    ngx-bootstrap "^2.0.3"
-    ngx-highlight-js "^1.0.3"
-    ngx-notify "^1.0.2"
-    rxjs "^5.5.6"
-    zone.js "^0.8.19"
+  version "2.0.4"
+  resolved "http://registry.npm.taobao.org/ngx-countdown/download/ngx-countdown-2.0.4.tgz#b0c0266da4aa24efc057f99f2e19a03142133cc0"
+
+ngx-echarts@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/ngx-echarts/-/ngx-echarts-2.0.2.tgz#ec0d084220e63313a74cc6a40f2a2617a3241533"
 
 ngx-highlight-js@^1.0.3:
   version "1.0.3"
   resolved "http://registry.npm.taobao.org/ngx-highlight-js/download/ngx-highlight-js-1.0.3.tgz#b46ef9069d443baae7a43e5e4217d64fb8049003"
 
-ngx-notify@^1.0.2:
-  version "1.0.2"
-  resolved "http://registry.npm.taobao.org/ngx-notify/download/ngx-notify-1.0.2.tgz#53e68e85df77558a8e9ee37e7e9fe9806db6ce43"
+ngx-tinymce@^1.0.1:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/ngx-tinymce/download/ngx-tinymce-1.0.1.tgz#a5f04f71a6a393a8363690530c4d832fc39fc9f2"
+  dependencies:
+    "@angular/animations" "^5.0.0"
+    "@angular/common" "^5.0.0"
+    "@angular/compiler" "^5.0.0"
+    "@angular/core" "^5.0.0"
+    "@angular/forms" "^5.0.0"
+    "@angular/http" "^5.0.0"
+    "@angular/platform-browser" "^5.0.0"
+    "@angular/platform-browser-dynamic" "^5.0.0"
+    "@angular/router" "^5.0.0"
+    core-js "^2.4.1"
+    ngx-highlight-js "^1.0.3"
+    rxjs "^5.5.2"
+    zone.js "^0.8.14"
 
-nice-try@^1.0.4:
-  version "1.0.4"
-  resolved "http://registry.npm.taobao.org/nice-try/download/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4"
+ngx-ueditor@^1.1.0:
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/ngx-ueditor/download/ngx-ueditor-1.1.0.tgz#0766acc6a8e8205661131c97be49c1e991c97c6c"
+  dependencies:
+    "@angular/animations" "^5.0.0"
+    "@angular/common" "^5.0.0"
+    "@angular/compiler" "^5.0.0"
+    "@angular/core" "^5.0.0"
+    "@angular/forms" "^5.0.0"
+    "@angular/http" "^5.0.0"
+    "@angular/platform-browser" "^5.0.0"
+    "@angular/platform-browser-dynamic" "^5.0.0"
+    "@angular/router" "^5.0.0"
+    core-js "^2.4.1"
+    ngx-highlight-js "^1.0.3"
+    rxjs "^5.5.2"
+    zone.js "^0.8.14"
 
 no-case@^2.2.0:
   version "2.3.2"
@@ -5145,22 +5161,23 @@
   dependencies:
     lower-case "^1.1.1"
 
-node-forge@0.7.5:
-  version "0.7.5"
-  resolved "http://registry.npm.taobao.org/node-forge/download/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df"
+node-forge@0.6.33:
+  version "0.6.33"
+  resolved "http://registry.npm.taobao.org/node-forge/download/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc"
 
 node-gyp@^3.3.1:
-  version "3.7.0"
-  resolved "http://registry.npm.taobao.org/node-gyp/download/node-gyp-3.7.0.tgz#789478e8f6c45e277aa014f3e28f958f286f9203"
+  version "3.6.2"
+  resolved "http://registry.npm.taobao.org/node-gyp/download/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60"
   dependencies:
     fstream "^1.0.0"
     glob "^7.0.3"
     graceful-fs "^4.1.2"
+    minimatch "^3.0.2"
     mkdirp "^0.5.0"
     nopt "2 || 3"
     npmlog "0 || 1 || 2 || 3 || 4"
     osenv "0"
-    request ">=2.9.0 <2.82.0"
+    request "2"
     rimraf "2"
     semver "~5.3.0"
     tar "^2.0.0"
@@ -5198,24 +5215,25 @@
   version "1.0.1"
   resolved "http://registry.npm.taobao.org/node-modules-path/download/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8"
 
-node-pre-gyp@^0.10.0:
-  version "0.10.3"
-  resolved "http://registry.npm.taobao.org/node-pre-gyp/download/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
+node-pre-gyp@^0.6.39:
+  version "0.6.39"
+  resolved "http://registry.npm.taobao.org/node-pre-gyp/download/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649"
   dependencies:
     detect-libc "^1.0.2"
+    hawk "3.1.3"
     mkdirp "^0.5.1"
-    needle "^2.2.1"
     nopt "^4.0.1"
-    npm-packlist "^1.1.6"
     npmlog "^4.0.2"
-    rc "^1.2.7"
+    rc "^1.1.7"
+    request "2.81.0"
     rimraf "^2.6.1"
     semver "^5.3.0"
-    tar "^4"
+    tar "^2.2.1"
+    tar-pack "^3.4.0"
 
 node-sass@^4.7.2:
-  version "4.9.2"
-  resolved "http://registry.npm.taobao.org/node-sass/download/node-sass-4.9.2.tgz#5e63fe6bd0f2ae3ac9d6c14ede8620e2b8bdb437"
+  version "4.7.2"
+  resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.7.2.tgz#9366778ba1469eb01438a9e8592f4262bcb6794e"
   dependencies:
     async-foreach "^0.1.3"
     chalk "^1.1.1"
@@ -5229,10 +5247,10 @@
     lodash.mergewith "^4.6.0"
     meow "^3.7.0"
     mkdirp "^0.5.1"
-    nan "^2.10.0"
+    nan "^2.3.2"
     node-gyp "^3.3.1"
     npmlog "^4.0.0"
-    request "2.87.0"
+    request "~2.79.0"
     sass-graph "^2.2.4"
     stdout-stream "^1.4.0"
     "true-case-path" "^1.0.2"
@@ -5273,17 +5291,6 @@
   version "0.2.0"
   resolved "http://registry.npm.taobao.org/normalize-selector/download/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03"
 
-npm-bundled@^1.0.1:
-  version "1.0.3"
-  resolved "http://registry.npm.taobao.org/npm-bundled/download/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
-
-npm-packlist@^1.1.6:
-  version "1.1.10"
-  resolved "http://registry.npm.taobao.org/npm-packlist/download/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a"
-  dependencies:
-    ignore-walk "^3.0.1"
-    npm-bundled "^1.0.1"
-
 npm-path@^2.0.2:
   version "2.0.4"
   resolved "http://registry.npm.taobao.org/npm-path/download/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64"
@@ -5291,12 +5298,12 @@
     which "^1.2.10"
 
 npm-run-all@^4.1.1:
-  version "4.1.3"
-  resolved "http://registry.npm.taobao.org/npm-run-all/download/npm-run-all-4.1.3.tgz#49f15b55a66bb4101664ce270cb18e7103f8f185"
+  version "4.1.2"
+  resolved "http://registry.npm.taobao.org/npm-run-all/download/npm-run-all-4.1.2.tgz#90d62d078792d20669139e718621186656cea056"
   dependencies:
     ansi-styles "^3.2.0"
     chalk "^2.1.0"
-    cross-spawn "^6.0.4"
+    cross-spawn "^5.1.0"
     memorystream "^0.3.1"
     minimatch "^3.0.4"
     ps-tree "^1.1.0"
@@ -5367,23 +5374,19 @@
 
 object-copy@^0.1.0:
   version "0.1.0"
-  resolved "http://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
   dependencies:
     copy-descriptor "^0.1.0"
     define-property "^0.2.5"
     kind-of "^3.0.3"
 
-object-inspect@~1.6.0:
-  version "1.6.0"
-  resolved "http://registry.npm.taobao.org/object-inspect/download/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b"
-
 object-keys@^1.0.8:
-  version "1.0.12"
-  resolved "http://registry.npm.taobao.org/object-keys/download/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2"
+  version "1.0.11"
+  resolved "http://registry.npm.taobao.org/object-keys/download/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
 
 object-visit@^1.0.0:
   version "1.0.1"
-  resolved "http://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
   dependencies:
     isobject "^3.0.0"
 
@@ -5396,13 +5399,13 @@
 
 object.pick@^1.3.0:
   version "1.3.0"
-  resolved "http://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
   dependencies:
     isobject "^3.0.1"
 
 obuf@^1.0.0, obuf@^1.1.1:
-  version "1.1.2"
-  resolved "http://registry.npm.taobao.org/obuf/download/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/obuf/download/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e"
 
 on-finished@~2.3.0:
   version "2.3.0"
@@ -5414,7 +5417,7 @@
   version "1.0.1"
   resolved "http://registry.npm.taobao.org/on-headers/download/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
 
-once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0:
+once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
   version "1.4.0"
   resolved "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
   dependencies:
@@ -5428,13 +5431,7 @@
   version "1.4.3"
   resolved "http://registry.npm.taobao.org/opener/download/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8"
 
-opn@^5.1.0:
-  version "5.3.0"
-  resolved "http://registry.npm.taobao.org/opn/download/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c"
-  dependencies:
-    is-wsl "^1.1.0"
-
-opn@~5.1.0:
+opn@^5.1.0, opn@~5.1.0:
   version "5.1.0"
   resolved "http://registry.npm.taobao.org/opn/download/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519"
   dependencies:
@@ -5472,16 +5469,16 @@
     object-assign "^4.0.1"
 
 original@>=0.0.5:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/original/download/original-1.0.1.tgz#b0a53ff42ba997a8c9cd1fb5daaeb42b9d693190"
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/original/download/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b"
   dependencies:
-    url-parse "~1.4.0"
+    url-parse "1.0.x"
 
 os-browserify@^0.3.0:
   version "0.3.0"
   resolved "http://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
 
-os-homedir@^1.0.0:
+os-homedir@^1.0.0, os-homedir@^1.0.1:
   version "1.0.2"
   resolved "http://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
 
@@ -5504,8 +5501,8 @@
   resolved "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
 
 osenv@0, osenv@^0.1.4:
-  version "0.1.5"
-  resolved "http://registry.npm.taobao.org/osenv/download/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+  version "0.1.4"
+  resolved "http://registry.npm.taobao.org/osenv/download/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
   dependencies:
     os-homedir "^1.0.0"
     os-tmpdir "^1.0.0"
@@ -5515,8 +5512,8 @@
   resolved "http://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
 
 p-limit@^1.0.0, p-limit@^1.1.0:
-  version "1.3.0"
-  resolved "http://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/p-limit/download/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c"
   dependencies:
     p-try "^1.0.0"
 
@@ -5553,8 +5550,8 @@
     no-case "^2.2.0"
 
 parse-asn1@^5.0.0:
-  version "5.1.1"
-  resolved "http://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
+  version "5.1.0"
+  resolved "http://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712"
   dependencies:
     asn1.js "^4.0.0"
     browserify-aes "^1.0.0"
@@ -5563,8 +5560,8 @@
     pbkdf2 "^3.0.3"
 
 parse-entities@^1.0.2:
-  version "1.1.2"
-  resolved "http://registry.npm.taobao.org/parse-entities/download/parse-entities-1.1.2.tgz#9eaf719b29dc3bd62246b4332009072e01527777"
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/parse-entities/download/parse-entities-1.1.1.tgz#8112d88471319f27abae4d64964b122fe4e1b890"
   dependencies:
     character-entities "^1.0.0"
     character-entities-legacy "^1.0.0"
@@ -5633,7 +5630,7 @@
 
 pascalcase@^0.1.1:
   version "0.1.1"
-  resolved "http://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
 
 path-browserify@0.0.0:
   version "0.0.0"
@@ -5641,7 +5638,7 @@
 
 path-dirname@^1.0.0:
   version "1.0.2"
-  resolved "http://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+  resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
 
 path-exists@^2.0.0:
   version "2.1.0"
@@ -5661,7 +5658,7 @@
   version "1.0.2"
   resolved "http://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
 
-path-key@^2.0.0, path-key@^2.0.1:
+path-key@^2.0.0:
   version "2.0.1"
   resolved "http://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
 
@@ -5700,8 +5697,8 @@
     through "~2.3"
 
 pbkdf2@^3.0.3:
-  version "3.0.16"
-  resolved "http://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"
+  version "3.0.14"
+  resolved "http://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade"
   dependencies:
     create-hash "^1.1.2"
     create-hmac "^1.1.4"
@@ -5741,9 +5738,9 @@
   dependencies:
     find-up "^2.1.0"
 
-point-at-length@^1.0.2:
-  version "1.1.0"
-  resolved "http://registry.npm.taobao.org/point-at-length/download/point-at-length-1.1.0.tgz#0ad72ebd0980d7f5a1ab12296c055f9eb6b30e57"
+point-at-length@~1.0.2:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/point-at-length/download/point-at-length-1.0.2.tgz#9176d8d6d7c8162f12b646f707db9f0ea728125e"
   dependencies:
     abs-svg-path "~0.1.1"
     isarray "~0.0.1"
@@ -5759,7 +5756,7 @@
 
 posix-character-classes@^0.1.0:
   version "0.1.1"
-  resolved "http://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
 
 postcss-html@^0.12.0:
   version "0.12.0"
@@ -5771,7 +5768,7 @@
 
 postcss-import@^11.0.0:
   version "11.1.0"
-  resolved "http://registry.npm.taobao.org/postcss-import/download/postcss-import-11.1.0.tgz#55c9362c9192994ec68865d224419df1db2981f0"
+  resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-11.1.0.tgz#55c9362c9192994ec68865d224419df1db2981f0"
   dependencies:
     postcss "^6.0.1"
     postcss-value-parser "^3.2.3"
@@ -5779,25 +5776,41 @@
     resolve "^1.1.7"
 
 postcss-less@^1.1.0:
-  version "1.1.5"
-  resolved "http://registry.npm.taobao.org/postcss-less/download/postcss-less-1.1.5.tgz#a6f0ce180cf3797eeee1d4adc0e9e6d6db665609"
+  version "1.1.3"
+  resolved "http://registry.npm.taobao.org/postcss-less/download/postcss-less-1.1.3.tgz#6930525271bfe38d5793d33ac09c1a546b87bb51"
   dependencies:
     postcss "^5.2.16"
 
-postcss-load-config@^2.0.0:
-  version "2.0.0"
-  resolved "http://registry.npm.taobao.org/postcss-load-config/download/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484"
+postcss-load-config@^1.2.0:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/postcss-load-config/download/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a"
   dependencies:
-    cosmiconfig "^4.0.0"
-    import-cwd "^2.0.0"
+    cosmiconfig "^2.1.0"
+    object-assign "^4.1.0"
+    postcss-load-options "^1.2.0"
+    postcss-load-plugins "^2.3.0"
+
+postcss-load-options@^1.2.0:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/postcss-load-options/download/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c"
+  dependencies:
+    cosmiconfig "^2.1.0"
+    object-assign "^4.1.0"
+
+postcss-load-plugins@^2.3.0:
+  version "2.3.0"
+  resolved "http://registry.npm.taobao.org/postcss-load-plugins/download/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92"
+  dependencies:
+    cosmiconfig "^2.1.1"
+    object-assign "^4.1.0"
 
 postcss-loader@^2.0.10:
-  version "2.1.6"
-  resolved "http://registry.npm.taobao.org/postcss-loader/download/postcss-loader-2.1.6.tgz#1d7dd7b17c6ba234b9bed5af13e0bea40a42d740"
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.1.1.tgz#208935af3b1d65e1abb1a870a912dd12e7b36895"
   dependencies:
     loader-utils "^1.1.0"
     postcss "^6.0.0"
-    postcss-load-config "^2.0.0"
+    postcss-load-config "^1.2.0"
     schema-utils "^0.4.0"
 
 postcss-media-query-parser@^0.2.3:
@@ -5831,10 +5844,10 @@
     postcss "^6.0.6"
 
 postcss-scss@^1.0.2:
-  version "1.0.6"
-  resolved "http://registry.npm.taobao.org/postcss-scss/download/postcss-scss-1.0.6.tgz#ab903f3bb20161bc177896462293a53d4bff5f7a"
+  version "1.0.3"
+  resolved "http://registry.npm.taobao.org/postcss-scss/download/postcss-scss-1.0.3.tgz#4c00ab440fc1c994134e3d4e600c23341af6cd27"
   dependencies:
-    postcss "^6.0.23"
+    postcss "^6.0.15"
 
 postcss-selector-parser@^3.1.0:
   version "3.1.1"
@@ -5845,8 +5858,8 @@
     uniq "^1.0.1"
 
 postcss-url@^7.1.2:
-  version "7.3.2"
-  resolved "http://registry.npm.taobao.org/postcss-url/download/postcss-url-7.3.2.tgz#5fea273807fb84b38c461c3c9a9e8abd235f7120"
+  version "7.3.0"
+  resolved "http://registry.npm.taobao.org/postcss-url/download/postcss-url-7.3.0.tgz#cf2f45e06743cf43cfea25309f81cbc003dc783f"
   dependencies:
     mime "^1.4.1"
     minimatch "^3.0.4"
@@ -5867,13 +5880,21 @@
     source-map "^0.5.6"
     supports-color "^3.2.3"
 
-postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.14, postcss@^6.0.16, postcss@^6.0.17, postcss@^6.0.23, postcss@^6.0.6, postcss@^6.0.8:
-  version "6.0.23"
-  resolved "http://registry.npm.taobao.org/postcss/download/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.14, postcss@^6.0.15, postcss@^6.0.6, postcss@^6.0.8:
+  version "6.0.16"
+  resolved "http://registry.npm.taobao.org/postcss/download/postcss-6.0.16.tgz#112e2fe2a6d2109be0957687243170ea5589e146"
   dependencies:
-    chalk "^2.4.1"
+    chalk "^2.3.0"
     source-map "^0.6.1"
-    supports-color "^5.4.0"
+    supports-color "^5.1.0"
+
+postcss@^6.0.16, postcss@^6.0.17:
+  version "6.0.19"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.19.tgz#76a78386f670b9d9494a655bf23ac012effd1555"
+  dependencies:
+    chalk "^2.3.1"
+    source-map "^0.6.1"
+    supports-color "^5.2.0"
 
 prelude-ls@~1.1.2:
   version "1.1.2"
@@ -5897,13 +5918,13 @@
     ansi-regex "^3.0.0"
     ansi-styles "^3.2.0"
 
+printj@~1.1.0:
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/printj/download/printj-1.1.0.tgz#85487b5e8f96763b0b4a253613bef9dd9b387e3c"
+
 process-nextick-args@~1.0.6:
   version "1.0.7"
   resolved "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
-
-process-nextick-args@~2.0.0:
-  version "2.0.0"
-  resolved "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
 
 process@^0.11.10:
   version "0.11.10"
@@ -5939,12 +5960,12 @@
     webdriver-js-extender "^1.0.0"
     webdriver-manager "^12.0.6"
 
-proxy-addr@~2.0.3:
-  version "2.0.3"
-  resolved "http://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341"
+proxy-addr@~2.0.2:
+  version "2.0.2"
+  resolved "http://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec"
   dependencies:
     forwarded "~0.1.2"
-    ipaddr.js "1.6.0"
+    ipaddr.js "1.5.2"
 
 prr@~1.0.1:
   version "1.0.1"
@@ -5961,8 +5982,8 @@
   resolved "http://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
 
 public-encrypt@^4.0.0:
-  version "4.0.2"
-  resolved "http://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994"
+  version "4.0.0"
+  resolved "http://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
   dependencies:
     bn.js "^4.1.0"
     browserify-rsa "^4.0.0"
@@ -5970,20 +5991,20 @@
     parse-asn1 "^5.0.0"
     randombytes "^2.0.1"
 
-pump@^2.0.0, pump@^2.0.1:
-  version "2.0.1"
-  resolved "http://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+pump@^1.0.0:
+  version "1.0.3"
+  resolved "http://registry.npm.taobao.org/pump/download/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954"
   dependencies:
     end-of-stream "^1.1.0"
     once "^1.3.1"
 
 pumpify@^1.3.3:
-  version "1.5.1"
-  resolved "http://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+  version "1.3.5"
+  resolved "http://registry.npm.taobao.org/pumpify/download/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b"
   dependencies:
-    duplexify "^3.6.0"
-    inherits "^2.0.3"
-    pump "^2.0.0"
+    duplexify "^3.1.2"
+    inherits "^2.0.1"
+    pump "^1.0.0"
 
 punycode@1.3.2:
   version "1.3.2"
@@ -5992,10 +6013,6 @@
 punycode@^1.2.4, punycode@^1.4.1:
   version "1.4.1"
   resolved "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
-
-punycode@^2.1.0:
-  version "2.1.1"
-  resolved "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
 
 q@1.4.1:
   version "1.4.1"
@@ -6006,16 +6023,16 @@
   resolved "http://registry.npm.taobao.org/q/download/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
 
 qjobs@^1.1.4:
-  version "1.2.0"
-  resolved "http://registry.npm.taobao.org/qjobs/download/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071"
+  version "1.1.5"
+  resolved "http://registry.npm.taobao.org/qjobs/download/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73"
 
-qs@6.5.1:
+qs@6.5.1, qs@~6.5.1:
   version "6.5.1"
   resolved "http://registry.npm.taobao.org/qs/download/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
 
-qs@6.5.2, qs@~6.5.1:
-  version "6.5.2"
-  resolved "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+qs@~6.3.0:
+  version "6.3.2"
+  resolved "http://registry.npm.taobao.org/qs/download/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
 
 qs@~6.4.0:
   version "6.4.0"
@@ -6029,31 +6046,34 @@
   version "0.2.0"
   resolved "http://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
 
-querystringify@^2.0.0:
-  version "2.0.0"
-  resolved "http://registry.npm.taobao.org/querystringify/download/querystringify-2.0.0.tgz#fa3ed6e68eb15159457c89b37bc6472833195755"
+querystringify@0.0.x:
+  version "0.0.4"
+  resolved "http://registry.npm.taobao.org/querystringify/download/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c"
+
+querystringify@~1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/querystringify/download/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb"
 
 quick-lru@^1.0.0:
   version "1.1.0"
   resolved "http://registry.npm.taobao.org/quick-lru/download/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
 
-randomatic@^3.0.0:
-  version "3.0.0"
-  resolved "http://registry.npm.taobao.org/randomatic/download/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923"
+randomatic@^1.1.3:
+  version "1.1.7"
+  resolved "http://registry.npm.taobao.org/randomatic/download/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
   dependencies:
-    is-number "^4.0.0"
-    kind-of "^6.0.0"
-    math-random "^1.0.1"
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
 
 randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
-  version "2.0.6"
-  resolved "http://registry.npm.taobao.org/randombytes/download/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+  version "2.0.5"
+  resolved "http://registry.npm.taobao.org/randombytes/download/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79"
   dependencies:
     safe-buffer "^5.1.0"
 
 randomfill@^1.0.3:
-  version "1.0.4"
-  resolved "http://registry.npm.taobao.org/randomfill/download/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+  version "1.0.3"
+  resolved "http://registry.npm.taobao.org/randomfill/download/randomfill-1.0.3.tgz#b96b7df587f01dd91726c418f30553b1418e3d62"
   dependencies:
     randombytes "^2.0.5"
     safe-buffer "^5.1.0"
@@ -6071,31 +6091,22 @@
     iconv-lite "0.4.19"
     unpipe "1.0.0"
 
-raw-body@2.3.3:
-  version "2.3.3"
-  resolved "http://registry.npm.taobao.org/raw-body/download/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3"
-  dependencies:
-    bytes "3.0.0"
-    http-errors "1.6.3"
-    iconv-lite "0.4.23"
-    unpipe "1.0.0"
-
 raw-loader@^0.5.1:
   version "0.5.1"
   resolved "http://registry.npm.taobao.org/raw-loader/download/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
 
-rc@^1.2.7:
-  version "1.2.8"
-  resolved "http://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+rc@^1.1.7:
+  version "1.2.3"
+  resolved "http://registry.npm.taobao.org/rc/download/rc-1.2.3.tgz#51575a900f8dd68381c710b4712c2154c3e2035b"
   dependencies:
-    deep-extend "^0.6.0"
+    deep-extend "~0.4.0"
     ini "~1.3.0"
     minimist "^1.2.0"
     strip-json-comments "~2.0.1"
 
 read-cache@^1.0.0:
   version "1.0.0"
-  resolved "http://registry.npm.taobao.org/read-cache/download/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
+  resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
   dependencies:
     pify "^2.3.0"
 
@@ -6144,16 +6155,16 @@
     normalize-package-data "^2.3.2"
     path-type "^3.0.0"
 
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6:
-  version "2.3.6"
-  resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.2.9, readable-stream@^2.3.3:
+  version "2.3.3"
+  resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
   dependencies:
     core-util-is "~1.0.0"
     inherits "~2.0.3"
     isarray "~1.0.0"
-    process-nextick-args "~2.0.0"
+    process-nextick-args "~1.0.6"
     safe-buffer "~5.1.1"
-    string_decoder "~1.1.1"
+    string_decoder "~1.0.3"
     util-deprecate "~1.0.1"
 
 readable-stream@1.0, readable-stream@~1.0.2:
@@ -6209,12 +6220,12 @@
     strip-indent "^2.0.0"
 
 reflect-metadata@^0.1.2:
-  version "0.1.12"
-  resolved "http://registry.npm.taobao.org/reflect-metadata/download/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2"
+  version "0.1.10"
+  resolved "http://registry.npm.taobao.org/reflect-metadata/download/reflect-metadata-0.1.10.tgz#b4f83704416acad89988c9b15635d47e03b9344a"
 
 regenerate@^1.2.1:
-  version "1.4.0"
-  resolved "http://registry.npm.taobao.org/regenerate/download/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
+  version "1.3.3"
+  resolved "http://registry.npm.taobao.org/regenerate/download/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
 
 regenerator-runtime@^0.11.0:
   version "0.11.1"
@@ -6228,7 +6239,7 @@
 
 regex-not@^1.0.0, regex-not@^1.0.2:
   version "1.0.2"
-  resolved "http://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
   dependencies:
     extend-shallow "^3.0.2"
     safe-regex "^1.1.0"
@@ -6251,7 +6262,7 @@
   dependencies:
     jsesc "~0.5.0"
 
-regression@^2.0.0:
+regression@~2.0.0:
   version "2.0.1"
   resolved "http://registry.npm.taobao.org/regression/download/regression-2.0.1.tgz#8d29c3e8224a10850c35e337e85a8b2fac3b0c87"
 
@@ -6260,14 +6271,14 @@
   resolved "http://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
 
 remap-istanbul@^0.9.0:
-  version "0.9.6"
-  resolved "http://registry.npm.taobao.org/remap-istanbul/download/remap-istanbul-0.9.6.tgz#bbd5a688fe265192f067a0ca5b2b0d7f746c5f4b"
+  version "0.9.5"
+  resolved "http://registry.npm.taobao.org/remap-istanbul/download/remap-istanbul-0.9.5.tgz#a18617b1f31eec5a7dbee77538298b775606aaa8"
   dependencies:
     amdefine "^1.0.0"
     gulp-util "3.0.7"
     istanbul "0.4.5"
     minimatch "^3.0.3"
-    source-map "^0.6.1"
+    source-map ">=0.5.6"
     through2 "2.0.1"
 
 remark-parse@^4.0.0:
@@ -6357,7 +6368,59 @@
   version "1.0.0"
   resolved "http://registry.npm.taobao.org/replace-ext/download/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
 
-request@2.81.0, "request@>=2.9.0 <2.82.0":
+request@2, request@^2.78.0:
+  version "2.83.0"
+  resolved "http://registry.npm.taobao.org/request/download/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
+  dependencies:
+    aws-sign2 "~0.7.0"
+    aws4 "^1.6.0"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.1"
+    forever-agent "~0.6.1"
+    form-data "~2.3.1"
+    har-validator "~5.0.3"
+    hawk "~6.0.2"
+    http-signature "~1.2.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.17"
+    oauth-sign "~0.8.2"
+    performance-now "^2.1.0"
+    qs "~6.5.1"
+    safe-buffer "^5.1.1"
+    stringstream "~0.0.5"
+    tough-cookie "~2.3.3"
+    tunnel-agent "^0.6.0"
+    uuid "^3.1.0"
+
+request@2.79.0, request@~2.79.0:
+  version "2.79.0"
+  resolved "http://registry.npm.taobao.org/request/download/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.11.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~2.0.6"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    qs "~6.3.0"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "~0.4.1"
+    uuid "^3.0.0"
+
+request@2.81.0:
   version "2.81.0"
   resolved "http://registry.npm.taobao.org/request/download/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
   dependencies:
@@ -6384,71 +6447,23 @@
     tunnel-agent "^0.6.0"
     uuid "^3.0.0"
 
-request@2.85.0:
-  version "2.85.0"
-  resolved "http://registry.npm.taobao.org/request/download/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa"
-  dependencies:
-    aws-sign2 "~0.7.0"
-    aws4 "^1.6.0"
-    caseless "~0.12.0"
-    combined-stream "~1.0.5"
-    extend "~3.0.1"
-    forever-agent "~0.6.1"
-    form-data "~2.3.1"
-    har-validator "~5.0.3"
-    hawk "~6.0.2"
-    http-signature "~1.2.0"
-    is-typedarray "~1.0.0"
-    isstream "~0.1.2"
-    json-stringify-safe "~5.0.1"
-    mime-types "~2.1.17"
-    oauth-sign "~0.8.2"
-    performance-now "^2.1.0"
-    qs "~6.5.1"
-    safe-buffer "^5.1.1"
-    stringstream "~0.0.5"
-    tough-cookie "~2.3.3"
-    tunnel-agent "^0.6.0"
-    uuid "^3.1.0"
-
-request@2.87.0, request@^2.87.0:
-  version "2.87.0"
-  resolved "http://registry.npm.taobao.org/request/download/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e"
-  dependencies:
-    aws-sign2 "~0.7.0"
-    aws4 "^1.6.0"
-    caseless "~0.12.0"
-    combined-stream "~1.0.5"
-    extend "~3.0.1"
-    forever-agent "~0.6.1"
-    form-data "~2.3.1"
-    har-validator "~5.0.3"
-    http-signature "~1.2.0"
-    is-typedarray "~1.0.0"
-    isstream "~0.1.2"
-    json-stringify-safe "~5.0.1"
-    mime-types "~2.1.17"
-    oauth-sign "~0.8.2"
-    performance-now "^2.1.0"
-    qs "~6.5.1"
-    safe-buffer "^5.1.1"
-    tough-cookie "~2.3.3"
-    tunnel-agent "^0.6.0"
-    uuid "^3.1.0"
-
 require-directory@^2.1.1:
   version "2.1.1"
   resolved "http://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
 
+require-from-string@^1.1.0:
+  version "1.2.1"
+  resolved "http://registry.npm.taobao.org/require-from-string/download/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418"
+
 require-from-string@^2.0.1:
-  version "2.0.2"
-  resolved "http://registry.npm.taobao.org/require-from-string/download/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/require-from-string/download/require-from-string-2.0.1.tgz#c545233e9d7da6616e9d59adfb39fc9f588676ff"
 
 require-main-filename@^1.0.1:
   version "1.0.1"
   resolved "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
 
-requires-port@^1.0.0:
+requires-port@1.0.x, requires-port@1.x.x, requires-port@~1.0.0:
   version "1.0.0"
   resolved "http://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
 
@@ -6468,21 +6483,15 @@
 
 resolve-url@^0.2.1:
   version "0.2.1"
-  resolved "http://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
 
 resolve@1.1.x:
   version "1.1.7"
   resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
 
 resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2:
-  version "1.8.1"
-  resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
-  dependencies:
-    path-parse "^1.0.5"
-
-resolve@~1.7.1:
-  version "1.7.1"
-  resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3"
+  version "1.5.0"
+  resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
   dependencies:
     path-parse "^1.0.5"
 
@@ -6493,15 +6502,9 @@
     exit-hook "^1.0.0"
     onetime "^1.0.0"
 
-resumer@~0.0.0:
-  version "0.0.0"
-  resolved "http://registry.npm.taobao.org/resumer/download/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759"
-  dependencies:
-    through "~2.3.4"
-
 ret@~0.1.10:
   version "0.1.15"
-  resolved "http://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
 
 right-align@^0.1.1:
   version "0.1.3"
@@ -6509,26 +6512,18 @@
   dependencies:
     align-text "^0.1.1"
 
-rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2:
+rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1:
   version "2.6.2"
   resolved "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
   dependencies:
     glob "^7.0.5"
 
 ripemd160@^2.0.0, ripemd160@^2.0.1:
-  version "2.0.2"
-  resolved "http://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
   dependencies:
-    hash-base "^3.0.0"
+    hash-base "^2.0.0"
     inherits "^2.0.1"
-
-rollup@^0.25.8:
-  version "0.25.8"
-  resolved "http://registry.npm.taobao.org/rollup/download/rollup-0.25.8.tgz#bf6ce83b87510d163446eeaa577ed6a6fc5835e0"
-  dependencies:
-    chalk "^1.1.1"
-    minimist "^1.2.0"
-    source-map-support "^0.3.2"
 
 run-queue@^1.0.0, run-queue@^1.0.3:
   version "1.0.3"
@@ -6536,33 +6531,25 @@
   dependencies:
     aproba "^1.1.1"
 
-rw@1, rw@^1.3.2:
+rw@1:
   version "1.3.3"
   resolved "http://registry.npm.taobao.org/rw/download/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
 
 rxjs@^5.4.2, rxjs@^5.5.2, rxjs@^5.5.5, rxjs@^5.5.6:
-  version "5.5.11"
-  resolved "http://registry.npm.taobao.org/rxjs/download/rxjs-5.5.11.tgz#f733027ca43e3bec6b994473be4ab98ad43ced87"
+  version "5.5.6"
+  resolved "http://registry.npm.taobao.org/rxjs/download/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02"
   dependencies:
     symbol-observable "1.0.1"
 
-safe-buffer@5.1.1:
+safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   version "5.1.1"
   resolved "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
 
-safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
-  version "5.1.2"
-  resolved "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
-
 safe-regex@^1.1.0:
   version "1.1.0"
-  resolved "http://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
   dependencies:
     ret "~0.1.10"
-
-"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2:
-  version "2.1.2"
-  resolved "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
 
 sass-graph@^2.2.4:
   version "2.2.4"
@@ -6574,30 +6561,30 @@
     yargs "^7.0.0"
 
 sass-loader@^6.0.6:
-  version "6.0.7"
-  resolved "http://registry.npm.taobao.org/sass-loader/download/sass-loader-6.0.7.tgz#dd2fdb3e7eeff4a53f35ba6ac408715488353d00"
+  version "6.0.6"
+  resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-6.0.6.tgz#e9d5e6c1f155faa32a4b26d7a9b7107c225e40f9"
   dependencies:
-    clone-deep "^2.0.1"
+    async "^2.1.5"
+    clone-deep "^0.3.0"
     loader-utils "^1.0.1"
     lodash.tail "^4.1.1"
-    neo-async "^2.5.0"
     pify "^3.0.0"
 
 sauce-connect-launcher@^1.2.2:
-  version "1.2.4"
-  resolved "http://registry.npm.taobao.org/sauce-connect-launcher/download/sauce-connect-launcher-1.2.4.tgz#8d38f85242a9fbede1b2303b559f7e20c5609a1c"
+  version "1.2.3"
+  resolved "http://registry.npm.taobao.org/sauce-connect-launcher/download/sauce-connect-launcher-1.2.3.tgz#d2f931ad7ae8fdabf1968a440e7b20417aca7f86"
   dependencies:
     adm-zip "~0.4.3"
     async "^2.1.2"
-    https-proxy-agent "^2.2.1"
+    https-proxy-agent "~1.0.0"
     lodash "^4.16.6"
     rimraf "^2.5.4"
 
 saucelabs@^1.4.0:
-  version "1.5.0"
-  resolved "http://registry.npm.taobao.org/saucelabs/download/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d"
+  version "1.4.0"
+  resolved "http://registry.npm.taobao.org/saucelabs/download/saucelabs-1.4.0.tgz#b934a9af9da2874b3f40aae1fcde50a4466f5f38"
   dependencies:
-    https-proxy-agent "^2.2.1"
+    https-proxy-agent "^1.0.0"
 
 saucelabs@~1.3.0:
   version "1.3.0"
@@ -6613,7 +6600,7 @@
   version "0.6.1"
   resolved "http://registry.npm.taobao.org/sax/download/sax-0.6.1.tgz#563b19c7c1de892e09bfc4f2fc30e3c27f0952b9"
 
-sax@>=0.6.0, sax@^1.2.4:
+sax@>=0.6.0:
   version "1.2.4"
   resolved "http://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
 
@@ -6623,12 +6610,19 @@
   dependencies:
     ajv "^5.0.0"
 
-schema-utils@^0.4.0, schema-utils@^0.4.2, schema-utils@^0.4.5:
+schema-utils@^0.4.0:
   version "0.4.5"
-  resolved "http://registry.npm.taobao.org/schema-utils/download/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e"
   dependencies:
     ajv "^6.1.0"
     ajv-keywords "^3.1.0"
+
+schema-utils@^0.4.2:
+  version "0.4.3"
+  resolved "http://registry.npm.taobao.org/schema-utils/download/schema-utils-0.4.3.tgz#e2a594d3395834d5e15da22b48be13517859458e"
+  dependencies:
+    ajv "^5.0.0"
+    ajv-keywords "^2.1.0"
 
 screenfull@^3.3.1:
   version "3.3.2"
@@ -6665,10 +6659,10 @@
     xml2js "0.4.4"
 
 selfsigned@^1.9.1:
-  version "1.10.3"
-  resolved "http://registry.npm.taobao.org/selfsigned/download/selfsigned-1.10.3.tgz#d628ecf9e3735f84e8bafba936b3cf85bea43823"
+  version "1.10.1"
+  resolved "http://registry.npm.taobao.org/selfsigned/download/selfsigned-1.10.1.tgz#bf8cb7b83256c4551e31347c6311778db99eec52"
   dependencies:
-    node-forge "0.7.5"
+    node-forge "0.6.33"
 
 semver-dsl@^1.0.1:
   version "1.0.1"
@@ -6678,13 +6672,17 @@
 
 semver-intersect@^1.1.2:
   version "1.3.1"
-  resolved "http://registry.npm.taobao.org/semver-intersect/download/semver-intersect-1.3.1.tgz#8fa84a9e1028bd239e4530d1a3e181e698d884ba"
+  resolved "https://registry.yarnpkg.com/semver-intersect/-/semver-intersect-1.3.1.tgz#8fa84a9e1028bd239e4530d1a3e181e698d884ba"
   dependencies:
     semver "^5.0.0"
 
-"semver@2 || 3 || 4 || 5", semver@^5.0.0, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0:
+"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0:
+  version "5.4.1"
+  resolved "http://registry.npm.taobao.org/semver/download/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
+
+semver@^5.0.0:
   version "5.5.0"
-  resolved "http://registry.npm.taobao.org/semver/download/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
 
 semver@~4.3.3:
   version "4.3.6"
@@ -6698,14 +6696,14 @@
   version "5.3.0"
   resolved "http://registry.npm.taobao.org/semver/download/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
 
-send@0.16.2:
-  version "0.16.2"
-  resolved "http://registry.npm.taobao.org/send/download/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
+send@0.16.1:
+  version "0.16.1"
+  resolved "http://registry.npm.taobao.org/send/download/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3"
   dependencies:
     debug "2.6.9"
-    depd "~1.1.2"
+    depd "~1.1.1"
     destroy "~1.0.4"
-    encodeurl "~1.0.2"
+    encodeurl "~1.0.1"
     escape-html "~1.0.3"
     etag "~1.8.1"
     fresh "0.5.2"
@@ -6714,11 +6712,11 @@
     ms "2.0.0"
     on-finished "~2.3.0"
     range-parser "~1.2.0"
-    statuses "~1.4.0"
+    statuses "~1.3.1"
 
 serialize-javascript@^1.4.0:
-  version "1.5.0"
-  resolved "http://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe"
+  version "1.4.0"
+  resolved "http://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005"
 
 serve-index@^1.7.2:
   version "1.9.1"
@@ -6732,18 +6730,24 @@
     mime-types "~2.1.17"
     parseurl "~1.3.2"
 
-serve-static@1.13.2:
-  version "1.13.2"
-  resolved "http://registry.npm.taobao.org/serve-static/download/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
+serve-static@1.13.1:
+  version "1.13.1"
+  resolved "http://registry.npm.taobao.org/serve-static/download/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719"
   dependencies:
-    encodeurl "~1.0.2"
+    encodeurl "~1.0.1"
     escape-html "~1.0.3"
     parseurl "~1.3.2"
-    send "0.16.2"
+    send "0.16.1"
 
 set-blocking@^2.0.0, set-blocking@~2.0.0:
   version "2.0.0"
   resolved "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-getter@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376"
+  dependencies:
+    to-object-path "^0.3.0"
 
 set-immediate-shim@^1.0.1:
   version "1.0.1"
@@ -6751,7 +6755,7 @@
 
 set-value@^0.4.3:
   version "0.4.3"
-  resolved "http://registry.npm.taobao.org/set-value/download/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
   dependencies:
     extend-shallow "^2.0.1"
     is-extendable "^0.1.1"
@@ -6760,7 +6764,7 @@
 
 set-value@^2.0.0:
   version "2.0.0"
-  resolved "http://registry.npm.taobao.org/set-value/download/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
   dependencies:
     extend-shallow "^2.0.1"
     is-extendable "^0.1.1"
@@ -6780,18 +6784,19 @@
   resolved "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
 
 sha.js@^2.4.0, sha.js@^2.4.8:
-  version "2.4.11"
-  resolved "http://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+  version "2.4.9"
+  resolved "http://registry.npm.taobao.org/sha.js/download/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d"
   dependencies:
     inherits "^2.0.1"
     safe-buffer "^5.0.1"
 
-shallow-clone@^1.0.0:
-  version "1.0.0"
-  resolved "http://registry.npm.taobao.org/shallow-clone/download/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571"
+shallow-clone@^0.1.2:
+  version "0.1.2"
+  resolved "http://registry.npm.taobao.org/shallow-clone/download/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060"
   dependencies:
     is-extendable "^0.1.1"
-    kind-of "^5.0.0"
+    kind-of "^2.0.1"
+    lazy-cache "^0.2.3"
     mixin-object "^2.0.1"
 
 shebang-command@^1.2.0:
@@ -6827,7 +6832,7 @@
   version "2.4.1"
   resolved "http://registry.npm.taobao.org/simple-line-icons/download/simple-line-icons-2.4.1.tgz#b75bc5a0d87e530928c2ccda5735274bb256f234"
 
-simple-statistics@^4.1.0:
+simple-statistics@~4.1.0:
   version "4.1.1"
   resolved "http://registry.npm.taobao.org/simple-statistics/download/simple-statistics-4.1.1.tgz#533c48d48336ba3d350d8135f20fa7138acb0c7d"
 
@@ -6847,7 +6852,7 @@
 
 snapdragon-node@^2.0.1:
   version "2.1.1"
-  resolved "http://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
   dependencies:
     define-property "^1.0.0"
     isobject "^3.0.0"
@@ -6855,13 +6860,13 @@
 
 snapdragon-util@^3.0.1:
   version "3.0.1"
-  resolved "http://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
   dependencies:
     kind-of "^3.2.0"
 
 snapdragon@^0.8.1:
-  version "0.8.2"
-  resolved "http://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+  version "0.8.1"
+  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370"
   dependencies:
     base "^0.11.1"
     debug "^2.2.0"
@@ -6870,7 +6875,7 @@
     map-cache "^0.2.2"
     source-map "^0.5.6"
     source-map-resolve "^0.5.0"
-    use "^3.1.0"
+    use "^2.0.0"
 
 sntp@1.x.x:
   version "1.0.9"
@@ -6941,7 +6946,7 @@
 
 sockjs@0.3.19:
   version "0.3.19"
-  resolved "http://registry.npm.taobao.org/sockjs/download/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d"
+  resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d"
   dependencies:
     faye-websocket "^0.10.0"
     uuid "^3.0.1"
@@ -6955,43 +6960,24 @@
   resolved "http://registry.npm.taobao.org/source-list-map/download/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106"
 
 source-map-resolve@^0.5.0:
-  version "0.5.2"
-  resolved "http://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a"
   dependencies:
-    atob "^2.1.1"
+    atob "^2.0.0"
     decode-uri-component "^0.2.0"
     resolve-url "^0.2.1"
     source-map-url "^0.4.0"
     urix "^0.1.0"
 
-source-map-support@^0.3.2:
-  version "0.3.3"
-  resolved "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.3.3.tgz#34900977d5ba3f07c7757ee72e73bb1a9b53754f"
-  dependencies:
-    source-map "0.1.32"
-
-source-map-support@^0.4.0, source-map-support@^0.4.1, source-map-support@~0.4.0:
+source-map-support@^0.4.0, source-map-support@^0.4.1, source-map-support@^0.4.2, source-map-support@~0.4.0:
   version "0.4.18"
   resolved "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
   dependencies:
     source-map "^0.5.6"
 
-source-map-support@^0.5.0, source-map-support@^0.5.5:
-  version "0.5.6"
-  resolved "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13"
-  dependencies:
-    buffer-from "^1.0.0"
-    source-map "^0.6.0"
-
 source-map-url@^0.4.0:
   version "0.4.0"
-  resolved "http://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
-
-source-map@0.1.32:
-  version "0.1.32"
-  resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266"
-  dependencies:
-    amdefine ">=0.0.4"
+  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
 
 source-map@0.1.x:
   version "0.1.43"
@@ -6999,19 +6985,19 @@
   dependencies:
     amdefine ">=0.0.4"
 
-source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1:
+source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1:
   version "0.5.7"
   resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@>=0.5.6, source-map@^0.6.1, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
 
 source-map@^0.4.2, source-map@^0.4.4, source-map@~0.4.1:
   version "0.4.4"
   resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
   dependencies:
     amdefine ">=0.0.4"
-
-source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
-  version "0.6.1"
-  resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
 
 source-map@~0.2.0:
   version "0.2.0"
@@ -7020,34 +7006,26 @@
     amdefine ">=0.0.4"
 
 sparkles@^1.0.0:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/sparkles/download/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c"
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/sparkles/download/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3"
 
-spdx-correct@^3.0.0:
-  version "3.0.0"
-  resolved "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
+spdx-correct@~1.0.0:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
   dependencies:
-    spdx-expression-parse "^3.0.0"
-    spdx-license-ids "^3.0.0"
+    spdx-license-ids "^1.0.2"
 
-spdx-exceptions@^2.1.0:
-  version "2.1.0"
-  resolved "http://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"
+spdx-expression-parse@~1.0.0:
+  version "1.0.4"
+  resolved "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
 
-spdx-expression-parse@^3.0.0:
-  version "3.0.0"
-  resolved "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
-  dependencies:
-    spdx-exceptions "^2.1.0"
-    spdx-license-ids "^3.0.0"
-
-spdx-license-ids@^3.0.0:
-  version "3.0.0"
-  resolved "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87"
+spdx-license-ids@^1.0.2:
+  version "1.2.2"
+  resolved "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
 
 spdy-transport@^2.0.18:
-  version "2.1.0"
-  resolved "http://registry.npm.taobao.org/spdy-transport/download/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1"
+  version "2.0.20"
+  resolved "http://registry.npm.taobao.org/spdy-transport/download/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d"
   dependencies:
     debug "^2.6.8"
     detect-node "^2.0.3"
@@ -7074,7 +7052,7 @@
 
 split-string@^3.0.1, split-string@^3.0.2:
   version "3.1.0"
-  resolved "http://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
   dependencies:
     extend-shallow "^3.0.0"
 
@@ -7092,53 +7070,54 @@
   version "1.0.3"
   resolved "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
 
+ssf@~0.10.1:
+  version "0.10.1"
+  resolved "http://registry.npm.taobao.org/ssf/download/ssf-0.10.1.tgz#f23d82b63792ef56089089c1cd0c848e911cdba6"
+  dependencies:
+    frac "~1.1.0"
+
 sshpk@^1.7.0:
-  version "1.14.2"
-  resolved "http://registry.npm.taobao.org/sshpk/download/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98"
+  version "1.13.1"
+  resolved "http://registry.npm.taobao.org/sshpk/download/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
   dependencies:
     asn1 "~0.2.3"
     assert-plus "^1.0.0"
     dashdash "^1.12.0"
     getpass "^0.1.1"
-    safer-buffer "^2.0.2"
   optionalDependencies:
     bcrypt-pbkdf "^1.0.0"
     ecc-jsbn "~0.1.1"
     jsbn "~0.1.0"
     tweetnacl "~0.14.0"
 
-ssri@^5.2.4:
-  version "5.3.0"
-  resolved "http://registry.npm.taobao.org/ssri/download/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06"
+ssri@^5.0.0:
+  version "5.0.0"
+  resolved "http://registry.npm.taobao.org/ssri/download/ssri-5.0.0.tgz#13c19390b606c821f2a10d02b351c1729b94d8cf"
   dependencies:
-    safe-buffer "^5.1.1"
+    safe-buffer "^5.1.0"
 
 staged-git-files@0.0.4:
   version "0.0.4"
   resolved "http://registry.npm.taobao.org/staged-git-files/download/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35"
 
 state-toggle@^1.0.0:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/state-toggle/download/state-toggle-1.0.1.tgz#c3cb0974f40a6a0f8e905b96789eb41afa1cde3a"
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/state-toggle/download/state-toggle-1.0.0.tgz#d20f9a616bb4f0c3b98b91922d25b640aa2bc425"
 
 static-extend@^0.1.1:
   version "0.1.2"
-  resolved "http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
   dependencies:
     define-property "^0.2.5"
     object-copy "^0.1.0"
 
-"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2":
-  version "1.5.0"
-  resolved "http://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+"statuses@>= 1.3.1 < 2":
+  version "1.4.0"
+  resolved "http://registry.npm.taobao.org/statuses/download/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
 
 statuses@~1.3.1:
   version "1.3.1"
   resolved "http://registry.npm.taobao.org/statuses/download/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
-
-statuses@~1.4.0:
-  version "1.4.0"
-  resolved "http://registry.npm.taobao.org/statuses/download/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
 
 stdout-stream@^1.4.0:
   version "1.4.0"
@@ -7167,12 +7146,12 @@
     stream-shift "^1.0.0"
 
 stream-http@^2.7.2:
-  version "2.8.3"
-  resolved "http://registry.npm.taobao.org/stream-http/download/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+  version "2.7.2"
+  resolved "http://registry.npm.taobao.org/stream-http/download/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad"
   dependencies:
     builtin-status-codes "^3.0.0"
     inherits "^2.0.1"
-    readable-stream "^2.3.6"
+    readable-stream "^2.2.6"
     to-arraybuffer "^1.0.0"
     xtend "^4.0.0"
 
@@ -7194,7 +7173,7 @@
     is-fullwidth-code-point "^1.0.0"
     strip-ansi "^3.0.0"
 
-"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
+string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
   version "2.1.1"
   resolved "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
   dependencies:
@@ -7209,17 +7188,9 @@
     es-abstract "^1.4.3"
     function-bind "^1.0.2"
 
-string.prototype.trim@~1.1.2:
-  version "1.1.2"
-  resolved "http://registry.npm.taobao.org/string.prototype.trim/download/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea"
-  dependencies:
-    define-properties "^1.1.2"
-    es-abstract "^1.5.0"
-    function-bind "^1.0.2"
-
-string_decoder@^1.0.0, string_decoder@~1.1.1:
-  version "1.1.1"
-  resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+string_decoder@^1.0.0, string_decoder@~1.0.3:
+  version "1.0.3"
+  resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
   dependencies:
     safe-buffer "~5.1.0"
 
@@ -7228,8 +7199,8 @@
   resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
 
 stringify-entities@^1.0.1:
-  version "1.3.2"
-  resolved "http://registry.npm.taobao.org/stringify-entities/download/stringify-entities-1.3.2.tgz#a98417e5471fd227b3e45d3db1861c11caf668f7"
+  version "1.3.1"
+  resolved "http://registry.npm.taobao.org/stringify-entities/download/stringify-entities-1.3.1.tgz#b150ec2d72ac4c1b5f324b51fb6b28c9cdff058c"
   dependencies:
     character-entities-html4 "^1.0.0"
     character-entities-legacy "^1.0.0"
@@ -7237,16 +7208,16 @@
     is-hexadecimal "^1.0.0"
 
 stringify-object@^3.2.0:
-  version "3.2.2"
-  resolved "http://registry.npm.taobao.org/stringify-object/download/stringify-object-3.2.2.tgz#9853052e5a88fb605a44cd27445aa257ad7ffbcd"
+  version "3.2.1"
+  resolved "http://registry.npm.taobao.org/stringify-object/download/stringify-object-3.2.1.tgz#2720c2eff940854c819f6ee252aaeb581f30624d"
   dependencies:
     get-own-enumerable-property-symbols "^2.0.1"
     is-obj "^1.0.1"
     is-regexp "^1.0.0"
 
 stringstream@~0.0.4, stringstream@~0.0.5:
-  version "0.0.6"
-  resolved "http://registry.npm.taobao.org/stringstream/download/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72"
+  version "0.0.5"
+  resolved "http://registry.npm.taobao.org/stringstream/download/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
 
 strip-ansi@^3.0.0, strip-ansi@^3.0.1:
   version "3.0.1"
@@ -7290,7 +7261,7 @@
 
 style-loader@^0.19.1:
   version "0.19.1"
-  resolved "http://registry.npm.taobao.org/style-loader/download/style-loader-0.19.1.tgz#591ffc80bcefe268b77c5d9ebc0505d772619f85"
+  resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.19.1.tgz#591ffc80bcefe268b77c5d9ebc0505d772619f85"
   dependencies:
     loader-utils "^1.0.2"
     schema-utils "^0.3.0"
@@ -7354,8 +7325,8 @@
     table "^4.0.1"
 
 stylus-loader@^3.0.1:
-  version "3.0.2"
-  resolved "http://registry.npm.taobao.org/stylus-loader/download/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6"
+  version "3.0.1"
+  resolved "http://registry.npm.taobao.org/stylus-loader/download/stylus-loader-3.0.1.tgz#77f4b34fd030d25b2617bcf5513db5b0730c4089"
   dependencies:
     loader-utils "^1.0.2"
     lodash.clonedeep "^4.5.0"
@@ -7394,9 +7365,15 @@
   dependencies:
     has-flag "^2.0.0"
 
-supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0:
-  version "5.4.0"
-  resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+supports-color@^5.1.0:
+  version "5.1.0"
+  resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-5.1.0.tgz#058a021d1b619f7ddf3980d712ea3590ce7de3d5"
+  dependencies:
+    has-flag "^2.0.0"
+
+supports-color@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.2.0.tgz#b0d5333b1184dd3666cbe5aa0b45c5ac7ac17a4a"
   dependencies:
     has-flag "^3.0.0"
 
@@ -7405,8 +7382,8 @@
   resolved "http://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
 
 sweetalert2@^7.0.0:
-  version "7.25.0"
-  resolved "http://registry.npm.taobao.org/sweetalert2/download/sweetalert2-7.25.0.tgz#b23293ad0e1e92c0bd3fdf85e18a352a66a09071"
+  version "7.3.5"
+  resolved "http://registry.npm.taobao.org/sweetalert2/download/sweetalert2-7.3.5.tgz#fc900404660aa107dccd0ca4c9c8e918187ec5aa"
 
 symbol-observable@1.0.1:
   version "1.0.1"
@@ -7417,11 +7394,11 @@
   resolved "http://registry.npm.taobao.org/symbol-observable/download/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40"
 
 table@^4.0.1:
-  version "4.0.3"
-  resolved "http://registry.npm.taobao.org/table/download/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc"
+  version "4.0.2"
+  resolved "http://registry.npm.taobao.org/table/download/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
   dependencies:
-    ajv "^6.0.1"
-    ajv-keywords "^3.0.0"
+    ajv "^5.2.3"
+    ajv-keywords "^2.1.0"
     chalk "^2.1.0"
     lodash "^4.17.4"
     slice-ansi "1.0.0"
@@ -7431,55 +7408,35 @@
   version "0.2.8"
   resolved "http://registry.npm.taobao.org/tapable/download/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
 
-tape@^4.5.1:
-  version "4.9.1"
-  resolved "http://registry.npm.taobao.org/tape/download/tape-4.9.1.tgz#1173d7337e040c76fbf42ec86fcabedc9b3805c9"
+tar-pack@^3.4.0:
+  version "3.4.1"
+  resolved "http://registry.npm.taobao.org/tar-pack/download/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f"
   dependencies:
-    deep-equal "~1.0.1"
-    defined "~1.0.0"
-    for-each "~0.3.3"
-    function-bind "~1.1.1"
-    glob "~7.1.2"
-    has "~1.0.3"
-    inherits "~2.0.3"
-    minimist "~1.2.0"
-    object-inspect "~1.6.0"
-    resolve "~1.7.1"
-    resumer "~0.0.0"
-    string.prototype.trim "~1.1.2"
-    through "~2.3.8"
+    debug "^2.2.0"
+    fstream "^1.0.10"
+    fstream-ignore "^1.0.5"
+    once "^1.3.3"
+    readable-stream "^2.1.4"
+    rimraf "^2.5.1"
+    tar "^2.2.1"
+    uid-number "^0.0.6"
 
 tar-stream@^1.5.0:
-  version "1.6.1"
-  resolved "http://registry.npm.taobao.org/tar-stream/download/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395"
+  version "1.5.5"
+  resolved "http://registry.npm.taobao.org/tar-stream/download/tar-stream-1.5.5.tgz#5cad84779f45c83b1f2508d96b09d88c7218af55"
   dependencies:
     bl "^1.0.0"
-    buffer-alloc "^1.1.0"
     end-of-stream "^1.0.0"
-    fs-constants "^1.0.0"
-    readable-stream "^2.3.0"
-    to-buffer "^1.1.0"
+    readable-stream "^2.0.0"
     xtend "^4.0.0"
 
-tar@^2.0.0:
+tar@^2.0.0, tar@^2.2.1:
   version "2.2.1"
   resolved "http://registry.npm.taobao.org/tar/download/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
   dependencies:
     block-stream "*"
     fstream "^1.0.2"
     inherits "2"
-
-tar@^4:
-  version "4.4.4"
-  resolved "http://registry.npm.taobao.org/tar/download/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
-  dependencies:
-    chownr "^1.0.1"
-    fs-minipass "^1.2.5"
-    minipass "^2.3.3"
-    minizlib "^1.1.0"
-    mkdirp "^0.5.0"
-    safe-buffer "^5.1.2"
-    yallist "^3.0.2"
 
 through2@2.0.1:
   version "2.0.1"
@@ -7495,13 +7452,13 @@
     readable-stream "^2.1.5"
     xtend "~4.0.1"
 
-through@2, through@X.X.X, through@~2.3, through@~2.3.1, through@~2.3.4, through@~2.3.8:
+through@2, through@X.X.X, through@~2.3, through@~2.3.1:
   version "2.3.8"
   resolved "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
 
-thunky@^1.0.2:
-  version "1.0.2"
-  resolved "http://registry.npm.taobao.org/thunky/download/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371"
+thunky@^0.1.0:
+  version "0.1.0"
+  resolved "http://registry.npm.taobao.org/thunky/download/thunky-0.1.0.tgz#bf30146824e2b6e67b0f2d7a4ac8beb26908684e"
 
 time-stamp@^1.0.0:
   version "1.1.0"
@@ -7512,8 +7469,8 @@
   resolved "http://registry.npm.taobao.org/time-stamp/download/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357"
 
 timers-browserify@^2.0.4:
-  version "2.0.10"
-  resolved "http://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
+  version "2.0.4"
+  resolved "http://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6"
   dependencies:
     setimmediate "^1.0.4"
 
@@ -7547,49 +7504,45 @@
   version "1.0.1"
   resolved "http://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
 
-to-buffer@^1.1.0:
-  version "1.1.1"
-  resolved "http://registry.npm.taobao.org/to-buffer/download/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
-
 to-fast-properties@^1.0.3:
   version "1.0.3"
   resolved "http://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
 
 to-object-path@^0.3.0:
   version "0.3.0"
-  resolved "http://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
   dependencies:
     kind-of "^3.0.2"
 
 to-regex-range@^2.1.0:
   version "2.1.1"
-  resolved "http://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
   dependencies:
     is-number "^3.0.0"
     repeat-string "^1.6.1"
 
-to-regex@^3.0.1, to-regex@^3.0.2:
+to-regex@^3.0.1:
   version "3.0.2"
-  resolved "http://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
   dependencies:
     define-property "^2.0.2"
     extend-shallow "^3.0.2"
     regex-not "^1.0.2"
     safe-regex "^1.1.0"
 
-topojson-client@^3.0.0:
+topojson-client@~3.0.0:
   version "3.0.0"
   resolved "http://registry.npm.taobao.org/topojson-client/download/topojson-client-3.0.0.tgz#1f99293a77ef42a448d032a81aa982b73f360d2f"
   dependencies:
     commander "2"
 
 toposort@^1.0.0:
-  version "1.0.7"
-  resolved "http://registry.npm.taobao.org/toposort/download/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
+  version "1.0.6"
+  resolved "http://registry.npm.taobao.org/toposort/download/toposort-1.0.6.tgz#c31748e55d210effc00fdcdc7d6e68d7d7bb9cec"
 
 tough-cookie@~2.3.0, tough-cookie@~2.3.3:
-  version "2.3.4"
-  resolved "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
+  version "2.3.3"
+  resolved "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
   dependencies:
     punycode "^1.4.1"
 
@@ -7610,16 +7563,16 @@
   resolved "http://registry.npm.taobao.org/trim-right/download/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
 
 trim-trailing-lines@^1.0.0:
-  version "1.1.1"
-  resolved "http://registry.npm.taobao.org/trim-trailing-lines/download/trim-trailing-lines-1.1.1.tgz#e0ec0810fd3c3f1730516b45f49083caaf2774d9"
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/trim-trailing-lines/download/trim-trailing-lines-1.1.0.tgz#7aefbb7808df9d669f6da2e438cac8c46ada7684"
 
 trim@0.0.1:
   version "0.0.1"
   resolved "http://registry.npm.taobao.org/trim/download/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
 
 trough@^1.0.0:
-  version "1.0.2"
-  resolved "http://registry.npm.taobao.org/trough/download/trough-1.0.2.tgz#7f1663ec55c480139e2de5e486c6aef6cc24a535"
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/trough/download/trough-1.0.1.tgz#a9fd8b0394b0ae8fff82e0633a0a36ccad5b5f86"
 
 "true-case-path@^1.0.2":
   version "1.0.2"
@@ -7628,8 +7581,8 @@
     glob "^6.0.4"
 
 tryer@^1.0.0:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/tryer/download/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.0.tgz#027b69fa823225e551cace3ef03b11f6ab37c1d7"
 
 ts-node@~3.2.0:
   version "3.2.2"
@@ -7653,18 +7606,18 @@
     strip-bom "^3.0.0"
     strip-json-comments "^2.0.0"
 
-tsickle@^0.27.2:
-  version "0.27.5"
-  resolved "http://registry.npm.taobao.org/tsickle/download/tsickle-0.27.5.tgz#41e1a41a5acf971cbb2b0558a9590779234d591f"
+tsickle@^0.25.5:
+  version "0.25.6"
+  resolved "http://registry.npm.taobao.org/tsickle/download/tsickle-0.25.6.tgz#b595db16b236721824eeeda8bb262365b47ef334"
   dependencies:
     minimist "^1.2.0"
     mkdirp "^0.5.1"
-    source-map "^0.6.0"
-    source-map-support "^0.5.0"
+    source-map "^0.5.6"
+    source-map-support "^0.4.2"
 
 tslib@^1.7.1, tslib@^1.8.1:
-  version "1.9.3"
-  resolved "http://registry.npm.taobao.org/tslib/download/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
+  version "1.8.1"
+  resolved "http://registry.npm.taobao.org/tslib/download/tslib-1.8.1.tgz#6946af2d1d651a7b1863b531d6e5afa41aa44eac"
 
 tslint@~5.7.0:
   version "5.7.0"
@@ -7682,8 +7635,8 @@
     tsutils "^2.8.1"
 
 tsutils@^2.8.1:
-  version "2.27.2"
-  resolved "http://registry.npm.taobao.org/tsutils/download/tsutils-2.27.2.tgz#60ba88a23d6f785ec4b89c6e8179cac9b431f1c7"
+  version "2.16.0"
+  resolved "http://registry.npm.taobao.org/tsutils/download/tsutils-2.16.0.tgz#ad8e83f47bef4f7d24d173cc6cd180990c831105"
   dependencies:
     tslib "^1.8.1"
 
@@ -7697,6 +7650,10 @@
   dependencies:
     safe-buffer "^5.0.1"
 
+tunnel-agent@~0.4.1:
+  version "0.4.3"
+  resolved "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
+
 tweetnacl@^0.14.3, tweetnacl@~0.14.0:
   version "0.14.5"
   resolved "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
@@ -7707,40 +7664,40 @@
   dependencies:
     prelude-ls "~1.1.2"
 
-type-is@~1.6.15, type-is@~1.6.16:
-  version "1.6.16"
-  resolved "http://registry.npm.taobao.org/type-is/download/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
+type-is@~1.6.15:
+  version "1.6.15"
+  resolved "http://registry.npm.taobao.org/type-is/download/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
   dependencies:
     media-typer "0.3.0"
-    mime-types "~2.1.18"
+    mime-types "~2.1.15"
 
 typedarray@^0.0.6:
   version "0.0.6"
   resolved "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
 
-typescript@~2.5.0:
+typescript@~2.5.3:
   version "2.5.3"
-  resolved "http://registry.npm.taobao.org/typescript/download/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d"
 
 typescript@~2.6.2:
   version "2.6.2"
-  resolved "http://registry.npm.taobao.org/typescript/download/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4"
 
 uglify-es@^3.3.4:
-  version "3.3.9"
-  resolved "http://registry.npm.taobao.org/uglify-es/download/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
+  version "3.3.5"
+  resolved "http://registry.npm.taobao.org/uglify-es/download/uglify-es-3.3.5.tgz#cf7e695da81999f85196b15e2978862f13212f88"
   dependencies:
-    commander "~2.13.0"
+    commander "~2.12.1"
     source-map "~0.6.1"
 
-uglify-js@3.4.x:
-  version "3.4.4"
-  resolved "http://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.4.tgz#92e79532a3aeffd4b6c65755bdba8d5bad98d607"
+uglify-js@3.3.x:
+  version "3.3.5"
+  resolved "http://registry.npm.taobao.org/uglify-js/download/uglify-js-3.3.5.tgz#4c4143dfe08e8825746675cc49a6874a933b543e"
   dependencies:
-    commander "~2.16.0"
+    commander "~2.12.1"
     source-map "~0.6.1"
 
-uglify-js@^2.6, uglify-js@^2.6.2, uglify-js@^2.8.29:
+uglify-js@^2.6, uglify-js@^2.8.29:
   version "2.8.29"
   resolved "http://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
   dependencies:
@@ -7762,21 +7719,29 @@
     webpack-sources "^1.0.1"
 
 uglifyjs-webpack-plugin@^1.1.8:
-  version "1.2.7"
-  resolved "http://registry.npm.taobao.org/uglifyjs-webpack-plugin/download/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00"
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.2.tgz#e7516d4367afdb715c3847841eb46f94c45ca2b9"
   dependencies:
-    cacache "^10.0.4"
+    cacache "^10.0.1"
     find-cache-dir "^1.0.0"
-    schema-utils "^0.4.5"
+    schema-utils "^0.4.2"
     serialize-javascript "^1.4.0"
     source-map "^0.6.1"
     uglify-es "^3.3.4"
     webpack-sources "^1.1.0"
     worker-farm "^1.5.2"
 
+uid-number@^0.0.6:
+  version "0.0.6"
+  resolved "http://registry.npm.taobao.org/uid-number/download/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
+
 ultron@1.0.x:
   version "1.0.2"
   resolved "http://registry.npm.taobao.org/ultron/download/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
+
+ultron@~1.1.0:
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/ultron/download/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
 
 underscore.string@3.3.4:
   version "3.3.4"
@@ -7786,26 +7751,27 @@
     util-deprecate "^1.0.2"
 
 unherit@^1.0.4:
-  version "1.1.1"
-  resolved "http://registry.npm.taobao.org/unherit/download/unherit-1.1.1.tgz#132748da3e88eab767e08fabfbb89c5e9d28628c"
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/unherit/download/unherit-1.1.0.tgz#6b9aaedfbf73df1756ad9e316dd981885840cd7d"
   dependencies:
     inherits "^2.0.1"
     xtend "^4.0.1"
 
 unified@^6.0.0:
-  version "6.2.0"
-  resolved "http://registry.npm.taobao.org/unified/download/unified-6.2.0.tgz#7fbd630f719126d67d40c644b7e3f617035f6dba"
+  version "6.1.6"
+  resolved "http://registry.npm.taobao.org/unified/download/unified-6.1.6.tgz#5ea7f807a0898f1f8acdeefe5f25faa010cc42b1"
   dependencies:
     bail "^1.0.0"
     extend "^3.0.0"
     is-plain-obj "^1.1.0"
     trough "^1.0.0"
     vfile "^2.0.0"
+    x-is-function "^1.0.4"
     x-is-string "^0.1.0"
 
 union-value@^1.0.0:
   version "1.0.0"
-  resolved "http://registry.npm.taobao.org/union-value/download/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
   dependencies:
     arr-union "^3.1.0"
     get-value "^2.0.6"
@@ -7829,40 +7795,40 @@
     imurmurhash "^0.1.4"
 
 unist-util-find-all-after@^1.0.1:
-  version "1.0.2"
-  resolved "http://registry.npm.taobao.org/unist-util-find-all-after/download/unist-util-find-all-after-1.0.2.tgz#9be49cfbae5ca1566b27536670a92836bf2f8d6d"
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/unist-util-find-all-after/download/unist-util-find-all-after-1.0.1.tgz#4e5512abfef7e0616781aecf7b1ed751c00af908"
   dependencies:
     unist-util-is "^2.0.0"
 
 unist-util-is@^2.0.0, unist-util-is@^2.1.1:
-  version "2.1.2"
-  resolved "http://registry.npm.taobao.org/unist-util-is/download/unist-util-is-2.1.2.tgz#1193fa8f2bfbbb82150633f3a8d2eb9a1c1d55db"
+  version "2.1.1"
+  resolved "http://registry.npm.taobao.org/unist-util-is/download/unist-util-is-2.1.1.tgz#0c312629e3f960c66e931e812d3d80e77010947b"
 
 unist-util-modify-children@^1.0.0:
-  version "1.1.2"
-  resolved "http://registry.npm.taobao.org/unist-util-modify-children/download/unist-util-modify-children-1.1.2.tgz#c7f1b91712554ee59c47a05b551ed3e052a4e2d1"
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/unist-util-modify-children/download/unist-util-modify-children-1.1.1.tgz#66d7e6a449e6f67220b976ab3cb8b5ebac39e51d"
   dependencies:
     array-iterate "^1.0.0"
 
 unist-util-remove-position@^1.0.0:
-  version "1.1.2"
-  resolved "http://registry.npm.taobao.org/unist-util-remove-position/download/unist-util-remove-position-1.1.2.tgz#86b5dad104d0bbfbeb1db5f5c92f3570575c12cb"
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/unist-util-remove-position/download/unist-util-remove-position-1.1.1.tgz#5a85c1555fc1ba0c101b86707d15e50fa4c871bb"
   dependencies:
     unist-util-visit "^1.1.0"
 
 unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1:
-  version "1.1.2"
-  resolved "http://registry.npm.taobao.org/unist-util-stringify-position/download/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6"
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/unist-util-stringify-position/download/unist-util-stringify-position-1.1.1.tgz#3ccbdc53679eed6ecf3777dd7f5e3229c1b6aa3c"
 
 unist-util-visit@^1.1.0:
-  version "1.3.1"
-  resolved "http://registry.npm.taobao.org/unist-util-visit/download/unist-util-visit-1.3.1.tgz#c019ac9337a62486be58531bc27e7499ae7d55c7"
+  version "1.3.0"
+  resolved "http://registry.npm.taobao.org/unist-util-visit/download/unist-util-visit-1.3.0.tgz#41ca7c82981fd1ce6c762aac397fc24e35711444"
   dependencies:
     unist-util-is "^2.1.1"
 
 universalify@^0.1.0:
-  version "0.1.2"
-  resolved "http://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+  version "0.1.1"
+  resolved "http://registry.npm.taobao.org/universalify/download/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7"
 
 unpipe@1.0.0, unpipe@~1.0.0:
   version "1.0.0"
@@ -7870,28 +7836,22 @@
 
 unset-value@^1.0.0:
   version "1.0.0"
-  resolved "http://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
   dependencies:
     has-value "^0.3.1"
     isobject "^3.0.0"
 
-upath@^1.0.5:
-  version "1.1.0"
-  resolved "http://registry.npm.taobao.org/upath/download/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
+upath@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d"
 
 upper-case@^1.1.1:
   version "1.1.3"
   resolved "http://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
 
-uri-js@^4.2.1:
-  version "4.2.2"
-  resolved "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
-  dependencies:
-    punycode "^2.1.0"
-
 urix@^0.1.0:
   version "0.1.0"
-  resolved "http://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
 
 url-loader@^0.6.2:
   version "0.6.2"
@@ -7901,12 +7861,19 @@
     mime "^1.4.1"
     schema-utils "^0.3.0"
 
-url-parse@^1.1.8, url-parse@~1.4.0:
-  version "1.4.1"
-  resolved "http://registry.npm.taobao.org/url-parse/download/url-parse-1.4.1.tgz#4dec9dad3dc8585f862fed461d2e19bbf623df30"
+url-parse@1.0.x:
+  version "1.0.5"
+  resolved "http://registry.npm.taobao.org/url-parse/download/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b"
   dependencies:
-    querystringify "^2.0.0"
-    requires-port "^1.0.0"
+    querystringify "0.0.x"
+    requires-port "1.0.x"
+
+url-parse@^1.1.8:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/url-parse/download/url-parse-1.2.0.tgz#3a19e8aaa6d023ddd27dcc44cb4fc8f7fec23986"
+  dependencies:
+    querystringify "~1.0.0"
+    requires-port "~1.0.0"
 
 url@^0.11.0:
   version "0.11.0"
@@ -7915,38 +7882,34 @@
     punycode "1.3.2"
     querystring "0.2.0"
 
-urlgrey@^0.4.4:
+urlgrey@0.4.4:
   version "0.4.4"
   resolved "http://registry.npm.taobao.org/urlgrey/download/urlgrey-0.4.4.tgz#892fe95960805e85519f1cd4389f2cb4cbb7652f"
 
-use@^3.1.0:
-  version "3.1.0"
-  resolved "http://registry.npm.taobao.org/use/download/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544"
+use@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8"
   dependencies:
-    kind-of "^6.0.2"
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    lazy-cache "^2.0.2"
 
 useragent@^2.1.12:
-  version "2.3.0"
-  resolved "http://registry.npm.taobao.org/useragent/download/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972"
+  version "2.2.1"
+  resolved "http://registry.npm.taobao.org/useragent/download/useragent-2.2.1.tgz#cf593ef4f2d175875e8bb658ea92e18a4fd06d8e"
   dependencies:
-    lru-cache "4.1.x"
+    lru-cache "2.2.x"
     tmp "0.0.x"
 
 util-deprecate@^1.0.2, util-deprecate@~1.0.1:
   version "1.0.2"
   resolved "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
 
-util@0.10.3:
+util@0.10.3, util@^0.10.3:
   version "0.10.3"
   resolved "http://registry.npm.taobao.org/util/download/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
   dependencies:
     inherits "2.0.1"
-
-util@^0.10.3:
-  version "0.10.4"
-  resolved "http://registry.npm.taobao.org/util/download/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
-  dependencies:
-    inherits "2.0.3"
 
 utila@~0.3:
   version "0.3.3"
@@ -7960,22 +7923,26 @@
   version "1.0.1"
   resolved "http://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
 
-uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0:
-  version "3.3.2"
-  resolved "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+uuid@^3.0.0, uuid@^3.1.0:
+  version "3.1.0"
+  resolved "http://registry.npm.taobao.org/uuid/download/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
+
+uuid@^3.0.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
 
 v8flags@^3.0.0:
-  version "3.1.1"
-  resolved "http://registry.npm.taobao.org/v8flags/download/v8flags-3.1.1.tgz#42259a1461c08397e37fe1d4f1cfb59cad85a053"
+  version "3.0.1"
+  resolved "http://registry.npm.taobao.org/v8flags/download/v8flags-3.0.1.tgz#dce8fc379c17d9f2c9e9ed78d89ce00052b1b76b"
   dependencies:
     homedir-polyfill "^1.0.1"
 
 validate-npm-package-license@^3.0.1:
-  version "3.0.3"
-  resolved "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338"
+  version "3.0.1"
+  resolved "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
   dependencies:
-    spdx-correct "^3.0.0"
-    spdx-expression-parse "^3.0.0"
+    spdx-correct "~1.0.0"
+    spdx-expression-parse "~1.0.0"
 
 vargs@0.1.0:
   version "0.1.0"
@@ -7984,14 +7951,6 @@
 vary@~1.1.2:
   version "1.1.2"
   resolved "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
-
-venn.js@~0.2.20:
-  version "0.2.20"
-  resolved "http://registry.npm.taobao.org/venn.js/download/venn.js-0.2.20.tgz#3f0e50cc75cba1f58692a8a32f67bd7aaf1aa6fa"
-  dependencies:
-    d3-selection "^1.0.2"
-    d3-transition "^1.0.1"
-    fmin "0.0.2"
 
 verror@1.10.0:
   version "1.10.0"
@@ -8002,12 +7961,12 @@
     extsprintf "^1.2.0"
 
 vfile-location@^2.0.0:
-  version "2.0.3"
-  resolved "http://registry.npm.taobao.org/vfile-location/download/vfile-location-2.0.3.tgz#083ba80e50968e8d420be49dd1ea9a992131df77"
+  version "2.0.2"
+  resolved "http://registry.npm.taobao.org/vfile-location/download/vfile-location-2.0.2.tgz#d3675c59c877498e492b4756ff65e4af1a752255"
 
 vfile-message@^1.0.0:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/vfile-message/download/vfile-message-1.0.1.tgz#51a2ccd8a6b97a7980bb34efb9ebde9632e93677"
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/vfile-message/download/vfile-message-1.0.0.tgz#a6adb0474ea400fa25d929f1d673abea6a17e359"
   dependencies:
     unist-util-stringify-position "^1.1.1"
 
@@ -8028,7 +7987,7 @@
     clone-stats "^0.0.1"
     replace-ext "0.0.1"
 
-vlq@^0.2.2:
+vlq@^0.2.1:
   version "0.2.3"
   resolved "http://registry.npm.taobao.org/vlq/download/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26"
 
@@ -8038,34 +7997,42 @@
   dependencies:
     indexof "0.0.1"
 
+voc@~1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/voc/download/voc-1.0.0.tgz#5465c0ce11d0881f7d8e36d8ca587043f33a25ae"
+
 void-elements@^2.0.0:
   version "2.0.1"
   resolved "http://registry.npm.taobao.org/void-elements/download/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
 
+walkdir@^0.0.11:
+  version "0.0.11"
+  resolved "http://registry.npm.taobao.org/walkdir/download/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532"
+
 watchpack@^1.4.0:
-  version "1.6.0"
-  resolved "http://registry.npm.taobao.org/watchpack/download/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
+  version "1.4.0"
+  resolved "http://registry.npm.taobao.org/watchpack/download/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac"
   dependencies:
-    chokidar "^2.0.2"
+    async "^2.1.2"
+    chokidar "^1.7.0"
     graceful-fs "^4.1.2"
-    neo-async "^2.5.0"
 
 wbuf@^1.1.0, wbuf@^1.7.2:
-  version "1.7.3"
-  resolved "http://registry.npm.taobao.org/wbuf/download/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df"
+  version "1.7.2"
+  resolved "http://registry.npm.taobao.org/wbuf/download/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe"
   dependencies:
     minimalistic-assert "^1.0.0"
 
 wd@^1.4.0:
-  version "1.10.1"
-  resolved "http://registry.npm.taobao.org/wd/download/wd-1.10.1.tgz#06cfe70a4903d7359f155866b8bafbe30aaccc3e"
+  version "1.5.0"
+  resolved "http://registry.npm.taobao.org/wd/download/wd-1.5.0.tgz#45c96a16ff9f8c0f9e7ca90f806a8b48bd0034d6"
   dependencies:
-    archiver "2.1.1"
+    archiver "1.3.0"
     async "2.0.1"
-    lodash "4.17.10"
+    lodash "4.16.2"
     mkdirp "^0.5.1"
     q "1.4.1"
-    request "2.85.0"
+    request "2.79.0"
     underscore.string "3.3.4"
     vargs "0.1.0"
 
@@ -8081,24 +8048,24 @@
     selenium-webdriver "^2.53.2"
 
 webdriver-manager@^12.0.6:
-  version "12.1.0"
-  resolved "http://registry.npm.taobao.org/webdriver-manager/download/webdriver-manager-12.1.0.tgz#f6601e52de5f0c97fc7024c889eeb2416f2f1d9d"
+  version "12.0.6"
+  resolved "http://registry.npm.taobao.org/webdriver-manager/download/webdriver-manager-12.0.6.tgz#3df1a481977010b4cbf8c9d85c7a577828c0e70b"
   dependencies:
-    adm-zip "^0.4.9"
+    adm-zip "^0.4.7"
     chalk "^1.1.1"
     del "^2.2.0"
     glob "^7.0.3"
     ini "^1.3.4"
     minimist "^1.2.0"
     q "^1.4.1"
-    request "^2.87.0"
+    request "^2.78.0"
     rimraf "^2.5.2"
     semver "^5.3.0"
     xml2js "^0.4.17"
 
 webpack-bundle-analyzer@^2.9.0:
-  version "2.13.1"
-  resolved "http://registry.npm.taobao.org/webpack-bundle-analyzer/download/webpack-bundle-analyzer-2.13.1.tgz#07d2176c6e86c3cdce4c23e56fae2a7b6b4ad526"
+  version "2.10.0"
+  resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.10.0.tgz#d0646cda342939f6f05eb632a090abbd90317446"
   dependencies:
     acorn "^5.3.0"
     bfj-node4 "^5.2.0"
@@ -8132,7 +8099,7 @@
 
 webpack-dev-server@~2.11.0:
   version "2.11.2"
-  resolved "http://registry.npm.taobao.org/webpack-dev-server/download/webpack-dev-server-2.11.2.tgz#1f4f4c78bf1895378f376815910812daf79a216f"
+  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz#1f4f4c78bf1895378f376815910812daf79a216f"
   dependencies:
     ansi-html "0.0.7"
     array-includes "^3.0.3"
@@ -8163,10 +8130,10 @@
     yargs "6.6.0"
 
 webpack-merge@^4.1.0:
-  version "4.1.3"
-  resolved "http://registry.npm.taobao.org/webpack-merge/download/webpack-merge-4.1.3.tgz#8aaff2108a19c29849bc9ad2a7fd7fce68e87c4a"
+  version "4.1.1"
+  resolved "http://registry.npm.taobao.org/webpack-merge/download/webpack-merge-4.1.1.tgz#f1197a0a973e69c6fbeeb6d658219aa8c0c13555"
   dependencies:
-    lodash "^4.17.5"
+    lodash "^4.17.4"
 
 webpack-sources@^1.0.0, webpack-sources@^1.0.1, webpack-sources@^1.1.0:
   version "1.1.0"
@@ -8176,14 +8143,14 @@
     source-map "~0.6.1"
 
 webpack-subresource-integrity@^1.0.1:
-  version "1.0.4"
-  resolved "http://registry.npm.taobao.org/webpack-subresource-integrity/download/webpack-subresource-integrity-1.0.4.tgz#8fac8a7e8eb59fc6a16768a85c9d94ee7f9d0edb"
+  version "1.0.3"
+  resolved "http://registry.npm.taobao.org/webpack-subresource-integrity/download/webpack-subresource-integrity-1.0.3.tgz#c0606d40090b070cde428bec8df3603216e472eb"
   dependencies:
     webpack-core "^0.6.8"
 
 webpack@~3.11.0:
   version "3.11.0"
-  resolved "http://registry.npm.taobao.org/webpack/download/webpack-3.11.0.tgz#77da451b1d7b4b117adaf41a1a93b5742f24d894"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.11.0.tgz#77da451b1d7b4b117adaf41a1a93b5742f24d894"
   dependencies:
     acorn "^5.0.0"
     acorn-dynamic-import "^2.0.0"
@@ -8232,28 +8199,28 @@
   resolved "http://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
 
 which@1, which@^1.1.1, which@^1.2.1, which@^1.2.10, which@^1.2.9:
-  version "1.3.1"
-  resolved "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+  version "1.3.0"
+  resolved "http://registry.npm.taobao.org/which/download/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
   dependencies:
     isexe "^2.0.0"
 
 wide-align@^1.1.0:
-  version "1.1.3"
-  resolved "http://registry.npm.taobao.org/wide-align/download/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+  version "1.1.2"
+  resolved "http://registry.npm.taobao.org/wide-align/download/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
   dependencies:
-    string-width "^1.0.2 || 2"
+    string-width "^1.0.2"
 
 window-size@0.1.0:
   version "0.1.0"
   resolved "http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
 
-wolfy87-eventemitter@^5.1.0:
-  version "5.2.5"
-  resolved "http://registry.npm.taobao.org/wolfy87-eventemitter/download/wolfy87-eventemitter-5.2.5.tgz#e7af2adbb84e481c65edeb2a2e01032c8ff1b88f"
-
 wolfy87-eventemitter@~5.1.0:
   version "5.1.0"
   resolved "http://registry.npm.taobao.org/wolfy87-eventemitter/download/wolfy87-eventemitter-5.1.0.tgz#35c1ac0dd1ac0c15e35d981508fc22084a13a011"
+
+wolfy87-eventemitter@~5.2.4:
+  version "5.2.4"
+  resolved "http://registry.npm.taobao.org/wolfy87-eventemitter/download/wolfy87-eventemitter-5.2.4.tgz#5021d2952d3611cbcd195149711d9b595cd11d48"
 
 wordwrap@0.0.2:
   version "0.0.2"
@@ -8268,10 +8235,11 @@
   resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
 
 worker-farm@^1.5.2:
-  version "1.6.0"
-  resolved "http://registry.npm.taobao.org/worker-farm/download/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
+  version "1.5.2"
+  resolved "http://registry.npm.taobao.org/worker-farm/download/worker-farm-1.5.2.tgz#32b312e5dc3d5d45d79ef44acc2587491cd729ae"
   dependencies:
-    errno "~0.1.7"
+    errno "^0.1.4"
+    xtend "^4.0.1"
 
 wrap-ansi@^2.0.0:
   version "2.1.0"
@@ -8305,19 +8273,40 @@
     ultron "1.0.x"
 
 ws@^4.0.0:
-  version "4.1.0"
-  resolved "http://registry.npm.taobao.org/ws/download/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289"
+  version "4.0.0"
+  resolved "http://registry.npm.taobao.org/ws/download/ws-4.0.0.tgz#bfe1da4c08eeb9780b986e0e4d10eccd7345999f"
   dependencies:
     async-limiter "~1.0.0"
     safe-buffer "~5.1.0"
+    ultron "~1.1.0"
 
 wtf-8@1.0.0:
   version "1.0.0"
   resolved "http://registry.npm.taobao.org/wtf-8/download/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a"
 
+x-is-function@^1.0.4:
+  version "1.0.4"
+  resolved "http://registry.npm.taobao.org/x-is-function/download/x-is-function-1.0.4.tgz#5d294dc3d268cbdd062580e0c5df77a391d1fa1e"
+
 x-is-string@^0.1.0:
   version "0.1.0"
   resolved "http://registry.npm.taobao.org/x-is-string/download/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82"
+
+xlsx@^0.11.16:
+  version "0.11.17"
+  resolved "http://registry.npm.taobao.org/xlsx/download/xlsx-0.11.17.tgz#507461fb9783ad0afe1cf751aeb59956e93232da"
+  dependencies:
+    adler-32 "~1.1.0"
+    cfb "~1.0.1"
+    codepage "~1.11.0"
+    commander "~2.11.0"
+    crc-32 "~1.1.1"
+    exit-on-epipe "~1.0.1"
+    ssf "~0.10.1"
+
+xml-char-classes@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/xml-char-classes/download/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d"
 
 xml2js@0.4.4:
   version "0.4.4"
@@ -8333,13 +8322,9 @@
     sax ">=0.6.0"
     xmlbuilder "~9.0.1"
 
-xmlbuilder@>=1.0.0:
-  version "10.0.0"
-  resolved "http://registry.npm.taobao.org/xmlbuilder/download/xmlbuilder-10.0.0.tgz#c64e52f8ae097fe5fd46d1c38adaade071ee1b55"
-
-xmlbuilder@~9.0.1:
-  version "9.0.7"
-  resolved "http://registry.npm.taobao.org/xmlbuilder/download/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
+xmlbuilder@>=1.0.0, xmlbuilder@~9.0.1:
+  version "9.0.4"
+  resolved "http://registry.npm.taobao.org/xmlbuilder/download/xmlbuilder-9.0.4.tgz#519cb4ca686d005a8420d3496f3f0caeecca580f"
 
 xmlhttprequest-ssl@1.5.3:
   version "1.5.3"
@@ -8350,26 +8335,18 @@
   resolved "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
 
 xxhashjs@^0.2.1:
-  version "0.2.2"
-  resolved "http://registry.npm.taobao.org/xxhashjs/download/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8"
+  version "0.2.1"
+  resolved "http://registry.npm.taobao.org/xxhashjs/download/xxhashjs-0.2.1.tgz#9bbe9be896142976dfa34c061b2d068c43d30de0"
   dependencies:
-    cuint "^0.2.2"
+    cuint latest
 
 y18n@^3.2.1:
   version "3.2.1"
   resolved "http://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
 
-y18n@^4.0.0:
-  version "4.0.0"
-  resolved "http://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
-
 yallist@^2.1.2:
   version "2.1.2"
   resolved "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
-
-yallist@^3.0.0, yallist@^3.0.2:
-  version "3.0.2"
-  resolved "http://registry.npm.taobao.org/yallist/download/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
 
 yargs-parser@^4.2.0:
   version "4.2.1"
@@ -8391,7 +8368,7 @@
 
 yargs@6.6.0:
   version "6.6.0"
-  resolved "http://registry.npm.taobao.org/yargs/download/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
   dependencies:
     camelcase "^3.0.0"
     cliui "^3.2.0"
@@ -8460,7 +8437,7 @@
   version "2.0.0"
   resolved "http://registry.npm.taobao.org/yn/download/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
 
-zip-stream@^1.2.0:
+zip-stream@^1.1.0:
   version "1.2.0"
   resolved "http://registry.npm.taobao.org/zip-stream/download/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04"
   dependencies:
@@ -8469,6 +8446,10 @@
     lodash "^4.8.0"
     readable-stream "^2.0.0"
 
-zone.js@^0.8.14, zone.js@^0.8.18, zone.js@^0.8.19:
-  version "0.8.26"
-  resolved "http://registry.npm.taobao.org/zone.js/download/zone.js-0.8.26.tgz#7bdd72f7668c5a7ad6b118148b4ea39c59d08d2d"
+zone.js@^0.8.14, zone.js@^0.8.18:
+  version "0.8.19"
+  resolved "http://registry.npm.taobao.org/zone.js/download/zone.js-0.8.19.tgz#a4b522cd9e8b7b616a638c297d720d4c7f292f71"
+
+zrender@4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/zrender/-/zrender-4.0.3.tgz#801ef001101750a61857f84e64c4d5fb3c88cca7"

--
Gitblit v1.8.0