diff --git a/.gitignore b/.gitignore
index dc99ae877bb12722f60c567114629f5e6775dff8..15cceb3616f81705edf47ec66f3850c3431e2065 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,3 +23,6 @@ package-lock.json
*.njsproj
*.sln
*.sw?
+
+logs
+run
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..cc107b5f28868c3f66b32377e9b9c0deb26561ca
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,205 @@
+# [4.8.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.6.0...4.8.0) (2019-11-08)
+
+
+### Features
+
+* ssr asyncData ([21e5b62](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/21e5b62))
+* use easy-team mode ([473617a](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/473617a))
+
+
+
+# [4.7.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.6.0...4.7.0) (2019-10-13)
+
+
+### Features
+
+* use easy-team mode ([473617a](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/473617a))
+
+
+
+# [4.6.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.4.6...4.6.0) (2019-10-13)
+
+
+### Bug Fixes
+
+* server side render hydrate not effective ([8ef6aa8](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/8ef6aa8))
+* server side render hydrate not effective ([7f1192f](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/7f1192f))
+
+
+### Features
+
+* add inject css and js demo ([11b6083](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/11b6083))
+* inject script tag demoe ([713fb43](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/713fb43))
+* load component on demand ([c95aecd](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/c95aecd))
+* set title ([fb99718](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/fb99718))
+* use easy-team mode ([36d74e3](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/36d74e3))
+
+
+
+# [4.5.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.4.6...4.5.0) (2019-08-02)
+
+
+### Bug Fixes
+
+* server side render hydrate not effective ([8ef6aa8](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/8ef6aa8))
+
+
+### Features
+
+* set title ([fb99718](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/fb99718))
+
+
+
+## [4.4.6](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.4.5...4.4.6) (2018-12-12)
+
+
+### Bug Fixes
+
+* not set baseUrl for axios ([d23a8c9](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/d23a8c9))
+
+
+
+## [4.4.5](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.4.2...4.4.5) (2018-11-06)
+
+
+### Bug Fixes
+
+* https://github.com/easy-team/egg-vue-webpack-boilerplate/issues/88 ([cd47e3a](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/cd47e3a))
+* https://github.com/easy-team/egg-vue-webpack-boilerplate/issues/99 ([4218f85](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/4218f85))
+* imagemini plugin no install ([f80b54c](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/f80b54c))
+
+
+### Features
+
+* add link asset file example ([cb81976](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/cb81976))
+
+# [4.4.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.3.0...4.4.0) (2018-10-09)
+
+
+### Bug Fixes
+
+* egg worker reload for config/manifest.json update ([c1df7f1](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/c1df7f1))
+
+
+### Features
+
+* simplified configuration ([1854282](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/1854282))
+* webpack zero config implement ([16ea32e](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/16ea32e))
+
+
+
+# [4.3.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.0.0...4.3.0) (2018-09-11)
+
+
+### Bug Fixes
+
+* add article and login style ([c510473](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/c510473))
+* ajax cross origin ([d9998de](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/d9998de))
+* article add and delete ([2a65c15](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/2a65c15))
+* autoprefixer invalid ([4e497df](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/4e497df))
+* dev local spa request error ([a79a408](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/a79a408))
+* id params ([21d8b39](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/21d8b39))
+* remove webpack4 compatible ([1734520](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/1734520))
+
+
+### Features
+
+* add component async load demo ([b8b3eaf](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/b8b3eaf))
+* add i18n menu ([b7f65b0](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/b7f65b0))
+* add npm clean command ([be4177d](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/be4177d))
+* admin dashboard ([e63dc83](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/e63dc83))
+* support i18n ([752baad](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/752baad))
+* use egg-bin and egg-scripts ([cf85319](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/cf85319))
+
+
+### Performance Improvements
+
+* build by BABEL_ENV ([8d05f71](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/8d05f71))
+
+
+
+# [4.0.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/3.5.0...4.0.0) (2018-03-07)
+
+
+### Bug Fixes
+
+* babel-eslint deps ([d7bb91a](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/d7bb91a))
+* dll remove element-ui ([a58a5ec](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/a58a5ec))
+* hack webpack, webpack issue 6681 ([e9ecb4c](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/e9ecb4c))
+
+
+### Features
+
+* add debug command ([aa7b344](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/aa7b344))
+* add dynamic vue componnet demo ([1768ee0](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/1768ee0))
+* dll ([f5c5679](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/f5c5679))
+* dll and lib support ([bf0019c](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/bf0019c))
+* spa dynamic import vue component ([a95b75f](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/a95b75f))
+* spa use loader template ([09ea960](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/09ea960))
+* support cli build dll and auto check dll file ([2f7e61a](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/2f7e61a))
+* support html dll inject ([880cad4](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/880cad4))
+* upgrade egg to 2.0.0 and node to 8 ([1313931](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/1313931))
+* use .vue file as webpack entry ([9622d86](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/9622d86))
+* use easywebpack env ([3d6ca7b](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/3d6ca7b))
+* webpack 4 deps ([b245087](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/b245087))
+* webpack4 ([2d58278](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/2d58278))
+* webpack4 running ([a9e46e2](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/a9e46e2))
+* webpack4 service worker adapter ([456ca48](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/456ca48))
+
+
+
+## [3.2.2](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/v3.0.3...3.2.2) (2017-11-29)
+
+
+### Bug Fixes
+
+* element ui css link url ([f265956](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/f265956))
+
+
+### Features
+
+* support import css in js file ([b32a082](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/b32a082))
+
+
+
+## [3.0.3](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/v3.0.2...v3.0.3) (2017-10-26)
+
+
+
+## [3.0.2](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/v3.0.1...v3.0.2) (2017-10-26)
+
+
+
+## [3.0.1](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/3.0.0...v3.0.1) (2017-10-26)
+
+
+### Features
+
+* add autoprefixer config ([be6837b](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/be6837b))
+
+
+
+# [3.0.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/1.3.1...3.0.0) (2017-09-13)
+
+
+
+## [1.3.1](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/1.2.0...1.3.1) (2017-08-29)
+
+
+### Bug Fixes
+
+* default node6 , node8 please see app/controller/await/await.js description ([75d0c57](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/75d0c57))
+
+
+
+# [1.2.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/1.0.0...1.2.0) (2017-08-21)
+
+
+
+# [1.0.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/0.6.0...1.0.0) (2017-05-25)
+
+
+## 0.0.1 (2017-04-24)
+
+
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..6c44e1440c56da18e8cf5a86c7b20a041de7af5b
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2017 sky.
+
+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.md b/README.md
new file mode 100755
index 0000000000000000000000000000000000000000..c3291c67ee2d08f659f2d695304039320f6d60c5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,425 @@
+# egg-vue-webpack-boilerplate
+
+> 功能性需求或者Bug问题, 欢迎大家 PR 完善, 如果你需要了解更多信息,请加QQ群: 433207205(备注:Node.js).
+
+
+基于 Egg + Vue + Webpack SSR 服务端渲染工程骨架项目,包括前台系统(SSR MPA)和后台管理系统(SSR SPA)。 如果要深入了解,建议请先阅读 https://www.yuque.com/easy-team/egg-vue 专题。
+
+## 系统功能
+
+### 前台博客系统 http://localhost:7001
+
+**采用 Egg + Vue 服务端渲染**
+
+
+
+- 博客首页
+- 文章列表
+- 文章详情
+
+### 后台管理系统 http://localhost:7001/admin
+
+**采用 Egg + Vue + Vue-Router + Element 单页面服务端同构渲染**
+
+
+
+- Dashboard
+- Markdown
+- 文章管理
+
+## 纯净版
+
+因该项目包含了多种实现, 提供多种例子实现,为防干扰, 特提供了两个纯净版本分支用于实际项目开发, 请自行选用。
+
+- Egg + Vue + Axios 多页面服务端渲染分支 [feature/green/multi](https://github.com/easy-team/egg-vue-webpack-boilerplate/tree/feature/green/multi)
+- Egg + Vue + vue-router + vuex + axios 单页面服务端渲染分支 [feature/green/spa](https://github.com/easy-team/egg-vue-webpack-boilerplate/tree/feature/green/spa)
+- Egg + Vue + vue-router + vuex + axios 前端渲染 asset 方案 [feature/green/asset](https://github.com/easy-team/egg-vue-webpack-boilerplate/tree/feature/green/asset)
+- Egg + Vue + vue-router + vuex + axios 前端渲染一体化方案 [element-admin](https://github.com/easy-team/egg-vue-webpack-boilerplate/tree/element-admin)
+- Egg + Vue + TypeScript 项目,请见项目 [egg-vue-typescript-boilerplate](https://github.com/easy-team/egg-vue-typescript-boilerplate) 和 [ves-admin](https://github.com/easy-team/ves-admin)
+
+以上项目,你可以通过 [easywebpack-cli](https://github.com/easy-team/easywebpack-cli) 初始化
+
+## 版本
+
+- Egg 版本: ^2.x.x
+- Node 版本: ^8.x.x+
+- Vue 版本: ^2.5.0
+- Webpack 版本: ^4.x.x, 对应 `easywebpack-vue` 版本为 ^4.x.x; Webpack3 版本项目骨架请见 `webpack3` 分支, 对应 `easywebpack-react` 版本为 3.x.x
+
+## 说明
+
+- 项目开发之前, 请阅读[Egg + Vue 解决方案](https://www.yuque.com/easy-team/egg-vue)
+- 如果你需要了解 Egg+ Vue + Webpack 项目更多信息,请扫以下二维码加好友,请备注:Node.js。 骨架功能性需求或者 Bug 问题, 欢迎大家 PR 完善。
+
+
+
+## 文档
+
+- https://www.yuque.com/easy-team/egg-vue
+- https://zhuanlan.zhihu.com/easywebpack
+
+
+## 1.特性
+
+- 支持服务端渲染SSR(Server Side Render), 前端渲染CSR(Client Side Render) 方式
+
+- 支持 Node 和 前端代码修改, Webpack 自动编译和热更新, `npm run dev` 一键启动应用
+
+- 基于 vue + axios 多页面服务端渲染, 客户端渲染同构实现, 支持 asyncData 渲染
+
+- 基于 vue + vuex + vue-router + axios 单页面服务器客户端同构实现
+
+- 支持 js/css/image 资源依赖, 内置支持 CDN 特性, 支持 css/sass/less 样式编写
+
+- 支持根据 .vue 文件自动创建 Webpack Entry 入口文件
+
+- 开始支持多进程和缓存编译, 支持 Webpack dll 自动化构建, 与多进程编译结合,构建速度减少 2/3
+
+- 支持 Vue 组件 import 异步加载, 具体实例请看[app/web/page/dynamic](app/web/page/dynamic)
+
+- 支持服务端渲染(SSR)失败时,自动降级为前端渲染(CSR)模式
+
+- 提供 国际化 i18n 多语言支持方案
+
+
+## 2.依赖
+
+- [easywebpack](https://github.com/easy-team/easywebpack) ^4.x.x
+- [easywebpack-vue](https://github.com/easy-team/easywebpack) ^4.x.x
+- [egg-view-vue-ssr](https://github.com/easy-team/egg-view-vue-ssr) ^3.x.x
+- [egg-webpack](https://github.com/easy-team/egg-webpack) ^4.x.x
+- [egg-webpack-vue](https://github.com/easy-team/egg-webpack-vue) ^2.x.x
+
+
+## 3. 使用
+
+#### 3.1 安装cli(非必需)
+
+```bash
+npm install @easy-team/easywebpack-cli -g
+```
+
+`easywebpack-cli` 已内置 `devDependencies` 中, 无需安装。如果你需要在命令行使用 `easy` 命令, 可以单独全局安装。
+
+#### 3.2 安装依赖
+
+```bash
+npm install
+```
+
+
+#### 3.3 本地开发启动应用
+
+```bash
+npm run dev
+```
+
+应用访问: http://127.0.0.1:7001
+
+
+
+
+#### 3.4 发布模式启动应用
+
+- 首先在本地或者ci构建好jsbundle文件
+
+```bash
+npm run build
+```
+
+- 然后,启动应用
+
+```bash
+npm start
+```
+
+
+详细打包部署请见: http://hubcarl.github.io/easywebpack/vue/dev/
+
+## 4. 配置说明(支持三种方式)
+
+#### 4.1 方式一: `easywebpack-cli` 根据 `webpack.config.js` 自动创建Webpack Config
+
+```js
+`config/config.local.js`
+const EasyWebpack = require('@easy-team/easywebpack-vue');
+exports.webpack = {
+ webpackConfigList:EasyWebpack.getWebpackConfig()
+};
+```
+
+#### 4.2 方式二: 自己编写Webpack配置
+
+编写配置请见 tag `1.0.0` build目录代码实现
+
+```js
+`config/config.local.js`
+exports.webpack = {
+ webpackConfigList: [
+ require(path.join(app.baseDir, 'build/client')), // http://127.0.0.1:9000
+ ]
+};
+```
+
+#### 4.3 方式三: 开启多进程编译
+
+[egg npm start 启动开启多进程编译](http://hubcarl.github.io/easywebpack/vue/version/)
+
+
+构建会同时启动两个 webpack 构建服务, 客户端js构建(build/client), 服务端构建(build/server), 默认端口9000, webpackConfigList 端口依次递增.
+
+
+## 5. 项目结构和基本规范
+
+ ├── app
+ │ ├── controller
+ │ │ ├── test
+ │ │ │ └── test.js
+ │ ├── extend
+ │ ├── lib
+ │ ├── middleware
+ │ ├── mocks
+ │ ├── proxy
+ │ ├── router.js
+ │ ├── view
+ │ │ ├── about // 服务器编译的jsbundle文件
+ │ │ │ └── about.js
+ │ │ ├── home
+ │ │ │ └── home.js // 服务器编译的jsbundle文件
+ │ │ └── layout // 用于根据指定的layout生成对应的html页面, 用于服务器渲染失败时,采用客户端渲染
+ │ │ └── layout.html
+ │ └── web // 前端工程目录
+ │ ├── asset // 存放公共js,css资源
+ │ ├── framework // 前端公共库和第三方库
+ │ │ ├── fastclick
+ │ │ │ └── fastclick.js
+ │ │ ├── sdk
+ │ │ │ ├── sdk.js
+ │ │ ├── storage
+ │ │ │ └── storage.js
+ │ │ └── vue // 与vue相关的公开代码
+ │ │ ├── app.js // 前后端调用入口, 默认引入componet/directive/filter
+ │ │ ├── component.js // 组件入口, 可以增加component目录,类似下面的directive
+ │ │ ├── directive // directive 目录,存放各种directive组件
+ │ │ ├── directive.js // directive引用入口
+ │ │ └── filter.js // filter引用入口
+ │ ├── page // 前端页面和webpack构建目录, 也就是webpack打包配置entryDir
+ │ │ ├── home // 每个页面遵循目录名, js文件名, scss文件名, vue文件名相同
+ │ │ │ ├── home.scss
+ │ │ │ ├── home.vue
+ │ │ │ ├── images // 页面自有图片,公共图片和css放到asset下面
+ │ │ │ │ └── icon_more.png
+ │ │ │ └── w-week // 页面自有组件,公共组件放到widget下面
+ │ │ │ ├── w-week.scss
+ │ │ │ └── w-week.vue
+ │ │ └── test // 每个页面遵循目录名, js文件名, scss文件名, vue文件名相同
+ │ │ └── test.vue
+ │ ├── store // 引入vuex 的基本规范, 可以分模块
+ │ │ ├── app
+ │ │ │ ├── actions.js
+ │ │ │ ├── getters.js
+ │ │ │ ├── index.js
+ │ │ │ ├── mutation-type.js
+ │ │ │ └── mutations.js
+ │ │ └── store.js
+ │ └── component // 公共业务组件, 比如loading, toast等, 遵循目录名, js文件名, scss文件名, vue文件名相同
+ │ ├── loading
+ │ │ ├── loading.scss
+ │ │ └── loading.vue
+ │ ├── test
+ │ │ ├── test.vue
+ │ │ └── test.scss
+ │ └── toast
+ │ ├── toast.scss
+ │ └── toast.vue
+ ├── build // webpack 自定义配置入口, 会与默认配置进行合并(看似这么多,其实这里只是占个位说明一下)
+ │ ├── base
+ │ │ └── index.js // 公共配置
+ │ ├── client // 客户端webpack编译配置
+ │ │ ├── dev.js
+ │ │ ├── prod.js
+ │ │ └── index.js
+ │ ├── server // 服务端webpack编译配置
+ │ │ ├── dev.js
+ │ │ ├── prod.js
+ │ │ └── index.js
+ │ └── index.js
+ ├── config
+ │ ├── config.default.js
+ │ ├── config.local.js
+ │ ├── config.prod.js
+ │ ├── config.test.js
+ │ └── plugin.js
+ ├── doc
+ ├── index.js
+ ├── public // webpack编译目录结构, render文件查找目录
+ │ ├── manifest.json // 资源依赖表
+ │ ├── static
+ │ │ ├── css
+ │ │ │ ├── home
+ │ │ │ │ ├── home.07012d33.css
+ │ │ │ └── test
+ │ │ │ ├── test.4bbb32ce.css
+ │ │ ├── img
+ │ │ │ ├── change_top.4735c57.png
+ │ │ │ └── intro.0e66266.png
+ │ ├── test
+ │ │ └── test.js
+ │ └── vendor.js // 生成的公共打包库
+
+
+## 6. 功能实现
+
+支持多页面/单页面服务端渲染, 前端渲染, 静态页面三种方式.
+
+
+### 6.1 多页面服务端渲染/前端渲染同构实现
+
+#### 6.1.1 多页面前端页面实现
+
+在app/web/page 目录下面创建home目录, home.vue 文件, Webpack自动根据.vue文件创建entry入口, 具体实现请见[webpack.config.js](webpack.config.js)
+
+- home.vue 编写界面逻辑, 根元素为layout(自定义组件, 全局注册, 统一的html, meta, header, body)
+
+```html
+
+
+ {{message}}
+
+
+
+
+```
+
+
+#### 6.1.2 多页面后端渲染实现, 通过 `egg-view-vue-ssr` 插件 `render` 方法实现
+
+- 创建controller文件home.js
+
+```javascript
+exports.index = function* (ctx) {
+ yield ctx.render('home/home.js', { message: 'vue server side render!' });
+};
+```
+
+- 添加路由配置
+
+```javascript
+app.get('/home', app.controller.home.home.index);
+```
+
+#### 6.1.3 多页面走前端渲染(后端路由)实现, 通过 `egg-view-vue-ssr` 插件 `renderClient` 方法实现
+
+- 创建controller文件home.js
+
+```javascript
+exports.client = function* (ctx) {
+ yield ctx.renderClient('home/home.js', { message: 'vue server side render!' });
+};
+```
+
+- 添加路由配置
+
+```javascript
+app.get('/client', app.controller.home.home.client);
+```
+
+#### 6.1.4 HTML静态页面前端渲染
+
+- 直接有easywebpack构建出静态HTML文件, 请见 `webpack.config.js` 配置和 `app/web/page/html`代码实现
+
+- 通过 `egg-static` 静态文件访问HTML文件
+
+
+### 6.2 单页面服务器渲染同构实现
+
+#### 6.2.1 单页面前端实现
+
+在app/web/page 目录下面创建app目录, app.vue, app.js 文件.
+
+- app.vue 编写界面逻辑, 根元素为layout(自定义组件, 全局注册, 统一的html, meta, header, body)
+
+```html
+
+
+
+
+
+
+
+
+
+```
+
+- app.js 页面调用入口
+
+```javascript
+import { sync } from 'vuex-router-sync';
+import store from 'store/app';
+import router from 'component/app/router';
+import app from './app.vue';
+import App from 'app';
+import Layout from 'component/layout/app';
+
+App.component(Layout.name, Layout);
+
+sync(store, router);
+
+export default App.init({
+ base: '/app',
+ ...app,
+ router,
+ store
+});
+
+```
+
+#### 6.2.2 单页面后端实现
+
+- 创建controller文件app.js
+
+```javascript
+exports.index = function* (ctx) {
+ yield ctx.render('app/app.js', { url: this.url.replace(/\/app/, '') });
+};
+```
+
+- 添加路由配置
+
+```javascript
+ app.get('/app(/.+)?', app.controller.app.app.index);
+```
+
+
+## License
+
+[MIT](LICENSE)
diff --git a/app/controller/admin/admin.js b/app/controller/admin/admin.js
new file mode 100644
index 0000000000000000000000000000000000000000..f0cec3113f9b8c5ec4cd510d337e3cc6c0c7251e
--- /dev/null
+++ b/app/controller/admin/admin.js
@@ -0,0 +1,31 @@
+'use strict';
+const egg = require('egg');
+module.exports = class AdminController extends egg.Controller {
+ async login(ctx) {
+ await ctx.renderClient('admin/login/login.js', {});
+ }
+ async home(ctx) {
+ const url = ctx.url.replace(/\/admin/, '');
+ const { mode } = ctx.query;
+ if (mode === 'csr') {
+ await ctx.renderClient('admin/home/home.js', { ctx, url, title: 'easy-admin' });
+ } else {
+ await ctx.render('admin/home/home.js', { ctx, url, title: 'easy-admin' });
+ }
+ }
+ async list(ctx) {
+ this.ctx.body = ctx.service.article.getArtilceList(ctx.request.body);
+ }
+ async add(ctx) {
+ ctx.body = this.service.article.saveArticle(ctx.request.body);
+ }
+ async del(ctx) {
+ const { id } = ctx.params;
+ ctx.body = this.service.article.deleteArticle(id);
+ }
+ async detail(ctx) {
+ const id = ctx.params.id;
+ console.log('>>id', Number(id));
+ ctx.body = this.service.article.getArticle(Number(id));
+ }
+};
\ No newline at end of file
diff --git a/app/controller/category/category.js b/app/controller/category/category.js
new file mode 100644
index 0000000000000000000000000000000000000000..e295e461bf90a225206cf0ccf14e2d38d5dcedef
--- /dev/null
+++ b/app/controller/category/category.js
@@ -0,0 +1,8 @@
+'use strict';
+module.exports = app => {
+ return class CategoryController extends app.Controller {
+ async index(ctx) {
+ await ctx.render('category/category.js', { message: 'Egg Vue Server Side Render: Category' });
+ }
+ };
+};
\ No newline at end of file
diff --git a/app/controller/index/index.js b/app/controller/index/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..2c0995e4920d9349981c65e3ef16ae5581fcbe81
--- /dev/null
+++ b/app/controller/index/index.js
@@ -0,0 +1,22 @@
+'usestrict';
+const egg = require('egg');
+module.exports = class IndexController extends egg.Controller {
+
+ async ssr() {
+ const result = this.service.article.getArtilceList();
+ await this.ctx.render('index/index.js', result);
+ }
+
+ async csr() {
+ const result = this.service.article.getArtilceList();
+ await this.ctx.renderClient('index/index.js', result);
+ }
+
+ async list() {
+ this.ctx.body = this.service.article.getArtilceList(this.ctx.query);
+ }
+
+ async detail() {
+ const id = this.ctx.query.id;
+ }
+};
\ No newline at end of file
diff --git a/app/extend/application.js b/app/extend/application.js
new file mode 100644
index 0000000000000000000000000000000000000000..697c356334b7497ce1dc7ae41bc0ba522eadc1a2
--- /dev/null
+++ b/app/extend/application.js
@@ -0,0 +1,11 @@
+'use strict';
+const Factory = require('../lib/db/factory');
+const DBSymbol = Symbol('Application#db');
+module.exports = {
+ get db() {
+ if (!this[DBSymbol]) {
+ this[DBSymbol] = Factory();
+ }
+ return this[DBSymbol];
+ },
+};
\ No newline at end of file
diff --git a/app/extend/context.js b/app/extend/context.js
new file mode 100644
index 0000000000000000000000000000000000000000..bd0a53344cc68b6a1a319f8e86ecf15e4ed47338
--- /dev/null
+++ b/app/extend/context.js
@@ -0,0 +1,6 @@
+'use strict';
+module.exports = {
+ get db() {
+ return this.app.db;
+ }
+};
\ No newline at end of file
diff --git a/app/lib/db/base.js b/app/lib/db/base.js
new file mode 100644
index 0000000000000000000000000000000000000000..278b4c16cb0392389f377d630beba20849f182ff
--- /dev/null
+++ b/app/lib/db/base.js
@@ -0,0 +1,25 @@
+'use strict';
+const shortid = require('shortid');
+module.exports = class DB {
+ constructor(name = 'blog.json') {
+ this.name = name;
+ }
+ getUniqueId() {
+ return shortid.generate();
+ }
+ get(collectionName) {
+ return null;
+ }
+ add(collectionName, json) {
+ return null;
+ }
+ update(collectionName, where, json) {
+ return null;
+ }
+ delete(collectionName, field) {
+ return null;
+ }
+ getPager(collectionName, query) {
+ return null;
+ }
+};
\ No newline at end of file
diff --git a/app/lib/db/collection.js b/app/lib/db/collection.js
new file mode 100644
index 0000000000000000000000000000000000000000..889dd15cea7f6b38065c1f5fe18257aa2083fa2d
--- /dev/null
+++ b/app/lib/db/collection.js
@@ -0,0 +1,31 @@
+'use strict';
+module.exports = class Collection {
+ constructor(db, name) {
+ this.db = db;
+ this.name = name;
+ }
+ get() {
+ return this.db.get(this.name);
+ }
+ getByWhere(json) {
+ return this.db.get(this.name).find(json);
+ }
+ add(json) {
+ return this.db.add(this.name, json);
+ }
+ update(where, json) {
+ return this.db.update(this.name, where, json);
+ }
+ delete(field) {
+ return this.db.delete(this.name, field);
+ }
+ getPager(query) {
+ return this.db.getPager(this.name, query);
+ }
+ getOrderAscByField(field) {
+ return this.get().orderBy(field, 'asc').value();
+ }
+ getOrderDescByField(field) {
+ return this.get().orderBy(field, 'desc').value();
+ }
+};
\ No newline at end of file
diff --git a/app/lib/db/factory.js b/app/lib/db/factory.js
new file mode 100644
index 0000000000000000000000000000000000000000..c1618792a5ac2cbef6db6efd0f31b5aa1fce85b4
--- /dev/null
+++ b/app/lib/db/factory.js
@@ -0,0 +1,14 @@
+'use strict';
+const File = require('./file');
+const MySQL = require('./mysql');
+const MongoDB = require('./mongo');
+module.exports = type => {
+ switch (type) {
+ case 'mysql':
+ return new MySQL();
+ case 'mongo':
+ return new MongoDB();
+ default:
+ return new File();
+ }
+};
\ No newline at end of file
diff --git a/app/lib/db/file.js b/app/lib/db/file.js
new file mode 100644
index 0000000000000000000000000000000000000000..6bca8928288ae1a907a1d4f14c927345c5dc1cc0
--- /dev/null
+++ b/app/lib/db/file.js
@@ -0,0 +1,60 @@
+'use strict';
+const lowdb = require('lowdb');
+const lodashid = require('lodash-id');
+const FileSync = require('lowdb/adapters/FileSync');
+const Base = require('./base');
+module.exports = class FileDB extends Base {
+ constructor(name) {
+ super(name);
+ const file = new FileSync(this.name);
+ this.instance = lowdb(file);
+ this.instance._.mixin(lodashid);
+ this.create();
+ }
+ create() {
+ this.instance.defaults({
+ article: [],
+ user: {}
+ }).write();
+ }
+ get(collectionName) {
+ return this.instance.get(collectionName);
+ }
+ add(collectionName, json) {
+ return this.get(collectionName)
+ .push(json)
+ .write();
+ }
+ update(collectionName, where, json) {
+ return this.get(collectionName).find(where).assign(json).write();
+ }
+ delete(collectionName, field) {
+ return this.get(collectionName).remove(field).write();
+ }
+ getPager(collectionName, json) {
+ const {
+ where,
+ like,
+ pageIndex,
+ pageSize,
+ orderByField,
+ orderBy
+ } = json;
+ const start = (pageIndex - 1) * pageSize;
+ const end = pageIndex * pageSize;
+ const result = this.get(collectionName)
+ .filter(where)
+ .filter(item => {
+ return Object.keys(like).reduce((isLike, key) => {
+ return isLike && item[key] && item[key].indexOf(like[key]) > -1;
+ }, true);
+ })
+ .orderBy(orderByField, orderBy);
+ const total = result.size().value();
+ const list = result.slice(start, end).value();
+ return {
+ total,
+ list
+ };
+ }
+};
\ No newline at end of file
diff --git a/app/lib/db/mongo.js b/app/lib/db/mongo.js
new file mode 100644
index 0000000000000000000000000000000000000000..453b55c71f50e0b11b15127dfb42020b8a64391d
--- /dev/null
+++ b/app/lib/db/mongo.js
@@ -0,0 +1,3 @@
+'use strict';
+const Base = require('./base');
+module.exports = class MongoDB extends Base {};
\ No newline at end of file
diff --git a/app/lib/db/mysql.js b/app/lib/db/mysql.js
new file mode 100644
index 0000000000000000000000000000000000000000..70a8d2b0214550fea4eff26d652907130dba79e4
--- /dev/null
+++ b/app/lib/db/mysql.js
@@ -0,0 +1,3 @@
+'use strict';
+const Base = require('./base');
+module.exports = class MySQLDB extends Base {};
diff --git a/app/lib/db/query.js b/app/lib/db/query.js
new file mode 100644
index 0000000000000000000000000000000000000000..b6c605c1e5161bc00e14ed2f6eb660b753b6c8dc
--- /dev/null
+++ b/app/lib/db/query.js
@@ -0,0 +1,44 @@
+'use strict';
+module.exports = class Query {
+ constructor() {
+ this.orderByField = 'createTime';
+ this.orderBy = 'desc';
+ this._pageIndex = 1;
+ this._pageSize = 10;
+ this.where = new Proxy({}, {
+ set(target, key, value, proxy) {
+ if (value === undefined) {
+ return true;
+ }
+ return Reflect.set(target, key, value, proxy);
+ }
+ });
+
+ this.like = new Proxy({}, {
+ set(target, key, value, proxy) {
+ if (value === undefined) {
+ return true;
+ }
+ return Reflect.set(target, key, value, proxy);
+ }
+ });
+ }
+
+ get pageIndex() {
+ return this._pageIndex;
+ }
+ set pageIndex(value) {
+ if (value !== undefined) {
+ this._pageIndex = value;
+ }
+ }
+
+ get pageSize() {
+ return this._pageSize;
+ }
+ set pageSize(value) {
+ if (value !== undefined) {
+ this._pageSize = value;
+ }
+ }
+};
\ No newline at end of file
diff --git a/app/middleware/access.js b/app/middleware/access.js
new file mode 100644
index 0000000000000000000000000000000000000000..137b311f34ff90c569a9bd692523e2d7a86aa524
--- /dev/null
+++ b/app/middleware/access.js
@@ -0,0 +1,35 @@
+const path = require('path');
+const util = require('util');
+
+module.exports = () => {
+ const skipExt = [ '.png', '.jpeg', '.jpg', '.ico', '.gif' ];
+ return function* (next) {
+ const start = new Date().getTime();
+
+ yield* next;
+
+ const rs = Math.ceil(new Date().getTime() - start);
+
+ this.set('X-Response-Time', rs);
+
+ const ext = path.extname(this.url).toLocaleLowerCase();
+ const isSkip = skipExt.indexOf(ext) !== -1 && this.status < 400;
+
+ if (!isSkip) {
+ const ip = this.get('X-Real-IP') || this.ip;
+ const port = this.get('X-Real-Port');
+ const protocol = this.protocol.toUpperCase();
+ const method = this.method;
+ const url = this.url;
+ const status = this.status;
+ const length = this.length || '-';
+ const referrer = this.get('referrer') || '-';
+ const ua = this.get('user-agent') || '-';
+ const serverTime = this.response.get('X-Server-Response-Time') || '-';
+ const message = util.format('[access] %s:%s - %s %s %s/%s %s %s %s %s %s',
+ ip, port, method, url, protocol, status, length, referrer, rs, serverTime, ua);
+ this.logger.info(message);
+ }
+ };
+};
+
diff --git a/app/middleware/locals.js b/app/middleware/locals.js
new file mode 100644
index 0000000000000000000000000000000000000000..2630d65968e3289a01daf6c91b4bb33288920a55
--- /dev/null
+++ b/app/middleware/locals.js
@@ -0,0 +1,7 @@
+module.exports = () => {
+ return async function locale(ctx, next) {
+ ctx.locals.locale = ctx.query.locale || 'cn';
+ ctx.locals.origin = ctx.request.origin;
+ await next();
+ };
+};
\ No newline at end of file
diff --git a/app/model/article.js b/app/model/article.js
new file mode 100644
index 0000000000000000000000000000000000000000..153cacfc172bb3d986e0f108b87c4c87bfc210e6
--- /dev/null
+++ b/app/model/article.js
@@ -0,0 +1,13 @@
+'use strict';
+
+module.exports = class Model {
+ constructor() {
+ super();
+ this.id = void 0;
+ this.title = undefined;
+ this.summary = undefined;
+ this.tag = undefined;
+ this.hits = 0;
+ this.createTime = Date.now();
+ }
+};
\ No newline at end of file
diff --git a/app/model/artilcedetail.js b/app/model/artilcedetail.js
new file mode 100644
index 0000000000000000000000000000000000000000..34c817ba401922c342239cd81fc793705d85a3da
--- /dev/null
+++ b/app/model/artilcedetail.js
@@ -0,0 +1,2 @@
+'use strict';
+module.exports = class ArticleDetail {};
diff --git a/app/model/user.js b/app/model/user.js
new file mode 100644
index 0000000000000000000000000000000000000000..700dc7b62dc200ed79f26bd51ded742e6ad7be6b
--- /dev/null
+++ b/app/model/user.js
@@ -0,0 +1,9 @@
+'use strict';
+module.exports = class User {
+ constructor() {
+ this.id = null;
+ this.name = null;
+ this.password = null;
+ this.roleId = null;
+ }
+};
\ No newline at end of file
diff --git a/app/model/utils/base.js b/app/model/utils/base.js
new file mode 100644
index 0000000000000000000000000000000000000000..bb3192c20e6fd5cd197b68fb20a4beb420e6b212
--- /dev/null
+++ b/app/model/utils/base.js
@@ -0,0 +1,7 @@
+'use strict';
+const Pagination = require('./pagination');
+module.exports = class Model {
+ constructor() {
+ this.pagination = new Pagination();
+ }
+};
\ No newline at end of file
diff --git a/app/router.js b/app/router.js
new file mode 100644
index 0000000000000000000000000000000000000000..b75bf6f681eeb8e4b98cfb66e74ec2a96eb52b1d
--- /dev/null
+++ b/app/router.js
@@ -0,0 +1,14 @@
+'use strict';
+module.exports = app => {
+ const { router, controller } = app;
+ router.get('/', controller.index.index.ssr);
+ router.get('/csr', controller.index.index.csr);
+ router.get('/list', controller.index.index.list);
+ router.get('/category', controller.category.category.index);
+ router.get('/login', controller.admin.admin.login);
+ router.post('/admin/api/article/list', controller.admin.admin.list);
+ router.post('/admin/api/article/add', controller.admin.admin.add);
+ router.get('/admin/api/article/del/:id', controller.admin.admin.del);
+ router.get('/admin/api/article/:id', controller.admin.admin.detail);
+ router.get('/admin(/.+)?', controller.admin.admin.home);
+};
\ No newline at end of file
diff --git a/app/service/article.js b/app/service/article.js
new file mode 100644
index 0000000000000000000000000000000000000000..34494e9ecd454d228a7988c27570c4b03e32f824
--- /dev/null
+++ b/app/service/article.js
@@ -0,0 +1,35 @@
+'use strict';
+const egg = require('egg');
+const Collection = require('../lib/db/collection');
+const Query = require('../lib/db/query');
+module.exports = class ArticeService extends egg.Service {
+ constructor(ctx) {
+ super(ctx);
+ this.ctx = ctx;
+ this.colllection = new Collection(ctx.db, 'article');
+ }
+ getArtilceList(json = {}) {
+ const { title, categoryId, status, pageIndex, pageSize } = json;
+ const query = new Query();
+ query.where.categoryId = categoryId;
+ query.where.status = status;
+ query.like.title = title;
+ query.pageIndex = pageIndex;
+ query.pageSize = pageSize;
+ return this.colllection.getPager(query);
+ }
+ getArticle(id) {
+ return this.colllection.getByWhere({ id });
+ }
+ saveArticle(json) {
+ if (json.id) {
+ return this.colllection.update({ id: json.id }, json);
+ }
+ json.id = this.ctx.db.getUniqueId();
+ this.colllection.add(json);
+ return json.id;
+ }
+ deleteArticle(id) {
+ return this.colllection.delete({ id });
+ }
+};
\ No newline at end of file
diff --git a/app/view/README.md b/app/view/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..7f4b987f87efaac0f80067328b73eff652fc2437
--- /dev/null
+++ b/app/view/README.md
@@ -0,0 +1 @@
+## egg规范view目录, 保证view文件夹存在, 否则app.config.view.root为空, 编译服务器文件会存放到该目录.
\ No newline at end of file
diff --git a/app/web/asset/css/blog.css b/app/web/asset/css/blog.css
new file mode 100755
index 0000000000000000000000000000000000000000..0aeef20feddeb7aeb52f4f5a325b906259e04dc2
--- /dev/null
+++ b/app/web/asset/css/blog.css
@@ -0,0 +1,534 @@
+body {
+ font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif;
+ line-height: 1.7;
+ font-size: 16px;
+ color: #404040;
+ overflow-x: hidden;
+}
+p {
+ margin: 30px 0;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif;
+
+ line-height: 1.1;
+ font-weight: 800;
+}
+h1 {
+ font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+}
+h4 {
+ font-size: 18px;
+ margin-top: 24px;
+ margin-bottom: 24px;
+}
+a {
+ color: #404040;
+}
+a:hover,
+a:focus {
+ color: #0085a1;
+}
+a img:hover,
+a img:focus {
+ cursor: zoom-in;
+}
+article {
+ overflow-x: hidden;
+}
+blockquote {
+ color: #808080;
+ font-style: italic;
+ font-size: 0.95em;
+ margin: 20px 0 20px;
+}
+blockquote p {
+ margin: 0;
+}
+@media screen and (max-width: 768px) {
+ select {
+ -webkit-appearance: none;
+ margin-top: 15px;
+ color: #44bff2;
+ border-color: #44bff2;
+ padding: 0em 0.4em;
+ background: white;
+ }
+}
+.table th,
+.table td {
+ border: 1px solid #eee !important;
+}
+hr.small {
+ max-width: 100px;
+ margin: 15px auto;
+ border-width: 4px;
+ border-color: white;
+}
+hr.large {
+ max-width: 280px;
+ margin: 15px auto;
+ border-width: 4px;
+ border-color: white;
+}
+@media screen and (max-width: 500px) {
+ pre code {
+ display: block;
+ width: 500px;
+ }
+}
+.post-container a {
+ color: #2B4180;
+}
+.post-container a:hover,
+.post-container a:focus {
+ color: #6bb4bf;
+}
+.post-container ul,
+.post-container ol {
+ margin-bottom: 40px;
+}
+.post-container ol ol,
+.post-container ol ul,
+.post-container ul ol,
+.post-container ul ul {
+ margin-bottom: 5px;
+}
+.post-container li p {
+ margin: 0;
+ margin-bottom: 5px;
+}
+.post-container li h1,
+.post-container li h2,
+.post-container li h3,
+.post-container li h4,
+.post-container li h5,
+.post-container li h6 {
+ line-height: 2;
+ margin-top: 20px;
+}
+.navbar-custom {
+ background: white;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ z-index: 3;
+ font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif;
+ line-height: 1.7;
+}
+.navbar-custom .navbar-brand {
+ font-weight: 800;
+}
+.navbar-custom .nav li a {
+ text-transform: uppercase;
+ font-size: 16px;
+ font-weight: 800;
+ letter-spacing: 1px;
+}
+@media only screen and (min-width: 768px) {
+ .navbar-custom {
+ background: transparent;
+ border-bottom: 1px solid transparent;
+ }
+ .navbar-custom body {
+ font-size: 20px;
+ }
+ .navbar-custom .navbar-brand {
+ color: white;
+ padding: 20px;
+ }
+ .navbar-custom .navbar-brand:hover,
+ .navbar-custom .navbar-brand:focus {
+ color: rgba(255, 255, 255, 0.8);
+ }
+ .navbar-custom .nav li a {
+ color: white;
+ padding: 20px;
+ }
+ .navbar-custom .nav li a:hover,
+ .navbar-custom .nav li a:focus {
+ color: rgba(255, 255, 255, 0.8);
+ }
+}
+@media only screen and (min-width: 1170px) {
+ .navbar-custom {
+ -webkit-transition: background-color 0.3s;
+ -moz-transition: background-color 0.3s;
+ transition: background-color 0.3s;
+ /* Force Hardware Acceleration in WebKit */
+ -webkit-transform: translate3d(0, 0, 0);
+ -moz-transform: translate3d(0, 0, 0);
+ -ms-transform: translate3d(0, 0, 0);
+ -o-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ }
+ .navbar-custom.is-fixed {
+ /* when the user scrolls down, we hide the header right above the viewport */
+ position: fixed;
+ top: -61px;
+ background-color: rgba(255, 255, 255, 0.9);
+ border-bottom: 1px solid #f2f2f2;
+ -webkit-transition: -webkit-transform 0.3s;
+ -moz-transition: -moz-transform 0.3s;
+ transition: transform 0.3s;
+ }
+ .navbar-custom.is-fixed .navbar-brand {
+ color: #404040;
+ }
+ .navbar-custom.is-fixed .navbar-brand:hover,
+ .navbar-custom.is-fixed .navbar-brand:focus {
+ color: #0085a1;
+ }
+ .navbar-custom.is-fixed .nav li a {
+ color: #404040;
+ }
+ .navbar-custom.is-fixed .nav li a:hover,
+ .navbar-custom.is-fixed .nav li a:focus {
+ color: #0085a1;
+ }
+ .navbar-custom.is-visible {
+ /* if the user changes the scrolling direction, we show the header */
+ -webkit-transform: translate3d(0, 100%, 0);
+ -moz-transform: translate3d(0, 100%, 0);
+ -ms-transform: translate3d(0, 100%, 0);
+ -o-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+}
+.intro-header {
+ background: no-repeat center center;
+ background-color: #808080;
+ background-attachment: scroll;
+ -webkit-background-size: cover;
+ -moz-background-size: cover;
+ background-size: cover;
+ -o-background-size: cover;
+ margin-bottom: 0px;
+ /* 0 on mobile, changed the setting*/
+}
+@media only screen and (min-width: 768px) {
+ .intro-header {
+ margin-bottom: 20px;
+ /* response on desktop */
+ }
+}
+.intro-header .site-heading,
+.intro-header .post-heading,
+.intro-header .page-heading {
+ padding: 100px 0 50px;
+ color: white;
+}
+@media only screen and (min-width: 768px) {
+ .intro-header .site-heading,
+ .intro-header .post-heading,
+ .intro-header .page-heading {
+ padding: 150px 0;
+ }
+}
+.intro-header .site-heading,
+.intro-header .page-heading {
+ text-align: center;
+}
+.intro-header .site-heading h1,
+.intro-header .page-heading h1 {
+ margin-top: 0;
+ font-size: 36px;
+}
+.intro-header .site-heading .subheading,
+.intro-header .page-heading .subheading {
+ font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif;
+ line-height: 1.7;
+ font-size: 20px;
+ line-height: 1.1;
+ display: block;
+ font-weight: 300;
+ margin: 10px 0 0;
+}
+@media only screen and (min-width: 768px) {
+ .intro-header .site-heading h1,
+ .intro-header .page-heading h1 {
+ font-size: 65px;
+ }
+}
+.intro-header .post-heading h1 {
+ font-size: 27px;
+}
+.intro-header .post-heading .subheading,
+.intro-header .post-heading .meta {
+ line-height: 1.1;
+ display: block;
+}
+.intro-header .post-heading .subheading {
+ font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif;
+ line-height: 1.7;
+ font-size: 17px;
+ font-weight: normal;
+ margin: 10px 0 30px;
+ margin-top: -5px;
+}
+.intro-header .post-heading .meta {
+ font-family: 'Lora', 'Times New Roman', serif;
+ font-style: italic;
+ font-weight: 300;
+ font-size: 17px;
+}
+.intro-header .post-heading .meta a {
+ color: white;
+}
+@media only screen and (min-width: 768px) {
+ .intro-header .post-heading h1 {
+ font-size: 36px;
+ }
+ .intro-header .post-heading .subheading {
+ font-size: 30px;
+ }
+ .intro-header .post-heading .meta {
+ font-size: 20px;
+ }
+}
+.post-preview > a {
+ color: #404040;
+}
+.post-preview > a:hover,
+.post-preview > a:focus {
+ text-decoration: none;
+ color: #0666C5;
+}
+.post-preview > a > .post-title {
+ font-size: 21px;
+ line-height: 1.3;
+ margin-top: 30px;
+ margin-bottom: 8px;
+}
+.post-preview > a > .post-subtitle {
+ font-size: 15px;
+ margin: 0;
+ font-weight: 300;
+ margin-bottom: 10px;
+}
+.post-preview > .post-meta {
+ font-family: 'Lora', 'Times New Roman', serif;
+ color: #808080;
+ font-size: 16px;
+ font-style: italic;
+ margin-top: 0;
+}
+.post-preview > .post-meta > a {
+ text-decoration: none;
+ color: #404040;
+}
+.post-preview > .post-meta > a:hover,
+.post-preview > .post-meta > a:focus {
+ color: #2B4180;
+ text-decoration: underline;
+}
+@media only screen and (min-width: 768px) {
+ .post-preview > a > .post-title {
+ font-size: 26px;
+ line-height: 1.3;
+ margin-bottom: 10px;
+ }
+ .post-preview > a > .post-subtitle {
+ font-size: 16px;
+ }
+ .post-preview .post-meta {
+ font-size: 18px;
+ }
+}
+.post-content-preview {
+ font-size: 13px;
+ font-style: normal;
+ color: #a3a3a3;
+}
+.post-content-preview:hover {
+ color: #46A5ED;
+}
+@media only screen and (min-width: 768px) {
+ .post-content-preview {
+ font-size: 14px;
+ }
+}
+.section-heading {
+ font-size: 36px;
+ margin-top: 60px;
+ font-weight: 700;
+}
+.caption {
+ text-align: center;
+ font-size: 14px;
+ padding: 10px;
+ font-style: italic;
+ margin: 0;
+ display: block;
+ border-bottom-right-radius: 5px;
+ border-bottom-left-radius: 5px;
+}
+footer {
+ font-size: 20px;
+ padding: 50px 0 65px;
+}
+footer .list-inline {
+ margin: 0;
+ padding: 0;
+}
+footer .copyright {
+ font-size: 14px;
+ text-align: center;
+ margin-bottom: 0;
+}
+footer .copyright a {
+ color: #93e1de;
+}
+footer .copyright a:hover,
+footer .copyright a:focus {
+ color: #44bff2;
+}
+.floating-label-form-group {
+ font-size: 14px;
+ position: relative;
+ margin-bottom: 0;
+ padding-bottom: 0.5em;
+ border-bottom: 1px solid #eeeeee;
+}
+.floating-label-form-group input,
+.floating-label-form-group textarea {
+ z-index: 1;
+ position: relative;
+ padding-right: 0;
+ padding-left: 0;
+ border: none;
+ border-radius: 0;
+ font-size: 1.5em;
+ background: none;
+ box-shadow: none !important;
+ resize: none;
+}
+.floating-label-form-group label {
+ display: block;
+ z-index: 0;
+ position: relative;
+ top: 2em;
+ margin: 0;
+ font-size: 0.85em;
+ line-height: 1.764705882em;
+ vertical-align: middle;
+ vertical-align: baseline;
+ opacity: 0;
+ -webkit-transition: top 0.3s ease,opacity 0.3s ease;
+ -moz-transition: top 0.3s ease,opacity 0.3s ease;
+ -ms-transition: top 0.3s ease,opacity 0.3s ease;
+ transition: top 0.3s ease,opacity 0.3s ease;
+}
+.floating-label-form-group::not(:first-child) {
+ padding-left: 14px;
+ border-left: 1px solid #eeeeee;
+}
+.floating-label-form-group-with-value label {
+ top: 0;
+ opacity: 1;
+}
+.floating-label-form-group-with-focus label {
+ color: #2B4180;
+}
+form .row:first-child .floating-label-form-group {
+ border-top: 1px solid #eeeeee;
+}
+.btn {
+ font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif;
+ line-height: 1.7;
+ text-transform: uppercase;
+ font-size: 14px;
+ font-weight: 800;
+ letter-spacing: 1px;
+ border-radius: 0;
+ padding: 15px 25px;
+}
+.btn-lg {
+ font-size: 16px;
+ padding: 25px 35px;
+}
+.btn-default:hover,
+.btn-default:focus {
+ background-color: #0085a1;
+ border: 1px solid #0085a1;
+ color: white;
+}
+.pager {
+ margin: 20px 0 0;
+}
+.pager li > a,
+.pager li > span {
+ font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif;
+ line-height: 1.7;
+ text-transform: uppercase;
+ font-size: 14px;
+ font-weight: 800;
+ letter-spacing: 1px;
+ padding: 10px 5px;
+ background-color: white;
+ border-radius: 0;
+}
+@media only screen and (min-width: 768px) {
+ .pager li > a,
+ .pager li > span {
+ font-size: 14px;
+ padding: 15px 25px;
+ }
+}
+.pager li > a {
+ color: #404040;
+}c
+.pager li > a:hover,
+.pager li > a:focus {
+ color: white;
+ background-color: #00c9d7;
+ border: 1px solid #00c9d7;
+}
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+ color: #808080;
+ background-color: #404040;
+ cursor: not-allowed;
+}
+::-moz-selection {
+ color: white;
+ text-shadow: none;
+ background: #00c9d7;
+}
+::selection {
+ color: white;
+ text-shadow: none;
+ background: #00c9d7;
+}
+img::selection {
+ color: white;
+ background: transparent;
+}
+img::-moz-selection {
+ color: white;
+ background: transparent;
+}
+body {
+ webkit-tap-highlight-color: #00c9d7;
+}
+
+
+/* Optimize UserExperience */
+.navbar-default .navbar-toggle:focus,
+.navbar-default .navbar-toggle:hover {
+ background-color: inherit;
+}
+.navbar-default .navbar-toggle:active {
+ background-color: #ddd;
+}
+
diff --git a/app/web/asset/css/bootstrap.css b/app/web/asset/css/bootstrap.css
new file mode 100755
index 0000000000000000000000000000000000000000..c46af7dfbda90bd819d422ef941a49c65de63d27
--- /dev/null
+++ b/app/web/asset/css/bootstrap.css
@@ -0,0 +1,6566 @@
+/*!
+ * Bootstrap v3.3.2 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+html {
+ font-family: sans-serif;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+}
+body {
+ margin: 0;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block;
+}
+audio,
+canvas,
+progress,
+video {
+ display: inline-block;
+ vertical-align: baseline;
+}
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+[hidden],
+template {
+ display: none;
+}
+a {
+ background-color: transparent;
+}
+a:active,
+a:hover {
+ outline: 0;
+}
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+b,
+strong {
+ font-weight: bold;
+}
+dfn {
+ font-style: italic;
+}
+h1 {
+ margin: .67em 0;
+ font-size: 2em;
+}
+mark {
+ color: #000;
+ background: #ff0;
+}
+small {
+ font-size: 80%;
+}
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+sup {
+ top: -.5em;
+}
+sub {
+ bottom: -.25em;
+}
+img {
+ border: 0;
+}
+svg:not(:root) {
+ overflow: hidden;
+}
+figure {
+ margin: 1em 40px;
+}
+hr {
+ height: 0;
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+pre {
+ overflow: auto;
+}
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+button,
+input,
+optgroup,
+select,
+textarea {
+ margin: 0;
+ font: inherit;
+ color: inherit;
+}
+button {
+ overflow: visible;
+}
+button,
+select {
+ text-transform: none;
+}
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button;
+ cursor: pointer;
+}
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+}
+input {
+ line-height: normal;
+}
+input[type="checkbox"],
+input[type="radio"] {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ padding: 0;
+}
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+input[type="search"] {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ -webkit-appearance: textfield;
+}
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+fieldset {
+ padding: .35em .625em .75em;
+ margin: 0 2px;
+ border: 1px solid #c0c0c0;
+}
+legend {
+ padding: 0;
+ border: 0;
+}
+textarea {
+ overflow: auto;
+}
+optgroup {
+ font-weight: bold;
+}
+table {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+td,
+th {
+ padding: 0;
+}
+/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
+@media print {
+ *,
+ *:before,
+ *:after {
+ color: #000 !important;
+ text-shadow: none !important;
+ background: transparent !important;
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important;
+ }
+ a,
+ a:visited {
+ text-decoration: underline;
+ }
+ a[href]:after {
+ content: " (" attr(href) ")";
+ }
+ abbr[title]:after {
+ content: " (" attr(title) ")";
+ }
+ a[href^="#"]:after,
+ a[href^="javascript:"]:after {
+ content: "";
+ }
+ pre,
+ blockquote {
+ border: 1px solid #999;
+
+ page-break-inside: avoid;
+ }
+ thead {
+ display: table-header-group;
+ }
+ tr,
+ img {
+ page-break-inside: avoid;
+ }
+ img {
+ max-width: 100% !important;
+ }
+ p,
+ h2,
+ h3 {
+ orphans: 3;
+ widows: 3;
+ }
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+ select {
+ background: #fff !important;
+ }
+ .navbar {
+ display: none;
+ }
+ .btn > .caret,
+ .dropup > .btn > .caret {
+ border-top-color: #000 !important;
+ }
+ .label {
+ border: 1px solid #000;
+ }
+ .table {
+ border-collapse: collapse !important;
+ }
+ .table td,
+ .table th {
+ background-color: #fff !important;
+ }
+ .table-bordered th,
+ .table-bordered td {
+ border: 1px solid #ddd !important;
+ }
+}
+@font-face {
+ font-family: 'Glyphicons Halflings';
+
+ src: url('../fonts/glyphicons-halflings-regular.eot');
+ src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
+}
+.glyphicon {
+ position: relative;
+ top: 1px;
+ display: inline-block;
+ font-family: 'Glyphicons Halflings';
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1;
+
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.glyphicon-asterisk:before {
+ content: "\2a";
+}
+.glyphicon-plus:before {
+ content: "\2b";
+}
+.glyphicon-euro:before,
+.glyphicon-eur:before {
+ content: "\20ac";
+}
+.glyphicon-minus:before {
+ content: "\2212";
+}
+.glyphicon-cloud:before {
+ content: "\2601";
+}
+.glyphicon-envelope:before {
+ content: "\2709";
+}
+.glyphicon-pencil:before {
+ content: "\270f";
+}
+.glyphicon-glass:before {
+ content: "\e001";
+}
+.glyphicon-music:before {
+ content: "\e002";
+}
+.glyphicon-search:before {
+ content: "\e003";
+}
+.glyphicon-heart:before {
+ content: "\e005";
+}
+.glyphicon-star:before {
+ content: "\e006";
+}
+.glyphicon-star-empty:before {
+ content: "\e007";
+}
+.glyphicon-user:before {
+ content: "\e008";
+}
+.glyphicon-film:before {
+ content: "\e009";
+}
+.glyphicon-th-large:before {
+ content: "\e010";
+}
+.glyphicon-th:before {
+ content: "\e011";
+}
+.glyphicon-th-list:before {
+ content: "\e012";
+}
+.glyphicon-ok:before {
+ content: "\e013";
+}
+.glyphicon-remove:before {
+ content: "\e014";
+}
+.glyphicon-zoom-in:before {
+ content: "\e015";
+}
+.glyphicon-zoom-out:before {
+ content: "\e016";
+}
+.glyphicon-off:before {
+ content: "\e017";
+}
+.glyphicon-signal:before {
+ content: "\e018";
+}
+.glyphicon-cog:before {
+ content: "\e019";
+}
+.glyphicon-trash:before {
+ content: "\e020";
+}
+.glyphicon-home:before {
+ content: "\e021";
+}
+.glyphicon-file:before {
+ content: "\e022";
+}
+.glyphicon-time:before {
+ content: "\e023";
+}
+.glyphicon-road:before {
+ content: "\e024";
+}
+.glyphicon-download-alt:before {
+ content: "\e025";
+}
+.glyphicon-download:before {
+ content: "\e026";
+}
+.glyphicon-upload:before {
+ content: "\e027";
+}
+.glyphicon-inbox:before {
+ content: "\e028";
+}
+.glyphicon-play-circle:before {
+ content: "\e029";
+}
+.glyphicon-repeat:before {
+ content: "\e030";
+}
+.glyphicon-refresh:before {
+ content: "\e031";
+}
+.glyphicon-list-alt:before {
+ content: "\e032";
+}
+.glyphicon-lock:before {
+ content: "\e033";
+}
+.glyphicon-flag:before {
+ content: "\e034";
+}
+.glyphicon-headphones:before {
+ content: "\e035";
+}
+.glyphicon-volume-off:before {
+ content: "\e036";
+}
+.glyphicon-volume-down:before {
+ content: "\e037";
+}
+.glyphicon-volume-up:before {
+ content: "\e038";
+}
+.glyphicon-qrcode:before {
+ content: "\e039";
+}
+.glyphicon-barcode:before {
+ content: "\e040";
+}
+.glyphicon-tag:before {
+ content: "\e041";
+}
+.glyphicon-tags:before {
+ content: "\e042";
+}
+.glyphicon-book:before {
+ content: "\e043";
+}
+.glyphicon-bookmark:before {
+ content: "\e044";
+}
+.glyphicon-print:before {
+ content: "\e045";
+}
+.glyphicon-camera:before {
+ content: "\e046";
+}
+.glyphicon-font:before {
+ content: "\e047";
+}
+.glyphicon-bold:before {
+ content: "\e048";
+}
+.glyphicon-italic:before {
+ content: "\e049";
+}
+.glyphicon-text-height:before {
+ content: "\e050";
+}
+.glyphicon-text-width:before {
+ content: "\e051";
+}
+.glyphicon-align-left:before {
+ content: "\e052";
+}
+.glyphicon-align-center:before {
+ content: "\e053";
+}
+.glyphicon-align-right:before {
+ content: "\e054";
+}
+.glyphicon-align-justify:before {
+ content: "\e055";
+}
+.glyphicon-list:before {
+ content: "\e056";
+}
+.glyphicon-indent-left:before {
+ content: "\e057";
+}
+.glyphicon-indent-right:before {
+ content: "\e058";
+}
+.glyphicon-facetime-video:before {
+ content: "\e059";
+}
+.glyphicon-picture:before {
+ content: "\e060";
+}
+.glyphicon-map-marker:before {
+ content: "\e062";
+}
+.glyphicon-adjust:before {
+ content: "\e063";
+}
+.glyphicon-tint:before {
+ content: "\e064";
+}
+.glyphicon-edit:before {
+ content: "\e065";
+}
+.glyphicon-share:before {
+ content: "\e066";
+}
+.glyphicon-check:before {
+ content: "\e067";
+}
+.glyphicon-move:before {
+ content: "\e068";
+}
+.glyphicon-step-backward:before {
+ content: "\e069";
+}
+.glyphicon-fast-backward:before {
+ content: "\e070";
+}
+.glyphicon-backward:before {
+ content: "\e071";
+}
+.glyphicon-play:before {
+ content: "\e072";
+}
+.glyphicon-pause:before {
+ content: "\e073";
+}
+.glyphicon-stop:before {
+ content: "\e074";
+}
+.glyphicon-forward:before {
+ content: "\e075";
+}
+.glyphicon-fast-forward:before {
+ content: "\e076";
+}
+.glyphicon-step-forward:before {
+ content: "\e077";
+}
+.glyphicon-eject:before {
+ content: "\e078";
+}
+.glyphicon-chevron-left:before {
+ content: "\e079";
+}
+.glyphicon-chevron-right:before {
+ content: "\e080";
+}
+.glyphicon-plus-sign:before {
+ content: "\e081";
+}
+.glyphicon-minus-sign:before {
+ content: "\e082";
+}
+.glyphicon-remove-sign:before {
+ content: "\e083";
+}
+.glyphicon-ok-sign:before {
+ content: "\e084";
+}
+.glyphicon-question-sign:before {
+ content: "\e085";
+}
+.glyphicon-info-sign:before {
+ content: "\e086";
+}
+.glyphicon-screenshot:before {
+ content: "\e087";
+}
+.glyphicon-remove-circle:before {
+ content: "\e088";
+}
+.glyphicon-ok-circle:before {
+ content: "\e089";
+}
+.glyphicon-ban-circle:before {
+ content: "\e090";
+}
+.glyphicon-arrow-left:before {
+ content: "\e091";
+}
+.glyphicon-arrow-right:before {
+ content: "\e092";
+}
+.glyphicon-arrow-up:before {
+ content: "\e093";
+}
+.glyphicon-arrow-down:before {
+ content: "\e094";
+}
+.glyphicon-share-alt:before {
+ content: "\e095";
+}
+.glyphicon-resize-full:before {
+ content: "\e096";
+}
+.glyphicon-resize-small:before {
+ content: "\e097";
+}
+.glyphicon-exclamation-sign:before {
+ content: "\e101";
+}
+.glyphicon-gift:before {
+ content: "\e102";
+}
+.glyphicon-leaf:before {
+ content: "\e103";
+}
+.glyphicon-fire:before {
+ content: "\e104";
+}
+.glyphicon-eye-open:before {
+ content: "\e105";
+}
+.glyphicon-eye-close:before {
+ content: "\e106";
+}
+.glyphicon-warning-sign:before {
+ content: "\e107";
+}
+.glyphicon-plane:before {
+ content: "\e108";
+}
+.glyphicon-calendar:before {
+ content: "\e109";
+}
+.glyphicon-random:before {
+ content: "\e110";
+}
+.glyphicon-comment:before {
+ content: "\e111";
+}
+.glyphicon-magnet:before {
+ content: "\e112";
+}
+.glyphicon-chevron-up:before {
+ content: "\e113";
+}
+.glyphicon-chevron-down:before {
+ content: "\e114";
+}
+.glyphicon-retweet:before {
+ content: "\e115";
+}
+.glyphicon-shopping-cart:before {
+ content: "\e116";
+}
+.glyphicon-folder-close:before {
+ content: "\e117";
+}
+.glyphicon-folder-open:before {
+ content: "\e118";
+}
+.glyphicon-resize-vertical:before {
+ content: "\e119";
+}
+.glyphicon-resize-horizontal:before {
+ content: "\e120";
+}
+.glyphicon-hdd:before {
+ content: "\e121";
+}
+.glyphicon-bullhorn:before {
+ content: "\e122";
+}
+.glyphicon-bell:before {
+ content: "\e123";
+}
+.glyphicon-certificate:before {
+ content: "\e124";
+}
+.glyphicon-thumbs-up:before {
+ content: "\e125";
+}
+.glyphicon-thumbs-down:before {
+ content: "\e126";
+}
+.glyphicon-hand-right:before {
+ content: "\e127";
+}
+.glyphicon-hand-left:before {
+ content: "\e128";
+}
+.glyphicon-hand-up:before {
+ content: "\e129";
+}
+.glyphicon-hand-down:before {
+ content: "\e130";
+}
+.glyphicon-circle-arrow-right:before {
+ content: "\e131";
+}
+.glyphicon-circle-arrow-left:before {
+ content: "\e132";
+}
+.glyphicon-circle-arrow-up:before {
+ content: "\e133";
+}
+.glyphicon-circle-arrow-down:before {
+ content: "\e134";
+}
+.glyphicon-globe:before {
+ content: "\e135";
+}
+.glyphicon-wrench:before {
+ content: "\e136";
+}
+.glyphicon-tasks:before {
+ content: "\e137";
+}
+.glyphicon-filter:before {
+ content: "\e138";
+}
+.glyphicon-briefcase:before {
+ content: "\e139";
+}
+.glyphicon-fullscreen:before {
+ content: "\e140";
+}
+.glyphicon-dashboard:before {
+ content: "\e141";
+}
+.glyphicon-paperclip:before {
+ content: "\e142";
+}
+.glyphicon-heart-empty:before {
+ content: "\e143";
+}
+.glyphicon-link:before {
+ content: "\e144";
+}
+.glyphicon-phone:before {
+ content: "\e145";
+}
+.glyphicon-pushpin:before {
+ content: "\e146";
+}
+.glyphicon-usd:before {
+ content: "\e148";
+}
+.glyphicon-gbp:before {
+ content: "\e149";
+}
+.glyphicon-sort:before {
+ content: "\e150";
+}
+.glyphicon-sort-by-alphabet:before {
+ content: "\e151";
+}
+.glyphicon-sort-by-alphabet-alt:before {
+ content: "\e152";
+}
+.glyphicon-sort-by-order:before {
+ content: "\e153";
+}
+.glyphicon-sort-by-order-alt:before {
+ content: "\e154";
+}
+.glyphicon-sort-by-attributes:before {
+ content: "\e155";
+}
+.glyphicon-sort-by-attributes-alt:before {
+ content: "\e156";
+}
+.glyphicon-unchecked:before {
+ content: "\e157";
+}
+.glyphicon-expand:before {
+ content: "\e158";
+}
+.glyphicon-collapse-down:before {
+ content: "\e159";
+}
+.glyphicon-collapse-up:before {
+ content: "\e160";
+}
+.glyphicon-log-in:before {
+ content: "\e161";
+}
+.glyphicon-flash:before {
+ content: "\e162";
+}
+.glyphicon-log-out:before {
+ content: "\e163";
+}
+.glyphicon-new-window:before {
+ content: "\e164";
+}
+.glyphicon-record:before {
+ content: "\e165";
+}
+.glyphicon-save:before {
+ content: "\e166";
+}
+.glyphicon-open:before {
+ content: "\e167";
+}
+.glyphicon-saved:before {
+ content: "\e168";
+}
+.glyphicon-import:before {
+ content: "\e169";
+}
+.glyphicon-export:before {
+ content: "\e170";
+}
+.glyphicon-send:before {
+ content: "\e171";
+}
+.glyphicon-floppy-disk:before {
+ content: "\e172";
+}
+.glyphicon-floppy-saved:before {
+ content: "\e173";
+}
+.glyphicon-floppy-remove:before {
+ content: "\e174";
+}
+.glyphicon-floppy-save:before {
+ content: "\e175";
+}
+.glyphicon-floppy-open:before {
+ content: "\e176";
+}
+.glyphicon-credit-card:before {
+ content: "\e177";
+}
+.glyphicon-transfer:before {
+ content: "\e178";
+}
+.glyphicon-cutlery:before {
+ content: "\e179";
+}
+.glyphicon-header:before {
+ content: "\e180";
+}
+.glyphicon-compressed:before {
+ content: "\e181";
+}
+.glyphicon-earphone:before {
+ content: "\e182";
+}
+.glyphicon-phone-alt:before {
+ content: "\e183";
+}
+.glyphicon-tower:before {
+ content: "\e184";
+}
+.glyphicon-stats:before {
+ content: "\e185";
+}
+.glyphicon-sd-video:before {
+ content: "\e186";
+}
+.glyphicon-hd-video:before {
+ content: "\e187";
+}
+.glyphicon-subtitles:before {
+ content: "\e188";
+}
+.glyphicon-sound-stereo:before {
+ content: "\e189";
+}
+.glyphicon-sound-dolby:before {
+ content: "\e190";
+}
+.glyphicon-sound-5-1:before {
+ content: "\e191";
+}
+.glyphicon-sound-6-1:before {
+ content: "\e192";
+}
+.glyphicon-sound-7-1:before {
+ content: "\e193";
+}
+.glyphicon-copyright-mark:before {
+ content: "\e194";
+}
+.glyphicon-registration-mark:before {
+ content: "\e195";
+}
+.glyphicon-cloud-download:before {
+ content: "\e197";
+}
+.glyphicon-cloud-upload:before {
+ content: "\e198";
+}
+.glyphicon-tree-conifer:before {
+ content: "\e199";
+}
+.glyphicon-tree-deciduous:before {
+ content: "\e200";
+}
+.glyphicon-cd:before {
+ content: "\e201";
+}
+.glyphicon-save-file:before {
+ content: "\e202";
+}
+.glyphicon-open-file:before {
+ content: "\e203";
+}
+.glyphicon-level-up:before {
+ content: "\e204";
+}
+.glyphicon-copy:before {
+ content: "\e205";
+}
+.glyphicon-paste:before {
+ content: "\e206";
+}
+.glyphicon-alert:before {
+ content: "\e209";
+}
+.glyphicon-equalizer:before {
+ content: "\e210";
+}
+.glyphicon-king:before {
+ content: "\e211";
+}
+.glyphicon-queen:before {
+ content: "\e212";
+}
+.glyphicon-pawn:before {
+ content: "\e213";
+}
+.glyphicon-bishop:before {
+ content: "\e214";
+}
+.glyphicon-knight:before {
+ content: "\e215";
+}
+.glyphicon-baby-formula:before {
+ content: "\e216";
+}
+.glyphicon-tent:before {
+ content: "\26fa";
+}
+.glyphicon-blackboard:before {
+ content: "\e218";
+}
+.glyphicon-bed:before {
+ content: "\e219";
+}
+.glyphicon-apple:before {
+ content: "\f8ff";
+}
+.glyphicon-erase:before {
+ content: "\e221";
+}
+.glyphicon-hourglass:before {
+ content: "\231b";
+}
+.glyphicon-lamp:before {
+ content: "\e223";
+}
+.glyphicon-duplicate:before {
+ content: "\e224";
+}
+.glyphicon-piggy-bank:before {
+ content: "\e225";
+}
+.glyphicon-scissors:before {
+ content: "\e226";
+}
+.glyphicon-bitcoin:before {
+ content: "\e227";
+}
+.glyphicon-yen:before {
+ content: "\00a5";
+}
+.glyphicon-ruble:before {
+ content: "\20bd";
+}
+.glyphicon-scale:before {
+ content: "\e230";
+}
+.glyphicon-ice-lolly:before {
+ content: "\e231";
+}
+.glyphicon-ice-lolly-tasted:before {
+ content: "\e232";
+}
+.glyphicon-education:before {
+ content: "\e233";
+}
+.glyphicon-option-horizontal:before {
+ content: "\e234";
+}
+.glyphicon-option-vertical:before {
+ content: "\e235";
+}
+.glyphicon-menu-hamburger:before {
+ content: "\e236";
+}
+.glyphicon-modal-window:before {
+ content: "\e237";
+}
+.glyphicon-oil:before {
+ content: "\e238";
+}
+.glyphicon-grain:before {
+ content: "\e239";
+}
+.glyphicon-sunglasses:before {
+ content: "\e240";
+}
+.glyphicon-text-size:before {
+ content: "\e241";
+}
+.glyphicon-text-color:before {
+ content: "\e242";
+}
+.glyphicon-text-background:before {
+ content: "\e243";
+}
+.glyphicon-object-align-top:before {
+ content: "\e244";
+}
+.glyphicon-object-align-bottom:before {
+ content: "\e245";
+}
+.glyphicon-object-align-horizontal:before {
+ content: "\e246";
+}
+.glyphicon-object-align-left:before {
+ content: "\e247";
+}
+.glyphicon-object-align-vertical:before {
+ content: "\e248";
+}
+.glyphicon-object-align-right:before {
+ content: "\e249";
+}
+.glyphicon-triangle-right:before {
+ content: "\e250";
+}
+.glyphicon-triangle-left:before {
+ content: "\e251";
+}
+.glyphicon-triangle-bottom:before {
+ content: "\e252";
+}
+.glyphicon-triangle-top:before {
+ content: "\e253";
+}
+.glyphicon-console:before {
+ content: "\e254";
+}
+.glyphicon-superscript:before {
+ content: "\e255";
+}
+.glyphicon-subscript:before {
+ content: "\e256";
+}
+.glyphicon-menu-left:before {
+ content: "\e257";
+}
+.glyphicon-menu-right:before {
+ content: "\e258";
+}
+.glyphicon-menu-down:before {
+ content: "\e259";
+}
+.glyphicon-menu-up:before {
+ content: "\e260";
+}
+* {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+*:before,
+*:after {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+html {
+ font-size: 10px;
+
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ line-height: 1.42857143;
+ color: #333;
+ background-color: #fff;
+}
+input,
+button,
+select,
+textarea {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+a {
+ color: #337ab7;
+ text-decoration: none;
+}
+a:hover,
+a:focus {
+ color: #23527c;
+ text-decoration: underline;
+}
+a:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+figure {
+ margin: 0;
+}
+img {
+ vertical-align: middle;
+}
+.img-responsive,
+.thumbnail > img,
+.thumbnail a > img,
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+ display: block;
+ max-width: 100%;
+ height: auto;
+}
+.img-rounded {
+ border-radius: 6px;
+}
+.img-thumbnail {
+ display: inline-block;
+ max-width: 100%;
+ height: auto;
+ padding: 4px;
+ line-height: 1.42857143;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ -webkit-transition: all .2s ease-in-out;
+ -o-transition: all .2s ease-in-out;
+ transition: all .2s ease-in-out;
+}
+.img-circle {
+ border-radius: 50%;
+}
+hr {
+ margin-top: 20px;
+ margin-bottom: 20px;
+ border: 0;
+ border-top: 1px solid #eee;
+}
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6 {
+ font-family: inherit;
+ font-weight: 500;
+ line-height: 1.1;
+ color: inherit;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small,
+.h1 small,
+.h2 small,
+.h3 small,
+.h4 small,
+.h5 small,
+.h6 small,
+h1 .small,
+h2 .small,
+h3 .small,
+h4 .small,
+h5 .small,
+h6 .small,
+.h1 .small,
+.h2 .small,
+.h3 .small,
+.h4 .small,
+.h5 .small,
+.h6 .small {
+ font-weight: normal;
+ line-height: 1;
+ color: #777;
+}
+h1,
+.h1,
+h2,
+.h2,
+h3,
+.h3 {
+ margin-top: 20px;
+ margin-bottom: 10px;
+}
+h1 small,
+.h1 small,
+h2 small,
+.h2 small,
+h3 small,
+.h3 small,
+h1 .small,
+.h1 .small,
+h2 .small,
+.h2 .small,
+h3 .small,
+.h3 .small {
+ font-size: 65%;
+}
+h4,
+.h4,
+h5,
+.h5,
+h6,
+.h6 {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+h4 small,
+.h4 small,
+h5 small,
+.h5 small,
+h6 small,
+.h6 small,
+h4 .small,
+.h4 .small,
+h5 .small,
+.h5 .small,
+h6 .small,
+.h6 .small {
+ font-size: 75%;
+}
+h1,
+.h1 {
+ font-size: 36px;
+}
+h2,
+.h2 {
+ font-size: 30px;
+}
+h3,
+.h3 {
+ font-size: 24px;
+}
+h4,
+.h4 {
+ font-size: 18px;
+}
+h5,
+.h5 {
+ font-size: 14px;
+}
+h6,
+.h6 {
+ font-size: 12px;
+}
+p {
+ margin: 0 0 10px;
+}
+.lead {
+ margin-bottom: 20px;
+ font-size: 16px;
+ font-weight: 300;
+ line-height: 1.4;
+}
+@media (min-width: 768px) {
+ .lead {
+ font-size: 21px;
+ }
+}
+small,
+.small {
+ font-size: 85%;
+}
+mark,
+.mark {
+ padding: .2em;
+ background-color: #fcf8e3;
+}
+.text-left {
+ text-align: left;
+}
+.text-right {
+ text-align: right;
+}
+.text-center {
+ text-align: center;
+}
+.text-justify {
+ text-align: justify;
+}
+.text-nowrap {
+ white-space: nowrap;
+}
+.text-lowercase {
+ text-transform: lowercase;
+}
+.text-uppercase {
+ text-transform: uppercase;
+}
+.text-capitalize {
+ text-transform: capitalize;
+}
+.text-muted {
+ color: #777;
+}
+.text-primary {
+ color: #337ab7;
+}
+a.text-primary:hover {
+ color: #286090;
+}
+.text-success {
+ color: #3c763d;
+}
+a.text-success:hover {
+ color: #2b542c;
+}
+.text-info {
+ color: #31708f;
+}
+a.text-info:hover {
+ color: #245269;
+}
+.text-warning {
+ color: #8a6d3b;
+}
+a.text-warning:hover {
+ color: #66512c;
+}
+.text-danger {
+ color: #a94442;
+}
+a.text-danger:hover {
+ color: #843534;
+}
+.bg-primary {
+ color: #fff;
+ background-color: #337ab7;
+}
+a.bg-primary:hover {
+ background-color: #286090;
+}
+.bg-success {
+ background-color: #dff0d8;
+}
+a.bg-success:hover {
+ background-color: #c1e2b3;
+}
+.bg-info {
+ background-color: #d9edf7;
+}
+a.bg-info:hover {
+ background-color: #afd9ee;
+}
+.bg-warning {
+ background-color: #fcf8e3;
+}
+a.bg-warning:hover {
+ background-color: #f7ecb5;
+}
+.bg-danger {
+ background-color: #f2dede;
+}
+a.bg-danger:hover {
+ background-color: #e4b9b9;
+}
+.page-header {
+ padding-bottom: 9px;
+ margin: 40px 0 20px;
+ border-bottom: 1px solid #eee;
+}
+ul,
+ol {
+ margin-top: 0;
+ margin-bottom: 10px;
+}
+ul ul,
+ol ul,
+ul ol,
+ol ol {
+ margin-bottom: 0;
+}
+.list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
+.list-inline {
+ padding-left: 0;
+ margin-left: -5px;
+ list-style: none;
+}
+.list-inline > li {
+ display: inline-block;
+ padding-right: 5px;
+ padding-left: 5px;
+}
+dl {
+ margin-top: 0;
+ margin-bottom: 20px;
+}
+dt,
+dd {
+ line-height: 1.42857143;
+}
+dt {
+ font-weight: bold;
+}
+dd {
+ margin-left: 0;
+}
+@media (min-width: 768px) {
+ .dl-horizontal dt {
+ float: left;
+ width: 160px;
+ overflow: hidden;
+ clear: left;
+ text-align: right;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ .dl-horizontal dd {
+ margin-left: 180px;
+ }
+}
+abbr[title],
+abbr[data-original-title] {
+ cursor: help;
+ border-bottom: 1px dotted #777;
+}
+.initialism {
+ font-size: 90%;
+ text-transform: uppercase;
+}
+blockquote {
+ padding: 10px 20px;
+ margin: 0 0 20px;
+ font-size: 17.5px;
+ border-left: 5px solid #eee;
+}
+blockquote p:last-child,
+blockquote ul:last-child,
+blockquote ol:last-child {
+ margin-bottom: 0;
+}
+blockquote footer,
+blockquote small,
+blockquote .small {
+ display: block;
+ font-size: 80%;
+ line-height: 1.42857143;
+ color: #777;
+}
+blockquote footer:before,
+blockquote small:before,
+blockquote .small:before {
+ content: '\2014 \00A0';
+}
+.blockquote-reverse,
+blockquote.pull-right {
+ padding-right: 15px;
+ padding-left: 0;
+ text-align: right;
+ border-right: 5px solid #eee;
+ border-left: 0;
+}
+.blockquote-reverse footer:before,
+blockquote.pull-right footer:before,
+.blockquote-reverse small:before,
+blockquote.pull-right small:before,
+.blockquote-reverse .small:before,
+blockquote.pull-right .small:before {
+ content: '';
+}
+.blockquote-reverse footer:after,
+blockquote.pull-right footer:after,
+.blockquote-reverse small:after,
+blockquote.pull-right small:after,
+.blockquote-reverse .small:after,
+blockquote.pull-right .small:after {
+ content: '\00A0 \2014';
+}
+address {
+ margin-bottom: 20px;
+ font-style: normal;
+ line-height: 1.42857143;
+}
+code,
+kbd,
+pre,
+samp {
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+code {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #c7254e;
+ background-color: #f9f2f4;
+ border-radius: 4px;
+}
+kbd {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #fff;
+ background-color: #333;
+ border-radius: 3px;
+ -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+}
+kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: bold;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+pre {
+ display: block;
+ padding: 9.5px;
+ margin: 0 0 10px;
+ font-size: 13px;
+ line-height: 1.42857143;
+ color: #333;
+ word-break: break-all;
+ word-wrap: break-word;
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+}
+pre code {
+ padding: 0;
+ font-size: inherit;
+ color: inherit;
+ white-space: pre-wrap;
+ background-color: transparent;
+ border-radius: 0;
+}
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll;
+}
+.container {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+@media (min-width: 768px) {
+ .container {
+ width: 750px;
+ }
+}
+@media (min-width: 992px) {
+ .container {
+ width: 970px;
+ }
+}
+@media (min-width: 1200px) {
+ .container {
+ width: 1170px;
+ }
+}
+.container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+.row {
+ margin-right: -15px;
+ margin-left: -15px;
+}
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+ position: relative;
+ min-height: 1px;
+ padding-right: 15px;
+ padding-left: 15px;
+}
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+ float: left;
+}
+.col-xs-12 {
+ width: 100%;
+}
+.col-xs-11 {
+ width: 91.66666667%;
+}
+.col-xs-10 {
+ width: 83.33333333%;
+}
+.col-xs-9 {
+ width: 75%;
+}
+.col-xs-8 {
+ width: 66.66666667%;
+}
+.col-xs-7 {
+ width: 58.33333333%;
+}
+.col-xs-6 {
+ width: 50%;
+}
+.col-xs-5 {
+ width: 41.66666667%;
+}
+.col-xs-4 {
+ width: 33.33333333%;
+}
+.col-xs-3 {
+ width: 25%;
+}
+.col-xs-2 {
+ width: 16.66666667%;
+}
+.col-xs-1 {
+ width: 8.33333333%;
+}
+.col-xs-pull-12 {
+ right: 100%;
+}
+.col-xs-pull-11 {
+ right: 91.66666667%;
+}
+.col-xs-pull-10 {
+ right: 83.33333333%;
+}
+.col-xs-pull-9 {
+ right: 75%;
+}
+.col-xs-pull-8 {
+ right: 66.66666667%;
+}
+.col-xs-pull-7 {
+ right: 58.33333333%;
+}
+.col-xs-pull-6 {
+ right: 50%;
+}
+.col-xs-pull-5 {
+ right: 41.66666667%;
+}
+.col-xs-pull-4 {
+ right: 33.33333333%;
+}
+.col-xs-pull-3 {
+ right: 25%;
+}
+.col-xs-pull-2 {
+ right: 16.66666667%;
+}
+.col-xs-pull-1 {
+ right: 8.33333333%;
+}
+.col-xs-pull-0 {
+ right: auto;
+}
+.col-xs-push-12 {
+ left: 100%;
+}
+.col-xs-push-11 {
+ left: 91.66666667%;
+}
+.col-xs-push-10 {
+ left: 83.33333333%;
+}
+.col-xs-push-9 {
+ left: 75%;
+}
+.col-xs-push-8 {
+ left: 66.66666667%;
+}
+.col-xs-push-7 {
+ left: 58.33333333%;
+}
+.col-xs-push-6 {
+ left: 50%;
+}
+.col-xs-push-5 {
+ left: 41.66666667%;
+}
+.col-xs-push-4 {
+ left: 33.33333333%;
+}
+.col-xs-push-3 {
+ left: 25%;
+}
+.col-xs-push-2 {
+ left: 16.66666667%;
+}
+.col-xs-push-1 {
+ left: 8.33333333%;
+}
+.col-xs-push-0 {
+ left: auto;
+}
+.col-xs-offset-12 {
+ margin-left: 100%;
+}
+.col-xs-offset-11 {
+ margin-left: 91.66666667%;
+}
+.col-xs-offset-10 {
+ margin-left: 83.33333333%;
+}
+.col-xs-offset-9 {
+ margin-left: 75%;
+}
+.col-xs-offset-8 {
+ margin-left: 66.66666667%;
+}
+.col-xs-offset-7 {
+ margin-left: 58.33333333%;
+}
+.col-xs-offset-6 {
+ margin-left: 50%;
+}
+.col-xs-offset-5 {
+ margin-left: 41.66666667%;
+}
+.col-xs-offset-4 {
+ margin-left: 33.33333333%;
+}
+.col-xs-offset-3 {
+ margin-left: 25%;
+}
+.col-xs-offset-2 {
+ margin-left: 16.66666667%;
+}
+.col-xs-offset-1 {
+ margin-left: 8.33333333%;
+}
+.col-xs-offset-0 {
+ margin-left: 0;
+}
+@media (min-width: 768px) {
+ .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+ float: left;
+ }
+ .col-sm-12 {
+ width: 100%;
+ }
+ .col-sm-11 {
+ width: 91.66666667%;
+ }
+ .col-sm-10 {
+ width: 83.33333333%;
+ }
+ .col-sm-9 {
+ width: 75%;
+ }
+ .col-sm-8 {
+ width: 66.66666667%;
+ }
+ .col-sm-7 {
+ width: 58.33333333%;
+ }
+ .col-sm-6 {
+ width: 50%;
+ }
+ .col-sm-5 {
+ width: 41.66666667%;
+ }
+ .col-sm-4 {
+ width: 33.33333333%;
+ }
+ .col-sm-3 {
+ width: 25%;
+ }
+ .col-sm-2 {
+ width: 16.66666667%;
+ }
+ .col-sm-1 {
+ width: 8.33333333%;
+ }
+ .col-sm-pull-12 {
+ right: 100%;
+ }
+ .col-sm-pull-11 {
+ right: 91.66666667%;
+ }
+ .col-sm-pull-10 {
+ right: 83.33333333%;
+ }
+ .col-sm-pull-9 {
+ right: 75%;
+ }
+ .col-sm-pull-8 {
+ right: 66.66666667%;
+ }
+ .col-sm-pull-7 {
+ right: 58.33333333%;
+ }
+ .col-sm-pull-6 {
+ right: 50%;
+ }
+ .col-sm-pull-5 {
+ right: 41.66666667%;
+ }
+ .col-sm-pull-4 {
+ right: 33.33333333%;
+ }
+ .col-sm-pull-3 {
+ right: 25%;
+ }
+ .col-sm-pull-2 {
+ right: 16.66666667%;
+ }
+ .col-sm-pull-1 {
+ right: 8.33333333%;
+ }
+ .col-sm-pull-0 {
+ right: auto;
+ }
+ .col-sm-push-12 {
+ left: 100%;
+ }
+ .col-sm-push-11 {
+ left: 91.66666667%;
+ }
+ .col-sm-push-10 {
+ left: 83.33333333%;
+ }
+ .col-sm-push-9 {
+ left: 75%;
+ }
+ .col-sm-push-8 {
+ left: 66.66666667%;
+ }
+ .col-sm-push-7 {
+ left: 58.33333333%;
+ }
+ .col-sm-push-6 {
+ left: 50%;
+ }
+ .col-sm-push-5 {
+ left: 41.66666667%;
+ }
+ .col-sm-push-4 {
+ left: 33.33333333%;
+ }
+ .col-sm-push-3 {
+ left: 25%;
+ }
+ .col-sm-push-2 {
+ left: 16.66666667%;
+ }
+ .col-sm-push-1 {
+ left: 8.33333333%;
+ }
+ .col-sm-push-0 {
+ left: auto;
+ }
+ .col-sm-offset-12 {
+ margin-left: 100%;
+ }
+ .col-sm-offset-11 {
+ margin-left: 91.66666667%;
+ }
+ .col-sm-offset-10 {
+ margin-left: 83.33333333%;
+ }
+ .col-sm-offset-9 {
+ margin-left: 75%;
+ }
+ .col-sm-offset-8 {
+ margin-left: 66.66666667%;
+ }
+ .col-sm-offset-7 {
+ margin-left: 58.33333333%;
+ }
+ .col-sm-offset-6 {
+ margin-left: 50%;
+ }
+ .col-sm-offset-5 {
+ margin-left: 41.66666667%;
+ }
+ .col-sm-offset-4 {
+ margin-left: 33.33333333%;
+ }
+ .col-sm-offset-3 {
+ margin-left: 25%;
+ }
+ .col-sm-offset-2 {
+ margin-left: 16.66666667%;
+ }
+ .col-sm-offset-1 {
+ margin-left: 8.33333333%;
+ }
+ .col-sm-offset-0 {
+ margin-left: 0;
+ }
+}
+@media (min-width: 992px) {
+ .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+ float: left;
+ }
+ .col-md-12 {
+ width: 100%;
+ }
+ .col-md-11 {
+ width: 91.66666667%;
+ }
+ .col-md-10 {
+ width: 83.33333333%;
+ }
+ .col-md-9 {
+ width: 75%;
+ }
+ .col-md-8 {
+ width: 66.66666667%;
+ }
+ .col-md-7 {
+ width: 58.33333333%;
+ }
+ .col-md-6 {
+ width: 50%;
+ }
+ .col-md-5 {
+ width: 41.66666667%;
+ }
+ .col-md-4 {
+ width: 33.33333333%;
+ }
+ .col-md-3 {
+ width: 25%;
+ }
+ .col-md-2 {
+ width: 16.66666667%;
+ }
+ .col-md-1 {
+ width: 8.33333333%;
+ }
+ .col-md-pull-12 {
+ right: 100%;
+ }
+ .col-md-pull-11 {
+ right: 91.66666667%;
+ }
+ .col-md-pull-10 {
+ right: 83.33333333%;
+ }
+ .col-md-pull-9 {
+ right: 75%;
+ }
+ .col-md-pull-8 {
+ right: 66.66666667%;
+ }
+ .col-md-pull-7 {
+ right: 58.33333333%;
+ }
+ .col-md-pull-6 {
+ right: 50%;
+ }
+ .col-md-pull-5 {
+ right: 41.66666667%;
+ }
+ .col-md-pull-4 {
+ right: 33.33333333%;
+ }
+ .col-md-pull-3 {
+ right: 25%;
+ }
+ .col-md-pull-2 {
+ right: 16.66666667%;
+ }
+ .col-md-pull-1 {
+ right: 8.33333333%;
+ }
+ .col-md-pull-0 {
+ right: auto;
+ }
+ .col-md-push-12 {
+ left: 100%;
+ }
+ .col-md-push-11 {
+ left: 91.66666667%;
+ }
+ .col-md-push-10 {
+ left: 83.33333333%;
+ }
+ .col-md-push-9 {
+ left: 75%;
+ }
+ .col-md-push-8 {
+ left: 66.66666667%;
+ }
+ .col-md-push-7 {
+ left: 58.33333333%;
+ }
+ .col-md-push-6 {
+ left: 50%;
+ }
+ .col-md-push-5 {
+ left: 41.66666667%;
+ }
+ .col-md-push-4 {
+ left: 33.33333333%;
+ }
+ .col-md-push-3 {
+ left: 25%;
+ }
+ .col-md-push-2 {
+ left: 16.66666667%;
+ }
+ .col-md-push-1 {
+ left: 8.33333333%;
+ }
+ .col-md-push-0 {
+ left: auto;
+ }
+ .col-md-offset-12 {
+ margin-left: 100%;
+ }
+ .col-md-offset-11 {
+ margin-left: 91.66666667%;
+ }
+ .col-md-offset-10 {
+ margin-left: 83.33333333%;
+ }
+ .col-md-offset-9 {
+ margin-left: 75%;
+ }
+ .col-md-offset-8 {
+ margin-left: 66.66666667%;
+ }
+ .col-md-offset-7 {
+ margin-left: 58.33333333%;
+ }
+ .col-md-offset-6 {
+ margin-left: 50%;
+ }
+ .col-md-offset-5 {
+ margin-left: 41.66666667%;
+ }
+ .col-md-offset-4 {
+ margin-left: 33.33333333%;
+ }
+ .col-md-offset-3 {
+ margin-left: 25%;
+ }
+ .col-md-offset-2 {
+ margin-left: 16.66666667%;
+ }
+ .col-md-offset-1 {
+ margin-left: 8.33333333%;
+ }
+ .col-md-offset-0 {
+ margin-left: 0;
+ }
+}
+@media (min-width: 1200px) {
+ .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+ float: left;
+ }
+ .col-lg-12 {
+ width: 100%;
+ }
+ .col-lg-11 {
+ width: 91.66666667%;
+ }
+ .col-lg-10 {
+ width: 83.33333333%;
+ }
+ .col-lg-9 {
+ width: 75%;
+ }
+ .col-lg-8 {
+ width: 66.66666667%;
+ }
+ .col-lg-7 {
+ width: 58.33333333%;
+ }
+ .col-lg-6 {
+ width: 50%;
+ }
+ .col-lg-5 {
+ width: 41.66666667%;
+ }
+ .col-lg-4 {
+ width: 33.33333333%;
+ }
+ .col-lg-3 {
+ width: 25%;
+ }
+ .col-lg-2 {
+ width: 16.66666667%;
+ }
+ .col-lg-1 {
+ width: 8.33333333%;
+ }
+ .col-lg-pull-12 {
+ right: 100%;
+ }
+ .col-lg-pull-11 {
+ right: 91.66666667%;
+ }
+ .col-lg-pull-10 {
+ right: 83.33333333%;
+ }
+ .col-lg-pull-9 {
+ right: 75%;
+ }
+ .col-lg-pull-8 {
+ right: 66.66666667%;
+ }
+ .col-lg-pull-7 {
+ right: 58.33333333%;
+ }
+ .col-lg-pull-6 {
+ right: 50%;
+ }
+ .col-lg-pull-5 {
+ right: 41.66666667%;
+ }
+ .col-lg-pull-4 {
+ right: 33.33333333%;
+ }
+ .col-lg-pull-3 {
+ right: 25%;
+ }
+ .col-lg-pull-2 {
+ right: 16.66666667%;
+ }
+ .col-lg-pull-1 {
+ right: 8.33333333%;
+ }
+ .col-lg-pull-0 {
+ right: auto;
+ }
+ .col-lg-push-12 {
+ left: 100%;
+ }
+ .col-lg-push-11 {
+ left: 91.66666667%;
+ }
+ .col-lg-push-10 {
+ left: 83.33333333%;
+ }
+ .col-lg-push-9 {
+ left: 75%;
+ }
+ .col-lg-push-8 {
+ left: 66.66666667%;
+ }
+ .col-lg-push-7 {
+ left: 58.33333333%;
+ }
+ .col-lg-push-6 {
+ left: 50%;
+ }
+ .col-lg-push-5 {
+ left: 41.66666667%;
+ }
+ .col-lg-push-4 {
+ left: 33.33333333%;
+ }
+ .col-lg-push-3 {
+ left: 25%;
+ }
+ .col-lg-push-2 {
+ left: 16.66666667%;
+ }
+ .col-lg-push-1 {
+ left: 8.33333333%;
+ }
+ .col-lg-push-0 {
+ left: auto;
+ }
+ .col-lg-offset-12 {
+ margin-left: 100%;
+ }
+ .col-lg-offset-11 {
+ margin-left: 91.66666667%;
+ }
+ .col-lg-offset-10 {
+ margin-left: 83.33333333%;
+ }
+ .col-lg-offset-9 {
+ margin-left: 75%;
+ }
+ .col-lg-offset-8 {
+ margin-left: 66.66666667%;
+ }
+ .col-lg-offset-7 {
+ margin-left: 58.33333333%;
+ }
+ .col-lg-offset-6 {
+ margin-left: 50%;
+ }
+ .col-lg-offset-5 {
+ margin-left: 41.66666667%;
+ }
+ .col-lg-offset-4 {
+ margin-left: 33.33333333%;
+ }
+ .col-lg-offset-3 {
+ margin-left: 25%;
+ }
+ .col-lg-offset-2 {
+ margin-left: 16.66666667%;
+ }
+ .col-lg-offset-1 {
+ margin-left: 8.33333333%;
+ }
+ .col-lg-offset-0 {
+ margin-left: 0;
+ }
+}
+table {
+ background-color: transparent;
+}
+caption {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ color: #777;
+ text-align: left;
+}
+th {
+ text-align: left;
+}
+.table {
+ width: 100%;
+ max-width: 100%;
+ margin-bottom: 20px;
+}
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+ padding: 8px;
+ line-height: 1.42857143;
+ vertical-align: top;
+ border-top: 1px solid #ddd;
+}
+.table > thead > tr > th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #ddd;
+}
+.table > caption + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > th,
+.table > thead:first-child > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > td {
+ border-top: 0;
+}
+.table > tbody + tbody {
+ border-top: 2px solid #ddd;
+}
+.table .table {
+ background-color: #fff;
+}
+.table-condensed > thead > tr > th,
+.table-condensed > tbody > tr > th,
+.table-condensed > tfoot > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > td {
+ padding: 5px;
+}
+.table-bordered {
+ border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+ border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+ border-bottom-width: 2px;
+}
+.table-striped > tbody > tr:nth-of-type(odd) {
+ background-color: #f9f9f9;
+}
+.table-hover > tbody > tr:hover {
+ background-color: #f5f5f5;
+}
+table col[class*="col-"] {
+ position: static;
+ display: table-column;
+ float: none;
+}
+table td[class*="col-"],
+table th[class*="col-"] {
+ position: static;
+ display: table-cell;
+ float: none;
+}
+.table > thead > tr > td.active,
+.table > tbody > tr > td.active,
+.table > tfoot > tr > td.active,
+.table > thead > tr > th.active,
+.table > tbody > tr > th.active,
+.table > tfoot > tr > th.active,
+.table > thead > tr.active > td,
+.table > tbody > tr.active > td,
+.table > tfoot > tr.active > td,
+.table > thead > tr.active > th,
+.table > tbody > tr.active > th,
+.table > tfoot > tr.active > th {
+ background-color: #f5f5f5;
+}
+.table-hover > tbody > tr > td.active:hover,
+.table-hover > tbody > tr > th.active:hover,
+.table-hover > tbody > tr.active:hover > td,
+.table-hover > tbody > tr:hover > .active,
+.table-hover > tbody > tr.active:hover > th {
+ background-color: #e8e8e8;
+}
+.table > thead > tr > td.success,
+.table > tbody > tr > td.success,
+.table > tfoot > tr > td.success,
+.table > thead > tr > th.success,
+.table > tbody > tr > th.success,
+.table > tfoot > tr > th.success,
+.table > thead > tr.success > td,
+.table > tbody > tr.success > td,
+.table > tfoot > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr.success > th,
+.table > tfoot > tr.success > th {
+ background-color: #dff0d8;
+}
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+ background-color: #d0e9c6;
+}
+.table > thead > tr > td.info,
+.table > tbody > tr > td.info,
+.table > tfoot > tr > td.info,
+.table > thead > tr > th.info,
+.table > tbody > tr > th.info,
+.table > tfoot > tr > th.info,
+.table > thead > tr.info > td,
+.table > tbody > tr.info > td,
+.table > tfoot > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr.info > th,
+.table > tfoot > tr.info > th {
+ background-color: #d9edf7;
+}
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+ background-color: #c4e3f3;
+}
+.table > thead > tr > td.warning,
+.table > tbody > tr > td.warning,
+.table > tfoot > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > tbody > tr > th.warning,
+.table > tfoot > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > tbody > tr.warning > td,
+.table > tfoot > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr.warning > th {
+ background-color: #fcf8e3;
+}
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+ background-color: #faf2cc;
+}
+.table > thead > tr > td.danger,
+.table > tbody > tr > td.danger,
+.table > tfoot > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > tbody > tr > th.danger,
+.table > tfoot > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > tbody > tr.danger > td,
+.table > tfoot > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr.danger > th {
+ background-color: #f2dede;
+}
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+ background-color: #ebcccc;
+}
+.table-responsive {
+ min-height: .01%;
+ overflow-x: auto;
+}
+@media screen and (max-width: 767px) {
+ .table-responsive {
+ width: 100%;
+ margin-bottom: 15px;
+ overflow-y: hidden;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ border: 1px solid #ddd;
+ }
+ .table-responsive > .table {
+ margin-bottom: 0;
+ }
+ .table-responsive > .table > thead > tr > th,
+ .table-responsive > .table > tbody > tr > th,
+ .table-responsive > .table > tfoot > tr > th,
+ .table-responsive > .table > thead > tr > td,
+ .table-responsive > .table > tbody > tr > td,
+ .table-responsive > .table > tfoot > tr > td {
+ white-space: nowrap;
+ }
+ .table-responsive > .table-bordered {
+ border: 0;
+ }
+ .table-responsive > .table-bordered > thead > tr > th:first-child,
+ .table-responsive > .table-bordered > tbody > tr > th:first-child,
+ .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+ .table-responsive > .table-bordered > thead > tr > td:first-child,
+ .table-responsive > .table-bordered > tbody > tr > td:first-child,
+ .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+ border-left: 0;
+ }
+ .table-responsive > .table-bordered > thead > tr > th:last-child,
+ .table-responsive > .table-bordered > tbody > tr > th:last-child,
+ .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+ .table-responsive > .table-bordered > thead > tr > td:last-child,
+ .table-responsive > .table-bordered > tbody > tr > td:last-child,
+ .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+ border-right: 0;
+ }
+ .table-responsive > .table-bordered > tbody > tr:last-child > th,
+ .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+ .table-responsive > .table-bordered > tbody > tr:last-child > td,
+ .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+ border-bottom: 0;
+ }
+}
+fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+legend {
+ display: block;
+ width: 100%;
+ padding: 0;
+ margin-bottom: 20px;
+ font-size: 21px;
+ line-height: inherit;
+ color: #333;
+ border: 0;
+ border-bottom: 1px solid #e5e5e5;
+}
+label {
+ display: inline-block;
+ max-width: 100%;
+ margin-bottom: 5px;
+ font-weight: bold;
+}
+input[type="search"] {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+input[type="radio"],
+input[type="checkbox"] {
+ margin: 4px 0 0;
+ margin-top: 1px \9;
+ line-height: normal;
+}
+input[type="file"] {
+ display: block;
+}
+input[type="range"] {
+ display: block;
+ width: 100%;
+}
+select[multiple],
+select[size] {
+ height: auto;
+}
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+output {
+ display: block;
+ padding-top: 7px;
+ font-size: 14px;
+ line-height: 1.42857143;
+ color: #555;
+}
+.form-control {
+ display: block;
+ width: 100%;
+ height: 34px;
+ padding: 6px 12px;
+ font-size: 14px;
+ line-height: 1.42857143;
+ color: #555;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+ -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
+ -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+ transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+}
+.form-control:focus {
+ border-color: #66afe9;
+ outline: 0;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
+ box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
+}
+.form-control::-moz-placeholder {
+ color: #999;
+ opacity: 1;
+}
+.form-control:-ms-input-placeholder {
+ color: #999;
+}
+.form-control::-webkit-input-placeholder {
+ color: #999;
+}
+.form-control[disabled],
+.form-control[readonly],
+fieldset[disabled] .form-control {
+ cursor: not-allowed;
+ background-color: #eee;
+ opacity: 1;
+}
+textarea.form-control {
+ height: auto;
+}
+input[type="search"] {
+ -webkit-appearance: none;
+}
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+ input[type="date"],
+ input[type="time"],
+ input[type="datetime-local"],
+ input[type="month"] {
+ line-height: 34px;
+ }
+ input[type="date"].input-sm,
+ input[type="time"].input-sm,
+ input[type="datetime-local"].input-sm,
+ input[type="month"].input-sm,
+ .input-group-sm input[type="date"],
+ .input-group-sm input[type="time"],
+ .input-group-sm input[type="datetime-local"],
+ .input-group-sm input[type="month"] {
+ line-height: 30px;
+ }
+ input[type="date"].input-lg,
+ input[type="time"].input-lg,
+ input[type="datetime-local"].input-lg,
+ input[type="month"].input-lg,
+ .input-group-lg input[type="date"],
+ .input-group-lg input[type="time"],
+ .input-group-lg input[type="datetime-local"],
+ .input-group-lg input[type="month"] {
+ line-height: 46px;
+ }
+}
+.form-group {
+ margin-bottom: 15px;
+}
+.radio,
+.checkbox {
+ position: relative;
+ display: block;
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+.radio label,
+.checkbox label {
+ min-height: 20px;
+ padding-left: 20px;
+ margin-bottom: 0;
+ font-weight: normal;
+ cursor: pointer;
+}
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+ position: absolute;
+ margin-top: 4px \9;
+ margin-left: -20px;
+}
+.radio + .radio,
+.checkbox + .checkbox {
+ margin-top: -5px;
+}
+.radio-inline,
+.checkbox-inline {
+ display: inline-block;
+ padding-left: 20px;
+ margin-bottom: 0;
+ font-weight: normal;
+ vertical-align: middle;
+ cursor: pointer;
+}
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+ margin-top: 0;
+ margin-left: 10px;
+}
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"].disabled,
+input[type="checkbox"].disabled,
+fieldset[disabled] input[type="radio"],
+fieldset[disabled] input[type="checkbox"] {
+ cursor: not-allowed;
+}
+.radio-inline.disabled,
+.checkbox-inline.disabled,
+fieldset[disabled] .radio-inline,
+fieldset[disabled] .checkbox-inline {
+ cursor: not-allowed;
+}
+.radio.disabled label,
+.checkbox.disabled label,
+fieldset[disabled] .radio label,
+fieldset[disabled] .checkbox label {
+ cursor: not-allowed;
+}
+.form-control-static {
+ padding-top: 7px;
+ padding-bottom: 7px;
+ margin-bottom: 0;
+}
+.form-control-static.input-lg,
+.form-control-static.input-sm {
+ padding-right: 0;
+ padding-left: 0;
+}
+.input-sm {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+select.input-sm {
+ height: 30px;
+ line-height: 30px;
+}
+textarea.input-sm,
+select[multiple].input-sm {
+ height: auto;
+}
+.form-group-sm .form-control {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+select.form-group-sm .form-control {
+ height: 30px;
+ line-height: 30px;
+}
+textarea.form-group-sm .form-control,
+select[multiple].form-group-sm .form-control {
+ height: auto;
+}
+.form-group-sm .form-control-static {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+}
+.input-lg {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+ border-radius: 6px;
+}
+select.input-lg {
+ height: 46px;
+ line-height: 46px;
+}
+textarea.input-lg,
+select[multiple].input-lg {
+ height: auto;
+}
+.form-group-lg .form-control {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+ border-radius: 6px;
+}
+select.form-group-lg .form-control {
+ height: 46px;
+ line-height: 46px;
+}
+textarea.form-group-lg .form-control,
+select[multiple].form-group-lg .form-control {
+ height: auto;
+}
+.form-group-lg .form-control-static {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+}
+.has-feedback {
+ position: relative;
+}
+.has-feedback .form-control {
+ padding-right: 42.5px;
+}
+.form-control-feedback {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 2;
+ display: block;
+ width: 34px;
+ height: 34px;
+ line-height: 34px;
+ text-align: center;
+ pointer-events: none;
+}
+.input-lg + .form-control-feedback {
+ width: 46px;
+ height: 46px;
+ line-height: 46px;
+}
+.input-sm + .form-control-feedback {
+ width: 30px;
+ height: 30px;
+ line-height: 30px;
+}
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline,
+.has-success.radio label,
+.has-success.checkbox label,
+.has-success.radio-inline label,
+.has-success.checkbox-inline label {
+ color: #3c763d;
+}
+.has-success .form-control {
+ border-color: #3c763d;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-success .form-control:focus {
+ border-color: #2b542c;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
+}
+.has-success .input-group-addon {
+ color: #3c763d;
+ background-color: #dff0d8;
+ border-color: #3c763d;
+}
+.has-success .form-control-feedback {
+ color: #3c763d;
+}
+.has-warning .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline,
+.has-warning.radio label,
+.has-warning.checkbox label,
+.has-warning.radio-inline label,
+.has-warning.checkbox-inline label {
+ color: #8a6d3b;
+}
+.has-warning .form-control {
+ border-color: #8a6d3b;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-warning .form-control:focus {
+ border-color: #66512c;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
+}
+.has-warning .input-group-addon {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+ border-color: #8a6d3b;
+}
+.has-warning .form-control-feedback {
+ color: #8a6d3b;
+}
+.has-error .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline,
+.has-error.radio label,
+.has-error.checkbox label,
+.has-error.radio-inline label,
+.has-error.checkbox-inline label {
+ color: #a94442;
+}
+.has-error .form-control {
+ border-color: #a94442;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-error .form-control:focus {
+ border-color: #843534;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
+}
+.has-error .input-group-addon {
+ color: #a94442;
+ background-color: #f2dede;
+ border-color: #a94442;
+}
+.has-error .form-control-feedback {
+ color: #a94442;
+}
+.has-feedback label ~ .form-control-feedback {
+ top: 25px;
+}
+.has-feedback label.sr-only ~ .form-control-feedback {
+ top: 0;
+}
+.help-block {
+ display: block;
+ margin-top: 5px;
+ margin-bottom: 10px;
+ color: #737373;
+}
+@media (min-width: 768px) {
+ .form-inline .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
+ .form-inline .form-control-static {
+ display: inline-block;
+ }
+ .form-inline .input-group {
+ display: inline-table;
+ vertical-align: middle;
+ }
+ .form-inline .input-group .input-group-addon,
+ .form-inline .input-group .input-group-btn,
+ .form-inline .input-group .form-control {
+ width: auto;
+ }
+ .form-inline .input-group > .form-control {
+ width: 100%;
+ }
+ .form-inline .control-label {
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .radio,
+ .form-inline .checkbox {
+ display: inline-block;
+ margin-top: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .radio label,
+ .form-inline .checkbox label {
+ padding-left: 0;
+ }
+ .form-inline .radio input[type="radio"],
+ .form-inline .checkbox input[type="checkbox"] {
+ position: relative;
+ margin-left: 0;
+ }
+ .form-inline .has-feedback .form-control-feedback {
+ top: 0;
+ }
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+ padding-top: 7px;
+ margin-top: 0;
+ margin-bottom: 0;
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+ min-height: 27px;
+}
+.form-horizontal .form-group {
+ margin-right: -15px;
+ margin-left: -15px;
+}
+@media (min-width: 768px) {
+ .form-horizontal .control-label {
+ padding-top: 7px;
+ margin-bottom: 0;
+ text-align: right;
+ }
+}
+.form-horizontal .has-feedback .form-control-feedback {
+ right: 15px;
+}
+@media (min-width: 768px) {
+ .form-horizontal .form-group-lg .control-label {
+ padding-top: 14.333333px;
+ }
+}
+@media (min-width: 768px) {
+ .form-horizontal .form-group-sm .control-label {
+ padding-top: 6px;
+ }
+}
+.btn {
+ display: inline-block;
+ padding: 6px 12px;
+ margin-bottom: 0;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 1.42857143;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: middle;
+ -ms-touch-action: manipulation;
+ touch-action: manipulation;
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ background-image: none;
+ border: 1px solid transparent;
+ border-radius: 4px;
+}
+.btn:focus,
+.btn:active:focus,
+.btn.active:focus,
+.btn.focus,
+.btn:active.focus,
+.btn.active.focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus,
+.btn.focus {
+ color: #333;
+ text-decoration: none;
+}
+.btn:active,
+.btn.active {
+ background-image: none;
+ outline: 0;
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+ pointer-events: none;
+ cursor: not-allowed;
+ filter: alpha(opacity=65);
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ opacity: .65;
+}
+.btn-default {
+ color: #333;
+ background-color: #fff;
+ border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus,
+.btn-default.focus,
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+ color: #333;
+ background-color: #e6e6e6;
+ border-color: #adadad;
+}
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+ background-image: none;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled.focus,
+.btn-default[disabled].focus,
+fieldset[disabled] .btn-default.focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+ background-color: #fff;
+ border-color: #ccc;
+}
+.btn-default .badge {
+ color: #fff;
+ background-color: #333;
+}
+.btn-primary {
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #2e6da4;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary.focus,
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+ color: #fff;
+ background-color: #286090;
+ border-color: #204d74;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+ background-image: none;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled.focus,
+.btn-primary[disabled].focus,
+fieldset[disabled] .btn-primary.focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+ background-color: #337ab7;
+ border-color: #2e6da4;
+}
+.btn-primary .badge {
+ color: #337ab7;
+ background-color: #fff;
+}
+.btn-success {
+ color: #fff;
+ background-color: #5cb85c;
+ border-color: #4cae4c;
+}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success.focus,
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+ color: #fff;
+ background-color: #449d44;
+ border-color: #398439;
+}
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+ background-image: none;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled.focus,
+.btn-success[disabled].focus,
+fieldset[disabled] .btn-success.focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+ background-color: #5cb85c;
+ border-color: #4cae4c;
+}
+.btn-success .badge {
+ color: #5cb85c;
+ background-color: #fff;
+}
+.btn-info {
+ color: #fff;
+ background-color: #5bc0de;
+ border-color: #46b8da;
+}
+.btn-info:hover,
+.btn-info:focus,
+.btn-info.focus,
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+ color: #fff;
+ background-color: #31b0d5;
+ border-color: #269abc;
+}
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+ background-image: none;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled.focus,
+.btn-info[disabled].focus,
+fieldset[disabled] .btn-info.focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+ background-color: #5bc0de;
+ border-color: #46b8da;
+}
+.btn-info .badge {
+ color: #5bc0de;
+ background-color: #fff;
+}
+.btn-warning {
+ color: #fff;
+ background-color: #f0ad4e;
+ border-color: #eea236;
+}
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning.focus,
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+ color: #fff;
+ background-color: #ec971f;
+ border-color: #d58512;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+ background-image: none;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled.focus,
+.btn-warning[disabled].focus,
+fieldset[disabled] .btn-warning.focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+ background-color: #f0ad4e;
+ border-color: #eea236;
+}
+.btn-warning .badge {
+ color: #f0ad4e;
+ background-color: #fff;
+}
+.btn-danger {
+ color: #fff;
+ background-color: #d9534f;
+ border-color: #d43f3a;
+}
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger.focus,
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+ color: #fff;
+ background-color: #c9302c;
+ border-color: #ac2925;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+ background-image: none;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled.focus,
+.btn-danger[disabled].focus,
+fieldset[disabled] .btn-danger.focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+ background-color: #d9534f;
+ border-color: #d43f3a;
+}
+.btn-danger .badge {
+ color: #d9534f;
+ background-color: #fff;
+}
+.btn-link {
+ font-weight: normal;
+ color: #337ab7;
+ border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link.active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+ background-color: transparent;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+ border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+ color: #23527c;
+ text-decoration: underline;
+ background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+ color: #777;
+ text-decoration: none;
+}
+.btn-lg,
+.btn-group-lg > .btn {
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+ border-radius: 6px;
+}
+.btn-sm,
+.btn-group-sm > .btn {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+.btn-xs,
+.btn-group-xs > .btn {
+ padding: 1px 5px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+.btn-block {
+ display: block;
+ width: 100%;
+}
+.btn-block + .btn-block {
+ margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+ width: 100%;
+}
+.fade {
+ opacity: 0;
+ -webkit-transition: opacity .15s linear;
+ -o-transition: opacity .15s linear;
+ transition: opacity .15s linear;
+}
+.fade.in {
+ opacity: 1;
+}
+.collapse {
+ display: none;
+ visibility: hidden;
+}
+.collapse.in {
+ display: block;
+ visibility: visible;
+}
+tr.collapse.in {
+ display: table-row;
+}
+tbody.collapse.in {
+ display: table-row-group;
+}
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ -webkit-transition-timing-function: ease;
+ -o-transition-timing-function: ease;
+ transition-timing-function: ease;
+ -webkit-transition-duration: .35s;
+ -o-transition-duration: .35s;
+ transition-duration: .35s;
+ -webkit-transition-property: height, visibility;
+ -o-transition-property: height, visibility;
+ transition-property: height, visibility;
+}
+.caret {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: 2px;
+ vertical-align: middle;
+ border-top: 4px solid;
+ border-right: 4px solid transparent;
+ border-left: 4px solid transparent;
+}
+.dropup,
+.dropdown {
+ position: relative;
+}
+.dropdown-toggle:focus {
+ outline: 0;
+}
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 160px;
+ padding: 5px 0;
+ margin: 2px 0 0;
+ font-size: 14px;
+ text-align: left;
+ list-style: none;
+ background-color: #fff;
+ -webkit-background-clip: padding-box;
+ background-clip: padding-box;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, .15);
+ border-radius: 4px;
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+ box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+}
+.dropdown-menu.pull-right {
+ right: 0;
+ left: auto;
+}
+.dropdown-menu .divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #e5e5e5;
+}
+.dropdown-menu > li > a {
+ display: block;
+ padding: 3px 20px;
+ clear: both;
+ font-weight: normal;
+ line-height: 1.42857143;
+ color: #333;
+ white-space: nowrap;
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+ color: #262626;
+ text-decoration: none;
+ background-color: #f5f5f5;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+ color: #fff;
+ text-decoration: none;
+ background-color: #337ab7;
+ outline: 0;
+}
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ color: #777;
+}
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ text-decoration: none;
+ cursor: not-allowed;
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.open > .dropdown-menu {
+ display: block;
+}
+.open > a {
+ outline: 0;
+}
+.dropdown-menu-right {
+ right: 0;
+ left: auto;
+}
+.dropdown-menu-left {
+ right: auto;
+ left: 0;
+}
+.dropdown-header {
+ display: block;
+ padding: 3px 20px;
+ font-size: 12px;
+ line-height: 1.42857143;
+ color: #777;
+ white-space: nowrap;
+}
+.dropdown-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 990;
+}
+.pull-right > .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+ content: "";
+ border-top: 0;
+ border-bottom: 4px solid;
+}
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 2px;
+}
+@media (min-width: 768px) {
+ .navbar-right .dropdown-menu {
+ right: 0;
+ left: auto;
+ }
+ .navbar-right .dropdown-menu-left {
+ right: auto;
+ left: 0;
+ }
+}
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+ position: relative;
+ float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+ z-index: 2;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+ margin-left: -1px;
+}
+.btn-toolbar {
+ margin-left: -5px;
+}
+.btn-toolbar .btn-group,
+.btn-toolbar .input-group {
+ float: left;
+}
+.btn-toolbar > .btn,
+.btn-toolbar > .btn-group,
+.btn-toolbar > .input-group {
+ margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+ border-radius: 0;
+}
+.btn-group > .btn:first-child {
+ margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.btn-group > .btn-group {
+ float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+ outline: 0;
+}
+.btn-group > .btn + .dropdown-toggle {
+ padding-right: 8px;
+ padding-left: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+ padding-right: 12px;
+ padding-left: 12px;
+}
+.btn-group.open .dropdown-toggle {
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn-group.open .dropdown-toggle.btn-link {
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.btn .caret {
+ margin-left: 0;
+}
+.btn-lg .caret {
+ border-width: 5px 5px 0;
+ border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+ border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group,
+.btn-group-vertical > .btn-group > .btn {
+ display: block;
+ float: none;
+ width: 100%;
+ max-width: 100%;
+}
+.btn-group-vertical > .btn-group > .btn {
+ float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+ margin-top: -1px;
+ margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+ border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+ border-bottom-left-radius: 4px;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.btn-group-justified {
+ display: table;
+ width: 100%;
+ table-layout: fixed;
+ border-collapse: separate;
+}
+.btn-group-justified > .btn,
+.btn-group-justified > .btn-group {
+ display: table-cell;
+ float: none;
+ width: 1%;
+}
+.btn-group-justified > .btn-group .btn {
+ width: 100%;
+}
+.btn-group-justified > .btn-group .dropdown-menu {
+ left: auto;
+}
+[data-toggle="buttons"] > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn input[type="checkbox"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
+}
+.input-group {
+ position: relative;
+ display: table;
+ border-collapse: separate;
+}
+.input-group[class*="col-"] {
+ float: none;
+ padding-right: 0;
+ padding-left: 0;
+}
+.input-group .form-control {
+ position: relative;
+ z-index: 2;
+ float: left;
+ width: 100%;
+ margin-bottom: 0;
+}
+.input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+ border-radius: 6px;
+}
+select.input-group-lg > .form-control,
+select.input-group-lg > .input-group-addon,
+select.input-group-lg > .input-group-btn > .btn {
+ height: 46px;
+ line-height: 46px;
+}
+textarea.input-group-lg > .form-control,
+textarea.input-group-lg > .input-group-addon,
+textarea.input-group-lg > .input-group-btn > .btn,
+select[multiple].input-group-lg > .form-control,
+select[multiple].input-group-lg > .input-group-addon,
+select[multiple].input-group-lg > .input-group-btn > .btn {
+ height: auto;
+}
+.input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+select.input-group-sm > .form-control,
+select.input-group-sm > .input-group-addon,
+select.input-group-sm > .input-group-btn > .btn {
+ height: 30px;
+ line-height: 30px;
+}
+textarea.input-group-sm > .form-control,
+textarea.input-group-sm > .input-group-addon,
+textarea.input-group-sm > .input-group-btn > .btn,
+select[multiple].input-group-sm > .form-control,
+select[multiple].input-group-sm > .input-group-addon,
+select[multiple].input-group-sm > .input-group-btn > .btn {
+ height: auto;
+}
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+ display: table-cell;
+}
+.input-group-addon:not(:first-child):not(:last-child),
+.input-group-btn:not(:first-child):not(:last-child),
+.input-group .form-control:not(:first-child):not(:last-child) {
+ border-radius: 0;
+}
+.input-group-addon,
+.input-group-btn {
+ width: 1%;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+.input-group-addon {
+ padding: 6px 12px;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 1;
+ color: #555;
+ text-align: center;
+ background-color: #eee;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+}
+.input-group-addon.input-sm {
+ padding: 5px 10px;
+ font-size: 12px;
+ border-radius: 3px;
+}
+.input-group-addon.input-lg {
+ padding: 10px 16px;
+ font-size: 18px;
+ border-radius: 6px;
+}
+.input-group-addon input[type="radio"],
+.input-group-addon input[type="checkbox"] {
+ margin-top: 0;
+}
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.input-group-addon:first-child {
+ border-right: 0;
+}
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.input-group-addon:last-child {
+ border-left: 0;
+}
+.input-group-btn {
+ position: relative;
+ font-size: 0;
+ white-space: nowrap;
+}
+.input-group-btn > .btn {
+ position: relative;
+}
+.input-group-btn > .btn + .btn {
+ margin-left: -1px;
+}
+.input-group-btn > .btn:hover,
+.input-group-btn > .btn:focus,
+.input-group-btn > .btn:active {
+ z-index: 2;
+}
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group {
+ margin-right: -1px;
+}
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group {
+ margin-left: -1px;
+}
+.nav {
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+.nav > li {
+ position: relative;
+ display: block;
+}
+.nav > li > a {
+ position: relative;
+ display: block;
+ padding: 10px 15px;
+}
+.nav > li > a:hover,
+.nav > li > a:focus {
+ text-decoration: none;
+ background-color: #eee;
+}
+.nav > li.disabled > a {
+ color: #777;
+}
+.nav > li.disabled > a:hover,
+.nav > li.disabled > a:focus {
+ color: #777;
+ text-decoration: none;
+ cursor: not-allowed;
+ background-color: transparent;
+}
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+ background-color: #eee;
+ border-color: #337ab7;
+}
+.nav .nav-divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #e5e5e5;
+}
+.nav > li > a > img {
+ max-width: none;
+}
+.nav-tabs {
+ border-bottom: 1px solid #ddd;
+}
+.nav-tabs > li {
+ float: left;
+ margin-bottom: -1px;
+}
+.nav-tabs > li > a {
+ margin-right: 2px;
+ line-height: 1.42857143;
+ border: 1px solid transparent;
+ border-radius: 4px 4px 0 0;
+}
+.nav-tabs > li > a:hover {
+ border-color: #eee #eee #ddd;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+ color: #555;
+ cursor: default;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-bottom-color: transparent;
+}
+.nav-tabs.nav-justified {
+ width: 100%;
+ border-bottom: 0;
+}
+.nav-tabs.nav-justified > li {
+ float: none;
+}
+.nav-tabs.nav-justified > li > a {
+ margin-bottom: 5px;
+ text-align: center;
+}
+.nav-tabs.nav-justified > .dropdown .dropdown-menu {
+ top: auto;
+ left: auto;
+}
+@media (min-width: 768px) {
+ .nav-tabs.nav-justified > li {
+ display: table-cell;
+ width: 1%;
+ }
+ .nav-tabs.nav-justified > li > a {
+ margin-bottom: 0;
+ }
+}
+.nav-tabs.nav-justified > li > a {
+ margin-right: 0;
+ border-radius: 4px;
+}
+.nav-tabs.nav-justified > .active > a,
+.nav-tabs.nav-justified > .active > a:hover,
+.nav-tabs.nav-justified > .active > a:focus {
+ border: 1px solid #ddd;
+}
+@media (min-width: 768px) {
+ .nav-tabs.nav-justified > li > a {
+ border-bottom: 1px solid #ddd;
+ border-radius: 4px 4px 0 0;
+ }
+ .nav-tabs.nav-justified > .active > a,
+ .nav-tabs.nav-justified > .active > a:hover,
+ .nav-tabs.nav-justified > .active > a:focus {
+ border-bottom-color: #fff;
+ }
+}
+.nav-pills > li {
+ float: left;
+}
+.nav-pills > li > a {
+ border-radius: 4px;
+}
+.nav-pills > li + li {
+ margin-left: 2px;
+}
+.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+ color: #fff;
+ background-color: #337ab7;
+}
+.nav-stacked > li {
+ float: none;
+}
+.nav-stacked > li + li {
+ margin-top: 2px;
+ margin-left: 0;
+}
+.nav-justified {
+ width: 100%;
+}
+.nav-justified > li {
+ float: none;
+}
+.nav-justified > li > a {
+ margin-bottom: 5px;
+ text-align: center;
+}
+.nav-justified > .dropdown .dropdown-menu {
+ top: auto;
+ left: auto;
+}
+@media (min-width: 768px) {
+ .nav-justified > li {
+ display: table-cell;
+ width: 1%;
+ }
+ .nav-justified > li > a {
+ margin-bottom: 0;
+ }
+}
+.nav-tabs-justified {
+ border-bottom: 0;
+}
+.nav-tabs-justified > li > a {
+ margin-right: 0;
+ border-radius: 4px;
+}
+.nav-tabs-justified > .active > a,
+.nav-tabs-justified > .active > a:hover,
+.nav-tabs-justified > .active > a:focus {
+ border: 1px solid #ddd;
+}
+@media (min-width: 768px) {
+ .nav-tabs-justified > li > a {
+ border-bottom: 1px solid #ddd;
+ border-radius: 4px 4px 0 0;
+ }
+ .nav-tabs-justified > .active > a,
+ .nav-tabs-justified > .active > a:hover,
+ .nav-tabs-justified > .active > a:focus {
+ border-bottom-color: #fff;
+ }
+}
+.tab-content > .tab-pane {
+ display: none;
+ visibility: hidden;
+}
+.tab-content > .active {
+ display: block;
+ visibility: visible;
+}
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.navbar {
+ position: relative;
+ min-height: 50px;
+ margin-bottom: 20px;
+ border: 1px solid transparent;
+}
+@media (min-width: 768px) {
+ .navbar {
+ border-radius: 4px;
+ }
+}
+@media (min-width: 768px) {
+ .navbar-header {
+ float: left;
+ }
+}
+.navbar-collapse {
+ padding-right: 15px;
+ padding-left: 15px;
+ overflow-x: visible;
+ -webkit-overflow-scrolling: touch;
+ border-top: 1px solid transparent;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+}
+.navbar-collapse.in {
+ overflow-y: auto;
+}
+@media (min-width: 768px) {
+ .navbar-collapse {
+ width: auto;
+ border-top: 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ }
+ .navbar-collapse.collapse {
+ display: block !important;
+ height: auto !important;
+ padding-bottom: 0;
+ overflow: visible !important;
+ visibility: visible !important;
+ }
+ .navbar-collapse.in {
+ overflow-y: visible;
+ }
+ .navbar-fixed-top .navbar-collapse,
+ .navbar-static-top .navbar-collapse,
+ .navbar-fixed-bottom .navbar-collapse {
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+.navbar-fixed-top .navbar-collapse,
+.navbar-fixed-bottom .navbar-collapse {
+ max-height: 340px;
+}
+@media (max-device-width: 480px) and (orientation: landscape) {
+ .navbar-fixed-top .navbar-collapse,
+ .navbar-fixed-bottom .navbar-collapse {
+ max-height: 200px;
+ }
+}
+.container > .navbar-header,
+.container-fluid > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-collapse {
+ margin-right: -15px;
+ margin-left: -15px;
+}
+@media (min-width: 768px) {
+ .container > .navbar-header,
+ .container-fluid > .navbar-header,
+ .container > .navbar-collapse,
+ .container-fluid > .navbar-collapse {
+ margin-right: 0;
+ margin-left: 0;
+ }
+}
+.navbar-static-top {
+ z-index: 1000;
+ border-width: 0 0 1px;
+}
+@media (min-width: 768px) {
+ .navbar-static-top {
+ border-radius: 0;
+ }
+}
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ position: fixed;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+}
+@media (min-width: 768px) {
+ .navbar-fixed-top,
+ .navbar-fixed-bottom {
+ border-radius: 0;
+ }
+}
+.navbar-fixed-top {
+ top: 0;
+ border-width: 0 0 1px;
+}
+.navbar-fixed-bottom {
+ bottom: 0;
+ margin-bottom: 0;
+ border-width: 1px 0 0;
+}
+.navbar-brand {
+ float: left;
+ height: 50px;
+ padding: 15px 15px;
+ font-size: 18px;
+ line-height: 20px;
+}
+.navbar-brand:hover,
+.navbar-brand:focus {
+ text-decoration: none;
+}
+.navbar-brand > img {
+ display: block;
+}
+@media (min-width: 768px) {
+ .navbar > .container .navbar-brand,
+ .navbar > .container-fluid .navbar-brand {
+ margin-left: -15px;
+ }
+}
+.navbar-toggle {
+ position: relative;
+ float: right;
+ padding: 9px 10px;
+ margin-top: 8px;
+ margin-right: 15px;
+ margin-bottom: 8px;
+ background-color: transparent;
+ background-image: none;
+ border: 1px solid transparent;
+ border-radius: 4px;
+}
+.navbar-toggle:focus {
+ outline: 0;
+}
+.navbar-toggle .icon-bar {
+ display: block;
+ width: 22px;
+ height: 2px;
+ border-radius: 1px;
+}
+.navbar-toggle .icon-bar + .icon-bar {
+ margin-top: 4px;
+}
+@media (min-width: 768px) {
+ .navbar-toggle {
+ display: none;
+ }
+}
+.navbar-nav {
+ margin: 7.5px -15px;
+}
+.navbar-nav > li > a {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ line-height: 20px;
+}
+@media (max-width: 767px) {
+ .navbar-nav .open .dropdown-menu {
+ position: static;
+ float: none;
+ width: auto;
+ margin-top: 0;
+ background-color: transparent;
+ border: 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ }
+ .navbar-nav .open .dropdown-menu > li > a,
+ .navbar-nav .open .dropdown-menu .dropdown-header {
+ padding: 5px 15px 5px 25px;
+ }
+ .navbar-nav .open .dropdown-menu > li > a {
+ line-height: 20px;
+ }
+ .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-nav .open .dropdown-menu > li > a:focus {
+ background-image: none;
+ }
+}
+@media (min-width: 768px) {
+ .navbar-nav {
+ float: left;
+ margin: 0;
+ }
+ .navbar-nav > li {
+ float: left;
+ }
+ .navbar-nav > li > a {
+ padding-top: 15px;
+ padding-bottom: 15px;
+ }
+}
+.navbar-form {
+ padding: 10px 15px;
+ margin-top: 8px;
+ margin-right: -15px;
+ margin-bottom: 8px;
+ margin-left: -15px;
+ border-top: 1px solid transparent;
+ border-bottom: 1px solid transparent;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+}
+@media (min-width: 768px) {
+ .navbar-form .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
+ .navbar-form .form-control-static {
+ display: inline-block;
+ }
+ .navbar-form .input-group {
+ display: inline-table;
+ vertical-align: middle;
+ }
+ .navbar-form .input-group .input-group-addon,
+ .navbar-form .input-group .input-group-btn,
+ .navbar-form .input-group .form-control {
+ width: auto;
+ }
+ .navbar-form .input-group > .form-control {
+ width: 100%;
+ }
+ .navbar-form .control-label {
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .radio,
+ .navbar-form .checkbox {
+ display: inline-block;
+ margin-top: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .radio label,
+ .navbar-form .checkbox label {
+ padding-left: 0;
+ }
+ .navbar-form .radio input[type="radio"],
+ .navbar-form .checkbox input[type="checkbox"] {
+ position: relative;
+ margin-left: 0;
+ }
+ .navbar-form .has-feedback .form-control-feedback {
+ top: 0;
+ }
+}
+@media (max-width: 767px) {
+ .navbar-form .form-group {
+ margin-bottom: 5px;
+ }
+ .navbar-form .form-group:last-child {
+ margin-bottom: 0;
+ }
+}
+@media (min-width: 768px) {
+ .navbar-form {
+ width: auto;
+ padding-top: 0;
+ padding-bottom: 0;
+ margin-right: 0;
+ margin-left: 0;
+ border: 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ }
+}
+.navbar-nav > li > .dropdown-menu {
+ margin-top: 0;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+ margin-bottom: 0;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.navbar-btn {
+ margin-top: 8px;
+ margin-bottom: 8px;
+}
+.navbar-btn.btn-sm {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+.navbar-btn.btn-xs {
+ margin-top: 14px;
+ margin-bottom: 14px;
+}
+.navbar-text {
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+@media (min-width: 768px) {
+ .navbar-text {
+ float: left;
+ margin-right: 15px;
+ margin-left: 15px;
+ }
+}
+@media (min-width: 768px) {
+ .navbar-left {
+ float: left !important;
+ }
+ .navbar-right {
+ float: right !important;
+ margin-right: -15px;
+ }
+ .navbar-right ~ .navbar-right {
+ margin-right: 0;
+ }
+}
+.navbar-default {
+ background-color: #f8f8f8;
+ border-color: #e7e7e7;
+}
+.navbar-default .navbar-brand {
+ color: #777;
+}
+.navbar-default .navbar-brand:hover,
+.navbar-default .navbar-brand:focus {
+ color: #5e5e5e;
+ background-color: transparent;
+}
+.navbar-default .navbar-text {
+ color: #777;
+}
+.navbar-default .navbar-nav > li > a {
+ color: #777;
+}
+.navbar-default .navbar-nav > li > a:hover,
+.navbar-default .navbar-nav > li > a:focus {
+ color: #333;
+ background-color: transparent;
+}
+.navbar-default .navbar-nav > .active > a,
+.navbar-default .navbar-nav > .active > a:hover,
+.navbar-default .navbar-nav > .active > a:focus {
+ color: #555;
+ background-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .disabled > a,
+.navbar-default .navbar-nav > .disabled > a:hover,
+.navbar-default .navbar-nav > .disabled > a:focus {
+ color: #ccc;
+ background-color: transparent;
+}
+.navbar-default .navbar-toggle {
+ border-color: #ddd;
+}
+.navbar-default .navbar-toggle:hover,
+.navbar-default .navbar-toggle:focus {
+ background-color: #ddd;
+}
+.navbar-default .navbar-toggle .icon-bar {
+ background-color: #888;
+}
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+ border-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .open > a:hover,
+.navbar-default .navbar-nav > .open > a:focus {
+ color: #555;
+ background-color: #e7e7e7;
+}
+@media (max-width: 767px) {
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+ color: #777;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #333;
+ background-color: transparent;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #555;
+ background-color: #e7e7e7;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #ccc;
+ background-color: transparent;
+ }
+}
+.navbar-default .navbar-link {
+ color: #777;
+}
+.navbar-default .navbar-link:hover {
+ color: #333;
+}
+.navbar-default .btn-link {
+ color: #777;
+}
+.navbar-default .btn-link:hover,
+.navbar-default .btn-link:focus {
+ color: #333;
+}
+.navbar-default .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-default .btn-link:hover,
+.navbar-default .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-default .btn-link:focus {
+ color: #ccc;
+}
+.navbar-inverse {
+ background-color: #222;
+ border-color: #080808;
+}
+.navbar-inverse .navbar-brand {
+ color: #9d9d9d;
+}
+.navbar-inverse .navbar-brand:hover,
+.navbar-inverse .navbar-brand:focus {
+ color: #fff;
+ background-color: transparent;
+}
+.navbar-inverse .navbar-text {
+ color: #9d9d9d;
+}
+.navbar-inverse .navbar-nav > li > a {
+ color: #9d9d9d;
+}
+.navbar-inverse .navbar-nav > li > a:hover,
+.navbar-inverse .navbar-nav > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+}
+.navbar-inverse .navbar-nav > .active > a,
+.navbar-inverse .navbar-nav > .active > a:hover,
+.navbar-inverse .navbar-nav > .active > a:focus {
+ color: #fff;
+ background-color: #080808;
+}
+.navbar-inverse .navbar-nav > .disabled > a,
+.navbar-inverse .navbar-nav > .disabled > a:hover,
+.navbar-inverse .navbar-nav > .disabled > a:focus {
+ color: #444;
+ background-color: transparent;
+}
+.navbar-inverse .navbar-toggle {
+ border-color: #333;
+}
+.navbar-inverse .navbar-toggle:hover,
+.navbar-inverse .navbar-toggle:focus {
+ background-color: #333;
+}
+.navbar-inverse .navbar-toggle .icon-bar {
+ background-color: #fff;
+}
+.navbar-inverse .navbar-collapse,
+.navbar-inverse .navbar-form {
+ border-color: #101010;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .open > a:hover,
+.navbar-inverse .navbar-nav > .open > a:focus {
+ color: #fff;
+ background-color: #080808;
+}
+@media (max-width: 767px) {
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+ border-color: #080808;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+ background-color: #080808;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+ color: #9d9d9d;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #fff;
+ background-color: #080808;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #444;
+ background-color: transparent;
+ }
+}
+.navbar-inverse .navbar-link {
+ color: #9d9d9d;
+}
+.navbar-inverse .navbar-link:hover {
+ color: #fff;
+}
+.navbar-inverse .btn-link {
+ color: #9d9d9d;
+}
+.navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link:focus {
+ color: #fff;
+}
+.navbar-inverse .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-inverse .btn-link:focus {
+ color: #444;
+}
+.breadcrumb {
+ padding: 8px 15px;
+ margin-bottom: 20px;
+ list-style: none;
+ background-color: #f5f5f5;
+ border-radius: 4px;
+}
+.breadcrumb > li {
+ display: inline-block;
+}
+.breadcrumb > li + li:before {
+ padding: 0 5px;
+ color: #ccc;
+ content: "/\00a0";
+}
+.breadcrumb > .active {
+ color: #777;
+}
+.pagination {
+ display: inline-block;
+ padding-left: 0;
+ margin: 20px 0;
+ border-radius: 4px;
+}
+.pagination > li {
+ display: inline;
+}
+.pagination > li > a,
+.pagination > li > span {
+ position: relative;
+ float: left;
+ padding: 6px 12px;
+ margin-left: -1px;
+ line-height: 1.42857143;
+ color: #337ab7;
+ text-decoration: none;
+ background-color: #fff;
+ border: 1px solid #ddd;
+}
+.pagination > li:first-child > a,
+.pagination > li:first-child > span {
+ margin-left: 0;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+.pagination > li:last-child > a,
+.pagination > li:last-child > span {
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+.pagination > li > a:hover,
+.pagination > li > span:hover,
+.pagination > li > a:focus,
+.pagination > li > span:focus {
+ color: #23527c;
+ background-color: #eee;
+ border-color: #ddd;
+}
+.pagination > .active > a,
+.pagination > .active > span,
+.pagination > .active > a:hover,
+.pagination > .active > span:hover,
+.pagination > .active > a:focus,
+.pagination > .active > span:focus {
+ z-index: 2;
+ color: #fff;
+ cursor: default;
+ background-color: #337ab7;
+ border-color: #337ab7;
+}
+.pagination > .disabled > span,
+.pagination > .disabled > span:hover,
+.pagination > .disabled > span:focus,
+.pagination > .disabled > a,
+.pagination > .disabled > a:hover,
+.pagination > .disabled > a:focus {
+ color: #777;
+ cursor: not-allowed;
+ background-color: #fff;
+ border-color: #ddd;
+}
+.pagination-lg > li > a,
+.pagination-lg > li > span {
+ padding: 10px 16px;
+ font-size: 18px;
+}
+.pagination-lg > li:first-child > a,
+.pagination-lg > li:first-child > span {
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 6px;
+}
+.pagination-lg > li:last-child > a,
+.pagination-lg > li:last-child > span {
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 6px;
+}
+.pagination-sm > li > a,
+.pagination-sm > li > span {
+ padding: 5px 10px;
+ font-size: 12px;
+}
+.pagination-sm > li:first-child > a,
+.pagination-sm > li:first-child > span {
+ border-top-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+.pagination-sm > li:last-child > a,
+.pagination-sm > li:last-child > span {
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+}
+.pager {
+ padding-left: 0;
+ margin: 20px 0;
+ text-align: center;
+ list-style: none;
+}
+.pager li {
+ display: inline;
+}
+.pager li > a,
+.pager li > span {
+ display: inline-block;
+ padding: 5px 14px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 15px;
+}
+.pager li > a:hover,
+.pager li > a:focus {
+ text-decoration: none;
+ background-color: #eee;
+}
+.pager .next > a,
+.pager .next > span {
+ float: right;
+}
+.pager .previous > a,
+.pager .previous > span {
+ float: left;
+}
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+ color: #777;
+ cursor: not-allowed;
+ background-color: #fff;
+}
+.label {
+ display: inline;
+ padding: .2em .6em .3em;
+ font-size: 75%;
+ font-weight: bold;
+ line-height: 1;
+ color: #fff;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: .25em;
+}
+a.label:hover,
+a.label:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer;
+}
+.label:empty {
+ display: none;
+}
+.btn .label {
+ position: relative;
+ top: -1px;
+}
+.label-default {
+ background-color: #777;
+}
+.label-default[href]:hover,
+.label-default[href]:focus {
+ background-color: #5e5e5e;
+}
+.label-primary {
+ background-color: #337ab7;
+}
+.label-primary[href]:hover,
+.label-primary[href]:focus {
+ background-color: #286090;
+}
+.label-success {
+ background-color: #5cb85c;
+}
+.label-success[href]:hover,
+.label-success[href]:focus {
+ background-color: #449d44;
+}
+.label-info {
+ background-color: #5bc0de;
+}
+.label-info[href]:hover,
+.label-info[href]:focus {
+ background-color: #31b0d5;
+}
+.label-warning {
+ background-color: #f0ad4e;
+}
+.label-warning[href]:hover,
+.label-warning[href]:focus {
+ background-color: #ec971f;
+}
+.label-danger {
+ background-color: #d9534f;
+}
+.label-danger[href]:hover,
+.label-danger[href]:focus {
+ background-color: #c9302c;
+}
+.badge {
+ display: inline-block;
+ min-width: 10px;
+ padding: 3px 7px;
+ font-size: 12px;
+ font-weight: bold;
+ line-height: 1;
+ color: #fff;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ background-color: #777;
+ border-radius: 10px;
+}
+.badge:empty {
+ display: none;
+}
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+.btn-xs .badge {
+ top: 0;
+ padding: 1px 5px;
+}
+a.badge:hover,
+a.badge:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer;
+}
+.list-group-item.active > .badge,
+.nav-pills > .active > a > .badge {
+ color: #337ab7;
+ background-color: #fff;
+}
+.list-group-item > .badge {
+ float: right;
+}
+.list-group-item > .badge + .badge {
+ margin-right: 5px;
+}
+.nav-pills > li > a > .badge {
+ margin-left: 3px;
+}
+.jumbotron {
+ padding: 30px 15px;
+ margin-bottom: 30px;
+ color: inherit;
+ background-color: #eee;
+}
+.jumbotron h1,
+.jumbotron .h1 {
+ color: inherit;
+}
+.jumbotron p {
+ margin-bottom: 15px;
+ font-size: 21px;
+ font-weight: 200;
+}
+.jumbotron > hr {
+ border-top-color: #d5d5d5;
+}
+.container .jumbotron,
+.container-fluid .jumbotron {
+ border-radius: 6px;
+}
+.jumbotron .container {
+ max-width: 100%;
+}
+@media screen and (min-width: 768px) {
+ .jumbotron {
+ padding: 48px 0;
+ }
+ .container .jumbotron,
+ .container-fluid .jumbotron {
+ padding-right: 60px;
+ padding-left: 60px;
+ }
+ .jumbotron h1,
+ .jumbotron .h1 {
+ font-size: 63px;
+ }
+}
+.thumbnail {
+ display: block;
+ padding: 4px;
+ margin-bottom: 20px;
+ line-height: 1.42857143;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ -webkit-transition: border .2s ease-in-out;
+ -o-transition: border .2s ease-in-out;
+ transition: border .2s ease-in-out;
+}
+.thumbnail > img,
+.thumbnail a > img {
+ margin-right: auto;
+ margin-left: auto;
+}
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+ border-color: #337ab7;
+}
+.thumbnail .caption {
+ padding: 9px;
+ color: #333;
+}
+.alert {
+ padding: 15px;
+ margin-bottom: 20px;
+ border: 1px solid transparent;
+ border-radius: 4px;
+}
+.alert h4 {
+ margin-top: 0;
+ color: inherit;
+}
+.alert .alert-link {
+ font-weight: bold;
+}
+.alert > p,
+.alert > ul {
+ margin-bottom: 0;
+}
+.alert > p + p {
+ margin-top: 5px;
+}
+.alert-dismissable,
+.alert-dismissible {
+ padding-right: 35px;
+}
+.alert-dismissable .close,
+.alert-dismissible .close {
+ position: relative;
+ top: -2px;
+ right: -21px;
+ color: inherit;
+}
+.alert-success {
+ color: #3c763d;
+ background-color: #dff0d8;
+ border-color: #d6e9c6;
+}
+.alert-success hr {
+ border-top-color: #c9e2b3;
+}
+.alert-success .alert-link {
+ color: #2b542c;
+}
+.alert-info {
+ color: #31708f;
+ background-color: #d9edf7;
+ border-color: #bce8f1;
+}
+.alert-info hr {
+ border-top-color: #a6e1ec;
+}
+.alert-info .alert-link {
+ color: #245269;
+}
+.alert-warning {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+ border-color: #faebcc;
+}
+.alert-warning hr {
+ border-top-color: #f7e1b5;
+}
+.alert-warning .alert-link {
+ color: #66512c;
+}
+.alert-danger {
+ color: #a94442;
+ background-color: #f2dede;
+ border-color: #ebccd1;
+}
+.alert-danger hr {
+ border-top-color: #e4b9c0;
+}
+.alert-danger .alert-link {
+ color: #843534;
+}
+@-webkit-keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+@-o-keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+.progress {
+ height: 20px;
+ margin-bottom: 20px;
+ overflow: hidden;
+ background-color: #f5f5f5;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+}
+.progress-bar {
+ float: left;
+ width: 0;
+ height: 100%;
+ font-size: 12px;
+ line-height: 20px;
+ color: #fff;
+ text-align: center;
+ background-color: #337ab7;
+ -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
+ -webkit-transition: width .6s ease;
+ -o-transition: width .6s ease;
+ transition: width .6s ease;
+}
+.progress-striped .progress-bar,
+.progress-bar-striped {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ -webkit-background-size: 40px 40px;
+ background-size: 40px 40px;
+}
+.progress.active .progress-bar,
+.progress-bar.active {
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
+ -o-animation: progress-bar-stripes 2s linear infinite;
+ animation: progress-bar-stripes 2s linear infinite;
+}
+.progress-bar-success {
+ background-color: #5cb85c;
+}
+.progress-striped .progress-bar-success {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-info {
+ background-color: #5bc0de;
+}
+.progress-striped .progress-bar-info {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-warning {
+ background-color: #f0ad4e;
+}
+.progress-striped .progress-bar-warning {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-danger {
+ background-color: #d9534f;
+}
+.progress-striped .progress-bar-danger {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.media {
+ margin-top: 15px;
+}
+.media:first-child {
+ margin-top: 0;
+}
+.media,
+.media-body {
+ overflow: hidden;
+ zoom: 1;
+}
+.media-body {
+ width: 10000px;
+}
+.media-object {
+ display: block;
+}
+.media-right,
+.media > .pull-right {
+ padding-left: 10px;
+}
+.media-left,
+.media > .pull-left {
+ padding-right: 10px;
+}
+.media-left,
+.media-right,
+.media-body {
+ display: table-cell;
+ vertical-align: top;
+}
+.media-middle {
+ vertical-align: middle;
+}
+.media-bottom {
+ vertical-align: bottom;
+}
+.media-heading {
+ margin-top: 0;
+ margin-bottom: 5px;
+}
+.media-list {
+ padding-left: 0;
+ list-style: none;
+}
+.list-group {
+ padding-left: 0;
+ margin-bottom: 20px;
+}
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: 10px 15px;
+ margin-bottom: -1px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+}
+.list-group-item:first-child {
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+}
+.list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom-right-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+a.list-group-item {
+ color: #555;
+}
+a.list-group-item .list-group-item-heading {
+ color: #333;
+}
+a.list-group-item:hover,
+a.list-group-item:focus {
+ color: #555;
+ text-decoration: none;
+ background-color: #f5f5f5;
+}
+.list-group-item.disabled,
+.list-group-item.disabled:hover,
+.list-group-item.disabled:focus {
+ color: #777;
+ cursor: not-allowed;
+ background-color: #eee;
+}
+.list-group-item.disabled .list-group-item-heading,
+.list-group-item.disabled:hover .list-group-item-heading,
+.list-group-item.disabled:focus .list-group-item-heading {
+ color: inherit;
+}
+.list-group-item.disabled .list-group-item-text,
+.list-group-item.disabled:hover .list-group-item-text,
+.list-group-item.disabled:focus .list-group-item-text {
+ color: #777;
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+ z-index: 2;
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #337ab7;
+}
+.list-group-item.active .list-group-item-heading,
+.list-group-item.active:hover .list-group-item-heading,
+.list-group-item.active:focus .list-group-item-heading,
+.list-group-item.active .list-group-item-heading > small,
+.list-group-item.active:hover .list-group-item-heading > small,
+.list-group-item.active:focus .list-group-item-heading > small,
+.list-group-item.active .list-group-item-heading > .small,
+.list-group-item.active:hover .list-group-item-heading > .small,
+.list-group-item.active:focus .list-group-item-heading > .small {
+ color: inherit;
+}
+.list-group-item.active .list-group-item-text,
+.list-group-item.active:hover .list-group-item-text,
+.list-group-item.active:focus .list-group-item-text {
+ color: #c7ddef;
+}
+.list-group-item-success {
+ color: #3c763d;
+ background-color: #dff0d8;
+}
+a.list-group-item-success {
+ color: #3c763d;
+}
+a.list-group-item-success .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-success:hover,
+a.list-group-item-success:focus {
+ color: #3c763d;
+ background-color: #d0e9c6;
+}
+a.list-group-item-success.active,
+a.list-group-item-success.active:hover,
+a.list-group-item-success.active:focus {
+ color: #fff;
+ background-color: #3c763d;
+ border-color: #3c763d;
+}
+.list-group-item-info {
+ color: #31708f;
+ background-color: #d9edf7;
+}
+a.list-group-item-info {
+ color: #31708f;
+}
+a.list-group-item-info .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-info:hover,
+a.list-group-item-info:focus {
+ color: #31708f;
+ background-color: #c4e3f3;
+}
+a.list-group-item-info.active,
+a.list-group-item-info.active:hover,
+a.list-group-item-info.active:focus {
+ color: #fff;
+ background-color: #31708f;
+ border-color: #31708f;
+}
+.list-group-item-warning {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+}
+a.list-group-item-warning {
+ color: #8a6d3b;
+}
+a.list-group-item-warning .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-warning:hover,
+a.list-group-item-warning:focus {
+ color: #8a6d3b;
+ background-color: #faf2cc;
+}
+a.list-group-item-warning.active,
+a.list-group-item-warning.active:hover,
+a.list-group-item-warning.active:focus {
+ color: #fff;
+ background-color: #8a6d3b;
+ border-color: #8a6d3b;
+}
+.list-group-item-danger {
+ color: #a94442;
+ background-color: #f2dede;
+}
+a.list-group-item-danger {
+ color: #a94442;
+}
+a.list-group-item-danger .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-danger:hover,
+a.list-group-item-danger:focus {
+ color: #a94442;
+ background-color: #ebcccc;
+}
+a.list-group-item-danger.active,
+a.list-group-item-danger.active:hover,
+a.list-group-item-danger.active:focus {
+ color: #fff;
+ background-color: #a94442;
+ border-color: #a94442;
+}
+.list-group-item-heading {
+ margin-top: 0;
+ margin-bottom: 5px;
+}
+.list-group-item-text {
+ margin-bottom: 0;
+ line-height: 1.3;
+}
+.panel {
+ margin-bottom: 20px;
+ background-color: #fff;
+ border: 1px solid transparent;
+ border-radius: 4px;
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+}
+.panel-body {
+ padding: 15px;
+}
+.panel-heading {
+ padding: 10px 15px;
+ border-bottom: 1px solid transparent;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+}
+.panel-heading > .dropdown .dropdown-toggle {
+ color: inherit;
+}
+.panel-title {
+ margin-top: 0;
+ margin-bottom: 0;
+ font-size: 16px;
+ color: inherit;
+}
+.panel-title > a,
+.panel-title > small,
+.panel-title > .small,
+.panel-title > small > a,
+.panel-title > .small > a {
+ color: inherit;
+}
+.panel-footer {
+ padding: 10px 15px;
+ background-color: #f5f5f5;
+ border-top: 1px solid #ddd;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+.panel > .list-group,
+.panel > .panel-collapse > .list-group {
+ margin-bottom: 0;
+}
+.panel > .list-group .list-group-item,
+.panel > .panel-collapse > .list-group .list-group-item {
+ border-width: 1px 0;
+ border-radius: 0;
+}
+.panel > .list-group:first-child .list-group-item:first-child,
+.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
+ border-top: 0;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+}
+.panel > .list-group:last-child .list-group-item:last-child,
+.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
+ border-bottom: 0;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+.panel-heading + .list-group .list-group-item:first-child {
+ border-top-width: 0;
+}
+.list-group + .panel-footer {
+ border-top-width: 0;
+}
+.panel > .table,
+.panel > .table-responsive > .table,
+.panel > .panel-collapse > .table {
+ margin-bottom: 0;
+}
+.panel > .table caption,
+.panel > .table-responsive > .table caption,
+.panel > .panel-collapse > .table caption {
+ padding-right: 15px;
+ padding-left: 15px;
+}
+.panel > .table:first-child,
+.panel > .table-responsive:first-child > .table:first-child {
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+ border-top-left-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+ border-top-right-radius: 3px;
+}
+.panel > .table:last-child,
+.panel > .table-responsive:last-child > .table:last-child {
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+ border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+ border-bottom-right-radius: 3px;
+}
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive,
+.panel > .table + .panel-body,
+.panel > .table-responsive + .panel-body {
+ border-top: 1px solid #ddd;
+}
+.panel > .table > tbody:first-child > tr:first-child th,
+.panel > .table > tbody:first-child > tr:first-child td {
+ border-top: 0;
+}
+.panel > .table-bordered,
+.panel > .table-responsive > .table-bordered {
+ border: 0;
+}
+.panel > .table-bordered > thead > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > thead > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+ border-left: 0;
+}
+.panel > .table-bordered > thead > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > thead > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+ border-right: 0;
+}
+.panel > .table-bordered > thead > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
+.panel > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-bordered > thead > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
+.panel > .table-bordered > tbody > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
+ border-bottom: 0;
+}
+.panel > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
+ border-bottom: 0;
+}
+.panel > .table-responsive {
+ margin-bottom: 0;
+ border: 0;
+}
+.panel-group {
+ margin-bottom: 20px;
+}
+.panel-group .panel {
+ margin-bottom: 0;
+ border-radius: 4px;
+}
+.panel-group .panel + .panel {
+ margin-top: 5px;
+}
+.panel-group .panel-heading {
+ border-bottom: 0;
+}
+.panel-group .panel-heading + .panel-collapse > .panel-body,
+.panel-group .panel-heading + .panel-collapse > .list-group {
+ border-top: 1px solid #ddd;
+}
+.panel-group .panel-footer {
+ border-top: 0;
+}
+.panel-group .panel-footer + .panel-collapse .panel-body {
+ border-bottom: 1px solid #ddd;
+}
+.panel-default {
+ border-color: #ddd;
+}
+.panel-default > .panel-heading {
+ color: #333;
+ background-color: #f5f5f5;
+ border-color: #ddd;
+}
+.panel-default > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #ddd;
+}
+.panel-default > .panel-heading .badge {
+ color: #f5f5f5;
+ background-color: #333;
+}
+.panel-default > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #ddd;
+}
+.panel-primary {
+ border-color: #337ab7;
+}
+.panel-primary > .panel-heading {
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #337ab7;
+}
+.panel-primary > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #337ab7;
+}
+.panel-primary > .panel-heading .badge {
+ color: #337ab7;
+ background-color: #fff;
+}
+.panel-primary > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #337ab7;
+}
+.panel-success {
+ border-color: #d6e9c6;
+}
+.panel-success > .panel-heading {
+ color: #3c763d;
+ background-color: #dff0d8;
+ border-color: #d6e9c6;
+}
+.panel-success > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #d6e9c6;
+}
+.panel-success > .panel-heading .badge {
+ color: #dff0d8;
+ background-color: #3c763d;
+}
+.panel-success > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #d6e9c6;
+}
+.panel-info {
+ border-color: #bce8f1;
+}
+.panel-info > .panel-heading {
+ color: #31708f;
+ background-color: #d9edf7;
+ border-color: #bce8f1;
+}
+.panel-info > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #bce8f1;
+}
+.panel-info > .panel-heading .badge {
+ color: #d9edf7;
+ background-color: #31708f;
+}
+.panel-info > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #bce8f1;
+}
+.panel-warning {
+ border-color: #faebcc;
+}
+.panel-warning > .panel-heading {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+ border-color: #faebcc;
+}
+.panel-warning > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #faebcc;
+}
+.panel-warning > .panel-heading .badge {
+ color: #fcf8e3;
+ background-color: #8a6d3b;
+}
+.panel-warning > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #faebcc;
+}
+.panel-danger {
+ border-color: #ebccd1;
+}
+.panel-danger > .panel-heading {
+ color: #a94442;
+ background-color: #f2dede;
+ border-color: #ebccd1;
+}
+.panel-danger > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #ebccd1;
+}
+.panel-danger > .panel-heading .badge {
+ color: #f2dede;
+ background-color: #a94442;
+}
+.panel-danger > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #ebccd1;
+}
+.embed-responsive {
+ position: relative;
+ display: block;
+ height: 0;
+ padding: 0;
+ overflow: hidden;
+}
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object,
+.embed-responsive video {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ border: 0;
+}
+.embed-responsive.embed-responsive-16by9 {
+ padding-bottom: 56.25%;
+}
+.embed-responsive.embed-responsive-4by3 {
+ padding-bottom: 75%;
+}
+.well {
+ min-height: 20px;
+ padding: 19px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ border: 1px solid #e3e3e3;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+}
+.well blockquote {
+ border-color: #ddd;
+ border-color: rgba(0, 0, 0, .15);
+}
+.well-lg {
+ padding: 24px;
+ border-radius: 6px;
+}
+.well-sm {
+ padding: 9px;
+ border-radius: 3px;
+}
+.close {
+ float: right;
+ font-size: 21px;
+ font-weight: bold;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ filter: alpha(opacity=20);
+ opacity: .2;
+}
+.close:hover,
+.close:focus {
+ color: #000;
+ text-decoration: none;
+ cursor: pointer;
+ filter: alpha(opacity=50);
+ opacity: .5;
+}
+button.close {
+ -webkit-appearance: none;
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+}
+.modal-open {
+ overflow: hidden;
+}
+.modal {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1040;
+ display: none;
+ overflow: hidden;
+ -webkit-overflow-scrolling: touch;
+ outline: 0;
+}
+.modal.fade .modal-dialog {
+ -webkit-transition: -webkit-transform .3s ease-out;
+ -o-transition: -o-transform .3s ease-out;
+ transition: transform .3s ease-out;
+ -webkit-transform: translate(0, -25%);
+ -ms-transform: translate(0, -25%);
+ -o-transform: translate(0, -25%);
+ transform: translate(0, -25%);
+}
+.modal.in .modal-dialog {
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ -o-transform: translate(0, 0);
+ transform: translate(0, 0);
+}
+.modal-open .modal {
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 10px;
+}
+.modal-content {
+ position: relative;
+ background-color: #fff;
+ -webkit-background-clip: padding-box;
+ background-clip: padding-box;
+ border: 1px solid #999;
+ border: 1px solid rgba(0, 0, 0, .2);
+ border-radius: 6px;
+ outline: 0;
+ -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+ box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+}
+.modal-backdrop {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ background-color: #000;
+}
+.modal-backdrop.fade {
+ filter: alpha(opacity=0);
+ opacity: 0;
+}
+.modal-backdrop.in {
+ filter: alpha(opacity=50);
+ opacity: .5;
+}
+.modal-header {
+ min-height: 16.42857143px;
+ padding: 15px;
+ border-bottom: 1px solid #e5e5e5;
+}
+.modal-header .close {
+ margin-top: -2px;
+}
+.modal-title {
+ margin: 0;
+ line-height: 1.42857143;
+}
+.modal-body {
+ position: relative;
+ padding: 15px;
+}
+.modal-footer {
+ padding: 15px;
+ text-align: right;
+ border-top: 1px solid #e5e5e5;
+}
+.modal-footer .btn + .btn {
+ margin-bottom: 0;
+ margin-left: 5px;
+}
+.modal-footer .btn-group .btn + .btn {
+ margin-left: -1px;
+}
+.modal-footer .btn-block + .btn-block {
+ margin-left: 0;
+}
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll;
+}
+@media (min-width: 768px) {
+ .modal-dialog {
+ width: 600px;
+ margin: 30px auto;
+ }
+ .modal-content {
+ -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+ box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+ }
+ .modal-sm {
+ width: 300px;
+ }
+}
+@media (min-width: 992px) {
+ .modal-lg {
+ width: 900px;
+ }
+}
+.tooltip {
+ position: absolute;
+ z-index: 1070;
+ display: block;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 12px;
+ font-weight: normal;
+ line-height: 1.4;
+ visibility: visible;
+ filter: alpha(opacity=0);
+ opacity: 0;
+}
+.tooltip.in {
+ filter: alpha(opacity=90);
+ opacity: .9;
+}
+.tooltip.top {
+ padding: 5px 0;
+ margin-top: -3px;
+}
+.tooltip.right {
+ padding: 0 5px;
+ margin-left: 3px;
+}
+.tooltip.bottom {
+ padding: 5px 0;
+ margin-top: 3px;
+}
+.tooltip.left {
+ padding: 0 5px;
+ margin-left: -3px;
+}
+.tooltip-inner {
+ max-width: 200px;
+ padding: 3px 8px;
+ color: #fff;
+ text-align: center;
+ text-decoration: none;
+ background-color: #000;
+ border-radius: 4px;
+}
+.tooltip-arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+.tooltip.top .tooltip-arrow {
+ bottom: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+.tooltip.top-left .tooltip-arrow {
+ right: 5px;
+ bottom: 0;
+ margin-bottom: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+.tooltip.top-right .tooltip-arrow {
+ bottom: 0;
+ left: 5px;
+ margin-bottom: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+.tooltip.right .tooltip-arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -5px;
+ border-width: 5px 5px 5px 0;
+ border-right-color: #000;
+}
+.tooltip.left .tooltip-arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -5px;
+ border-width: 5px 0 5px 5px;
+ border-left-color: #000;
+}
+.tooltip.bottom .tooltip-arrow {
+ top: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+.tooltip.bottom-left .tooltip-arrow {
+ top: 0;
+ right: 5px;
+ margin-top: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+.tooltip.bottom-right .tooltip-arrow {
+ top: 0;
+ left: 5px;
+ margin-top: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1060;
+ display: none;
+ max-width: 276px;
+ padding: 1px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 1.42857143;
+ text-align: left;
+ white-space: normal;
+ background-color: #fff;
+ -webkit-background-clip: padding-box;
+ background-clip: padding-box;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, .2);
+ border-radius: 6px;
+ -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
+ box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
+}
+.popover.top {
+ margin-top: -10px;
+}
+.popover.right {
+ margin-left: 10px;
+}
+.popover.bottom {
+ margin-top: 10px;
+}
+.popover.left {
+ margin-left: -10px;
+}
+.popover-title {
+ padding: 8px 14px;
+ margin: 0;
+ font-size: 14px;
+ background-color: #f7f7f7;
+ border-bottom: 1px solid #ebebeb;
+ border-radius: 5px 5px 0 0;
+}
+.popover-content {
+ padding: 9px 14px;
+}
+.popover > .arrow,
+.popover > .arrow:after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+.popover > .arrow {
+ border-width: 11px;
+}
+.popover > .arrow:after {
+ content: "";
+ border-width: 10px;
+}
+.popover.top > .arrow {
+ bottom: -11px;
+ left: 50%;
+ margin-left: -11px;
+ border-top-color: #999;
+ border-top-color: rgba(0, 0, 0, .25);
+ border-bottom-width: 0;
+}
+.popover.top > .arrow:after {
+ bottom: 1px;
+ margin-left: -10px;
+ content: " ";
+ border-top-color: #fff;
+ border-bottom-width: 0;
+}
+.popover.right > .arrow {
+ top: 50%;
+ left: -11px;
+ margin-top: -11px;
+ border-right-color: #999;
+ border-right-color: rgba(0, 0, 0, .25);
+ border-left-width: 0;
+}
+.popover.right > .arrow:after {
+ bottom: -10px;
+ left: 1px;
+ content: " ";
+ border-right-color: #fff;
+ border-left-width: 0;
+}
+.popover.bottom > .arrow {
+ top: -11px;
+ left: 50%;
+ margin-left: -11px;
+ border-top-width: 0;
+ border-bottom-color: #999;
+ border-bottom-color: rgba(0, 0, 0, .25);
+}
+.popover.bottom > .arrow:after {
+ top: 1px;
+ margin-left: -10px;
+ content: " ";
+ border-top-width: 0;
+ border-bottom-color: #fff;
+}
+.popover.left > .arrow {
+ top: 50%;
+ right: -11px;
+ margin-top: -11px;
+ border-right-width: 0;
+ border-left-color: #999;
+ border-left-color: rgba(0, 0, 0, .25);
+}
+.popover.left > .arrow:after {
+ right: 1px;
+ bottom: -10px;
+ content: " ";
+ border-right-width: 0;
+ border-left-color: #fff;
+}
+.carousel {
+ position: relative;
+}
+.carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+}
+.carousel-inner > .item {
+ position: relative;
+ display: none;
+ -webkit-transition: .6s ease-in-out left;
+ -o-transition: .6s ease-in-out left;
+ transition: .6s ease-in-out left;
+}
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+ line-height: 1;
+}
+@media all and (transform-3d), (-webkit-transform-3d) {
+ .carousel-inner > .item {
+ -webkit-transition: -webkit-transform .6s ease-in-out;
+ -o-transition: -o-transform .6s ease-in-out;
+ transition: transform .6s ease-in-out;
+
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-perspective: 1000;
+ perspective: 1000;
+ }
+ .carousel-inner > .item.next,
+ .carousel-inner > .item.active.right {
+ left: 0;
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
+ .carousel-inner > .item.prev,
+ .carousel-inner > .item.active.left {
+ left: 0;
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ }
+ .carousel-inner > .item.next.left,
+ .carousel-inner > .item.prev.right,
+ .carousel-inner > .item.active {
+ left: 0;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+ display: block;
+}
+.carousel-inner > .active {
+ left: 0;
+}
+.carousel-inner > .next,
+.carousel-inner > .prev {
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.carousel-inner > .next {
+ left: 100%;
+}
+.carousel-inner > .prev {
+ left: -100%;
+}
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+ left: 0;
+}
+.carousel-inner > .active.left {
+ left: -100%;
+}
+.carousel-inner > .active.right {
+ left: 100%;
+}
+.carousel-control {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 15%;
+ font-size: 20px;
+ color: #fff;
+ text-align: center;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+ filter: alpha(opacity=50);
+ opacity: .5;
+}
+.carousel-control.left {
+ background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+ background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+ background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));
+ background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
+ background-repeat: repeat-x;
+}
+.carousel-control.right {
+ right: 0;
+ left: auto;
+ background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+ background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+ background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));
+ background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
+ background-repeat: repeat-x;
+}
+.carousel-control:hover,
+.carousel-control:focus {
+ color: #fff;
+ text-decoration: none;
+ filter: alpha(opacity=90);
+ outline: 0;
+ opacity: .9;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-left,
+.carousel-control .glyphicon-chevron-right {
+ position: absolute;
+ top: 50%;
+ z-index: 5;
+ display: inline-block;
+}
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+ left: 50%;
+ margin-left: -10px;
+}
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+ right: 50%;
+ margin-right: -10px;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next {
+ width: 20px;
+ height: 20px;
+ margin-top: -10px;
+ font-family: serif;
+ line-height: 1;
+}
+.carousel-control .icon-prev:before {
+ content: '\2039';
+}
+.carousel-control .icon-next:before {
+ content: '\203a';
+}
+.carousel-indicators {
+ position: absolute;
+ bottom: 10px;
+ left: 50%;
+ z-index: 15;
+ width: 60%;
+ padding-left: 0;
+ margin-left: -30%;
+ text-align: center;
+ list-style: none;
+}
+.carousel-indicators li {
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ margin: 1px;
+ text-indent: -999px;
+ cursor: pointer;
+ background-color: #000 \9;
+ background-color: rgba(0, 0, 0, 0);
+ border: 1px solid #fff;
+ border-radius: 10px;
+}
+.carousel-indicators .active {
+ width: 12px;
+ height: 12px;
+ margin: 0;
+ background-color: #fff;
+}
+.carousel-caption {
+ position: absolute;
+ right: 15%;
+ bottom: 20px;
+ left: 15%;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: #fff;
+ text-align: center;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+}
+.carousel-caption .btn {
+ text-shadow: none;
+}
+@media screen and (min-width: 768px) {
+ .carousel-control .glyphicon-chevron-left,
+ .carousel-control .glyphicon-chevron-right,
+ .carousel-control .icon-prev,
+ .carousel-control .icon-next {
+ width: 30px;
+ height: 30px;
+ margin-top: -15px;
+ font-size: 30px;
+ }
+ .carousel-control .glyphicon-chevron-left,
+ .carousel-control .icon-prev {
+ margin-left: -15px;
+ }
+ .carousel-control .glyphicon-chevron-right,
+ .carousel-control .icon-next {
+ margin-right: -15px;
+ }
+ .carousel-caption {
+ right: 20%;
+ left: 20%;
+ padding-bottom: 30px;
+ }
+ .carousel-indicators {
+ bottom: 20px;
+ }
+}
+.clearfix:before,
+.clearfix:after,
+.dl-horizontal dd:before,
+.dl-horizontal dd:after,
+.container:before,
+.container:after,
+.container-fluid:before,
+.container-fluid:after,
+.row:before,
+.row:after,
+.form-horizontal .form-group:before,
+.form-horizontal .form-group:after,
+.btn-toolbar:before,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after,
+.nav:before,
+.nav:after,
+.navbar:before,
+.navbar:after,
+.navbar-header:before,
+.navbar-header:after,
+.navbar-collapse:before,
+.navbar-collapse:after,
+.pager:before,
+.pager:after,
+.panel-body:before,
+.panel-body:after,
+.modal-footer:before,
+.modal-footer:after {
+ display: table;
+ content: " ";
+}
+.clearfix:after,
+.dl-horizontal dd:after,
+.container:after,
+.container-fluid:after,
+.row:after,
+.form-horizontal .form-group:after,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:after,
+.nav:after,
+.navbar:after,
+.navbar-header:after,
+.navbar-collapse:after,
+.pager:after,
+.panel-body:after,
+.modal-footer:after {
+ clear: both;
+}
+.center-block {
+ display: block;
+ margin-right: auto;
+ margin-left: auto;
+}
+.pull-right {
+ float: right !important;
+}
+.pull-left {
+ float: left !important;
+}
+.hide {
+ display: none !important;
+}
+.show {
+ display: block !important;
+}
+.invisible {
+ visibility: hidden;
+}
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+.hidden {
+ display: none !important;
+ visibility: hidden !important;
+}
+.affix {
+ position: fixed;
+}
+@-ms-viewport {
+ width: device-width;
+}
+.visible-xs,
+.visible-sm,
+.visible-md,
+.visible-lg {
+ display: none !important;
+}
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+ display: none !important;
+}
+@media (max-width: 767px) {
+ .visible-xs {
+ display: block !important;
+ }
+ table.visible-xs {
+ display: table;
+ }
+ tr.visible-xs {
+ display: table-row !important;
+ }
+ th.visible-xs,
+ td.visible-xs {
+ display: table-cell !important;
+ }
+}
+@media (max-width: 767px) {
+ .visible-xs-block {
+ display: block !important;
+ }
+}
+@media (max-width: 767px) {
+ .visible-xs-inline {
+ display: inline !important;
+ }
+}
+@media (max-width: 767px) {
+ .visible-xs-inline-block {
+ display: inline-block !important;
+ }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm {
+ display: block !important;
+ }
+ table.visible-sm {
+ display: table;
+ }
+ tr.visible-sm {
+ display: table-row !important;
+ }
+ th.visible-sm,
+ td.visible-sm {
+ display: table-cell !important;
+ }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm-block {
+ display: block !important;
+ }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm-inline {
+ display: inline !important;
+ }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm-inline-block {
+ display: inline-block !important;
+ }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md {
+ display: block !important;
+ }
+ table.visible-md {
+ display: table;
+ }
+ tr.visible-md {
+ display: table-row !important;
+ }
+ th.visible-md,
+ td.visible-md {
+ display: table-cell !important;
+ }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md-block {
+ display: block !important;
+ }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md-inline {
+ display: inline !important;
+ }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md-inline-block {
+ display: inline-block !important;
+ }
+}
+@media (min-width: 1200px) {
+ .visible-lg {
+ display: block !important;
+ }
+ table.visible-lg {
+ display: table;
+ }
+ tr.visible-lg {
+ display: table-row !important;
+ }
+ th.visible-lg,
+ td.visible-lg {
+ display: table-cell !important;
+ }
+}
+@media (min-width: 1200px) {
+ .visible-lg-block {
+ display: block !important;
+ }
+}
+@media (min-width: 1200px) {
+ .visible-lg-inline {
+ display: inline !important;
+ }
+}
+@media (min-width: 1200px) {
+ .visible-lg-inline-block {
+ display: inline-block !important;
+ }
+}
+@media (max-width: 767px) {
+ .hidden-xs {
+ display: none !important;
+ }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .hidden-sm {
+ display: none !important;
+ }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+ .hidden-md {
+ display: none !important;
+ }
+}
+@media (min-width: 1200px) {
+ .hidden-lg {
+ display: none !important;
+ }
+}
+.visible-print {
+ display: none !important;
+}
+@media print {
+ .visible-print {
+ display: block !important;
+ }
+ table.visible-print {
+ display: table;
+ }
+ tr.visible-print {
+ display: table-row !important;
+ }
+ th.visible-print,
+ td.visible-print {
+ display: table-cell !important;
+ }
+}
+.visible-print-block {
+ display: none !important;
+}
+@media print {
+ .visible-print-block {
+ display: block !important;
+ }
+}
+.visible-print-inline {
+ display: none !important;
+}
+@media print {
+ .visible-print-inline {
+ display: inline !important;
+ }
+}
+.visible-print-inline-block {
+ display: none !important;
+}
+@media print {
+ .visible-print-inline-block {
+ display: inline-block !important;
+ }
+}
+@media print {
+ .hidden-print {
+ display: none !important;
+ }
+}
+/*# sourceMappingURL=bootstrap.css.map */
diff --git a/app/web/asset/css/font-awesome.min.css b/app/web/asset/css/font-awesome.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..540440ce89f2a408aa699b65100e18f15e0f09ca
--- /dev/null
+++ b/app/web/asset/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
diff --git a/app/web/asset/css/global.css b/app/web/asset/css/global.css
new file mode 100644
index 0000000000000000000000000000000000000000..9e2ab9801b72167128f68603a5709173eaccad62
--- /dev/null
+++ b/app/web/asset/css/global.css
@@ -0,0 +1,29 @@
+* {
+ padding: 0;
+ margin: 0;
+ outline: none;
+ box-sizing: border-box;
+}
+html, body{
+ height: 100%;
+}
+
+a {
+ color: #3c8dbc;
+ text-decoration: none;
+}
+
+-webkit-scrollbar {
+ width: 4px;
+ background-color: #F5F5F5;
+}
+
+-webkit-scrollbar-track {
+ box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
+ background-color: #F5F5F5;
+}
+
+-webkit-scrollbar-thumb {
+ box-shadow: inset 0 0 6px rgba(0, 0, 0, .3);
+ background-color: #3e8dbb;
+}
\ No newline at end of file
diff --git a/app/web/asset/fonts/FontAwesome.otf b/app/web/asset/fonts/FontAwesome.otf
new file mode 100644
index 0000000000000000000000000000000000000000..401ec0f36e4f73b8efa40bd6f604fe80d286db70
Binary files /dev/null and b/app/web/asset/fonts/FontAwesome.otf differ
diff --git a/app/web/asset/fonts/fontawesome-webfont.eot b/app/web/asset/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000000000000000000000000000000000000..e9f60ca953f93e35eab4108bd414bc02ddcf3928
Binary files /dev/null and b/app/web/asset/fonts/fontawesome-webfont.eot differ
diff --git a/app/web/asset/fonts/fontawesome-webfont.svg b/app/web/asset/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000000000000000000000000000000000000..855c845e538b65548118279537a04eab2ec6ef0d
--- /dev/null
+++ b/app/web/asset/fonts/fontawesome-webfont.svg
@@ -0,0 +1,2671 @@
+
+
+
+
+Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016
+ By ,,,
+Copyright Dave Gandy 2016. All rights reserved.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/web/asset/fonts/fontawesome-webfont.ttf b/app/web/asset/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3
Binary files /dev/null and b/app/web/asset/fonts/fontawesome-webfont.ttf differ
diff --git a/app/web/asset/fonts/fontawesome-webfont.woff b/app/web/asset/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000000000000000000000000000000000000..400014a4b06eee3d0c0d54402a47ab2601b2862b
Binary files /dev/null and b/app/web/asset/fonts/fontawesome-webfont.woff differ
diff --git a/app/web/asset/fonts/fontawesome-webfont.woff2 b/app/web/asset/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..4d13fc60404b91e398a37200c4a77b645cfd9586
Binary files /dev/null and b/app/web/asset/fonts/fontawesome-webfont.woff2 differ
diff --git a/app/web/asset/fonts/glyphicons-halflings-regular.eot b/app/web/asset/fonts/glyphicons-halflings-regular.eot
new file mode 100755
index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64
Binary files /dev/null and b/app/web/asset/fonts/glyphicons-halflings-regular.eot differ
diff --git a/app/web/asset/fonts/glyphicons-halflings-regular.svg b/app/web/asset/fonts/glyphicons-halflings-regular.svg
new file mode 100755
index 0000000000000000000000000000000000000000..94fb5490a2ed10b2c69a4a567a4fd2e4f706d841
--- /dev/null
+++ b/app/web/asset/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,288 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/web/asset/fonts/glyphicons-halflings-regular.ttf b/app/web/asset/fonts/glyphicons-halflings-regular.ttf
new file mode 100755
index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b
Binary files /dev/null and b/app/web/asset/fonts/glyphicons-halflings-regular.ttf differ
diff --git a/app/web/asset/fonts/glyphicons-halflings-regular.woff b/app/web/asset/fonts/glyphicons-halflings-regular.woff
new file mode 100755
index 0000000000000000000000000000000000000000..9e612858f802245ddcbf59788a0db942224bab35
Binary files /dev/null and b/app/web/asset/fonts/glyphicons-halflings-regular.woff differ
diff --git a/app/web/asset/fonts/glyphicons-halflings-regular.woff2 b/app/web/asset/fonts/glyphicons-halflings-regular.woff2
new file mode 100755
index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0
Binary files /dev/null and b/app/web/asset/fonts/glyphicons-halflings-regular.woff2 differ
diff --git a/app/web/asset/images/egg-vue-webpack-dev.png b/app/web/asset/images/egg-vue-webpack-dev.png
new file mode 100644
index 0000000000000000000000000000000000000000..0ef4ddd21a4fed1d7731208d067d8eabe0c7b84f
Binary files /dev/null and b/app/web/asset/images/egg-vue-webpack-dev.png differ
diff --git a/app/web/asset/images/favicon.ico b/app/web/asset/images/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..e70edfda7e6e0e8e705028adc1a6943b3f7828e6
Binary files /dev/null and b/app/web/asset/images/favicon.ico differ
diff --git a/app/web/asset/images/loading.gif b/app/web/asset/images/loading.gif
new file mode 100755
index 0000000000000000000000000000000000000000..e99cda9fcd0996d2eafe5a7b9317b8d23058d173
Binary files /dev/null and b/app/web/asset/images/loading.gif differ
diff --git a/app/web/asset/images/logo.png b/app/web/asset/images/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed92d85058cedd7e3971c3ee7349f05271721e15
Binary files /dev/null and b/app/web/asset/images/logo.png differ
diff --git a/app/web/component/MarkdownEditor/index.vue b/app/web/component/MarkdownEditor/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..69ea122f1475a5b1782329033c8c3079a6e5aabe
--- /dev/null
+++ b/app/web/component/MarkdownEditor/index.vue
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/web/component/layout/admin/content/content.css b/app/web/component/layout/admin/content/content.css
new file mode 100644
index 0000000000000000000000000000000000000000..70afeb19e6e691ff259d77a33fb80b17e13cd961
--- /dev/null
+++ b/app/web/component/layout/admin/content/content.css
@@ -0,0 +1,155 @@
+.main{
+ margin-top: -80px;
+ padding: 80px 0 120px;
+ box-sizing: border-box;
+}
+.page-container{
+ width: 1140px;
+ padding: 0 30px;
+ margin: 36 auto;
+}
+.page-component {
+ padding-bottom: 95px;
+ box-sizing: border-box
+}
+
+.page-component .content {
+ margin-left: -1px
+}
+
+.page-component .content > h3 {
+ margin: 45px 0 15px
+}
+
+.page-component .content > table {
+ border-collapse: collapse;
+ width: 100%;
+ background-color: #fff;
+ color: #5e6d82;
+ font-size: 14px;
+ margin-bottom: 45px
+}
+
+.page-component .content > table strong {
+ font-weight: 400
+}
+
+.page-component .content > table th {
+ text-align: left;
+ border-top: 1px solid #eaeefb;
+ background-color: #eff2f7;
+ white-space: nowrap
+}
+
+.page-component .content > table td, .page-component .content > table th {
+ border-bottom: 1px solid #eaeefb;
+ padding: 10px;
+ max-width: 250px
+}
+
+.page-component .content > table td:first-child, .page-component .content > table th:first-child {
+ padding-left: 10px
+}
+
+.page-component .page-component-up {
+ background-color: #58b7ff;
+ position: fixed;
+ right: 100px;
+ bottom: 150px;
+ width: 50px;
+ height: 50px;
+ border-radius: 25px;
+ cursor: pointer;
+ opacity: .4;
+ transition: .3s
+}
+
+.page-component .page-component-up i {
+ color: #fff;
+ display: block;
+ line-height: 50px;
+ text-align: center;
+ font-size: 22px
+}
+
+.page-component .page-component-up.hover {
+ opacity: 1
+}
+
+.page-component .back-top-fade-enter, .page-component .back-top-fade-leave-active {
+ transform: translateY(-30px);
+ opacity: 0
+}
+
+.page-component {
+ padding-bottom: 95px;
+ box-sizing: border-box
+}
+
+.page-component .content {
+ margin-left: -1px
+}
+
+.page-component .content > h3 {
+ margin: 45px 0 15px
+}
+
+.page-component .content > table {
+ border-collapse: collapse;
+ width: 100%;
+ background-color: #fff;
+ color: #5e6d82;
+ font-size: 14px;
+ margin-bottom: 45px
+}
+
+.page-component .content > table strong {
+ font-weight: 400
+}
+
+.page-component .content > table th {
+ text-align: left;
+ border-top: 1px solid #eaeefb;
+ background-color: #eff2f7;
+ white-space: nowrap
+}
+
+.page-component .content > table td, .page-component .content > table th {
+ border-bottom: 1px solid #eaeefb;
+ padding: 10px;
+ max-width: 250px
+}
+
+.page-component .content > table td:first-child, .page-component .content > table th:first-child {
+ padding-left: 10px
+}
+
+.page-component .page-component-up {
+ background-color: #58b7ff;
+ position: fixed;
+ right: 100px;
+ bottom: 150px;
+ width: 50px;
+ height: 50px;
+ border-radius: 25px;
+ cursor: pointer;
+ opacity: .4;
+ transition: .3s
+}
+
+.page-component .page-component-up i {
+ color: #fff;
+ display: block;
+ line-height: 50px;
+ text-align: center;
+ font-size: 22px
+}
+
+.page-component .page-component-up.hover {
+ opacity: 1
+}
+
+.page-component .back-top-fade-enter, .page-component .back-top-fade-leave-active {
+ transform: translateY(-30px);
+ opacity: 0
+}
\ No newline at end of file
diff --git a/app/web/component/layout/admin/content/content.vue b/app/web/component/layout/admin/content/content.vue
new file mode 100644
index 0000000000000000000000000000000000000000..b430645e21f2a6977a8318ea354c7bea09023d4d
--- /dev/null
+++ b/app/web/component/layout/admin/content/content.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
diff --git a/app/web/component/layout/admin/footer/footer.css b/app/web/component/layout/admin/footer/footer.css
new file mode 100644
index 0000000000000000000000000000000000000000..0085b33eab30ac25b53b58055e84f55f6cc965d6
--- /dev/null
+++ b/app/web/component/layout/admin/footer/footer.css
@@ -0,0 +1,143 @@
+.footer {
+ height: 120px;
+ background-color: #324057;
+ color: #a4aebd;
+ width: 100%;
+}
+
+.footer * {
+ word-spacing: 0
+}
+
+.footer .container {
+ height: 100%;
+ box-sizing: border-box
+}
+
+.footer .footer-main {
+ font-size: 0;
+ padding-top: 40px;
+ display: inline-block
+}
+
+.footer .footer-main .footer-main-title {
+ line-height: 1;
+ font-size: 22px;
+ margin: 0
+}
+
+.footer .footer-main .footer-main-link {
+ display: inline-block;
+ margin: 12px 18px 0 0;
+ line-height: 1;
+ font-size: 12px;
+ color: #768193
+}
+
+.footer .footer-main .footer-main-link a {
+ color: #768193;
+ text-decoration: none
+}
+
+.footer .footer-social {
+ float: right;
+ line-height: 120px
+}
+
+.footer .footer-social .elementdoc {
+ transition: .3s;
+ display: inline-block;
+ line-height: 32px;
+ text-align: center;
+ color: #8d99ab;
+ background-color: transparent;
+ width: 32px;
+ height: 32px;
+ font-size: 32px;
+ vertical-align: middle
+}
+
+.footer .footer-social .elementdoc:hover {
+ transform: scale(1.2)
+}
+
+.footer .footer-social .doc-icon-weixin {
+ margin-right: 36px
+}
+
+.footer .footer-social .doc-icon-weixin:hover {
+ color: #fff
+}
+
+.footer .footer-social .doc-icon-github {
+ margin-right: 0
+}
+
+.footer .footer-social .doc-icon-github:hover {
+ color: #fff
+}
+
+.footer-popover {
+ padding: 0;
+ min-width: 120px;
+ line-height: normal;
+ box-shadow: 0 0 11px 0 rgba(174, 187, 211, .24)
+}
+
+.footer-popover .footer-popover-title {
+ border-bottom: 1px solid #eaeefb;
+ height: 30px;
+ line-height: 30px;
+ text-align: center;
+ color: #99a9bf;
+ background-color: #f8f9fe
+}
+
+.footer-popover img {
+ width: 100px;
+ height: 100px;
+ margin: 10px
+}
+
+@media (max-width: 768px) {
+ .footer .footer-social {
+ display: none
+ }
+}
+
+.footer-nav {
+ padding: 24px 0;
+ color: #99a9bf;
+ font-size: 14px
+}
+
+.footer-nav:after {
+ content: "";
+ display: block;
+ clear: both
+}
+
+.footer-nav i {
+ transition: .3s;
+ color: #d9def1;
+ vertical-align: baseline
+}
+
+.footer-nav-link {
+ cursor: pointer;
+ transition: .3s
+}
+
+.footer-nav-link:hover, .footer-nav-link:hover i {
+ color: #20a0ff
+}
+
+.footer-nav-left {
+ float: left;
+ margin-left: -4px
+}
+
+.footer-nav-right {
+ float: right;
+ margin-right: -4px
+}
\ No newline at end of file
diff --git a/app/web/component/layout/admin/footer/footer.vue b/app/web/component/layout/admin/footer/footer.vue
new file mode 100644
index 0000000000000000000000000000000000000000..9f576058096fcd2ab52a993a76999c7cbd702f80
--- /dev/null
+++ b/app/web/component/layout/admin/footer/footer.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/app/web/component/layout/admin/header/header.css b/app/web/component/layout/admin/header/header.css
new file mode 100644
index 0000000000000000000000000000000000000000..9bd87c8df39402ac175c151c8a6b1196810bac98
--- /dev/null
+++ b/app/web/component/layout/admin/header/header.css
@@ -0,0 +1,63 @@
+.admin-header {
+ width: 100%;
+ position: fixed;
+ display: flex;
+ height: 50px;
+ background-color: #3c8dbc;
+ z-index: 10;
+}
+.admin-header .admin-logo {
+ height: 50px;
+ text-align: center;
+ line-height: 50px;
+ color: #fff;
+ background-color: #367fa9;
+ -webkit-transition: width 0.35s;
+ transition: width 0.35s;
+}
+
+.admin-header .admin-logo .admin-big {
+ width: 230px;
+ display: block;
+}
+.admin-header .admin-logo .admin-min {
+ width: 64px;
+ display: block;
+}
+.admin-header .right {
+ position: absolute;
+ right: 0;
+}
+
+.admin-header .admin-header-btn {
+ overflow: hidden;
+ height: 50px;
+ display: inline-block;
+ text-align: center;
+ line-height: 50px;
+ cursor: pointer;
+ padding: 0 14px;
+ color: #fff;
+}
+
+.admin-header .admin-header-btn:hover {
+ background-color: #367fa9
+}
+
+.admin-header .admin-header-btn .el-badge__content {
+ top: 14px;
+ right: 7px;
+ text-align: center;
+ font-size: 9px;
+ padding: 0 3px;
+ background-color: #00a65a;
+ color: #fff;
+ border: none;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: .25em;
+}
+
+.admin-menu {
+ border-right: none;
+}
\ No newline at end of file
diff --git a/app/web/component/layout/admin/header/header.vue b/app/web/component/layout/admin/header/header.vue
new file mode 100644
index 0000000000000000000000000000000000000000..fa8dcfeb1cbb73250c78f5496a4ac064250b98cf
--- /dev/null
+++ b/app/web/component/layout/admin/header/header.vue
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
diff --git a/app/web/component/layout/admin/index.css b/app/web/component/layout/admin/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..62d96516ea14978df68b951b9bc61e4743a44d2d
--- /dev/null
+++ b/app/web/component/layout/admin/index.css
@@ -0,0 +1,28 @@
+.admin .search {
+ margin-top: 8px;
+ margin-bottom: 16px;
+}
+.admin label {
+ padding-left: 8px;
+ padding-right: 8px;
+ color: #878d99
+}
+
+.admin .search-input{
+ max-width: 200px;
+}
+.admin .search-button{
+ margin-left: 16px;
+}
+.admin .add-button{
+ float:right;
+ margin-right: 16px;
+}
+
+.admin .long-input {
+ max-width: 75%;
+}
+
+.admin .top16 {
+ margin-top: 16px;
+}
\ No newline at end of file
diff --git a/app/web/component/layout/admin/index.js b/app/web/component/layout/admin/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..eb56124a6fb6f98b8069b757b7c7722c6d52f7d3
--- /dev/null
+++ b/app/web/component/layout/admin/index.js
@@ -0,0 +1,7 @@
+import Vue from 'vue';
+import MainLayout from './main.vue';
+import '../../../asset/css/global.css';
+import './index.css';
+import createLayout from '../layout';
+const tpl = '
';
+export default createLayout('Layout', { MainLayout }, tpl);
diff --git a/app/web/component/layout/admin/main.vue b/app/web/component/layout/admin/main.vue
new file mode 100644
index 0000000000000000000000000000000000000000..93fe5ef9fb273572b4a8d70abe11904447fc87f9
--- /dev/null
+++ b/app/web/component/layout/admin/main.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
diff --git a/app/web/component/layout/admin/menu/index.js b/app/web/component/layout/admin/menu/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..46f2c34b39461aea271135fff2dfb33b1a06967a
--- /dev/null
+++ b/app/web/component/layout/admin/menu/index.js
@@ -0,0 +1,25 @@
+const menu = {
+ home: {
+ name: 'menu.home',
+ path: '/',
+ icon: 'el-icon-menu',
+ },
+ content: {
+ name: 'menu.articlemanage',
+ icon: 'el-icon-document',
+ children: {
+ list: {
+ name: 'menu.articlequery',
+ icon: 'el-icon-edit-outline',
+ path: '/article/list'
+ },
+ add: {
+ name: 'menu.articleadd',
+ icon: 'el-icon-edit-outline',
+ path: '/article/add'
+ }
+ }
+ }
+};
+
+export default menu;
\ No newline at end of file
diff --git a/app/web/component/layout/admin/menu/index.vue b/app/web/component/layout/admin/menu/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..63b3e1d655f8e1a8ddc1898897e49d49a52cfad1
--- /dev/null
+++ b/app/web/component/layout/admin/menu/index.vue
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/web/component/layout/default.js b/app/web/component/layout/default.js
new file mode 100644
index 0000000000000000000000000000000000000000..f09bf50ec40b53cd2553ac0371381b68c23b00ae
--- /dev/null
+++ b/app/web/component/layout/default.js
@@ -0,0 +1,6 @@
+import Vue from 'vue';
+import MainLayout from './main.vue';
+import '../../asset/css/global.css';
+import createLayout from './layout';
+const tpl = '
';
+export default createLayout('Layout', { }, tpl);
\ No newline at end of file
diff --git a/app/web/component/layout/index/content/content.css b/app/web/component/layout/index/content/content.css
new file mode 100644
index 0000000000000000000000000000000000000000..70afeb19e6e691ff259d77a33fb80b17e13cd961
--- /dev/null
+++ b/app/web/component/layout/index/content/content.css
@@ -0,0 +1,155 @@
+.main{
+ margin-top: -80px;
+ padding: 80px 0 120px;
+ box-sizing: border-box;
+}
+.page-container{
+ width: 1140px;
+ padding: 0 30px;
+ margin: 36 auto;
+}
+.page-component {
+ padding-bottom: 95px;
+ box-sizing: border-box
+}
+
+.page-component .content {
+ margin-left: -1px
+}
+
+.page-component .content > h3 {
+ margin: 45px 0 15px
+}
+
+.page-component .content > table {
+ border-collapse: collapse;
+ width: 100%;
+ background-color: #fff;
+ color: #5e6d82;
+ font-size: 14px;
+ margin-bottom: 45px
+}
+
+.page-component .content > table strong {
+ font-weight: 400
+}
+
+.page-component .content > table th {
+ text-align: left;
+ border-top: 1px solid #eaeefb;
+ background-color: #eff2f7;
+ white-space: nowrap
+}
+
+.page-component .content > table td, .page-component .content > table th {
+ border-bottom: 1px solid #eaeefb;
+ padding: 10px;
+ max-width: 250px
+}
+
+.page-component .content > table td:first-child, .page-component .content > table th:first-child {
+ padding-left: 10px
+}
+
+.page-component .page-component-up {
+ background-color: #58b7ff;
+ position: fixed;
+ right: 100px;
+ bottom: 150px;
+ width: 50px;
+ height: 50px;
+ border-radius: 25px;
+ cursor: pointer;
+ opacity: .4;
+ transition: .3s
+}
+
+.page-component .page-component-up i {
+ color: #fff;
+ display: block;
+ line-height: 50px;
+ text-align: center;
+ font-size: 22px
+}
+
+.page-component .page-component-up.hover {
+ opacity: 1
+}
+
+.page-component .back-top-fade-enter, .page-component .back-top-fade-leave-active {
+ transform: translateY(-30px);
+ opacity: 0
+}
+
+.page-component {
+ padding-bottom: 95px;
+ box-sizing: border-box
+}
+
+.page-component .content {
+ margin-left: -1px
+}
+
+.page-component .content > h3 {
+ margin: 45px 0 15px
+}
+
+.page-component .content > table {
+ border-collapse: collapse;
+ width: 100%;
+ background-color: #fff;
+ color: #5e6d82;
+ font-size: 14px;
+ margin-bottom: 45px
+}
+
+.page-component .content > table strong {
+ font-weight: 400
+}
+
+.page-component .content > table th {
+ text-align: left;
+ border-top: 1px solid #eaeefb;
+ background-color: #eff2f7;
+ white-space: nowrap
+}
+
+.page-component .content > table td, .page-component .content > table th {
+ border-bottom: 1px solid #eaeefb;
+ padding: 10px;
+ max-width: 250px
+}
+
+.page-component .content > table td:first-child, .page-component .content > table th:first-child {
+ padding-left: 10px
+}
+
+.page-component .page-component-up {
+ background-color: #58b7ff;
+ position: fixed;
+ right: 100px;
+ bottom: 150px;
+ width: 50px;
+ height: 50px;
+ border-radius: 25px;
+ cursor: pointer;
+ opacity: .4;
+ transition: .3s
+}
+
+.page-component .page-component-up i {
+ color: #fff;
+ display: block;
+ line-height: 50px;
+ text-align: center;
+ font-size: 22px
+}
+
+.page-component .page-component-up.hover {
+ opacity: 1
+}
+
+.page-component .back-top-fade-enter, .page-component .back-top-fade-leave-active {
+ transform: translateY(-30px);
+ opacity: 0
+}
\ No newline at end of file
diff --git a/app/web/component/layout/index/content/content.vue b/app/web/component/layout/index/content/content.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a132fd13d89990294dd7ddc56fe8ce34418c5a63
--- /dev/null
+++ b/app/web/component/layout/index/content/content.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/app/web/component/layout/index/footer/footer.css b/app/web/component/layout/index/footer/footer.css
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/web/component/layout/index/footer/footer.vue b/app/web/component/layout/index/footer/footer.vue
new file mode 100644
index 0000000000000000000000000000000000000000..4c01bac7577cc5712baeebea7ec296e83141f35c
--- /dev/null
+++ b/app/web/component/layout/index/footer/footer.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
2018 ❖ Powered by hubcarl.
+
+
+
+
+
+
+
+
diff --git a/app/web/component/layout/index/header/header.css b/app/web/component/layout/index/header/header.css
new file mode 100644
index 0000000000000000000000000000000000000000..6d7bb728860d037f9fb4780b34d97f13d0185e81
--- /dev/null
+++ b/app/web/component/layout/index/header/header.css
@@ -0,0 +1,54 @@
+.header {
+ width: 100%;
+ position: fixed;
+ display: flex;
+ height: 50px;
+ background-color: #3c8dbc;
+ z-index: 10;
+}
+.header .logo {
+ width: 230px;
+ height: 50px;
+ text-align: center;
+ line-height: 50px;
+ color: #fff;
+ background-color: #367fa9;
+ -webkit-transition: width 0.35s;
+ transition: width 0.35s;
+}
+.header .logo .min {
+ display: none;
+}
+.header .right {
+ position: absolute;
+ right: 0;
+}
+.header .header-btn {
+ overflow: hidden;
+ height: 50px;
+ display: inline-block;
+ text-align: center;
+ line-height: 50px;
+ cursor: pointer;
+ padding: 0 14px;
+ color: #fff;
+}
+.header .header-btn .el-badge__content {
+ top: 14px;
+ right: 7px;
+ text-align: center;
+ font-size: 9px;
+ padding: 0 3px;
+ background-color: #00a65a;
+ color: #fff;
+ border: none;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: .25em;
+}
+.header .header-btn:hover {
+ background-color: #367fa9;
+}
+.menu {
+ border-right: none;
+}
diff --git a/app/web/component/layout/index/header/header.vue b/app/web/component/layout/index/header/header.vue
new file mode 100644
index 0000000000000000000000000000000000000000..91c2289612cac7f21684923d3c551480456e6fd2
--- /dev/null
+++ b/app/web/component/layout/index/header/header.vue
@@ -0,0 +1,61 @@
+
+
+
+
diff --git a/app/web/component/layout/index/index.js b/app/web/component/layout/index/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..555364e59b040e625e0f6fe8a13822763b104c90
--- /dev/null
+++ b/app/web/component/layout/index/index.js
@@ -0,0 +1,6 @@
+import Vue from 'vue';
+import MainLayout from './main.vue';
+import '../../../asset/css/bootstrap.css';
+import '../../../asset/css/blog.css';
+import createLayout from '../layout';
+export default createLayout('Layout', { MainLayout }, '');
diff --git a/app/web/component/layout/index/main.vue b/app/web/component/layout/index/main.vue
new file mode 100644
index 0000000000000000000000000000000000000000..da00aa131374abc70b1dd4c92717bcf2f8246f87
--- /dev/null
+++ b/app/web/component/layout/index/main.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/app/web/component/layout/layout.js b/app/web/component/layout/layout.js
new file mode 100644
index 0000000000000000000000000000000000000000..67f9408d6f29fe645744f12a4c161758ae761862
--- /dev/null
+++ b/app/web/component/layout/layout.js
@@ -0,0 +1,50 @@
+import Vue from 'vue';
+export default function createLayout(name, components, tpl) {
+ return {
+ name,
+ props: ['title', 'description', 'keywords'],
+ components,
+ computed: {
+ vTitle() {
+ return this.$root.title || this.title || 'IBlog';
+ },
+ vKeywords() {
+ return this.$root.keywords || this.keywords || 'egg, typescript, vue, webpack, server side render';
+ },
+ vDescription() {
+ return this.$root.description || this.description || 'IBlog';
+ },
+ baseClass() {
+ return this.$root.baseClass;
+ }
+ },
+ template: EASY_ENV_IS_BROWSER ? tpl : `
+
+
+ {{vTitle}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${tpl}
+
+ `,
+ install(vue, options) {
+ //
+ }
+ };
+}
diff --git a/app/web/framework/entry/template.js b/app/web/framework/entry/template.js
new file mode 100644
index 0000000000000000000000000000000000000000..347d8400fa8c07f7d0497487eb7bf478666e86ae
--- /dev/null
+++ b/app/web/framework/entry/template.js
@@ -0,0 +1,7 @@
+import Layout from 'component/layout/index';
+import plugin from 'framework/plugin';
+
+export default function(Vue) {
+ Vue.use(plugin);
+ Vue.component(Layout.name, Layout);
+}
\ No newline at end of file
diff --git a/app/web/framework/i18n/admin/cn.js b/app/web/framework/i18n/admin/cn.js
new file mode 100644
index 0000000000000000000000000000000000000000..41e916ae8f0b5c0f395bc4f27ecd2b49a362b751
--- /dev/null
+++ b/app/web/framework/i18n/admin/cn.js
@@ -0,0 +1,13 @@
+'use strict';
+export default {
+ menu: {
+ home: '首页',
+ articlemanage: '文章管理',
+ articlequery: '文章查询',
+ articleadd: '添加文章'
+ },
+ lang: {
+ href: '/admin?locale=en',
+ text: '中文'
+ }
+};
\ No newline at end of file
diff --git a/app/web/framework/i18n/admin/en.js b/app/web/framework/i18n/admin/en.js
new file mode 100644
index 0000000000000000000000000000000000000000..6ff035afddd580a2e7a48563ab00903defe093c4
--- /dev/null
+++ b/app/web/framework/i18n/admin/en.js
@@ -0,0 +1,12 @@
+export default {
+ menu: {
+ home: 'Home',
+ articlemanage: 'Article Manage',
+ articlequery: 'Article Query',
+ articleadd: 'Article Add'
+ },
+ lang: {
+ href: '/admin?locale=cn',
+ text: 'English'
+ }
+};
\ No newline at end of file
diff --git a/app/web/framework/i18n/admin/index.js b/app/web/framework/i18n/admin/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..4fcca24d7c24e198b090801f73a1c9e21e1efb6a
--- /dev/null
+++ b/app/web/framework/i18n/admin/index.js
@@ -0,0 +1,12 @@
+import VueI18n from 'vue-i18n';
+import cn from './cn';
+import en from './en';
+export default function createI18n(locale) {
+ return new VueI18n({
+ locale,
+ messages: {
+ en,
+ cn
+ }
+ });
+}
\ No newline at end of file
diff --git a/app/web/framework/i18n/site/cn.js b/app/web/framework/i18n/site/cn.js
new file mode 100644
index 0000000000000000000000000000000000000000..9b9e79bfc8cb39cb634d6cae828e27866684b820
--- /dev/null
+++ b/app/web/framework/i18n/site/cn.js
@@ -0,0 +1,12 @@
+'use strict';
+export default {
+ menu: {
+ home: '首页',
+ category: '分类',
+ about: '关于'
+ },
+ lang: {
+ href: '/?locale=en',
+ text: '中文'
+ }
+};
\ No newline at end of file
diff --git a/app/web/framework/i18n/site/en.js b/app/web/framework/i18n/site/en.js
new file mode 100644
index 0000000000000000000000000000000000000000..85d5cc90d2bf15dfefd41221dae95d1740eb76b9
--- /dev/null
+++ b/app/web/framework/i18n/site/en.js
@@ -0,0 +1,11 @@
+export default {
+ menu: {
+ home: 'Home',
+ category: 'Catetory',
+ about: 'About',
+ },
+ lang: {
+ href: '/?locale=cn',
+ text: 'English'
+ }
+};
\ No newline at end of file
diff --git a/app/web/framework/i18n/site/index.js b/app/web/framework/i18n/site/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..4fcca24d7c24e198b090801f73a1c9e21e1efb6a
--- /dev/null
+++ b/app/web/framework/i18n/site/index.js
@@ -0,0 +1,12 @@
+import VueI18n from 'vue-i18n';
+import cn from './cn';
+import en from './en';
+export default function createI18n(locale) {
+ return new VueI18n({
+ locale,
+ messages: {
+ en,
+ cn
+ }
+ });
+}
\ No newline at end of file
diff --git a/app/web/framework/network/request.js b/app/web/framework/network/request.js
new file mode 100644
index 0000000000000000000000000000000000000000..fb78f6f8a7678fc05aaf867b284b25f62bb77f87
--- /dev/null
+++ b/app/web/framework/network/request.js
@@ -0,0 +1,21 @@
+'use strict';
+import axios from 'axios';
+// axios.defaults.baseURL = 'http://127.0.0.1:7001';
+axios.defaults.timeout = 15000;
+axios.defaults.xsrfHeaderName = 'x-csrf-token';
+axios.defaults.xsrfCookieName = 'csrfToken';
+export default {
+ post(url, json, store = {}) {
+ const { state = { origin: '' } } = store;
+ const headers = {};
+ if (EASY_ENV_IS_NODE) {
+ headers['x-csrf-token'] = state.csrf;
+ headers.Cookie = `csrfToken=${state.csrf}`;
+ }
+ return axios.post(`${state.origin}${url}`, json, { headers });
+ },
+ get(url, store = {}) {
+ const { state = { origin: '' } } = store;
+ return axios.get(`${state.origin}${url}`);
+ }
+};
\ No newline at end of file
diff --git a/app/web/framework/plugin/index.js b/app/web/framework/plugin/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..543430d8f10f9ebcf6a40ee1c7a28011047384da
--- /dev/null
+++ b/app/web/framework/plugin/index.js
@@ -0,0 +1,22 @@
+'use strict';
+import axios from 'axios';
+import request from 'framework/network/request';
+import VueI18n from 'vue-i18n';
+import createI18n from 'framework/i18n/site';
+
+export default {
+ install(Vue) {
+ if (!Vue.prototype.hasOwnProperty('$request')) {
+ Vue.prototype.$request = request;
+ }
+ if (!Vue.hook) {
+ Vue.use(VueI18n);
+ Vue.hook = {
+ render(context, options) {
+ const i18n = createI18n(context.state.locale);
+ options.i18n = i18n;
+ }
+ };
+ }
+ }
+};
\ No newline at end of file
diff --git a/app/web/page/about/about.css b/app/web/page/about/about.css
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/web/page/about/about.vue b/app/web/page/about/about.vue
new file mode 100644
index 0000000000000000000000000000000000000000..9cfd8bc0180b353e2f434567c3f1b47bf1d755df
--- /dev/null
+++ b/app/web/page/about/about.vue
@@ -0,0 +1,32 @@
+
+
+
+
IBlog: About
+
+
+
+
+
+
diff --git a/app/web/page/admin/home/component/panel.vue b/app/web/page/admin/home/component/panel.vue
new file mode 100644
index 0000000000000000000000000000000000000000..8aa5c645cdc03122c404a9e93eadc1fe747c1add
--- /dev/null
+++ b/app/web/page/admin/home/component/panel.vue
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/web/page/admin/home/home.vue b/app/web/page/admin/home/home.vue
new file mode 100755
index 0000000000000000000000000000000000000000..639461a51c000e42bf325e0f54e9470aebad8224
--- /dev/null
+++ b/app/web/page/admin/home/home.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
diff --git a/app/web/page/admin/home/router/index.js b/app/web/page/admin/home/router/index.js
new file mode 100755
index 0000000000000000000000000000000000000000..08f1a902c72f312b30aa2e28b86020c29bb0dc24
--- /dev/null
+++ b/app/web/page/admin/home/router/index.js
@@ -0,0 +1,52 @@
+import Vue from 'vue';
+
+import VueRouter from 'vue-router';
+import Dashboard from '../view/dashboard/index.vue';
+import ArticleList from '../view/list.vue';
+
+Vue.use(VueRouter);
+
+export default function createRouter() {
+ const router = new VueRouter({
+ mode: 'history',
+ base: '/admin/',
+ routes: [
+ {
+ path: '/',
+ component: Dashboard
+ },
+ {
+ path: '/article/list',
+ component: ArticleList
+ },
+ {
+ path: '/article/add',
+ component: () => import('../view/write/index.vue')
+ },
+ {
+ path: '/article/detail/:id',
+ component: () => import('../view/detail.vue')
+ },
+ {
+ path: '*', component: () => import('../view/notfound.vue')
+ }
+ ]
+ });
+
+ router.beforeEach((route, redirec, next) => {
+ next();
+ });
+
+ router.afterEach((route, redirec) => {
+ if (EASY_ENV_IS_BROWSER && route.matched && route.matched.length) {
+ const matchComponent = route.matched[0].components.default;
+ const asyncData = matchComponent.methods && matchComponent.methods.fetchApi;
+ if (asyncData) {
+ console.log('router afterEach trigger asyncData', route);
+ asyncData(router.app.$store, route);
+ }
+ }
+ });
+
+ return router;
+}
\ No newline at end of file
diff --git a/app/web/page/admin/home/store/app/actions.js b/app/web/page/admin/home/store/app/actions.js
new file mode 100644
index 0000000000000000000000000000000000000000..7aed523c234e395fe84ea1570f90503a7b91595c
--- /dev/null
+++ b/app/web/page/admin/home/store/app/actions.js
@@ -0,0 +1,40 @@
+'use strict';
+
+import * as Type from './mutation-type';
+import Vue from 'vue';
+import Vuex from 'vuex';
+import request from 'framework/network/request';
+
+Vue.use(Vuex);
+
+const actions = {
+
+ SET_ARTICLE_LIST: (store, json) => {
+ return request.post('/admin/api/article/list', json, store).then(response => {
+ store.commit(Type.SET_ARTICLE_LIST, response.data);
+ });
+ },
+ SET_ARTICLE_DETAIL: (store, json) => {
+ const { commit, dispatch, state } = store;
+ return request.get(`/admin/api/article/${json.id}`, store)
+ .then(response => {
+ commit(Type.SET_ARTICLE_DETAIL, response.data);
+ });
+ },
+ SET_SAVE_ARTICLE: (store, json) => {
+ const { commit, dispatch, state } = store;
+ return request.post('/admin/api/article/add', json, store).then(response => {
+ commit(Type.SET_SAVE_ARTICLE, json);
+ });
+ },
+ DELETE_ARTICLE: (store, { id }) => {
+ // 鉴权 TODO
+ const { commit, dispatch, state } = store;
+ return request.get(`/admin/api/article/del/${id}`, store)
+ .then(response => {
+ commit(Type.DELETE_ARTICLE, { id });
+ });
+ },
+};
+
+export default actions;
\ No newline at end of file
diff --git a/app/web/page/admin/home/store/app/getters.js b/app/web/page/admin/home/store/app/getters.js
new file mode 100644
index 0000000000000000000000000000000000000000..4abd2b4961fc6d19d7202de016d30001c818324a
--- /dev/null
+++ b/app/web/page/admin/home/store/app/getters.js
@@ -0,0 +1,3 @@
+'use strict';
+
+export default {};
\ No newline at end of file
diff --git a/app/web/page/admin/home/store/app/index.js b/app/web/page/admin/home/store/app/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..c8cb23be6e90814ea541d338084c0f0681521da2
--- /dev/null
+++ b/app/web/page/admin/home/store/app/index.js
@@ -0,0 +1,24 @@
+'use strict';
+import Vue from 'vue';
+import Vuex from 'vuex';
+
+import actions from './actions';
+import getters from './getters';
+import mutations from './mutations';
+
+Vue.use(Vuex);
+
+export default function createStore(initState) {
+ const state = {
+ articleTotal: 0,
+ articleList: [],
+ article: {},
+ ...initState
+ };
+ return new Vuex.Store({
+ state,
+ actions,
+ getters,
+ mutations
+ });
+}
\ No newline at end of file
diff --git a/app/web/page/admin/home/store/app/mutation-type.js b/app/web/page/admin/home/store/app/mutation-type.js
new file mode 100644
index 0000000000000000000000000000000000000000..50effdfbdaaf2a56c874e71415d77efc5d63f499
--- /dev/null
+++ b/app/web/page/admin/home/store/app/mutation-type.js
@@ -0,0 +1,6 @@
+'use strict';
+
+export const SET_ARTICLE_LIST = 'SET_ARTICLE_LIST';
+export const SET_ARTICLE_DETAIL = 'SET_ARTICLE_DETAIL';
+export const SET_SAVE_ARTICLE = 'SET_SAVE_ARTICLE';
+export const DELETE_ARTICLE = 'DELETE_ARTICLE';
\ No newline at end of file
diff --git a/app/web/page/admin/home/store/app/mutations.js b/app/web/page/admin/home/store/app/mutations.js
new file mode 100644
index 0000000000000000000000000000000000000000..a931c9bd8bd9082840066ae56384297e1bbb8d43
--- /dev/null
+++ b/app/web/page/admin/home/store/app/mutations.js
@@ -0,0 +1,34 @@
+'use strict';
+
+import {
+ SET_ARTICLE_LIST,
+ SET_ARTICLE_DETAIL,
+ SET_SAVE_ARTICLE,
+ DELETE_ARTICLE
+} from './mutation-type';
+
+const mutations = {
+ [SET_ARTICLE_LIST](state, { list, total }) {
+ state.articleTotal = total;
+ state.articleList = list;
+ },
+ [SET_ARTICLE_DETAIL](state, data) {
+ console.log('>>>data', data);
+ if (Array.isArray(data) && data.length) {
+ state.article = data[0];
+ } else {
+ state.article = data;
+ }
+ },
+ [SET_SAVE_ARTICLE](state, data) {
+ state.articleTotal += 1;
+ state.articleList = [data].concat(state.articleList);
+ },
+ [DELETE_ARTICLE](state, { id }) {
+ state.articleTotal -= 1;
+ state.articleList = state.articleList.filter(item => {
+ return item.id !== id;
+ });
+ }
+};
+export default mutations;
diff --git a/app/web/page/admin/home/view/dashboard/index.vue b/app/web/page/admin/home/view/dashboard/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..1b2ff6456824fe33edf5e89d5944781d84dbf5e0
--- /dev/null
+++ b/app/web/page/admin/home/view/dashboard/index.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/web/page/admin/home/view/detail.vue b/app/web/page/admin/home/view/detail.vue
new file mode 100644
index 0000000000000000000000000000000000000000..5e71a82a9859e6112ce5e161935214239f2e435f
--- /dev/null
+++ b/app/web/page/admin/home/view/detail.vue
@@ -0,0 +1,24 @@
+
+
+
{{article.title}}
+
+
+
+
+
\ No newline at end of file
diff --git a/app/web/page/admin/home/view/list.vue b/app/web/page/admin/home/view/list.vue
new file mode 100644
index 0000000000000000000000000000000000000000..b79917421cc8bfb3f08f625a894a2d581c75a205
--- /dev/null
+++ b/app/web/page/admin/home/view/list.vue
@@ -0,0 +1,185 @@
+
+
+
+
+ 标题:
+ 分类:
+
+
+
+ 状态:
+
+
+
+ 查询
+ 写文章
+
+
+
+
+
+
+
+ {{props.row.title}}
+
+
+
+
+
+
+
+
+
+
+
+
+ 修改
+
+ 删除
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/web/page/admin/home/view/notfound.vue b/app/web/page/admin/home/view/notfound.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2a791e9a43b556b4e7f55a667dc5a283f3e89229
--- /dev/null
+++ b/app/web/page/admin/home/view/notfound.vue
@@ -0,0 +1,12 @@
+
+
+ Not Find The Page!!!
+
+
+
+
\ No newline at end of file
diff --git a/app/web/page/admin/home/view/write/index.vue b/app/web/page/admin/home/view/write/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7760e9154b7b2b3ba8d54c85b4046a647f4394e1
--- /dev/null
+++ b/app/web/page/admin/home/view/write/index.vue
@@ -0,0 +1,58 @@
+
+
+
+
+
+ 提交
+ 草稿
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/web/page/admin/login/login.css b/app/web/page/admin/login/login.css
new file mode 100644
index 0000000000000000000000000000000000000000..7a5390c48942a46684dd014dca30cc24e8958514
--- /dev/null
+++ b/app/web/page/admin/login/login.css
@@ -0,0 +1,40 @@
+.login {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: absolute;
+ height: 100%;
+ width: 100%;
+ background-color: #e4e5e6;
+}
+
+.login .login-info input {
+ width: 100%;
+}
+
+.login .login-form {
+ width: 375px;
+ height: 400px;
+ padding: 30px;
+ background-color: white;
+ text-align: left;
+ border-radius: 4px;
+ position: relative;
+ margin-left: 0;
+ margin-right: 0;
+ zoom: 1;
+ display: block;
+}
+
+.login .login-header {
+ text-align: center;
+ font-size: 16px;
+ font-weight: bold;
+ margin-bottom: 20px;
+}
+
+.login .el-checkbox__label {
+ font-size: 14px;
+ font-weight: normal;
+ padding-left: 4px;
+}
diff --git a/app/web/page/admin/login/login.vue b/app/web/page/admin/login/login.vue
new file mode 100644
index 0000000000000000000000000000000000000000..40ae6317dfb90fcc3c9240b0c8cf3c70d88f141f
--- /dev/null
+++ b/app/web/page/admin/login/login.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/web/page/category/category.css b/app/web/page/category/category.css
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/web/page/category/category.vue b/app/web/page/category/category.vue
new file mode 100644
index 0000000000000000000000000000000000000000..287660493a7956cd9934a4cd40a14f7ea3c154d6
--- /dev/null
+++ b/app/web/page/category/category.vue
@@ -0,0 +1,37 @@
+
+
+
+
{{ message }}
+ element-ui
+
+
+
+
+
+
diff --git a/app/web/page/index/index.css b/app/web/page/index/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/web/page/index/index.vue b/app/web/page/index/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3e1cc1067326485360309b2132786954e64b717e
--- /dev/null
+++ b/app/web/page/index/index.vue
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
Posted by hubcarl on 17-09-24
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/web/view/layout.html b/app/web/view/layout.html
new file mode 100644
index 0000000000000000000000000000000000000000..03a9b5d1b23dc88e20cc0a2cacb272068167ba7a
--- /dev/null
+++ b/app/web/view/layout.html
@@ -0,0 +1,14 @@
+
+
+
+ IBlog
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..7c09e1f92f711abee1d8838dd45cef02888e5ac7
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,55 @@
+module.exports = {
+ "env": {
+ "node": {
+ "presets": [
+ [
+ "@babel/preset-env",
+ {
+ "modules": false,
+ "targets": {
+ "node": "current"
+ }
+ }
+ ]
+ ],
+ "plugins": [
+ [
+ "component",
+ {
+ "libraryName": "element-ui",
+ "styleLibraryName": "theme-chalk"
+ }
+ ],
+ "@babel/plugin-syntax-dynamic-import"
+ ]
+ },
+ "web": {
+ "presets": [
+ [
+ "@babel/preset-env",
+ {
+ "modules": false,
+ "targets": {
+ "browsers": [
+ "last 2 versions",
+ "safari >= 7"
+ ]
+ }
+ }
+ ]
+ ],
+ "plugins": [
+ [
+ "component",
+ {
+ "libraryName": "element-ui",
+ "styleLibraryName": "theme-chalk"
+ }
+ ],
+ "@babel/plugin-proposal-object-rest-spread",
+ "@babel/plugin-syntax-dynamic-import",
+ "@babel/plugin-transform-object-assign"
+ ]
+ }
+ }
+}
diff --git a/blog.json b/blog.json
new file mode 100644
index 0000000000000000000000000000000000000000..8418edf824652a0c21c8bee9667693ef883ba82b
--- /dev/null
+++ b/blog.json
@@ -0,0 +1,519 @@
+{
+ "user": {},
+ "article": [
+ {
+ "id": 1,
+ "title": "vue-渐进式JavaScript 框架",
+ "summary": "简单小巧的核心,渐进式技术栈,足以应付任何规模的应用",
+ "hits": 200,
+ "url": "https://cn.vuejs.org",
+ "status": 1,
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348289
+ },
+ {
+ "id": 2,
+ "title": "Webpack 配置官方文档",
+ "summary": "webpack is a module bundler for modern JavaScript applications.",
+ "hits": 550,
+ "url": "https://webpack.js.org/configuration/",
+ "status": 1,
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348290
+ },
+ {
+ "id": 3,
+ "title": "egg-为企业级框架和应用而生",
+ "summary": "Born to buildbetter enterprise frameworks and apps with Node.js & Koa",
+ "hits": 278,
+ "url": "https://eggjs.org/",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348290
+ },
+ {
+ "id": 5,
+ "title": "Centralized State Management for Vue.js",
+ "summary": "Vuex 是一个专为Vue.js 应用程序开发的状态管理模式",
+ "hits": 232,
+ "url": "https://github.com/vuejs/vuex",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348293
+ },
+ {
+ "id": 6,
+ "title": "vue服务器渲染",
+ "summary": "服务器渲染可以加快首屏速度,利于SEO",
+ "hits": 565,
+ "url": "http://csbun.github.io/blog/2016/08/vue-2-0-server-side-rendering/",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348293
+ },
+ {
+ "id": 7,
+ "title": "webpack服务器构建",
+ "summary": "Webpack is an amazing tool.",
+ "hits": 988,
+ "url": "http://jlongster.com/Backend-Apps-with-Webpack--Part-I",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348294
+ },
+ {
+ "id": 8,
+ "title": "vue component loader for Webpack",
+ "summary": "Webpack loader for Vue.js components",
+ "hits": 322,
+ "url": "https://github.com/vuejs/vue-loader",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348295
+ },
+ {
+ "id": 9,
+ "title": "vue-router--The official router for Vue.js",
+ "summary": "It deeply integrates with Vue.js core to make building Single Page Applications with Vue.js a breeze",
+ "hits": 566,
+ "url": "https://github.com/vuejs/vue-router",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348295
+ },
+ {
+ "id": 10,
+ "title": "vue生命周期",
+ "summary": "Vue.js 生命周期和route的生命周期讲解",
+ "hits": 434,
+ "url": "http://www.jianshu.com/p/e9f884b6ba6c",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348296
+ },
+ {
+ "id": 11,
+ "title": "babel到底将代码转换成什么鸟样",
+ "summary": "将babel捧作前端一个划时代的工具一定也不为过,它的出现让许多程序员幸福地用上了es6新语法",
+ "hits": 432,
+ "url": "https://github.com/lcxfs1991/blog/issues/9",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348296
+ },
+ {
+ "id": 12,
+ "title": "HTTP2 的真正性能到底如何",
+ "summary": "HTTP2 的真正性能到底如何",
+ "hits": 565,
+ "url": "https://segmentfault.com/a/1190000007219256?utm_source=weekly&utm_medium=email&utm_campaign=email_weekly",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348296
+ },
+ {
+ "id": 13,
+ "title": "HTTP,HTTP2.0,SPDY,HTTPS讲解",
+ "summary": "使用SPDY加快你的网站速度",
+ "hits": 787,
+ "url": "http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-reading-this-is-enough/",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348297
+ },
+ {
+ "id": 14,
+ "title": "git - 简明指南",
+ "summary": "助你入门 git 的简明指南",
+ "hits": 121,
+ "url": "http://rogerdudler.github.io/git-guide/index.zh.html",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348297
+ },
+ {
+ "id": 15,
+ "title": "vue从1升级到2",
+ "summary": "Migrating from v1 to v2",
+ "hits": 555,
+ "url": "https://webpack.js.org/guides/migrating/",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348298
+ },
+ {
+ "id": 16,
+ "title": "vue-渐进式JavaScript 框架",
+ "summary": "简单小巧的核心,渐进式技术栈,足以应付任何规模的应用",
+ "hits": 200,
+ "url": "https://cn.vuejs.org",
+ "status": 1,
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348299
+ },
+ {
+ "id": 17,
+ "title": "webpack配置官方文档",
+ "summary": "webpack is a module bundler for modern JavaScript applications.",
+ "hits": 550,
+ "url": "https://webpack.js.org/configuration/",
+ "status": 1,
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348321
+ },
+ {
+ "id": 18,
+ "title": "egg-为企业级框架和应用而生",
+ "summary": "Born to buildbetter enterprise frameworks and apps with Node.js & Koa",
+ "hits": 278,
+ "url": "https://eggjs.org/",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348322
+ },
+ {
+ "id": 20,
+ "title": "Centralized State Management for Vue.js",
+ "summary": "Vuex 是一个专为Vue.js 应用程序开发的状态管理模式",
+ "hits": 232,
+ "url": "https://github.com/vuejs/vuex",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348326
+ },
+ {
+ "id": 21,
+ "title": "vue服务器渲染",
+ "summary": "服务器渲染可以加快首屏速度,利于SEO",
+ "hits": 565,
+ "url": "http://csbun.github.io/blog/2016/08/vue-2-0-server-side-rendering/",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348327
+ },
+ {
+ "id": 22,
+ "title": "webpack服务器构建",
+ "summary": "Webpack is an amazing tool.",
+ "hits": 988,
+ "url": "http://jlongster.com/Backend-Apps-with-Webpack--Part-I",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348329
+ },
+ {
+ "id": 23,
+ "title": "vue component loader for Webpack",
+ "summary": "Webpack loader for Vue.js components",
+ "hits": 322,
+ "url": "https://github.com/vuejs/vue-loader",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348330
+ },
+ {
+ "id": 24,
+ "title": "vue-router--The official router for Vue.js",
+ "summary": "It deeply integrates with Vue.js core to make building Single Page Applications with Vue.js a breeze",
+ "hits": 566,
+ "url": "https://github.com/vuejs/vue-router",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348330
+ },
+ {
+ "id": 25,
+ "title": "vue生命周期",
+ "summary": "Vue.js 生命周期和route的生命周期讲解",
+ "hits": 434,
+ "url": "http://www.jianshu.com/p/e9f884b6ba6c",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348331
+ },
+ {
+ "id": 26,
+ "title": "babel到底将代码转换成什么鸟样",
+ "summary": "将babel捧作前端一个划时代的工具一定也不为过,它的出现让许多程序员幸福地用上了es6新语法",
+ "hits": 432,
+ "url": "https://github.com/lcxfs1991/blog/issues/9",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348333
+ },
+ {
+ "id": 27,
+ "title": "HTTP2 的真正性能到底如何",
+ "summary": "HTTP2 的真正性能到底如何",
+ "hits": 565,
+ "url": "https://segmentfault.com/a/1190000007219256?utm_source=weekly&utm_medium=email&utm_campaign=email_weekly",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348333
+ },
+ {
+ "id": 28,
+ "title": "HTTP,HTTP2.0,SPDY,HTTPS讲解",
+ "summary": "使用SPDY加快你的网站速度",
+ "hits": 787,
+ "url": "http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-reading-this-is-enough/",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348334
+ },
+ {
+ "id": 29,
+ "title": "git - 简明指南",
+ "summary": "助你入门 git 的简明指南",
+ "hits": 121,
+ "url": "http://rogerdudler.github.io/git-guide/index.zh.html",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348335
+ },
+ {
+ "id": 30,
+ "title": "vue从1升级到2",
+ "summary": "Migrating from v1 to v2",
+ "hits": 555,
+ "url": "https://webpack.js.org/guides/migrating/",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348335
+ },
+ {
+ "id": 31,
+ "title": "vue-渐进式JavaScript 框架",
+ "summary": "简单小巧的核心,渐进式技术栈,足以应付任何规模的应用",
+ "hits": 200,
+ "url": "https://cn.vuejs.org",
+ "status": 1,
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348336
+ },
+ {
+ "id": 32,
+ "title": "webpack配置官方文档",
+ "summary": "webpack is a module bundler for modern JavaScript applications.",
+ "hits": 550,
+ "url": "https://webpack.js.org/configuration/",
+ "status": 1,
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348336
+ },
+ {
+ "id": 33,
+ "title": "egg-为企业级框架和应用而生",
+ "summary": "Born to buildbetter enterprise frameworks and apps with Node.js & Koa",
+ "hits": 278,
+ "url": "https://eggjs.org/",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348338
+ },
+ {
+ "id": 35,
+ "title": "Centralized State Management for Vue.js",
+ "summary": "Vuex 是一个专为Vue.js 应用程序开发的状态管理模式",
+ "hits": 232,
+ "url": "https://github.com/vuejs/vuex",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348339
+ },
+ {
+ "id": 36,
+ "title": "vue服务器渲染",
+ "summary": "服务器渲染可以加快首屏速度,利于SEO",
+ "hits": 565,
+ "url": "http://csbun.github.io/blog/2016/08/vue-2-0-server-side-rendering/",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348340
+ },
+ {
+ "id": 37,
+ "title": "webpack服务器构建",
+ "summary": "Webpack is an amazing tool.",
+ "hits": 988,
+ "url": "http://jlongster.com/Backend-Apps-with-Webpack--Part-I",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348340
+ },
+ {
+ "id": 38,
+ "title": "vue component loader for Webpack",
+ "summary": "Webpack loader for Vue.js components",
+ "hits": 322,
+ "url": "https://github.com/vuejs/vue-loader",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348341
+ },
+ {
+ "id": 39,
+ "title": "vue-router--The official router for Vue.js",
+ "summary": "It deeply integrates with Vue.js core to make building Single Page Applications with Vue.js a breeze",
+ "hits": 566,
+ "url": "https://github.com/vuejs/vue-router",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348341
+ },
+ {
+ "id": 40,
+ "title": "vue生命周期",
+ "summary": "Vue.js 生命周期和route的生命周期讲解",
+ "hits": 434,
+ "url": "http://www.jianshu.com/p/e9f884b6ba6c",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348342
+ },
+ {
+ "id": 41,
+ "title": "babel到底将代码转换成什么鸟样",
+ "summary": "将babel捧作前端一个划时代的工具一定也不为过,它的出现让许多程序员幸福地用上了es6新语法",
+ "hits": 432,
+ "url": "https://github.com/lcxfs1991/blog/issues/9",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348342
+ },
+ {
+ "id": 42,
+ "title": "HTTP2 的真正性能到底如何",
+ "summary": "HTTP2 的真正性能到底如何",
+ "hits": 565,
+ "url": "https://segmentfault.com/a/1190000007219256?utm_source=weekly&utm_medium=email&utm_campaign=email_weekly",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348343
+ },
+ {
+ "id": 43,
+ "title": "HTTP,HTTP2.0,SPDY,HTTPS讲解",
+ "summary": "使用SPDY加快你的网站速度",
+ "hits": 787,
+ "url": "http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-reading-this-is-enough/",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348343
+ },
+ {
+ "id": 44,
+ "title": "git - 简明指南",
+ "summary": "助你入门 git 的简明指南",
+ "hits": 121,
+ "url": "http://rogerdudler.github.io/git-guide/index.zh.html",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348344
+ },
+ {
+ "id": 45,
+ "title": "vue从1升级到2",
+ "summary": "Migrating from v1 to v2",
+ "hits": 555,
+ "url": "https://webpack.js.org/guides/migrating/",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348345
+ },
+ {
+ "id": 46,
+ "title": "vue-渐进式JavaScript 框架",
+ "summary": "简单小巧的核心,渐进式技术栈,足以应付任何规模的应用",
+ "hits": 200,
+ "url": "https://cn.vuejs.org",
+ "status": 1,
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348345
+ },
+ {
+ "id": 47,
+ "title": "webpack配置官方文档",
+ "summary": "webpack is a module bundler for modern JavaScript applications.",
+ "hits": 550,
+ "url": "https://webpack.js.org/configuration/",
+ "status": 1,
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348346
+ },
+ {
+ "id": 48,
+ "title": "egg-为企业级框架和应用而生",
+ "summary": "Born to buildbetter enterprise frameworks and apps with Node.js & Koa",
+ "hits": 278,
+ "url": "https://eggjs.org/",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348346
+ },
+ {
+ "id": 50,
+ "title": "Centralized State Management for Vue.js",
+ "summary": "Vuex 是一个专为Vue.js 应用程序开发的状态管理模式",
+ "hits": 232,
+ "url": "https://github.com/vuejs/vuex",
+ "tag": "egg,vue,webpack",
+ "categoryId": 1,
+ "authorId": 1,
+ "createTime": 1515671348347
+ }
+ ]
+}
\ No newline at end of file
diff --git a/config/config.default.js b/config/config.default.js
new file mode 100644
index 0000000000000000000000000000000000000000..0194ec5ff21bda91bbbd63058939011edc88b5c8
--- /dev/null
+++ b/config/config.default.js
@@ -0,0 +1,56 @@
+'use strict';
+const path = require('path');
+const fs = require('fs');
+module.exports = app => {
+ const exports = {};
+
+ exports.siteFile = {
+ '/favicon.ico': fs.readFileSync(path.join(app.baseDir, 'app/web/asset/images/favicon.ico'))
+ };
+
+ exports.vuessr = {
+ layout: path.join(app.baseDir, 'app/web/view/layout.html'),
+ renderOptions: {
+ basedir: path.join(app.baseDir, 'app/view')
+ },
+ injectRes:[
+ {
+ url: 'https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.0.2/css/swiper.min.css'
+ },
+ {
+ url: 'https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.0.2/js/swiper.min.js'
+ }
+ ]
+ };
+
+ exports.logger = {
+ consoleLevel: 'DEBUG',
+ dir: path.join(app.baseDir, 'logs')
+ };
+
+ exports.static = {
+ prefix: '/public/',
+ dir: path.join(app.baseDir, 'public')
+ };
+
+ exports.keys = '123456';
+
+ exports.middleware = [
+ 'locals',
+ 'access'
+ ];
+
+ exports.security = {
+ csrf: {
+ ignoreJSON: false,
+ cookieName: 'csrfToken',
+ sessionName: 'csrfToken',
+ headerName: 'x-csrf-token'
+ },
+ xframe: {
+ enable: false,
+ },
+ };
+
+ return exports;
+};
\ No newline at end of file
diff --git a/config/config.local.js b/config/config.local.js
new file mode 100644
index 0000000000000000000000000000000000000000..dddbb9d537ed3c0b479c93dc940b786b40a50e7a
--- /dev/null
+++ b/config/config.local.js
@@ -0,0 +1,39 @@
+const path = require('path');
+const ip = require('ip');
+module.exports = app => {
+ const exports = {};
+
+ exports.view = {
+ cache: false
+ };
+
+ exports.static = {
+ maxAge: 0 // maxAge 缓存,默认 1 年
+ };
+
+ exports.development = {
+ watchDirs: [], // 指定监视的目录(包括子目录),当目录下的文件变化的时候自动重载应用,路径从项目根目录开始写
+ ignoreDirs: ['app/web', 'public', 'config/manifest.json'] // 指定过滤的目录(包括子目录)
+ };
+
+ exports.logview = {
+ dir: path.join(app.baseDir, 'logs')
+ };
+
+ exports.webpack = {
+ // browser: 'http://localhost:7001',
+ // webpackConfigList: require('easywebpack-vue').getWebpackConfig()
+ };
+
+ const localIP = ip.address();
+ const domainWhiteList = [];
+ [7001, 9000, 9001].forEach(port => {
+ domainWhiteList.push(`http://localhost:${port}`);
+ domainWhiteList.push(`http://127.0.0.1:${port}`);
+ domainWhiteList.push(`http://${localIP}:${port}`);
+ });
+
+ exports.security = { domainWhiteList };
+
+ return exports;
+};
diff --git a/config/config.prod.js b/config/config.prod.js
new file mode 100644
index 0000000000000000000000000000000000000000..e4a94ef44487ca0c9009200f0d35c9a36454f61c
--- /dev/null
+++ b/config/config.prod.js
@@ -0,0 +1,12 @@
+/**
+ * 生产环境配置
+ *
+ * 最终生效的配置为 prod + default(前者覆盖后者)
+ */
+
+
+module.exports = app => {
+ const exports = {};
+
+ return exports;
+};
diff --git a/config/config.test.js b/config/config.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..665acb2547be289c4cf03aeb3442519f2187bf49
--- /dev/null
+++ b/config/config.test.js
@@ -0,0 +1,7 @@
+
+
+module.exports = app => {
+ const exports = {};
+
+ return exports;
+};
diff --git a/config/manifest.json b/config/manifest.json
new file mode 100644
index 0000000000000000000000000000000000000000..0237015edb9b908d1560e8d8c79c8dbed3c687ee
--- /dev/null
+++ b/config/manifest.json
@@ -0,0 +1,75 @@
+{
+ "chunk/0.js": "/public/js/chunk/0.js",
+ "chunk/1.js": "/public/js/chunk/1.js",
+ "chunk/2.js": "/public/js/chunk/2.js",
+ "chunk/3.js": "/public/js/chunk/3.js",
+ "chunk/4.js": "/public/js/chunk/4.js",
+ "about/about.js": "/public/js/chunk/about/about.js",
+ "admin/home/home.js": "/public/js/chunk/admin/home/home.js",
+ "admin/login/login.js": "/public/js/chunk/admin/login/login.js",
+ "category/category.js": "/public/js/chunk/category/category.js",
+ "common.js": "/public/js/chunk/common.js",
+ "index/index.js": "/public/js/chunk/index/index.js",
+ "runtime.js": "/public/js/runtime.js",
+ "font/element-icons.ttf": "/public/font/element-icons.ttf",
+ "font/element-icons.woff": "/public/font/element-icons.woff",
+ "font/fontawesome-webfont.eot?v=4.7.0": "/public/font/fontawesome-webfont.eot",
+ "font/fontawesome-webfont.ttf?v=4.7.0": "/public/font/fontawesome-webfont.ttf",
+ "font/fontawesome-webfont.woff?v=4.7.0": "/public/font/fontawesome-webfont.woff",
+ "font/fontawesome-webfont.woff2?v=4.7.0": "/public/font/fontawesome-webfont.woff2",
+ "font/glyphicons-halflings-regular.eot": "/public/font/glyphicons-halflings-regular.eot",
+ "font/glyphicons-halflings-regular.ttf": "/public/font/glyphicons-halflings-regular.ttf",
+ "font/glyphicons-halflings-regular.woff": "/public/font/glyphicons-halflings-regular.woff",
+ "font/glyphicons-halflings-regular.woff2": "/public/font/glyphicons-halflings-regular.woff2",
+ "img/fontawesome-webfont.svg?v=4.7.0": "/public/img/fontawesome-webfont.svg",
+ "img/glyphicons-halflings-regular.svg": "/public/img/glyphicons-halflings-regular.svg",
+ "img/loading.gif": "/public/img/loading.gif",
+ "img/logo.png": "/public/img/logo.png",
+ "deps": {
+ "about/about.js": {
+ "js": [
+ "/public/js/runtime.js",
+ "/public/js/chunk/common.js",
+ "/public/js/chunk/about/about.js"
+ ],
+ "css": []
+ },
+ "admin/home/home.js": {
+ "js": [
+ "/public/js/runtime.js",
+ "/public/js/chunk/common.js",
+ "/public/js/chunk/admin/home/home.js"
+ ],
+ "css": []
+ },
+ "admin/login/login.js": {
+ "js": [
+ "/public/js/runtime.js",
+ "/public/js/chunk/common.js",
+ "/public/js/chunk/admin/login/login.js"
+ ],
+ "css": []
+ },
+ "category/category.js": {
+ "js": [
+ "/public/js/runtime.js",
+ "/public/js/chunk/common.js",
+ "/public/js/chunk/category/category.js"
+ ],
+ "css": []
+ },
+ "index/index.js": {
+ "js": [
+ "/public/js/runtime.js",
+ "/public/js/chunk/common.js",
+ "/public/js/chunk/index/index.js"
+ ],
+ "css": []
+ }
+ },
+ "info": {
+ "publicPath": "/public/",
+ "buildPath": "public",
+ "mapped": true
+ }
+}
\ No newline at end of file
diff --git a/config/plugin.js b/config/plugin.js
new file mode 100644
index 0000000000000000000000000000000000000000..1b0e79693d0d39f7c1526b60af88c1ad778c51d4
--- /dev/null
+++ b/config/plugin.js
@@ -0,0 +1,4 @@
+exports.vuessr = {
+ enable: true,
+ package: 'egg-view-vue-ssr'
+};
\ No newline at end of file
diff --git a/config/plugin.local.js b/config/plugin.local.js
new file mode 100644
index 0000000000000000000000000000000000000000..c218c8b9adf951ea970e7304876a4e443cf9adac
--- /dev/null
+++ b/config/plugin.local.js
@@ -0,0 +1,19 @@
+exports.cors = {
+ enable: true,
+ package: 'egg-cors'
+};
+
+exports.webpack = {
+ enable: true,
+ package: 'egg-webpack'
+};
+
+exports.webpackvue = {
+ enable: true,
+ package: 'egg-webpack-vue'
+};
+
+exports.logview = {
+ package: 'egg-logview',
+ env: ['local']
+};
diff --git a/docs/images/admin.png b/docs/images/admin.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d1fa9f18146301334f58c63d6401e5fef4f9543
Binary files /dev/null and b/docs/images/admin.png differ
diff --git a/docs/images/egg-webpack.png b/docs/images/egg-webpack.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9f46ac8b09a1da0eaac6282e8efe87b98a2144d
Binary files /dev/null and b/docs/images/egg-webpack.png differ
diff --git a/docs/images/iblog.png b/docs/images/iblog.png
new file mode 100644
index 0000000000000000000000000000000000000000..817ed11b22ee33ca216fb8ca8e81d81d98e7c151
Binary files /dev/null and b/docs/images/iblog.png differ
diff --git a/docs/images/vue-mutil-page.png b/docs/images/vue-mutil-page.png
new file mode 100644
index 0000000000000000000000000000000000000000..47f74faa650743de541b947754a147a63daafb32
Binary files /dev/null and b/docs/images/vue-mutil-page.png differ
diff --git a/docs/images/vue-single-page.png b/docs/images/vue-single-page.png
new file mode 100644
index 0000000000000000000000000000000000000000..bb4351e1280c4c130d1184fb721687768987587c
Binary files /dev/null and b/docs/images/vue-single-page.png differ
diff --git a/docs/images/webpack-build.png b/docs/images/webpack-build.png
new file mode 100644
index 0000000000000000000000000000000000000000..6884069b43e316bc2b753c41fc2f8ea45e463727
Binary files /dev/null and b/docs/images/webpack-build.png differ
diff --git a/docs/images/webpack.png b/docs/images/webpack.png
new file mode 100644
index 0000000000000000000000000000000000000000..26ff8b88712b9bc99982d95fab7fbed1c88839f2
Binary files /dev/null and b/docs/images/webpack.png differ
diff --git a/docs/issue_template.md b/docs/issue_template.md
new file mode 100644
index 0000000000000000000000000000000000000000..909e90c3bde81396f5a953c7e4db96f959947003
--- /dev/null
+++ b/docs/issue_template.md
@@ -0,0 +1,7 @@
+
diff --git a/docs/perform.md b/docs/perform.md
new file mode 100644
index 0000000000000000000000000000000000000000..69d1d14f9b7116418ca4d9ded1defcda67a2066b
--- /dev/null
+++ b/docs/perform.md
@@ -0,0 +1,7 @@
+http://www.jianshu.com/p/1dffe3126686
+
+http://alexkuz.github.io/webpack-chart/
+http://webpack.github.io/analyse/
+
+
+http://kiwenlau.com/2017/04/01/nodejs-async-await/
\ No newline at end of file
diff --git a/package.json b/package.json
index 72caa1750a1c44c18460a496d258fbd3c51c673a..a9120f2d21a5568f2a24b964c5a7e577b8c1a398 100644
--- a/package.json
+++ b/package.json
@@ -1,18 +1,74 @@
{
- "name": "nodejs",
- "version": "1.0.0",
- "description": "",
- "main": "index.js",
- "scripts": {
- "dev": "node index.js",
- "test": "echo \"Error: no test specified\" && exit 1"
- },
- "keywords": [],
- "author": "",
- "license": "ISC",
- "dependencies": {
- "@types/node": "^18.0.6",
- "node-fetch": "^3.2.6"
- }
+ "name": "Blog",
+ "version": "1.0.0",
+ "description": "基于 easywebpack-vue 和 egg-view-vue-ssr 插件的 Egg + Vue SSR 服务端渲染同构工程骨架项目",
+ "scripts": {
+ "dev": "egg-bin dev",
+ "start": "egg-scripts start",
+ "debug": "egg-bin debug",
+ "clean": "easy clean all",
+ "build": "easy build prod",
+ "lint": "eslint .",
+ "fix": "eslint --fix .",
+ "ii": "npm install --registry https://registry.npm.taobao.org",
+ "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s"
+ },
+ "dependencies": {
+ "axios": "^0.18.1",
+ "codemirror": "^4.13.0",
+ "cross-env": "^5.0.0",
+ "egg": "^2.1.0",
+ "egg-bin": "^4.3.7",
+ "egg-cors": "^2.0.0",
+ "egg-logger": "^1.5.0",
+ "egg-scripts": "^2.5.1",
+ "egg-validate": "^1.0.0",
+ "egg-view-vue-ssr": "^3.2.0",
+ "element-ui": "^2.0.8",
+ "extend": "~3.0.0",
+ "font-awesome": "^4.7.0",
+ "lodash": "^4.17.4",
+ "lodash-id": "^0.14.0",
+ "lowdb": "^1.0.0",
+ "mockjs": "^1.0.1-beta3",
+ "moment": "^2.17.1",
+ "shortid": "^2.2.8",
+ "showdown": "^1.8.6",
+ "simplemde": "^1.11.2",
+ "vue": "^2.5.0",
+ "vue-hot-reload-api": "^2.1.0",
+ "vue-i18n": "^8.1.0",
+ "vue-material-input": "^1.2.0",
+ "vue-router": "^3.0.1",
+ "vuex": "^3.0.1",
+ "vuex-router-sync": "^5.0.0"
+ },
+ "devDependencies": {
+ "@easy-team/easywebpack-cli": "^4.0.0",
+ "@easy-team/easywebpack-vue": "^4.0.0",
+ "babel-plugin-component": "^1.1.1",
+ "egg-logview": "^1.0.0",
+ "egg-webpack": "^4.4.1",
+ "egg-webpack-vue": "^2.0.0",
+ "eslint": "^4.19.1",
+ "eslint-config-egg": "^5.0.0",
+ "eslint-plugin-vue": "^4.4.0",
+ "ip": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ },
+ "ci": {
+ "version": "8, 10"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/easy-team/egg-vue-webpack-boilerplate.git"
+ },
+ "author": "hubcarl@126.com",
+ "license": "MIT",
+ "homepage": "https://github.com/easy-team/egg-vue-webpack-boilerplate",
+ "webpack": {
+ "loaders": {}
}
-
\ No newline at end of file
+}
diff --git a/test/event.js b/test/event.js
new file mode 100644
index 0000000000000000000000000000000000000000..33306389e6d7711fc7fc47b23358cff6ca8f07f3
--- /dev/null
+++ b/test/event.js
@@ -0,0 +1,20 @@
+const EventEmitter = require('events');
+class MyEmitter extends EventEmitter{};
+const myEmitter = new MyEmitter();
+myEmitter.on('event', function() {
+ console.log('event1');
+});
+myEmitter.on('event', async function() {
+ console.log('event2');
+ await new Promise((resolve, reject) => {
+ setTimeout(() => {
+ resolve(1);
+ }, 1000);
+ });
+ console.log('event3');
+});
+myEmitter.on('event', function() {
+ console.log('event4');
+});
+myEmitter.emit('event');
+console.log('end');
diff --git a/test/glob.js b/test/glob.js
new file mode 100644
index 0000000000000000000000000000000000000000..957162df290d635bc4723ffa3dfdd3a45cc0b8aa
--- /dev/null
+++ b/test/glob.js
@@ -0,0 +1,19 @@
+const glob = require('glob');
+const str = 'app/web/page/**!(component|components|view|views)/*.vue';
+const result = str.match(/!\((.*)\)/);
+if (result && result.length) {
+ const matchIgnore = result[0];
+ const matchIgnoreKeys = result[1];
+ const matchStr = str.replace(matchIgnore, '');
+ const ignore = matchIgnoreKeys.split('|').map(key => {
+ if (/\./.test(key)) {
+ return `**/${key}/**`;
+ }
+ return `**/${key}/**`;
+ });
+ const files = glob.sync(matchStr, { ignore });
+ console.log(files);
+} else {
+ const files = glob.sync(str);
+ console.log(files);
+}
diff --git a/test/node8.js b/test/node8.js
new file mode 100644
index 0000000000000000000000000000000000000000..5f2688b63ecf023fd14bee0e343fdfde9818ce35
--- /dev/null
+++ b/test/node8.js
@@ -0,0 +1,3 @@
+function getList() {
+
+}
\ No newline at end of file
diff --git a/test/path.js b/test/path.js
new file mode 100644
index 0000000000000000000000000000000000000000..6b09f8a209e338540cc17989001630a602760e8a
--- /dev/null
+++ b/test/path.js
@@ -0,0 +1,11 @@
+'use strict';
+const path = require('path');
+const prefix = 'static/test';
+const url = 'js/index.js';
+console.log('--path.join--', path.join(prefix, url));
+console.log('--path.posix.join--', path.posix.join(prefix, url));
+
+// windows print
+
+// --path.join-- static\test\js\index.js
+// --path.posix.join-- static/test/js/index.js
\ No newline at end of file
diff --git a/test/resolve.js b/test/resolve.js
new file mode 100644
index 0000000000000000000000000000000000000000..ed65fbcf7e1c9f648d051f37ea3b165c2f4d75b8
--- /dev/null
+++ b/test/resolve.js
@@ -0,0 +1,5 @@
+'use strict';
+const path = require('path');
+const resolve = require('resolve');
+const baseDir = process.cwd() + '/app/view';
+const res = resolve.sync('test', { basedir: baseDir });
\ No newline at end of file
diff --git a/test/shell.js b/test/shell.js
new file mode 100644
index 0000000000000000000000000000000000000000..6571c2dd3fd6a67e1e2cc178735369d583ecfdf0
--- /dev/null
+++ b/test/shell.js
@@ -0,0 +1,26 @@
+const os = require('os');
+const shell = require('shelljs');
+
+function checkPortUsed(port) {
+ let cmd = '';
+ switch (os.platform()) {
+ case 'win32':
+ cmd = `netstat -ano | findstr ${port}`;
+ break;
+ case 'darwin':
+ cmd = `netstat -anp tcp | grep ${port}`;
+ break;
+ case 'linux':
+ cmd = `netstat -apn | grep ${port}`;
+ break;
+ default:
+ cmd = `netstat -apn | grep ${port}`;
+ break;
+ }
+ try {
+ const result = shell.exec(cmd, { silent: true });
+ return !!result.stdout;
+ } catch (err) {
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/test/spawn.js b/test/spawn.js
new file mode 100644
index 0000000000000000000000000000000000000000..254ff2fca10e5794de2324ca65785b5d73ac2920
--- /dev/null
+++ b/test/spawn.js
@@ -0,0 +1,6 @@
+const spawn = require('cross-spawn');
+const output = spawn.sync('ls', ['-lrt'], {
+ stdio: ['ignore', 'pipe', 'inherit']
+});
+
+console.log(output.stdout.toString());
\ No newline at end of file
diff --git a/test/vue.html b/test/vue.html
new file mode 100644
index 0000000000000000000000000000000000000000..c1a1a803d68b490449040e9149e4997634539d74
--- /dev/null
+++ b/test/vue.html
@@ -0,0 +1,62 @@
+
+
+
+
+ Vue
+
+
+
+
+{{message}}
+
+{{message}}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/webpack.config.js b/webpack.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..20ad67cfe7ebd2e8a9b960891ddf301d6f6c6782
--- /dev/null
+++ b/webpack.config.js
@@ -0,0 +1,7 @@
+'use strict';
+// Document:https://www.yuque.com/easy-team/easywebpack 和 https://www.yuque.com/easy-team/egg-vue
+module.exports = {
+ plugins: [
+ { imagemini: false }
+ ]
+};
\ No newline at end of file