diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..389959e --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +.git +.idea \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..f7ba128 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,14 @@ +* text=auto + +# Force the following filetypes to have unix eols, so Windows does not break them +*.* text eol=lf + +# Windows forced line-endings +/.idea/* text eol=crlf + +# +## These files are binary and should be left untouched +# + +# (binary is a macro for -text -diff) +*.png binary diff --git a/assets/bootstrap/images/add_site.png b/.github/image/add_site.png similarity index 100% rename from assets/bootstrap/images/add_site.png rename to .github/image/add_site.png diff --git a/.github/image/category.png b/.github/image/category.png new file mode 100644 index 0000000..b64b08f Binary files /dev/null and b/.github/image/category.png differ diff --git a/.github/image/index.png b/.github/image/index.png new file mode 100644 index 0000000..a3f22a4 Binary files /dev/null and b/.github/image/index.png differ diff --git a/assets/bootstrap/images/site.png b/.github/image/site.png similarity index 100% rename from assets/bootstrap/images/site.png rename to .github/image/site.png diff --git a/.gitignore b/.gitignore index bb8714a..fb81692 100644 --- a/.gitignore +++ b/.gitignore @@ -1,102 +1,6 @@ -### JetBrains template -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf - -# AWS User-specific -.idea/**/aws.xml - -# Generated files -.idea/**/contentModel.xml - -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml -.idea/**/dbnavigator.xml - -# Gradle -.idea/**/gradle.xml -.idea/**/libraries - -# Gradle and Maven with auto-import -# When using Gradle or Maven with auto-import, you should exclude module files, -# since they will be recreated, and may cause churn. Uncomment if using -# auto-import. -# .idea/artifacts -# .idea/compiler.xml -# .idea/jarRepositories.xml -# .idea/modules.xml -# .idea/*.iml -# .idea/modules -# *.iml -# *.ipr - -# CMake -cmake-build-*/ - -# Mongo Explorer plugin -.idea/**/mongoSettings.xml - -# File-based project format -*.iws - -# IntelliJ -out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# SonarLint plugin -.idea/sonarlint/ - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -# Editor-based Rest Client -.idea/httpRequests - -# Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser - -### Go template -# If you prefer the allow list template instead of the deny list, see community template: -# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore -# -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib - -# Test binary, built with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Dependency directories (remove the comment below to include it) -# vendor/ - -# Go workspace file -go.work - +bin/ +storage/logs +.idea +*.log +deploy/docker-compose/conf +deploy/docker-compose/data diff --git a/Dockerfile b/Dockerfile old mode 100755 new mode 100644 index 958befe..5023f5f --- a/Dockerfile +++ b/Dockerfile @@ -1,35 +1,32 @@ -# FROM 基于 golang:1.20-alpine -FROM golang:1.20-alpine AS builder +FROM golang:1.22-alpine AS builder +RUN set -eux && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories -# ENV 设置环境变量 -ENV GO111MODULE=on -ENV GOPROXY=https://goproxy.io,direct +ARG APP_RELATIVE_PATH -# COPY 源路径 目标路径 -COPY . /go/src/github.com/ch3nnn/webstack-go +COPY . /data/app +WORKDIR /data/app -# RUN 执行 go build . -RUN cd /go/src/github.com/ch3nnn/webstack-go && go build . +RUN rm -rf /data/app/bin/ +RUN export GOPROXY=https://goproxy.cn,direct && go mod tidy && go build -ldflags="-s -w" -o ./bin/server ${APP_RELATIVE_PATH} +RUN mv config /data/app/bin/ -# FROM 基于 alpine:latest -FROM alpine:latest -# RUN 设置代理镜像 -RUN echo -e http://mirrors.ustc.edu.cn/alpine/v3.13/main/ > /etc/apk/repositories +FROM alpine:3.14 +RUN set -eux && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories -# RUN 设置 Asia/Shanghai 时区 -RUN apk --no-cache add tzdata && \ - ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ - echo "Asia/Shanghai" > /etc/timezone -# COPY 源路径 目标路径 从镜像中 COPY -COPY --from=builder /go/src/github.com/ch3nnn/webstack-go/webstack-go /opt/ +RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && echo "Asia/Shanghai" > /etc/timezone \ + && apk del tzdata -# EXPOSE 设置端口映射 -EXPOSE 9999/tcp -# WORKDIR 设置工作目录 -WORKDIR /opt +ARG APP_ENV +ENV APP_ENV=${APP_ENV} -# CMD 设置启动命令 -CMD ["./webstack-go", "-env", "docker"] +WORKDIR /data/app +COPY --from=builder /data/app/bin /data/app +COPY --from=builder /data/app/web/upload /data/app/web/upload/ +RUN mkdir -p /data/app/storage/ + +EXPOSE 8000 +ENTRYPOINT [ "./server" ] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..728e45c --- /dev/null +++ b/Makefile @@ -0,0 +1,30 @@ +.PHONY: init +init: + go install github.com/google/wire/cmd/wire@latest + go install github.com/swaggo/swag/cmd/swag@latest + go install github.com/incu6us/goimports-reviser/v3@latest + go install mvdan.cc/gofumpt@latest + +.PHONY: build +build: + go build -ldflags="-s -w" -o ./bin/server ./cmd/server + +.PHONY: docker +docker: + docker build -t webstack-go:v2 --build-arg APP_CONF=config/prod.yml --build-arg APP_RELATIVE_PATH=./cmd/server . + docker run -itd -p 8000:8000 --name webstack-go webstack-go:v2 + +.PHONY: swag +swag: + swag init -g cmd/server/main.go -o ./docs --parseDependency + +.PHONY: fmt +fmt: + goimports-reviser -rm-unused -set-alias -format ./... + find . -name '*.go' -not -name "*.pb.go" -not -name "*.gen.go" | xargs gofumpt -w -extra + +.PHONY: run +run: + go mod tidy + go build -ldflags="-s -w" -o ./bin/server ./cmd/server + ./bin/server -conf=config/prod.yml diff --git a/README.md b/README.md index c2d9b3c..85319bb 100644 --- a/README.md +++ b/README.md @@ -2,35 +2,23 @@ 基于 Golang 开源的网址导航网站项目,具备完整的前后台,您可以拿来制作自己平日收藏的网址导航。 -- 图标库: [lineicons](https://lineicons.com/icons/) -- 前端模板: [WebStackPage](https://github.com/WebStackPage/WebStackPage.github.io) -- 后端 Gin 框架: 基于 [go-gin-api ](https://github.com/xinliangnote/go-gin-api)项目二次开发 +- 前端模板: [WebStackPage](https://github.com/WebStackPage/WebStackPage.github.io)、[go-gin-api ](https://github.com/xinliangnote/go-gin-api) +- 后端框架: 基于 [go-nunu](https://github.com/go-nunu/nunu) 脚手架搭建 -原有后端项目基础上新增功能: +功能: - [x] 新增 webstack - 导航首页 - [x] 新增 系统管理员 - 网站分类 - [x] 新增 系统管理员 - 网站列表 -- [x] 网站新增支持自动获取标题、Logo、网站描述、一键同步 -- [x] 新增 `docker-compose.yml` 一键安装各组件 -- [x] 批量添加网址 -- [x] 优化: 由 [gorm-gen](https://github.com/go-gorm/gen) 代码生成提供支持的友好且更安全的 GORM +- [x] 新增 网站新增支持自动获取标题、Logo、网站描述、一键同步 +- [x] 新增 批量添加网址 +- [x] 新增 由 [gorm-gen](https://github.com/go-gorm/gen) 代码生成提供支持的友好且更安全的 GORM ## 快速开始 ### 一、运行环境 -> 安装 Golang、Mysql、Redis - -- Golang 1.16+ 因为使用了 //go:embed 特性; -- MySQL - - 连接地址,例如:127.0.0.1:3306; - - 数据库名,例如:webstack,会在此数据库下初始化数据表; - - 用户名,不可为空; - - 密码,不可为空; -- Redis - - 连接地址,例如:127.0.0.1:6379; - - 密码,可为空; - - 连接DB,默认是 0 ; +- Golang 1.22 +- SQLite ### 二、启动服务 @@ -39,61 +27,19 @@ **一、源码运行服务** 1. 目录下执行 `go mod tidy` 拉取项目依赖库 -2. 安装完依赖执行 `go run main.go` 首次启动程序之后,会在浏览器中自动打开安装界面,链接地址:http://127.0.0.1:9999/install -3. 点击 `初始化项目` 会看到如下图所示, 如果提示重新运行服务说明项目初始化完成, 只需重新运行服务就 OK 了! +2. 执行 `go build -o ./bin/server ./cmd/server` 编译项目,生成可执行文件 server +3. 编译完执行 `./bin/server -conf=config/prod.yml` 首次启动程序之后,会生成 SQLite 数据库,并自动创建表结构 - **二、Docker运行服务** -> 包含两部分 1. 基础服务(Mysql、Redis、Service) 2. 监控服务(Prometheus、Grafana) - - -**一、基础服务** -1. 目录下执行 `docker-compose -f docker-compose.yml up -d` 等待基础组件启动 (Mysql、Redis、Service) - ```shell - $ docker-compose -f docker-compose.yml up -d - [+] Running 4/4 - ✔ Network webstack-go Created 0.1s - ✔ Container webstack-go-mysql Healthy 12.9s - ✔ Container webstack-go-redis Healthy 13.4s - ✔ Container webstack-go-service Started - ``` -2. 执行`docker-compose -f docker-compose.yml ps `服务正常运行如下 +1. 目录下执行 `make docker` 等待启动 ```shell - NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS - webstack-go-mysql mysql/mysql-server:5.7 "/entrypoint.sh mysq…" webstack-go-mysql 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:3306->3306/tcp, 33060/tcp - webstack-go-redis redis:6.2.4 "docker-entrypoint.s…" webstack-go-redis 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:6379->6379/tcp - webstack-go-service webstack-go-webstack-go-service "./webstack-go -env …" webstack-go-service 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:9999->9999/tcp + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 5cb641ff3950 webstack-go:v2 "./server" 5 seconds ago Up 5 seconds 0.0.0.0:8000->8000/tcp webstack-go ``` -3. docker container 正常运行后, 在浏览器中打开安装界面,链接地址:http://127.0.0.1:9999/install -4. 点击 `初始化项目` 会看到如下图所示, 如果提示重新运行服务说明项目初始化完成, 只需重新运行 `webstack-go-service` 容器服务就 OK 了! - - - -**二、prometheus、grafana监控服务** -> 注: 监控服务看自己是否需要, 不运行也不影响正常使用 - -1. 目录下执行 `docker-compose -f docker-compose-prometheus.yml up -d` 等待监控组件启动 (Prometheus、Grafana) - ```shell - [+] Running 4/4 - ✔ Container webstack-go-prometheus Started 4.0s - ✔ Container webstack-go-loki Started 3.6s - ✔ Container webstack-go-grafana Started 4.3s - ✔ Container webstack-go-promtail Started - ``` -2. 执行`docker-compose -f docker-compose-prometheus.yml ps `服务正常运行如下 - ```shell - NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS - webstack-go-grafana grafana/grafana-enterprise:9.4.3 "/run.sh" webstack-go-grafana 2 minutes ago Up 2 minutes 0.0.0.0:3000->3000/tcp - webstack-go-loki grafana/loki:2.7.3 "/usr/bin/loki -conf…" webstack-go-loki 2 minutes ago Up 2 minutes 0.0.0.0:3100->3100/tcp - webstack-go-mysql mysql/mysql-server:5.7 "/entrypoint.sh mysq…" webstack-go-mysql 3 minutes ago Up 3 minutes (healthy) 0.0.0.0:3306->3306/tcp, 33060/tcp - webstack-go-prometheus prom/prometheus:latest "/bin/prometheus --c…" webstack-go-prometheus 2 minutes ago Up 2 minutes 0.0.0.0:9090->9090/tcp - webstack-go-promtail grafana/promtail:2.7.3 "/usr/bin/promtail -…" webstack-go-promtail 2 minutes ago Up 2 minutes - webstack-go-redis redis:6.2.4 "docker-entrypoint.s…" webstack-go-redis 3 minutes ago Up 3 minutes (healthy) 0.0.0.0:6379->6379/tcp - webstack-go-service webstack-go-webstack-go-service "./webstack-go -env …" webstack-go-service 3 minutes ago Up 3 minutes (healthy) 0.0.0.0:9999->9999/tcp - ``` +2. docker container 正常运行后, 在浏览器中打开界面,链接地址:http://127.0.0.1:8000 ## Star History @@ -103,23 +49,16 @@ > **首页** -![](assets/bootstrap/images/index.png) +![](.github/image/index.png) > **网站分类** -![](assets/bootstrap/images/category.png) +![](.github/image/category.png) > **新增网站** -![](assets/bootstrap/images/add_site.png) +![](.github/image/add_site.png) > **网站信息** -![](assets/bootstrap/images/site.png) - -> **监控组件** - -![grafana.png](assets/bootstrap/images/grafana.png)![]() - - - +![](.github/image/site.png) diff --git a/api/v1/category.go b/api/v1/category.go new file mode 100644 index 0000000..638af36 --- /dev/null +++ b/api/v1/category.go @@ -0,0 +1,88 @@ +/** + * @Author: chentong + * @Date: 2024/05/27 上午10:24 + */ + +package v1 + +import "time" + +type Category struct { + ID int `json:"id"` + ParentID int `json:"parent_id"` + Sort int `json:"sort"` // 排序 + Title string `json:"title"` // 名称 + Icon string `json:"icon"` // 图标 + CreatedAt *time.Time `json:"created_at"` // 创建时间 + UpdatedAt *time.Time `json:"updated_at"` // 更新时间 + IsUsed bool `json:"is_used"` // 是否启用 1:是 0:否 + Level int32 `json:"level"` // 分类等级 +} + +type ( + CategoryCreateReq struct { + ParentID int `form:"parent_id"` // 分类父ID + Level int32 `form:"level"` // 分类等级 1 一级分类 2 二级分类 + Name string `form:"name"` // 菜单名称 + Icon string `form:"icon"` // 图标 + } + + CategoryCreateResp struct { + Category // 分类信息 + } +) + +type ( + CategoryList struct { + Id int `json:"id"` // ID + Pid int `json:"pid"` // 父类ID + Name string `json:"name"` // 菜单名称 + Link string `json:"link"` // 链接地址 + Icon string `json:"icon"` // 图标 + IsUsed bool `json:"is_used"` // 是否启用 1=启用 -1=禁用 + Sort int `json:"sort"` // 排序 + Level int32 `json:"level"` // 分类等级 1 一级分类 2 二级分类 + } + + CategoryListReq struct{} + + CategoryListResp struct { + List []CategoryList `json:"list"` // 分类列表 + } +) + +type ( + CategoryDeleteReq struct { + ID int `uri:"id" binding:"required"` // ID + } + + CategoryDeleteResp struct{} +) + +type ( + CategoryDetailReq struct { + ID int `uri:"id" binding:"required"` // ID + } + + CategoryDetailResp struct { + Id int `json:"id"` // 主键ID + Pid int `json:"pid"` // 父类ID + Name string `json:"name"` // 分类名称 + Icon string `json:"icon"` // 图标 + } +) + +type ( + CategoryUpdateReq struct { + ID int `form:"id" binding:"required"` // ID + Pid *int `form:"parent_id"` // 父类ID + Name *string `form:"name"` // 菜单名称 + Icon *string `form:"icon"` // 图标 + IsUsed *bool `form:"used"` // 是否启用 + Sort *int `form:"sort"` // 排序 + } + + CategoryUpdateResp struct { + Category + } +) diff --git a/api/v1/dashboard.go b/api/v1/dashboard.go new file mode 100644 index 0000000..f3cba37 --- /dev/null +++ b/api/v1/dashboard.go @@ -0,0 +1,25 @@ +/** + * @Author: chentong + * @Date: 2024/11/12 12:32 + */ + +package v1 + +type DashboardResp struct { + ProjectVersion string // 项目版本 + GoOS string // 操作系统 + GoArch string // 架构 + GoVersion string // go版本 + ProjectPath string // 项目路径 + Host string // 主机名 + Env string // 环境 + MemTotal string // 内存 + MemUsed string // 已用内存 + MemUsedPercent float64 // 已用内存百分比 + DiskTotal string // 磁盘 + DiskUsed string // 已用磁盘 + DiskUsedPercent float64 // 已用磁盘百分比 + CpuName string // cpu名称 + CpuCores int32 // cpu核数 + CpuUsedPercent float64 // cpu使用率 +} diff --git a/api/v1/errors.go b/api/v1/errors.go new file mode 100644 index 0000000..29e687a --- /dev/null +++ b/api/v1/errors.go @@ -0,0 +1,14 @@ +package v1 + +var ( + ErrSuccess = newError(0, "ok") + ErrBadRequest = newError(400, "Bad Request") + ErrUnauthorized = newError(401, "Unauthorized") + ErrNotFound = newError(404, "Not Found") + ErrInternalServerError = newError(500, "Internal Server Error") +) + +var ( + ErrorUserNameAndPassword = newError(100, "用户名和密码错误") + ErrorTokenGeneration = newError(101, "令牌生成错误") +) diff --git a/api/v1/index.go b/api/v1/index.go new file mode 100644 index 0000000..56244cb --- /dev/null +++ b/api/v1/index.go @@ -0,0 +1,26 @@ +/** + * @Author: chentong + * @Date: 2024/05/26 上午1:50 + */ + +package v1 + +import "github.com/ch3nnn/webstack-go/internal/dal/model" + +type TreeNode struct { + Id int // 节点ID + Pid int // 父节点ID + Name string // 节点名称 + Icon string // 图标 + Child []*TreeNode // 获取子节点切片 +} + +type CategorySite struct { + Category string // 分类 + SiteList []model.StSite // 站点列表 +} + +type IndexResponseData struct { + CategoryTree []*TreeNode // 分类树 + CategorySites []*CategorySite // 分类站点列表 +} diff --git a/api/v1/site.go b/api/v1/site.go new file mode 100644 index 0000000..a9ef5f1 --- /dev/null +++ b/api/v1/site.go @@ -0,0 +1,88 @@ +/** + * @Author: chentong + * @Date: 2024/05/27 下午6:19 + */ + +package v1 + +import "mime/multipart" + +type Site struct { + Id int `json:"id"` // ID + Thumb string `json:"thumb"` // 网站 logo + Title string `json:"title"` // 名称简介 + Url string `json:"url"` // 链接 + Category string `json:"category"` // 分类 + CategoryId int `json:"category_id"` // 分类id + Description string `json:"description"` // 描述 + IsUsed bool `json:"is_used"` // 是否启用 + CreatedAt string `json:"created_at"` // 创建时间 + UpdatedAt string `json:"updated_at"` // 更新时间 +} + +type ( + SiteDeleteReq struct { + ID int `uri:"id" binding:"required"` // ID + } + + SiteDeleteResp struct { + ID int `json:"id"` // ID + } +) + +type ( + SiteLisPagination struct { + Total int64 `json:"total"` // 总数 + CurrentPage int `json:"current_page"` // 当前页 + PerPageCount int `json:"per_page_count"` // 每页显示条数 + } + + SiteListReq struct { + Page int `form:"page,default=1"` // 第几页 + PageSize int `form:"page_size,default=10" ` // 每页显示条数 + Search string `form:"search"` // 搜索关键字 + } + + SiteListResp struct { + List []Site `json:"list"` // 列表网站信息 + Pagination SiteLisPagination `json:"pagination"` // 分页信息 + } +) + +type ( + SiteCreateReq struct { + CategoryID int `form:"category_id"` // 类别ID + Url string `form:"url"` // 网址地址 + } + + SiteCreateResp struct { + SuccessCount int `json:"successCount"` // 成功计数 + FailCount int `json:"failCount"` // 失败计数 + } +) + +type ( + SiteUpdateReq struct { + Id int `json:"id" uri:"id"` // ID + Icon *string `json:"thumb" form:"thumb"` // 网站 logo + Title *string `json:"title" form:"title"` // 名称简介 + Url *string `json:"url" form:"url"` // 链接 + CategoryId *int `json:"category_id" form:"category_id"` // 分类id + Description *string `json:"description" form:"description"` // 描述 + IsUsed *bool `json:"is_used" form:"is_used"` // 是否启用 + File *multipart.FileHeader `json:"file"` // 上传 logo 图片 + } + + SiteUpdateResp struct { + ID int `json:"id"` // 主键ID + } +) + +type ( + SiteSyncReq struct { + ID int `uri:"id"` // 主键ID + } + SiteSyncResp struct { + ID int `json:"id"` // 主键ID + } +) diff --git a/api/v1/user.go b/api/v1/user.go new file mode 100644 index 0000000..7286807 --- /dev/null +++ b/api/v1/user.go @@ -0,0 +1,38 @@ +package v1 + +type ( + LoginReq struct { + Username string `form:"username" json:"username" binding:"required" example:"admin"` + Password string `form:"password,default=value" json:"password,default=qweqwe" example:"123456"` + } + + LoginResp struct { + Token string `json:"token"` + } +) + +type ( + UpdatePasswordReq struct { + OldPassword string `form:"old_password"` // 旧密码 + NewPassword string `form:"new_password"` // 新密码 + } + + UpdatePasswordResp struct{} +) + +type ( + Menu struct { + Id int `json:"id"` // ID + Pid int `json:"pid"` // 父类ID + Name string `json:"name"` // 菜单名称 + Link string `json:"link"` // 链接地址 + Icon string `json:"icon"` // 图标 + } + + InfoReq struct{} + + InfoResp struct { + Username string `json:"username"` // 用户名 + Menus []Menu `json:"menu"` // 菜单栏 + } +) diff --git a/api/v1/v1.go b/api/v1/v1.go new file mode 100644 index 0000000..fff5a58 --- /dev/null +++ b/api/v1/v1.go @@ -0,0 +1,54 @@ +package v1 + +import ( + "errors" + "net/http" + + "github.com/gin-gonic/gin" +) + +type Response struct { + Code int `json:"code"` + Message string `json:"message"` + Data interface{} `json:"data"` +} + +func HandleSuccess(ctx *gin.Context, data interface{}) { + if data == nil { + data = map[string]interface{}{} + } + + ctx.JSON(http.StatusOK, data) +} + +func HandleError(ctx *gin.Context, httpCode int, err error, data interface{}) { + if data == nil { + data = map[string]string{} + } + resp := Response{Code: errorCodeMap[err], Message: err.Error(), Data: data} + if _, ok := errorCodeMap[ErrSuccess]; !ok { + resp = Response{Code: 500, Message: "unknown error", Data: data} + } + ctx.JSON(httpCode, resp) +} + +func ErrHandler404(c *gin.Context) { + c.HTML(http.StatusOK, "404.html", gin.H{"title": "404 Error - Page not found"}) +} + +type Error struct { + Code int + Message string +} + +var errorCodeMap = map[error]int{} + +func newError(code int, msg string) error { + err := errors.New(msg) + errorCodeMap[err] = code + return err +} + +func (e Error) Error() string { + return e.Message +} diff --git a/assets/bootstrap/favicon.ico b/assets/bootstrap/favicon.ico deleted file mode 100755 index 01a28ed..0000000 Binary files a/assets/bootstrap/favicon.ico and /dev/null differ diff --git a/assets/bootstrap/images/category.png b/assets/bootstrap/images/category.png deleted file mode 100644 index 4af4f0a..0000000 Binary files a/assets/bootstrap/images/category.png and /dev/null differ diff --git a/assets/bootstrap/images/grafana.png b/assets/bootstrap/images/grafana.png deleted file mode 100644 index 355ff6d..0000000 Binary files a/assets/bootstrap/images/grafana.png and /dev/null differ diff --git a/assets/bootstrap/images/index.png b/assets/bootstrap/images/index.png deleted file mode 100644 index 6432515..0000000 Binary files a/assets/bootstrap/images/index.png and /dev/null differ diff --git a/assets/bootstrap/images/init_project.png b/assets/bootstrap/images/init_project.png deleted file mode 100644 index 7613361..0000000 Binary files a/assets/bootstrap/images/init_project.png and /dev/null differ diff --git a/assets/bootstrap/images/users/avatar.png b/assets/bootstrap/images/users/avatar.png deleted file mode 100755 index 0e87a6f..0000000 Binary files a/assets/bootstrap/images/users/avatar.png and /dev/null differ diff --git a/assets/bootstrap/js/bootstrap-notify/notify.js b/assets/bootstrap/js/bootstrap-notify/notify.js deleted file mode 100755 index 763c506..0000000 --- a/assets/bootstrap/js/bootstrap-notify/notify.js +++ /dev/null @@ -1,32 +0,0 @@ -document.write(''); - -function SuccessNotify(content) { - $.notify({ - icon: "mdi mdi-alert", - title: "", - message: content, - url: "", - target: "" - }, { - type: "success", - allow_dismiss: true, - newest_on_top: false, - placement: { - from: "top", - align: "right", - }, - offset: { - x: "20", - y: "20" - }, - spacing: "10", - z_index: "1031", - delay: "3000", - animate: { - enter: "animated fadeInDown", - exit: "animated fadeOutUp" - }, - onClosed: null, - mouse_over: null - }); -} diff --git a/assets/bootstrap/js/main.min.js b/assets/bootstrap/js/main.min.js deleted file mode 100755 index a4b6e16..0000000 --- a/assets/bootstrap/js/main.min.js +++ /dev/null @@ -1,141 +0,0 @@ -;jQuery( function() { - // 工具提示 - if($('[data-toggle="tooltip"]')[0]) { - $('[data-toggle="tooltip"]').tooltip({ - "container" : 'body', - }); - } - - // POP弹出框 - if($('[data-toggle="popover"]')[0]) { - $('[data-toggle="popover"]').popover(); - } - - // 关闭卡片 - $(document).on('click', '.card-btn-close', function() { - $(this).closest('.card').fadeOut(150, function() { - if ($(this).parent().children().length == 1) { - $(this).parent().remove(); - } else { - $(this).remove(); - } - }); - }); - - // 卡片收缩与打开 - $(document).on('click', '.card-btn-slide', function(){ - $(this).toggleClass('rotate-180').closest('.card').find('.card-body').slideToggle(); - }); - - /** - * 如果页面中需要用到滚动条,请先导入perfect-scrollbar.min.js - */ - if($('.lyear-scroll')[0]) { - $('.lyear-scroll').each(function(){ - new PerfectScrollbar(this, { - swipeEasing: false, - suppressScrollX: true - }); - }); - } - - // 颜色选取 - jQuery('.js-colorpicker').each(function() { - var $colorpicker = jQuery(this); - var $colorpickerMode = $colorpicker.data('colorpicker-mode') ? $colorpicker.data('colorpicker-mode') : 'auto'; - $colorpicker.colorpicker({ - 'format': $colorpickerMode, - }); - }); - - // 日期选择器 - jQuery("[data-provide = 'datepicker']").each(function() { - var options = { - language: 'zh-CN', // 默认简体中文 - multidateSeparator: ', ' // 默认多个日期用,分隔 - } - - options = $.extend( options, getDataOptions( $(this) )); - - if ( $(this).prop("tagName") != 'INPUT' ) { - options.inputs = [$(this).find('input:first'), $(this).find('input:last')]; - } - - $(this).datepicker(options); - }); - - // 时间选择器 - jQuery("[data-provide = 'clockpicker']").each(function() { - $(this).clockpicker({ - donetext: 'Done' - }); - }); - - // 时间日期选择器 - jQuery("[data-provide = 'datetimepicker']").each(function() { - var options = { - locale: moment.locale(), - } - - options = $.extend( options, getDataOptions( $(this) )); - - if ( $(this).prop("tagName") != 'INPUT' ) { - options.inputs = [$(this).find('input:first'), $(this).find('input:last')]; - } - console.log(options); - $(this).datetimepicker(options); - }); - - // 标签 - $('.js-tags-input').each(function() { - var $this = $(this); - $this.tagsInput({ - height: $this.data('height') ? $this.data('height') : '36px', - width: '100%', - defaultText: $this.attr("placeholder"), - removeWithBackspace: true, - delimiter: [','] - }); - }); - - // 复选框全选 - $("#check-all").change(function () { - if ($boxname = $(this).data('name')) { - $(this).closest('table').find("input[name='" + $boxname + "']").prop('checked', $(this).prop("checked")); - } else { - $(this).closest('table').find(".custom-checkbox input[type='checkbox']").prop('checked', $(this).prop("checked")); - } - }); - - // iframe打开tab - $(document).on('click', '.js-create-tab', function(){ - parent.$(parent.document).data('multitabs').create({ - iframe : true, - title : $(this).data('title') ? $(this).data('title') : '标题', - url : $(this).data('url') ? $(this).data('url') : '/dashboard' - }, true); - }); - -}); - - -// 参考国外模板的写法,获取当前的配置,以data-*(*指插件原有的配置名) -getDataOptions = function(el, castList) { - var options = {}; - - $.each( $(el).data(), function(key, value){ - - key = dataToOption(key); - - if ( key == 'provide' ) { - return; - } - options[key] = value; - }); - - return options; -} - -dataToOption = function(name) { - return name.replace(/-([a-z])/g, function(x){return x[1].toUpperCase();}); -} \ No newline at end of file diff --git a/assets/bootstrap/js/vkbeautify.js b/assets/bootstrap/js/vkbeautify.js deleted file mode 100755 index 076c3d5..0000000 --- a/assets/bootstrap/js/vkbeautify.js +++ /dev/null @@ -1,357 +0,0 @@ -/** -* vkBeautify - javascript plugin to pretty-print or minify text in XML, JSON, CSS and SQL formats. -* -* Version - 0.99.00.beta -* Copyright (c) 2012 Vadim Kiryukhin -* vkiryukhin @ gmail.com -* http://www.eslinstructor.net/vkbeautify/ -* -* MIT license: -* http://www.opensource.org/licenses/mit-license.php -* -* Pretty print -* -* vkbeautify.xml(text [,indent_pattern]); -* vkbeautify.json(text [,indent_pattern]); -* vkbeautify.css(text [,indent_pattern]); -* vkbeautify.sql(text [,indent_pattern]); -* -* @text - String; text to beatufy; -* @indent_pattern - Integer | String; -* Integer: number of white spaces; -* String: character string to visualize indentation ( can also be a set of white spaces ) -* Minify -* -* vkbeautify.xmlmin(text [,preserve_comments]); -* vkbeautify.jsonmin(text); -* vkbeautify.cssmin(text [,preserve_comments]); -* vkbeautify.sqlmin(text); -* -* @text - String; text to minify; -* @preserve_comments - Bool; [optional]; -* Set this flag to true to prevent removing comments from @text ( minxml and mincss functions only. ) -* -* Examples: -* vkbeautify.xml(text); // pretty print XML -* vkbeautify.json(text, 4 ); // pretty print JSON -* vkbeautify.css(text, '. . . .'); // pretty print CSS -* vkbeautify.sql(text, '----'); // pretty print SQL -* -* vkbeautify.xmlmin(text, true);// minify XML, preserve comments -* vkbeautify.jsonmin(text);// minify JSON -* vkbeautify.cssmin(text);// minify CSS, remove comments ( default ) -* vkbeautify.sqlmin(text);// minify SQL -* -*/ - -(function() { - -function createShiftArr(step) { - - var space = ' '; - - if ( isNaN(parseInt(step)) ) { // argument is string - space = step; - } else { // argument is integer - switch(step) { - case 1: space = ' '; break; - case 2: space = ' '; break; - case 3: space = ' '; break; - case 4: space = ' '; break; - case 5: space = ' '; break; - case 6: space = ' '; break; - case 7: space = ' '; break; - case 8: space = ' '; break; - case 9: space = ' '; break; - case 10: space = ' '; break; - case 11: space = ' '; break; - case 12: space = ' '; break; - } - } - - var shift = ['\n']; // array of shifts - for(ix=0;ix<100;ix++){ - shift.push(shift[ix]+space); - } - return shift; -} - -function vkbeautify(){ - this.step = '\t'; // 4 spaces - this.shift = createShiftArr(this.step); -}; - -vkbeautify.prototype.xml = function(text,step) { - - var ar = text.replace(/>\s{0,}<") - .replace(/ or -1) { - str += shift[deep]+ar[ix]; - inComment = true; - // end comment or // - if(ar[ix].search(/-->/) > -1 || ar[ix].search(/\]>/) > -1 || ar[ix].search(/!DOCTYPE/) > -1 ) { - inComment = false; - } - } else - // end comment or // - if(ar[ix].search(/-->/) > -1 || ar[ix].search(/\]>/) > -1) { - str += ar[ix]; - inComment = false; - } else - // // - if( /^<\w/.exec(ar[ix-1]) && /^<\/\w/.exec(ar[ix]) && - /^<[\w:\-\.\,]+/.exec(ar[ix-1]) == /^<\/[\w:\-\.\,]+/.exec(ar[ix])[0].replace('/','')) { - str += ar[ix]; - if(!inComment) deep--; - } else - // // - if(ar[ix].search(/<\w/) > -1 && ar[ix].search(/<\//) == -1 && ar[ix].search(/\/>/) == -1 ) { - str = !inComment ? str += shift[deep++]+ar[ix] : str += ar[ix]; - } else - // ... // - if(ar[ix].search(/<\w/) > -1 && ar[ix].search(/<\//) > -1) { - str = !inComment ? str += shift[deep]+ar[ix] : str += ar[ix]; - } else - // // - if(ar[ix].search(/<\//) > -1) { - str = !inComment ? str += shift[--deep]+ar[ix] : str += ar[ix]; - } else - // // - if(ar[ix].search(/\/>/) > -1 ) { - str = !inComment ? str += shift[deep]+ar[ix] : str += ar[ix]; - } else - // // - if(ar[ix].search(/<\?/) > -1) { - str += shift[deep]+ar[ix]; - } else - // xmlns // - if( ar[ix].search(/xmlns\:/) > -1 || ar[ix].search(/xmlns\=/) > -1) { - str += shift[deep]+ar[ix]; - } - - else { - str += ar[ix]; - } - } - - return (str[0] == '\n') ? str.slice(1) : str; -} - -vkbeautify.prototype.json = function(text,step) { - - var step = step ? step : this.step; - - if (typeof JSON === 'undefined' ) return text; - - if ( typeof text === "string" ) return JSON.stringify(JSON.parse(text), null, step); - if ( typeof text === "object" ) return JSON.stringify(text, null, step); - - return text; // text is not string nor object -} - -vkbeautify.prototype.css = function(text, step) { - - var ar = text.replace(/\s{1,}/g,' ') - .replace(/\{/g,"{~::~") - .replace(/\}/g,"~::~}~::~") - .replace(/\;/g,";~::~") - .replace(/\/\*/g,"~::~/*") - .replace(/\*\//g,"*/~::~") - .replace(/~::~\s{0,}~::~/g,"~::~") - .split('~::~'), - len = ar.length, - deep = 0, - str = '', - ix = 0, - shift = step ? createShiftArr(step) : this.shift; - - for(ix=0;ix/g,"") - .replace(/[ \r\n\t]{1,}xmlns/g, ' xmlns'); - return str.replace(/>\s{0,}<"); -} - -vkbeautify.prototype.jsonmin = function(text) { - - if (typeof JSON === 'undefined' ) return text; - - return JSON.stringify(JSON.parse(text), null, 0); - -} - -vkbeautify.prototype.cssmin = function(text, preserveComments) { - - var str = preserveComments ? text - : text.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g,"") ; - - return str.replace(/\s{1,}/g,' ') - .replace(/\{\s{1,}/g,"{") - .replace(/\}\s{1,}/g,"}") - .replace(/\;\s{1,}/g,";") - .replace(/\/\*\s{1,}/g,"/*") - .replace(/\*\/\s{1,}/g,"*/"); -} - -vkbeautify.prototype.sqlmin = function(text) { - return text.replace(/\s{1,}/g," ").replace(/\s{1,}\(/,"(").replace(/\s{1,}\)/,")"); -} - -window.vkbeautify = new vkbeautify(); - -})(); - diff --git a/assets/templates/admin/admin_add.html b/assets/templates/admin/admin_add.html deleted file mode 100755 index f7cb71d..0000000 --- a/assets/templates/admin/admin_add.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - - - - - - -
-
-
-
-
-
新增管理员
-
-
-
-
- - -
-
- - -
-
- - -
-
- - -
- - -
-
-
-
-
-
- - - - - - - - - - diff --git a/assets/templates/admin/admin_list.html b/assets/templates/admin/admin_list.html deleted file mode 100755 index 6282f25..0000000 --- a/assets/templates/admin/admin_list.html +++ /dev/null @@ -1,401 +0,0 @@ - - - - - - - - - - - - -
-
- -
-
-
-
- 新增 -
-
- -
-
- - - - - - - - - - - - - - - - - -
编号用户名昵称手机号创建日期更新日期可用状态在线状态操作
-
-
    -
      - -
    -
-
-
-
- -
-
- - - - - - - - diff --git a/assets/templates/admin/admin_menu.html b/assets/templates/admin/admin_menu.html deleted file mode 100755 index be9a459..0000000 --- a/assets/templates/admin/admin_menu.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - - - - - - - - -
-
-
-
-
-
配置菜单 - -
-
-
- -
-
- - - - - - - - - - -
-
- - -
-
-
- - - -
-
-
-
-
-
- - - - - - - - - diff --git a/assets/templates/admin/admin_modify_info.html b/assets/templates/admin/admin_modify_info.html deleted file mode 100755 index 8c68883..0000000 --- a/assets/templates/admin/admin_modify_info.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - -
-
-
-
-
-
个人信息
-
-
- -
-
- - -
-
- - -
-
- - -
- - -
-
-
-
-
-
- - - - - - - - - diff --git a/assets/templates/authorized/authorized_add.html b/assets/templates/authorized/authorized_add.html deleted file mode 100755 index c666aad..0000000 --- a/assets/templates/authorized/authorized_add.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - - - - - - - -
-
-
-
-
-
新增调用方
-
-
-
-
- - -
-
- - -
-
- - -
- - -
-
-
-
-
-
- - - - - - - - - diff --git a/assets/templates/authorized/authorized_api.html b/assets/templates/authorized/authorized_api.html deleted file mode 100755 index 41dec9d..0000000 --- a/assets/templates/authorized/authorized_api.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - - - - - - - - -
-
-
-
-
-
接口授权
-
-
- - - -
-
- -
- -
- -
-
- 输入接口地址 -
- -
- - - - -
-
-
- -
-
-
-
已授权接口
-
-
- -
-
-
-
-
- - - - - - - - - - diff --git a/assets/templates/authorized/authorized_demo.html b/assets/templates/authorized/authorized_demo.html deleted file mode 100755 index 804f2fa..0000000 --- a/assets/templates/authorized/authorized_demo.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - - - - - - -
-
- -
-
-
-
如何给调用方开通 KEY 和 SECRET?
-
- -
-

1. 新增调用方,输入调用方标识、调用方对接人、备注等信息;

-

2. 授权调用方可调用的接口;

-

3. 查看详情,将调用方的 KEYSECRET 发给调用方;

-
-
-
- -
-
-
-
调用方如何传递 Token?
-
- -
-

基于 HTTP Header 中的两个参数 AuthorizationAuthorization-Date 存储签名信息。

-

1. Authorization 存储签名信息,格式:调用方 KEY + 空格分隔符 + 摘要(加密串),例如:

-
Authorization:blog MjJjMDE1MWFkZjMwOWFmYjFlNzViNDFjYjYwMWFlMmM=
-

2. Authorization-Date 存储时间信息,格式:0000-00-00 00:00:00,使用 Asia/Shanghai 时区,例如;

-
Authorization-Date:2021-04-03 21:12:36
-
-
-
- -
-
-
不同语言生成签名的方法,供参考
-
- - - -
-
-
-func New(key, secret string, ttl time.Duration) Signature {
-	return &signature{
-		key:    key,
-		secret: secret,
-		ttl:    ttl,
-	}
-}
-
-// Generate
-// path 请求的路径 (不附带 querystring)
-func (s *signature) Generate(path string, method string, params url.Values) (authorization, date string, err error) {
-	if path == "" {
-		err = errors.New("path required")
-		return
-	}
-
-	if method == "" {
-		err = errors.New("method required")
-		return
-	}
-
-	methodName := strings.ToUpper(method)
-	if !methods[methodName] {
-		err = errors.New("method param error")
-		return
-	}
-
-	// Date
-	date = time_parse.CSTLayoutString()
-
-	// Encode() 方法中自带 sorted by key
-	sortParamsEncode, err := url.QueryUnescape(params.Encode())
-	if err != nil {
-		err = errors.Errorf("url QueryUnescape %v", err)
-		return
-	}
-
-	// 加密字符串规则
-	buffer := bytes.NewBuffer(nil)
-	buffer.WriteString(path)
-	buffer.WriteString(delimiter)
-	buffer.WriteString(methodName)
-	buffer.WriteString(delimiter)
-	buffer.WriteString(sortParamsEncode)
-	buffer.WriteString(delimiter)
-	buffer.WriteString(date)
-
-	// 对数据进行 sha256 加密,并进行 base64 encode
-	hash := hmac.New(sha256.New, []byte(s.secret))
-	hash.Write(buffer.Bytes())
-	digest := base64.StdEncoding.EncodeToString(hash.Sum(nil))
-
-	authorization = fmt.Sprintf("%s %s", s.key, digest)
-	return
-}
-
-// 模拟数据
-const (
-	key    = "blog"
-	secret = "i1ydX9RtHyuJTrw7frcu"
-	ttl    = time.Minute * 10
-)
-
-func TestSignature_Generate(t *testing.T) {
-	path := "/echo"
-	method := "POST"
-
-	params := url.Values{}
-	params.Add("a", "a1")
-	params.Add("d", "d1")
-	params.Add("c", "c1 c2*")
-
-	authorization, date, err := New(key, secret, ttl).Generate(path, method, params)
-	t.Log("authorization:", authorization)
-	t.Log("authorization-date:", date)
-	t.Log("err:", err)
-}
-                            
-
-
-
-// 模拟数据
-$key    = "blog";
-$secret = "i1ydX9RtHyuJTrw7frcu";
-
-$path = "/echo";
-$method = "POST";
-
-$params['a'] = "a1";
-$params['d'] = "d1";
-$params['c'] = "c1 c2*";
-
-// 对 params key 进行排序
-ksort($params);
-
-// 对 sortParams 进行操作
-$sortParamsEncode = rawurldecode(http_build_query($params, "", "&", PHP_QUERY_RFC3986));
-
-// 时间 使用 Asia/Shanghai 时区
-$date = date("Y-m-d H:i:s", time());
-
-// 加密字符串规则
-$encryptStr = $path."|".strtoupper($method)."|".$sortParamsEncode."|".$date;
-
-// 对数据进行 sha256 加密,并进行 base64 encode
-$digest = base64_encode(hash_hmac("sha256", $encryptStr, $secret, true));
-
-$authorization = $key." ".$digest;
-
-echo "authorization:{$authorization}";
-echo "---";
-echo "authorization-date:{$date}";
-                            
-
-
-
-let key = "blog";
-let secret = "i1ydX9RtHyuJTrw7frcu";
-
-let date = new Date();
-let datetime = date.getFullYear() + "-" // "年"
-    + ((date.getMonth() + 1) > 10 ? (date.getMonth() + 1) : "0" + (date.getMonth() + 1)) + "-" // "月"
-    + (date.getDate() < 10 ? "0" + date.getDate() : date.getDate()) + " " // "日"
-    + (date.getHours() < 10 ? "0" + date.getHours() : date.getHours()) + ":" // "小时"
-    + (date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()) + ":" // "分钟"
-    + (date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds()); // "秒"
-
-let path = "/echo";
-let method = "POST";
-let params = {a:'a1', d:'d1', c: 'c1 c2*'};
-
-let sortParamsEncode = decodeURIComponent(jQuery.param(ksort(params)));
-let encryptStr = path + "|" + method.toUpperCase() + "|" + sortParamsEncode + "|" + datetime;
-let digest = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(encryptStr, secret));
-console.log({authorization: key + " " + digest, date: datetime});
-                            
-
-
- -
-
-
-
-
- - - - - - diff --git a/assets/templates/authorized/authorized_list.html b/assets/templates/authorized/authorized_list.html deleted file mode 100755 index 818cdb8..0000000 --- a/assets/templates/authorized/authorized_list.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - - - - - - - - -
-
- -
-
-
-
- 新增 -
-
- -
-
- - - - - - - - - - - - - - - -
编号调用方对接人创建日期更新日期状态操作
-
-
    -
      - -
    -
-
-
-
- -
-
- - - - - - - - diff --git a/assets/templates/configinfo/config_code.html b/assets/templates/configinfo/config_code.html deleted file mode 100755 index 5abd49b..0000000 --- a/assets/templates/configinfo/config_code.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - -
-
-
-
-
-
错误码
-
-
-
-
-

服务级错误码

-
    - {{range $key, $value := .SystemCodes}} -
  • {{$value.Code}} {{$value.Message}}
  • - {{end}} -
-
- -
-

模块级错误码

-
    - {{range $key, $value := .BusinessCodes}} -
  • {{$value.Code}} {{$value.Message}}
  • - {{end}} -
-
- -
-
-
-
- -
-
- - - diff --git a/assets/templates/configinfo/config_email.html b/assets/templates/configinfo/config_email.html deleted file mode 100755 index 0559b6e..0000000 --- a/assets/templates/configinfo/config_email.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - -
-
-
-
-
-
邮箱告警配置
-
-
-
-
- - -
-
- - -
-
- - -
-
- (发件人邮箱密码或授权码,根据邮箱服务器而定) - -
-
- (添加多个收件人邮箱,用英文,分割) - -
-
- 为了验证邮箱配置的准确性,点击保存后会给收件人发送邮件以确保配置可用。 -
- - -
- -
- -
-
- -
-
- - - - - - - diff --git a/assets/templates/cron_task/cron_task_add.html b/assets/templates/cron_task/cron_task_add.html deleted file mode 100755 index f126505..0000000 --- a/assets/templates/cron_task/cron_task_add.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - - - - - - - - - -
-
-
-
-
-
新增后台任务
-
-
-
-
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- -
-
- - -
-
- - -
-
-
- -
- - -
- - - -
-
-
-
-
-
- - - - - - - - - diff --git a/assets/templates/cron_task/cron_task_edit.html b/assets/templates/cron_task/cron_task_edit.html deleted file mode 100755 index f9cd95a..0000000 --- a/assets/templates/cron_task/cron_task_edit.html +++ /dev/null @@ -1,350 +0,0 @@ - - - - - - - - - - - - - - -
-
-
-
-
-
编辑后台任务
-
-
-
-
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- -
-
- - -
-
- - -
-
-
- -
- - -
- - - -
-
-
-
-
-
- - - - - - - - - diff --git a/assets/templates/cron_task/cron_task_list.html b/assets/templates/cron_task/cron_task_list.html deleted file mode 100755 index bd67c1f..0000000 --- a/assets/templates/cron_task/cron_task_list.html +++ /dev/null @@ -1,326 +0,0 @@ - - - - - - - - - - - - - -
-
- -
-
-
-
- 新增 -
-
- -
-
- - - - - - - - - - - - - - - - - - - - -
编号任务名称cron 表达式执行方式超时限制(秒)重试次数重试间隔(秒)通知方式创建人创建日期可用状态操作
-
-
    -
      - -
    -
-
-
-
- -
-
- - - - - - - - - - diff --git a/assets/templates/generator/generator_gorm.html b/assets/templates/generator/generator_gorm.html deleted file mode 100755 index 3b175ed..0000000 --- a/assets/templates/generator/generator_gorm.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - -
-
-
-
-
生成数据表 CURD
-
-
- - -
- -

- - -

- -
-
-
- -
-
-
执行结果
-
-

-        
-
-
- -
-
- - - - - - - - diff --git a/assets/templates/generator/generator_handler.html b/assets/templates/generator/generator_handler.html deleted file mode 100755 index 845c125..0000000 --- a/assets/templates/generator/generator_handler.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - -
-
-
-
-
生成控制器方法
-
-
- - -
- -

- - -

- -
-
-
- -
-
-
执行结果
-
-

-        
-
-
- -
-
- - - - - - - diff --git a/assets/templates/install/install_view.html b/assets/templates/install/install_view.html deleted file mode 100755 index 15e2222..0000000 --- a/assets/templates/install/install_view.html +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - - 项目初始化 - - - - - - - - - - - - - -
-
-
-
-
-
项目初始化
-
-
-
检测 · 环境
-
-

所需版本:go{{.MinGoVersion}}+ (当前版本 {{.GoVersion}})

-
- -
配置 · 语言
-
-
- 语言 -
- -
- -
配置 · Redis
-
-
- 地址 -
- -
- -
-
- 密码 -
- -
- -
-
- DB -
- -
- -
配置 · MySQL
-
-
- 地址 -
- -
- -
-
- 用户 -
- -
- -
-
- 密码 -
- -
- -
-
- DB -
- -
- 请确保此数据库已存在! -
-
- - - -
-
-
- -
-
-
-
执行结果
-
-
-

-                
-
-
- -
-
- - - - - - - - - - diff --git a/assets/templates/install/upgrade_view.html b/assets/templates/install/upgrade_view.html deleted file mode 100755 index 204bda6..0000000 --- a/assets/templates/install/upgrade_view.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - 服务升级 - - - - - - - - - - - - -
-
-
-
-
-
无版本号情况,服务升级
-
-
-

发现代码运行报错或缺少表字段,如何进行服务初始化?

-

1、删除根目录文件: - {{ .LockFile }} - 。 -

-

2、重新启动服务。

- -
-

发现 GitHub 仓库更新了新代码,如何进行服务升级?

-

1、源代码升级: - 拉取最新代码,覆盖旧版本代码即可。 -

-

2、数据表升级:

- - - - - - - - - - - {{range $key, $value := .List}} - - - - - - {{end}} - -
数据表是否存在操作
{{$value.TableName}} - {{if eq $value.IsHave 1}} 已存在 - {{else}} 不存在 - {{end}} - - - -
- -
-
-
- -
-
-
-
有版本号情况,服务升级
-
-
-

- v1.2.6 - -> - v1.2.7 -

- -

1、源代码升级: - 拉取最新代码,覆盖旧版本代码即可。 -

-

2、数据表升级: - 创建 cron_task 表结构 -

-

3、系统管理员->菜单管理,新增侧边栏:后台任务模块,同时添加菜单栏的功能权限。

-

4、系统管理员->管理员,对管理员进行菜单授权。

-

5、退出重新登录,即可以看到自己新增的模块。

- -
- -

- v1.2.7 - -> - v1.2.8 -

- -

1、源代码升级: - 拉取最新代码,覆盖旧版本代码即可。 -

-

2、系统管理员->菜单管理,新增侧边栏:实用工具箱 -> WebSocket,同时添加菜单栏的功能权限。

-

3、系统管理员->管理员,对管理员进行菜单授权。

-

4、退出重新登录,即可以看到自己新增的模块。

- -
-
-
-
-
-
- - - - - - - diff --git a/assets/templates/menu/menu_action.html b/assets/templates/menu/menu_action.html deleted file mode 100755 index 3bd2b9b..0000000 --- a/assets/templates/menu/menu_action.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - - - - - - - - -
-
-
-
-
-
功能权限
-
-
- - - -
-
- -
- -
- -
-
- 输入接口地址 -
- -
- - - - -
-
-
- -
-
-
-
已配置功能权限 - -
-
-
- -
-
-
-
-
- - - - - - - - - - diff --git a/assets/templates/menu/menu_view.html b/assets/templates/menu/menu_view.html deleted file mode 100755 index 377293b..0000000 --- a/assets/templates/menu/menu_view.html +++ /dev/null @@ -1,492 +0,0 @@ - - - - - - - - - - - - - - - -
-
-
-
-
-
配置菜单栏
-
-
- -
-
- 上级菜单 -
- -
- -
-
- 菜单名称 -
- -
- -
-
- 菜单图标 -
- -
- -
-
- 链接地址 -
- -
- - - - - - -
-
-
- -
-
-
-
菜单栏列表
-
-
-
-
-
-
-
-
- - - - - - - - - - - - - - diff --git a/assets/templates/tool/tool_cache.html b/assets/templates/tool/tool_cache.html deleted file mode 100755 index 52c4b45..0000000 --- a/assets/templates/tool/tool_cache.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - - - - - - -
-
-
-
-
-
查询缓存
-
-
- - -
-
-
-
- KEY -
- -
- - - -
-
-
-
-
- -
-
-
-
查询结果
-
-
-

-                    

- -
-
-
-
-
- - - - - - - - diff --git a/assets/templates/tool/tool_data.html b/assets/templates/tool/tool_data.html deleted file mode 100755 index f0ef4a3..0000000 --- a/assets/templates/tool/tool_data.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - - - - - - - - - -
-
-
-
-
-
查询数据
-
    -
  • -
-
-
- - -
-
-
-
- 数据库 -
- - -
- -
- 数据表 -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- 仅支持查询语句,最多支持查询 100 条数据。 -
- -
- - -
-
-
-
- -
-
- -
-
-
-
- - - - - - - -
-
-
-
-
- -
-
- - - - - - - - - - - - diff --git a/assets/templates/tool/tool_hashids.html b/assets/templates/tool/tool_hashids.html deleted file mode 100755 index 1eb95d3..0000000 --- a/assets/templates/tool/tool_hashids.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - -
-
-
-
-
-
hashids 加密
-
-
- -
-
- 数字 -
- -
- -
-
- 密文 -
- -
- - - - -
-
-
- -
-
-
-
hashids 解密
-
-
- -
-
- 密文 -
- -
- -
-
- 数字 -
- -
- - - - -
-
-
-
-
- - - - - - - - - diff --git a/assets/templates/tool/tool_logs.html b/assets/templates/tool/tool_logs.html deleted file mode 100755 index db30486..0000000 --- a/assets/templates/tool/tool_logs.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - -
- - - -
-
-
日志列表 仅展示最新的 100 条日志。
-
    -
  • - -
  • -
-
-
-
- {{range $key, $value := .Logs}} - {{$badgeLevelClass := ""}} - {{$badgeMethodClass := ""}} - {{$badgeCodeClass := ""}} -
-
-
- {{if eq $value.Level "info"}} - {{$badgeLevelClass = "badge-info"}} - {{else if eq $value.Level "error"}} - {{$badgeLevelClass = "badge-danger"}} - {{else if eq $value.Level "warn"}} - {{$badgeLevelClass = "badge-warning"}} - {{else}} - {{$badgeLevelClass = "badge-dark"}} - {{end}} - - {{if eq $value.Method "GET"}} - {{$badgeMethodClass = "badge-primary"}} - {{else if eq $value.Method "POST"}} - {{$badgeMethodClass = "badge-success"}} - {{else if eq $value.Method "DELETE"}} - {{$badgeMethodClass = "badge-danger"}} - {{else if eq $value.Method "PUT"}} - {{$badgeMethodClass = "badge-yellow"}} - {{else if eq $value.Method "PATCH"}} - {{$badgeMethodClass = "badge-cyan"}} - {{else}} - {{$badgeMethodClass = "badge-dark"}} - {{end}} - - {{if eq $value.HTTPCode 200}} - {{$badgeCodeClass = "badge-success"}} - {{else}} - {{$badgeCodeClass = "badge-dark"}} - {{end}} - - - {{if eq $value.HTTPCode 0}} - - {{else}} - - {{end}} - -
-
- -
-
-
{{$value.Content}}
-
-
-
- {{end}} -
-
-
-
- - - - - - diff --git a/assets/templates/tool/tool_websocket.html b/assets/templates/tool/tool_websocket.html deleted file mode 100755 index f98a16b..0000000 --- a/assets/templates/tool/tool_websocket.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - - - - - - - -
-
-
-
-
-
WebSocket 示例
-
-
- -
    -
  • -
    - -
    -
    -

    -

    -

    - -

    -
    -
  • -
- -
-
-
- -
-
-
-
WebSocket 示例
-
-
- - -
-
-
-
- 消息内容 -
- -
- - - -
-
-
-
-
-
-
- - - - - - - - - diff --git a/cmd/gormgen/generate_table.go b/cmd/gormgen/generate_table.go deleted file mode 100644 index 148ceae..0000000 --- a/cmd/gormgen/generate_table.go +++ /dev/null @@ -1,91 +0,0 @@ -package gormgen - -import ( - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "gorm.io/gen" - "gorm.io/gen/field" - "gorm.io/gorm" -) - -// Method 根据动态 sql 生成 orm -type Method interface { - // GetParentIdsByGroupParentId - // SELECT GROUP_CONCAT(a.parent_id) AS parent_ids from (SELECT parent_id FROM category GROUP BY parent_id) as a - GetParentIdsByGroupParentId() (gen.M, error) -} - -func GenerateTable(tables []string) { - - g := gen.NewGenerator(gen.Config{ - OutPath: "./internal/repository/mysql/query", - Mode: gen.WithoutContext | gen.WithDefaultQuery | gen.WithQueryInterface, // generate mode - }) - - // reuse your gorm db - repo, _ := mysql.New() - g.UseDB(repo.GetDbW()) - - // 自定义字段的数据类型 - // 统一数字类型为int64,兼容protobuf (columnType gorm.ColumnType) (dataType string) - dataMap := map[string]func(columnType gorm.ColumnType) (dataType string){ - "tinyint": func(columnType gorm.ColumnType) (dataType string) { return "int64" }, - "smallint": func(columnType gorm.ColumnType) (dataType string) { return "int64" }, - "mediumint": func(columnType gorm.ColumnType) (dataType string) { return "int64" }, - "bigint": func(columnType gorm.ColumnType) (dataType string) { return "int64" }, - "int": func(columnType gorm.ColumnType) (dataType string) { return "int64" }, - "integer": func(columnType gorm.ColumnType) (dataType string) { return "int64" }, - } - // 要先于`ApplyBasic`执行 - g.WithDataTypeMap(dataMap) - - // 将非默认字段名的字段定义为自动时间戳和软删除字段; - // 自动时间戳默认字段名为:`updated_at`、`created_at, 表字段数据类型为: INT 或 DATETIME - // 软删除默认字段名为:`deleted_at`, 表字段数据类型为: DATETIME - //autoUpdateTimeField := gen.FieldGORMTag("update_time", func(tag field.GormTag) field.GormTag {return }) - //autoCreateTimeField := gen.FieldGORMTag("create_time", "column:create_time;type:int unsigned;autoCreateTime") - - // 模型自定义选项组 - //fieldOpts := []gen.ModelOpt{autoCreateTimeField, autoUpdateTimeField} - - // 分类 - category := g.GenerateModel("category") - g.ApplyInterface(func(Method) {}, model.Category{}) - // 网址 - site := g.GenerateModel("site", gen.FieldRelate(field.BelongsTo, "Category", category, &field.RelateConfig{ - GORMTag: map[string]string{"foreignKey": "CategoryID"}, - }), - ) - // 菜单 - menu := g.GenerateModel("menu") - // 菜单动作 - menuAction := g.GenerateModel("menu_action") - // 管理员菜单栏表 - adminMenu := g.GenerateModel("admin_menu") - // 管理员表 - admin := g.GenerateModel("admin") - // 定时任务表 - cronTask := g.GenerateModel("cron_task") - // 已授权接口地址表 - authorizedApi := g.GenerateModel("authorized_api") - // 已授权的调用方表 - authorized := g.GenerateModel("authorized") - // 自定义表结构生成 - for _, table := range tables { - g.ApplyBasic(g.GenerateModel(table)) - } - - // 创建全部模型文件, 并覆盖前面创建的同名模型 - //allModel := g.GenerateAllTable(fieldOpts...) - - // Generate basic type-safe DAO API for struct `model.User` following conventions - g.ApplyBasic(site, menu, menuAction, adminMenu, admin, cronTask, authorizedApi, authorized) - //g.ApplyBasic(allModel) - - // Generate the code - g.Execute() -} - -//func main() { -// GenerateTable(nil) -//} diff --git a/cmd/handlergen/generate_handler.go b/cmd/handlergen/generate_handler.go deleted file mode 100644 index 112d96e..0000000 --- a/cmd/handlergen/generate_handler.go +++ /dev/null @@ -1,106 +0,0 @@ -package handlergen - -import ( - "fmt" - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "go/token" - "io/ioutil" - "os" - "strings" - "unicode" - - "github.com/dave/dst" - "github.com/dave/dst/decorator" -) - -func Lcfirst(str string) string { - for i, v := range str { - return string(unicode.ToLower(v)) + str[i+1:] - } - return "" -} - -func GenerateHandler(handlerName string) (err error) { - fs := token.NewFileSet() - filePath := fmt.Sprintf("./internal/api/%s", handlerName) - parsedFile, err := decorator.ParseFile(fs, filePath+"/handler.go", nil, 0) - if err != nil { - return errors.New(fmt.Sprintf("parsing package: %s: %s\n", filePath, err)) - } - - files, _ := ioutil.ReadDir(filePath) - if len(files) > 1 { - return errors.New(fmt.Sprintf("请先确保 %s 目录中,有且仅有 handler.go 一个文件。", filePath)) - } - - dst.Inspect(parsedFile, func(n dst.Node) bool { - decl, ok := n.(*dst.GenDecl) - if !ok || decl.Tok != token.TYPE { - return true - } - - for _, spec := range decl.Specs { - typeSpec, _ok := spec.(*dst.TypeSpec) - if !_ok { - continue - } - - var interfaceType *dst.InterfaceType - if interfaceType, ok = typeSpec.Type.(*dst.InterfaceType); !ok { - continue - } - - for _, v := range interfaceType.Methods.List { - if len(v.Names) > 0 { - if v.Names[0].String() == "i" { - continue - } - - filepath := "./internal/api/" + handlerName - filename := fmt.Sprintf("%s/func_%s.go", filepath, strings.ToLower(v.Names[0].String())) - funcFile, err := os.OpenFile(filename, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0766) - if err != nil { - fmt.Printf("create and open func file error %v\n", err.Error()) - continue - } - - if funcFile == nil { - fmt.Printf("func file is nil \n") - continue - } - - fmt.Println(" └── file : ", filename) - - funcContent := fmt.Sprintf("package %s\n\n", handlerName) - funcContent += "import (\n" - funcContent += `"github.com/ch3nnn/webstack-go/internal/pkg/core"` - funcContent += "\n)\n\n" - funcContent += fmt.Sprintf("\n\ntype %sRequest struct {}\n\n", Lcfirst(v.Names[0].String())) - funcContent += fmt.Sprintf("type %sResponse struct {}\n\n", Lcfirst(v.Names[0].String())) - - // 首行注释 - funcContent += fmt.Sprintf("%s\n", v.Decorations().Start.All()[0]) - - nameArr := strings.Split(v.Decorations().Start.All()[0], v.Names[0].String()) - funcContent += fmt.Sprintf("// @Summary%s \n", nameArr[1]) - funcContent += fmt.Sprintf("// @Description%s \n", nameArr[1]) - // Tags - funcContent += fmt.Sprintf("%s \n", v.Decorations().Start.All()[1]) - funcContent += fmt.Sprintf("// @Accept application/x-www-form-urlencoded \n") - funcContent += fmt.Sprintf("// @Produce json \n") - funcContent += fmt.Sprintf("// @Param Request body %sRequest true \"请求信息\" \n", Lcfirst(v.Names[0].String())) - funcContent += fmt.Sprintf("// @Success 200 {object} %sResponse \n", Lcfirst(v.Names[0].String())) - funcContent += fmt.Sprintf("// @Failure 400 {object} code.Failure \n") - // Router - funcContent += fmt.Sprintf("%s \n", v.Decorations().Start.All()[2]) - funcContent += fmt.Sprintf("func (h *handler) %s() core.HandlerFunc { \n return func(ctx core.Context) {\n\n}}", v.Names[0].String()) - - funcFile.WriteString(funcContent) - funcFile.Close() - } - } - } - return true - }) - return -} diff --git a/cmd/server/main.go b/cmd/server/main.go new file mode 100644 index 0000000..7c763a8 --- /dev/null +++ b/cmd/server/main.go @@ -0,0 +1,49 @@ +package main + +import ( + "context" + "flag" + "fmt" + + "go.uber.org/zap" + + "github.com/ch3nnn/webstack-go/cmd/server/wire" + "github.com/ch3nnn/webstack-go/pkg/config" + "github.com/ch3nnn/webstack-go/pkg/log" +) + +// @title webstack-go API +// @version 1.0.0 +// @description This is a sample server celler server. +// @termsOfService http://swagger.io/terms/ +// @contact.name API Support +// @contact.url http://www.swagger.io/support +// @contact.email support@swagger.io +// @license.name Apache 2.0 +// @license.url http://www.apache.org/licenses/LICENSE-2.0.html +// @host localhost:8000 +// @securityDefinitions.apiKey Bearer +// @in header +// @name Authorization +// @externalDocs.description OpenAPI +// @externalDocs.url https://swagger.io/resources/open-api/ +func main() { + envConf := flag.String("conf", "config/local.yml", "config path, eg: -conf ./config/local.yml") + flag.Parse() + + conf := config.NewConfig(*envConf) + logger := log.NewLog(conf) + + app, cleanup, err := wire.NewWire(conf, logger) + defer cleanup() + if err != nil { + panic(err) + } + + logger.Info("server start", zap.String("host", fmt.Sprintf("http://%s:%d", conf.GetString("http.host"), conf.GetInt("http.port")))) + logger.Info("docs addr", zap.String("addr", fmt.Sprintf("http://%s:%d/swagger/index.html", conf.GetString("http.host"), conf.GetInt("http.port")))) + + if err = app.Run(context.Background()); err != nil { + panic(err) + } +} diff --git a/cmd/server/wire/wire.go b/cmd/server/wire/wire.go new file mode 100644 index 0000000..a85b96f --- /dev/null +++ b/cmd/server/wire/wire.go @@ -0,0 +1,73 @@ +//go:build wireinject +// +build wireinject + +package wire + +import ( + "github.com/google/wire" + "github.com/spf13/viper" + + "github.com/ch3nnn/webstack-go/internal/dal/repository" + "github.com/ch3nnn/webstack-go/internal/handler" + categoryHandler "github.com/ch3nnn/webstack-go/internal/handler/category" + dashboardHandler "github.com/ch3nnn/webstack-go/internal/handler/dashboard" + indexHandler "github.com/ch3nnn/webstack-go/internal/handler/index" + siteHandler "github.com/ch3nnn/webstack-go/internal/handler/site" + userHandler "github.com/ch3nnn/webstack-go/internal/handler/user" + "github.com/ch3nnn/webstack-go/internal/server" + "github.com/ch3nnn/webstack-go/internal/service" + categoryService "github.com/ch3nnn/webstack-go/internal/service/category" + indexService "github.com/ch3nnn/webstack-go/internal/service/index" + siteService "github.com/ch3nnn/webstack-go/internal/service/site" + userService "github.com/ch3nnn/webstack-go/internal/service/user" + "github.com/ch3nnn/webstack-go/pkg/app" + "github.com/ch3nnn/webstack-go/pkg/jwt" + "github.com/ch3nnn/webstack-go/pkg/log" + "github.com/ch3nnn/webstack-go/pkg/server/http" +) + +var repositorySet = wire.NewSet( + repository.NewDB, + repository.NewRepository, +) + +var handlerSet = wire.NewSet( + handler.NewHandler, + userHandler.NewHandler, + indexHandler.NewHandler, + siteHandler.NewHandler, + categoryHandler.NewHandler, + dashboardHandler.NewHandler, +) + +var serviceSet = wire.NewSet( + service.NewService, + userService.NewService, + indexService.NewService, + siteService.NewService, + categoryService.NewService, +) + +var serverSet = wire.NewSet( + server.NewHTTPServer, +) + +// build App +func newApp(httpServer *http.Server) *app.App { + return app.NewApp( + app.WithServer(httpServer), + app.WithName("webstack-go"), + ) +} + +func NewWire(*viper.Viper, *log.Logger) (*app.App, func(), error) { + panic(wire.Build( + serverSet, + serviceSet, + handlerSet, + repositorySet, + jwt.NewJwt, + http.NewGinDefaultServer, + newApp, + )) +} diff --git a/cmd/server/wire/wire_gen.go b/cmd/server/wire/wire_gen.go new file mode 100644 index 0000000..7aceaf2 --- /dev/null +++ b/cmd/server/wire/wire_gen.go @@ -0,0 +1,68 @@ +// Code generated by Wire. DO NOT EDIT. + +//go:generate go run -mod=mod github.com/google/wire/cmd/wire +//go:build !wireinject +// +build !wireinject + +package wire + +import ( + "github.com/ch3nnn/webstack-go/internal/dal/repository" + "github.com/ch3nnn/webstack-go/internal/handler" + category2 "github.com/ch3nnn/webstack-go/internal/handler/category" + "github.com/ch3nnn/webstack-go/internal/handler/dashboard" + index3 "github.com/ch3nnn/webstack-go/internal/handler/index" + site2 "github.com/ch3nnn/webstack-go/internal/handler/site" + user2 "github.com/ch3nnn/webstack-go/internal/handler/user" + "github.com/ch3nnn/webstack-go/internal/server" + "github.com/ch3nnn/webstack-go/internal/service" + "github.com/ch3nnn/webstack-go/internal/service/category" + index2 "github.com/ch3nnn/webstack-go/internal/service/index" + "github.com/ch3nnn/webstack-go/internal/service/site" + "github.com/ch3nnn/webstack-go/internal/service/user" + "github.com/ch3nnn/webstack-go/pkg/app" + "github.com/ch3nnn/webstack-go/pkg/jwt" + "github.com/ch3nnn/webstack-go/pkg/log" + "github.com/ch3nnn/webstack-go/pkg/server/http" + "github.com/google/wire" + "github.com/spf13/viper" +) + +// Injectors from wire.go: + +func NewWire(viperViper *viper.Viper, logger *log.Logger) (*app.App, func(), error) { + engine := http.NewGinDefaultServer() + jwtJWT := jwt.NewJwt(viperViper) + handlerHandler := handler.NewHandler(logger) + indexHandler := index.NewHandler(handlerHandler) + db := repository.NewDB(viperViper, logger) + repositoryRepository := repository.NewRepository(logger, db) + serviceService := service.NewService(engine, logger, jwtJWT, repositoryRepository) + indexService := index2.NewService(serviceService) + handler2 := index3.NewHandler(handlerHandler, indexService) + userService := user.NewService(serviceService) + userHandler := user2.NewHandler(handlerHandler, userService) + siteService := site.NewService(serviceService) + siteHandler := site2.NewHandler(handlerHandler, siteService) + categoryService := category.NewService(serviceService) + categoryHandler := category2.NewHandler(handlerHandler, categoryService) + httpServer := server.NewHTTPServer(engine, logger, viperViper, jwtJWT, indexHandler, handler2, userHandler, siteHandler, categoryHandler) + appApp := newApp(httpServer) + return appApp, func() { + }, nil +} + +// wire.go: + +var repositorySet = wire.NewSet(repository.NewDB, repository.NewRepository) + +var handlerSet = wire.NewSet(handler.NewHandler, user2.NewHandler, index3.NewHandler, site2.NewHandler, category2.NewHandler, index.NewHandler) + +var serviceSet = wire.NewSet(service.NewService, user.NewService, index2.NewService, site.NewService, category.NewService) + +var serverSet = wire.NewSet(server.NewHTTPServer) + +// build App +func newApp(httpServer *http.Server) *app.App { + return app.NewApp(app.WithServer(httpServer), app.WithName("webstack-go")) +} diff --git a/config/local.yml b/config/local.yml new file mode 100644 index 0000000..6d72df7 --- /dev/null +++ b/config/local.yml @@ -0,0 +1,22 @@ +env: local +http: + host: 0.0.0.0 + port: 8000 +security: + jwt: + key: QQYnRFerJTSEcrfB89fw8prOaObmrch8 +data: + db: + user: + driver: sqlite +# dsn: storage/nunu-test2.db?_busy_timeout=5000 + dsn: storage/webstack-go.db?_busy_timeout=5000 + +log: + log_level: debug + encoding: console # json or console + log_file_name: "./storage/logs/server.log" + max_backups: 30 + max_age: 7 + max_size: 1024 + compress: true diff --git a/config/prod.yml b/config/prod.yml new file mode 100644 index 0000000..48e2b84 --- /dev/null +++ b/config/prod.yml @@ -0,0 +1,21 @@ +env: prod +http: + host: 0.0.0.0 + port: 8000 +security: + jwt: + key: QQYnRFerJTSEcrfB89fw8prOaObmrch8 +data: + db: + user: + driver: sqlite + dsn: storage/webstack-go.db?_busy_timeout=5000 + +log: + log_level: info + encoding: json # json or console + log_file_name: "./storage/logs/server.log" + max_backups: 30 + max_age: 7 + max_size: 1024 + compress: true diff --git a/configs/configs.go b/configs/configs.go deleted file mode 100644 index 3e24ecc..0000000 --- a/configs/configs.go +++ /dev/null @@ -1,84 +0,0 @@ -package configs - -import ( - "time" - - "github.com/ch3nnn/webstack-go/internal/pkg/env" - "github.com/fsnotify/fsnotify" - "github.com/spf13/viper" -) - -var config = new(Config) - -type Config struct { - MySQL struct { - Read struct { - Addr string `toml:"addr"` - User string `toml:"user"` - Pass string `toml:"pass"` - Name string `toml:"name"` - } `toml:"read"` - Write struct { - Addr string `toml:"addr"` - User string `toml:"user"` - Pass string `toml:"pass"` - Name string `toml:"name"` - } `toml:"write"` - Base struct { - MaxOpenConn int `toml:"maxOpenConn"` - MaxIdleConn int `toml:"maxIdleConn"` - ConnMaxLifeTime time.Duration `toml:"connMaxLifeTime"` - } `toml:"base"` - } `toml:"mysql"` - - Redis struct { - Addr string `toml:"addr"` - Pass string `toml:"pass"` - Db int `toml:"db"` - MaxRetries int `toml:"maxRetries"` - PoolSize int `toml:"poolSize"` - MinIdleConns int `toml:"minIdleConns"` - } `toml:"redis"` - - Mail struct { - Host string `toml:"host"` - Port int `toml:"port"` - User string `toml:"user"` - Pass string `toml:"pass"` - To string `toml:"to"` - } `toml:"mail"` - - HashIds struct { - Secret string `toml:"secret"` - Length int `toml:"length"` - } `toml:"hashids"` - - Language struct { - Local string `toml:"local"` - } `toml:"language"` -} - -func Get() Config { - return *config -} - -func init() { - viper.SetConfigName(env.Active().Value() + "_configs") - viper.SetConfigType("toml") - viper.AddConfigPath("./configs") - - viper.WatchConfig() - viper.OnConfigChange(func(e fsnotify.Event) { - if err := viper.Unmarshal(config); err != nil { - panic(err) - } - }) - - if err := viper.ReadInConfig(); err != nil { - panic(err) - } - - if err := viper.Unmarshal(config); err != nil { - panic(err) - } -} diff --git a/configs/constants.go b/configs/constants.go deleted file mode 100644 index 222ae22..0000000 --- a/configs/constants.go +++ /dev/null @@ -1,59 +0,0 @@ -package configs - -import "time" - -const ( - // MinGoVersion 最小 Go 版本 - MinGoVersion = 1.16 - - // ProjectVersion 项目版本 - ProjectVersion = "v1.2.8" - - // ProjectName 项目名称 - ProjectName = "go-gin-api" - - // ProjectDomain 项目域名 - ProjectDomain = "http://127.0.0.1" - - // ProjectPort 项目端口 - ProjectPort = ":9999" - - // ProjectAccessLogFile 项目访问日志存放文件 - ProjectAccessLogFile = "./logs/" + ProjectName + "-access.log" - - // ProjectCronLogFile 项目后台任务日志存放文件 - ProjectCronLogFile = "./logs/" + ProjectName + "-cron.log" - - // ProjectInstallMark 项目安装完成标识 - ProjectInstallMark = "./lock/INSTALL.lock" - - // HeaderLoginToken 登录验证 Token,Header 中传递的参数 - HeaderLoginToken = "Token" - - // HeaderSignToken 签名验证 Authorization,Header 中传递的参数 - HeaderSignToken = "Authorization" - - // HeaderSignTokenDate 签名验证 Date,Header 中传递的参数 - HeaderSignTokenDate = "Authorization-Date" - - // HeaderSignTokenTimeout 签名有效期为 2 分钟 - HeaderSignTokenTimeout = time.Minute * 2 - - // RedisKeyPrefixLoginUser Redis Key 前缀 - 登录用户信息 - RedisKeyPrefixLoginUser = ProjectName + ":login-user:" - - // RedisKeyPrefixSignature Redis Key 前缀 - 签名验证信息 - RedisKeyPrefixSignature = ProjectName + ":signature:" - - // ZhCN 简体中文 - 中国 - ZhCN = "zh-cn" - - // EnUS 英文 - 美国 - EnUS = "en-us" - - // MaxRequestsPerSecond 每秒最大请求量 - MaxRequestsPerSecond = 10000 - - // LoginSessionTTL 登录有效期为 24 小时 - LoginSessionTTL = time.Hour * 24 -) diff --git a/configs/dev_configs.toml b/configs/dev_configs.toml deleted file mode 100644 index 8b13789..0000000 --- a/configs/dev_configs.toml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/configs/docker_configs.toml b/configs/docker_configs.toml deleted file mode 100644 index b268009..0000000 --- a/configs/docker_configs.toml +++ /dev/null @@ -1,41 +0,0 @@ - -[hashids] - length = 12 - secret = "6ab6122836cfef95f8db" - -[language] - local = "zh-cn" - -[mail] - host = "smtp.163.com" - pass = "" - port = 465 - to = "" - user = "" - -[mysql] - - [mysql.base] - connmaxlifetime = 60 - maxidleconn = 60 - maxopenconn = 10 - - [mysql.read] - addr = "webstack-go-mysql:3306" - name = "webstack-go" - pass = "123456" - user = "root" - - [mysql.write] - addr = "webstack-go-mysql:3306" - name = "webstack-go" - pass = "123456" - user = "root" - -[redis] - addr = "webstack-go-redis:6379" - db = "0" - maxretries = 3 - minidleconns = 5 - pass = "123456" - poolsize = 10 diff --git a/configs/fat_configs.toml b/configs/fat_configs.toml deleted file mode 100644 index 02c1e23..0000000 --- a/configs/fat_configs.toml +++ /dev/null @@ -1,41 +0,0 @@ - -[hashids] - length = 12 - secret = "6ab6122836cfef95f8db" - -[language] - local = "zh-cn" - -[mail] - host = "smtp.163.com" - pass = "" - port = 465 - to = "" - user = "" - -[mysql] - - [mysql.base] - connmaxlifetime = 60 - maxidleconn = 60 - maxopenconn = 10 - - [mysql.read] - addr = "127.0.0.1:3306" - name = "webstack-go" - pass = "123456" - user = "root" - - [mysql.write] - addr = "127.0.0.1:3306" - name = "webstack-go" - pass = "123456" - user = "root" - -[redis] - addr = "127.0.0.1:6379" - db = "0" - maxretries = 3 - minidleconns = 5 - pass = "123456" - poolsize = 10 diff --git a/configs/pro_configs.toml b/configs/pro_configs.toml deleted file mode 100644 index 139597f..0000000 --- a/configs/pro_configs.toml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/configs/uat_configs.toml b/configs/uat_configs.toml deleted file mode 100644 index 139597f..0000000 --- a/configs/uat_configs.toml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/deployments/loki/loki.yaml b/deployments/loki/loki.yaml deleted file mode 100644 index d58cccf..0000000 --- a/deployments/loki/loki.yaml +++ /dev/null @@ -1,44 +0,0 @@ -auth_enabled: false - -server: - http_listen_port: 3100 - -ingester: - lifecycler: - address: 127.0.0.1 - ring: - kvstore: - store: inmemory - replication_factor: 1 - final_sleep: 0s - chunk_idle_period: 5m - chunk_retain_period: 30s - -schema_config: - configs: - - from: 2020-01-01 - store: boltdb - object_store: filesystem - schema: v9 - index: - prefix: index_ - period: 168h # 每张表的时间范围6天 - -storage_config: - boltdb: - directory: /data/loki/index # 索引文件存储地址 - - filesystem: - directory: /data/loki/chunks # 块存储地址 - -limits_config: - enforce_metric_name: false - reject_old_samples: true - reject_old_samples_max_age: 168h - -chunk_store_config: - max_look_back_period: 0s - -table_manager: - retention_deletes_enabled: false - retention_period: 0s diff --git a/deployments/loki/promtail.yaml b/deployments/loki/promtail.yaml deleted file mode 100644 index 117cf09..0000000 --- a/deployments/loki/promtail.yaml +++ /dev/null @@ -1,20 +0,0 @@ -server: - http_listen_port: 9080 - grpc_listen_port: 0 - -# Positions -positions: - filename: /tmp/positions.yaml - -# Loki服务器的地址 -clients: - - url: http://webstack-go-loki:3100/loki/api/v1/push - -scrape_configs: - - job_name: go-gin-api - static_configs: - - targets: - - localhost - labels: - job: accesslog - __path__: /data/logs/*.log # 日志目录 \ No newline at end of file diff --git a/deployments/prometheus/prometheus.yml b/deployments/prometheus/prometheus.yml deleted file mode 100644 index 98f0b94..0000000 --- a/deployments/prometheus/prometheus.yml +++ /dev/null @@ -1,12 +0,0 @@ -global: - scrape_interval: 15s - evaluation_interval: 15s - -scrape_configs: - - job_name: "prometheus" - static_configs: - - targets: ["127.0.0.1:9090"] - - job_name: "go_app_server" - static_configs: - - targets: - - "webstack-go-service:9999" diff --git a/docker-compose-prometheus.yml b/docker-compose-prometheus.yml deleted file mode 100644 index ad5b47c..0000000 --- a/docker-compose-prometheus.yml +++ /dev/null @@ -1,50 +0,0 @@ -version: "3.8" - -services: - - webstack-go-prometheus: - image: prom/prometheus:latest - container_name: webstack-go-prometheus - volumes: - - ./deployments/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - ports: - - "9090:9090" - networks: - - webstack-go - - webstack-go-grafana: - image: grafana/grafana-enterprise:9.4.3 - container_name: webstack-go-grafana - ports: - - "3000:3000" - networks: - - webstack-go - - webstack-go-loki: - image: grafana/loki:2.7.3 - container_name: webstack-go-loki - user: root - volumes: - - ./deployments/loki/loki.yaml:/etc/loki/loki.yaml - command: -config.file=/etc/loki/loki.yaml - ports: - - "3100:3100" - networks: - - webstack-go - - webstack-go-promtail: - image: grafana/promtail:2.7.3 - container_name: webstack-go-promtail - user: root - volumes: - - ./logs/:/data/logs/ - - ./deployments/loki/promtail.yaml:/etc/promtail/promtail.yaml - command: -config.file=/etc/promtail/promtail.yaml - networks: - - webstack-go - - -networks: - webstack-go: - driver: bridge - name: webstack-go \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index a8fdf26..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,70 +0,0 @@ -version: "3.8" - -x-healthcheck-defaults: &healthcheck_defaults - interval: 10s # 间隔 - timeout: 5s # 超时 - retries: 5 # 连续失败次数 - start_period: 10s # 初始化时间 - -services: - - webstack-go-service: - container_name: webstack-go-service - build: - context: ./ - dockerfile: ./Dockerfile - ports: - - "9999:9999" - volumes: - - ./configs:/opt/configs - - ./logs/:/opt/logs/ - - ./assets/upload/:/opt/assets/upload - - ./lock/:/opt/lock - networks: - - webstack-go - healthcheck: - test: "/bin/netstat -anpt|grep 9999" - <<: *healthcheck_defaults - depends_on: - webstack-go-mysql: - condition: service_healthy - webstack-go-redis: - condition: service_healthy - - - webstack-go-mysql: - image: mysql/mysql-server:5.7 - container_name: webstack-go-mysql - environment: - MYSQL_DATABASE: webstack-go - TZ: Asia/Shanghai - # 允许来自其他主机的根连接 - # https://dev.mysql.com/doc/refman/5.7/en/docker-mysql-more-topics.html#docker_var_mysql-root-host - MYSQL_ROOT_HOST: "%" - MYSQL_ROOT_PASSWORD: 123456 - ports: - - "3306:3306" - networks: - - webstack-go - healthcheck: - test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ] - <<: *healthcheck_defaults - - - webstack-go-redis: - image: redis:6.2.4 - container_name: webstack-go-redis - command: redis-server --requirepass 123456 - ports: - - "6379:6379" - networks: - - webstack-go - healthcheck: - test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ] - <<: *healthcheck_defaults - - -networks: - webstack-go: - driver: bridge - name: webstack-go diff --git a/docs/docs.go b/docs/docs.go index 7360277..8a03c7c 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -1,476 +1,153 @@ -// Package docs GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// This file was generated by swaggo/swag +// Package docs Code generated by swaggo/swag. DO NOT EDIT package docs -import ( - "bytes" - "encoding/json" - "strings" - "text/template" +import "github.com/swaggo/swag" - "github.com/swaggo/swag" -) - -var doc = `{ +const docTemplate = `{ "schemes": {{ marshal .Schemes }}, "swagger": "2.0", "info": { "description": "{{escape .Description}}", "title": "{{.Title}}", - "contact": {}, + "termsOfService": "http://swagger.io/terms/", + "contact": { + "name": "API Support", + "url": "http://www.swagger.io/support", + "email": "support@swagger.io" + }, "license": { - "name": "MIT", - "url": "https://github.com/xinliangnote/go-gin-api/blob/master/LICENSE" + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" }, "version": "{{.Version}}" }, "host": "{{.Host}}", "basePath": "{{.BasePath}}", "paths": { - "/api/admin": { + "/api/admin/category": { "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "管理员列表", + "description": "列表分类", "consumes": [ - "application/x-www-form-urlencoded" + "application/json" ], "produces": [ "application/json" ], "tags": [ - "API.admin" - ], - "summary": "管理员列表", - "parameters": [ - { - "type": "integer", - "default": 1, - "description": "第几页", - "name": "page", - "in": "query", - "required": true - }, - { - "type": "integer", - "default": 10, - "description": "每页显示条数", - "name": "page_size", - "in": "query", - "required": true - }, - { - "type": "string", - "description": "用户名", - "name": "username", - "in": "query" - }, - { - "type": "string", - "description": "昵称", - "name": "nickname", - "in": "query" - }, - { - "type": "string", - "description": "手机号", - "name": "mobile", - "in": "query" - } + "分类模块" ], + "summary": "列表分类", "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/admin.listResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryListResp" } } } }, "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "新增管理员", + "description": "新增分类", "consumes": [ - "application/x-www-form-urlencoded" + "application/json" ], "produces": [ "application/json" ], "tags": [ - "API.admin" + "分类模块" ], - "summary": "新增管理员", + "summary": "新增分类", "parameters": [ { - "type": "string", - "description": "用户名", - "name": "username", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "昵称", - "name": "nickname", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "手机号", - "name": "mobile", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "MD5后的密码", - "name": "password", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.createResponse" - } - }, - "400": { - "description": "Bad Request", + "description": "params", + "name": "request", + "in": "body", + "required": true, "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryCreateReq" } } - } - } - }, - "/api/admin/info": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "管理员详情", - "consumes": [ - "application/x-www-form-urlencoded" ], - "produces": [ - "application/json" - ], - "tags": [ - "API.admin" - ], - "summary": "管理员详情", "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/admin.detailResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryCreateResp" } } } } }, - "/api/admin/logout": { - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "管理员登出", + "/api/admin/category/:id": { + "get": { + "description": "详情分类", "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ "application/json" ], - "tags": [ - "API.admin" - ], - "summary": "管理员登出", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.logoutResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/admin/menu": { - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "提交菜单授权", - "consumes": [ - "application/x-www-form-urlencoded" - ], "produces": [ "application/json" ], "tags": [ - "API.admin" + "分类模块" ], - "summary": "提交菜单授权", + "summary": "详情分类", "parameters": [ { - "type": "string", - "description": "Hashid", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "功能权限ID,多个用,分割", - "name": "actions", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.createResponse" - } - }, - "400": { - "description": "Bad Request", + "description": "params", + "name": "request", + "in": "body", + "required": true, "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryDetailReq" } } - } - } - }, - "/api/admin/menu/{id}": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "菜单授权列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.admin" - ], - "summary": "菜单授权列表", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/admin.listAdminMenuResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryDetailResp" } } } - } - }, - "/api/admin/modify_password": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "修改密码", + }, + "delete": { + "description": "删除分类", "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ "application/json" ], - "tags": [ - "API.admin" - ], - "summary": "修改密码", - "parameters": [ - { - "type": "string", - "description": "旧密码", - "name": "old_password", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "新密码", - "name": "new_password", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.modifyPasswordResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/admin/modify_personal_info": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "修改个人信息", - "consumes": [ - "application/x-www-form-urlencoded" - ], "produces": [ "application/json" ], "tags": [ - "API.admin" + "分类模块" ], - "summary": "修改个人信息", + "summary": "删除分类", "parameters": [ { - "type": "string", - "description": "昵称", - "name": "nickname", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "手机号", - "name": "mobile", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.modifyPersonalInfoResponse" - } - }, - "400": { - "description": "Bad Request", + "description": "params", + "name": "request", + "in": "body", + "required": true, "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryDeleteReq" } } - } - } - }, - "/api/admin/offline": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "下线管理员", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.admin" - ], - "summary": "下线管理员", - "parameters": [ - { - "type": "string", - "description": "Hashid", - "name": "id", - "in": "formData", - "required": true - } ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/admin.offlineResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryDeleteResp" } } } } }, - "/api/admin/reset_password/{id}": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "重置密码", + "/api/admin/category/update": { + "put": { + "description": "更新分类", "consumes": [ "application/json" ], @@ -478,2922 +155,58 @@ var doc = `{ "application/json" ], "tags": [ - "API.admin" + "分类模块" ], - "summary": "重置密码", + "summary": "更新分类", "parameters": [ { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.resetPasswordResponse" - } - }, - "400": { - "description": "Bad Request", + "description": "params", + "name": "request", + "in": "body", + "required": true, "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryUpdateReq" } } - } - } - }, - "/api/admin/used": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "更新管理员为启用/禁用", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.admin" - ], - "summary": "更新管理员为启用/禁用", - "parameters": [ - { - "type": "string", - "description": "Hashid", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "used", - "in": "formData", - "required": true - } ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/admin.updateUsedResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryUpdateResp" } } } } - }, - "/api/admin/{id}": { - "delete": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "删除管理员", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.admin" - ], - "summary": "删除管理员", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.deleteResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } + } + }, + "definitions": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryCreateReq": { + "type": "object", + "properties": { + "icon": { + "description": "图标", + "type": "string" + }, + "level": { + "description": "分类等级 1 一级分类 2 二级分类", + "type": "integer" + }, + "name": { + "description": "菜单名称", + "type": "string" + }, + "parent_id": { + "description": "分类父ID", + "type": "integer" } } }, - "/api/authorized": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "调用方列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.authorized" - ], - "summary": "调用方列表", - "parameters": [ - { - "type": "integer", - "default": 1, - "description": "第几页", - "name": "page", - "in": "query", - "required": true - }, - { - "type": "integer", - "default": 10, - "description": "每页显示条数", - "name": "page_size", - "in": "query", - "required": true - }, - { - "type": "string", - "description": "调用方key", - "name": "business_key", - "in": "query" - }, - { - "type": "string", - "description": "调用方secret", - "name": "business_secret", - "in": "query" - }, - { - "type": "string", - "description": "调用方对接人", - "name": "business_developer", - "in": "query" - }, - { - "type": "string", - "description": "备注", - "name": "remark", - "in": "path" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/authorized.listResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "新增调用方", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.authorized" - ], - "summary": "新增调用方", - "parameters": [ - { - "type": "string", - "description": "调用方key", - "name": "business_key", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "调用方对接人", - "name": "business_developer", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "备注", - "name": "remark", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/authorized.createResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/authorized/used": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "更新调用方为启用/禁用", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.authorized" - ], - "summary": "更新调用方为启用/禁用", - "parameters": [ - { - "type": "string", - "description": "hashID", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "used", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/authorized.updateUsedResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/authorized/{id}": { - "delete": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "删除调用方", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.authorized" - ], - "summary": "删除调用方", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/authorized.deleteResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/authorized_api": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "调用方接口地址列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.authorized" - ], - "summary": "调用方接口地址列表", - "parameters": [ - { - "type": "string", - "description": "hashID", - "name": "id", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/authorized.listAPIResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "授权调用方接口地址", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.authorized" - ], - "summary": "授权调用方接口地址", - "parameters": [ - { - "type": "string", - "description": "HashID", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "请求方法", - "name": "method", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "请求地址", - "name": "api", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/authorized.createAPIResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/authorized_api/{id}": { - "delete": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "删除调用方接口地址", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.authorized" - ], - "summary": "删除调用方接口地址", - "parameters": [ - { - "type": "string", - "description": "主键ID", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/authorized.deleteAPIResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/category": { - "get": { - "description": "分类列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.category" - ], - "summary": "分类列表", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/category.listRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/category.listResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "创建/编辑分类", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.category" - ], - "summary": "创建/编辑分类", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/category.createRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/category.createResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/category/sort": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "更新分类排序", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.category" - ], - "summary": "更新分类排序", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "排序", - "name": "sort", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/category.updateSortResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/category/used": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "更新分类为启用/禁用", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.category" - ], - "summary": "更新分类为启用/禁用", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "used", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/category.updateUsedResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/category/{id}": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "分类详情", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.category" - ], - "summary": "分类详情", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/category.detailResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "delete": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "删除分类", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.category" - ], - "summary": "删除分类", - "parameters": [ - { - "type": "string", - "description": "id", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/category.deleteResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/config/email": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "修改邮件配置", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.config" - ], - "summary": "修改邮件配置", - "parameters": [ - { - "type": "string", - "description": "邮箱服务器", - "name": "host", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "端口", - "name": "port", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "发件人邮箱", - "name": "user", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "发件人密码", - "name": "pass", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "收件人邮箱地址,多个用,分割", - "name": "to", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/config.emailResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/cron": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "任务列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.cron" - ], - "summary": "任务列表", - "parameters": [ - { - "type": "integer", - "default": 1, - "description": "第几页", - "name": "page", - "in": "query", - "required": true - }, - { - "type": "integer", - "default": 10, - "description": "每页显示条数", - "name": "page_size", - "in": "query", - "required": true - }, - { - "type": "string", - "description": "任务名称", - "name": "name", - "in": "query" - }, - { - "type": "integer", - "description": "执行方式 1:shell 2:http", - "name": "protocol", - "in": "query" - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "is_used", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/cron.listResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "创建任务", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.cron" - ], - "summary": "创建任务", - "parameters": [ - { - "type": "string", - "description": "任务名称", - "name": "name", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "crontab 表达式", - "name": "spec", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "执行命令", - "name": "command", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "执行方式 1:shell 2:http", - "name": "protocol", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "http 请求方式 1:get 2:post", - "name": "http_method", - "in": "formData" - }, - { - "type": "integer", - "description": "超时时间(单位:秒)", - "name": "timeout", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "重试次数", - "name": "retry_times", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "重试间隔(单位:秒)", - "name": "retry_interval", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知", - "name": "notify_status", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "通知类型 1:邮件 2:webhook", - "name": "notify_type", - "in": "formData" - }, - { - "type": "string", - "description": "通知者邮箱地址(多个用,分割)", - "name": "notify_receiver_email", - "in": "formData" - }, - { - "type": "string", - "description": "通知匹配关键字(多个用,分割)", - "name": "notify_keyword", - "in": "formData" - }, - { - "type": "string", - "description": "备注", - "name": "remark", - "in": "formData" - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "is_used", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/cron.createResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/cron/exec/{id}": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "手动执行单条任务", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.cron" - ], - "summary": "手动执行单条任务", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/cron.detailResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/cron/used": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "更新任务为启用/禁用", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.cron" - ], - "summary": "更新任务为启用/禁用", - "parameters": [ - { - "type": "string", - "description": "hashID", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "used", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/cron.updateUsedResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/cron/{id}": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "获取单条任务详情", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.cron" - ], - "summary": "获取单条任务详情", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/cron.detailResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "编辑任务", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.cron" - ], - "summary": "编辑任务", - "parameters": [ - { - "type": "string", - "description": "hashID", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "任务名称", - "name": "name", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "crontab 表达式", - "name": "spec", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "执行命令", - "name": "command", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "执行方式 1:shell 2:http", - "name": "protocol", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "http 请求方式 1:get 2:post", - "name": "http_method", - "in": "formData" - }, - { - "type": "integer", - "description": "超时时间(单位:秒)", - "name": "timeout", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "重试次数", - "name": "retry_times", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "重试间隔(单位:秒)", - "name": "retry_interval", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知", - "name": "notify_status", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "通知类型 1:邮件 2:webhook", - "name": "notify_type", - "in": "formData" - }, - { - "type": "string", - "description": "通知者邮箱地址(多个用,分割)", - "name": "notify_receiver_email", - "in": "formData" - }, - { - "type": "string", - "description": "通知匹配关键字(多个用,分割)", - "name": "notify_keyword", - "in": "formData" - }, - { - "type": "string", - "description": "备注", - "name": "remark", - "in": "formData" - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "is_used", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/cron.modifyResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/login": { - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "管理员登录", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.admin" - ], - "summary": "管理员登录", - "parameters": [ - { - "type": "string", - "description": "用户名", - "name": "username", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "MD5后的密码", - "name": "password", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.loginResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/menu": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "菜单列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "菜单列表", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.listResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "创建/编辑菜单", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "创建/编辑菜单", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/menu.createRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.createResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/menu/sort": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "更新菜单排序", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "更新菜单排序", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "排序", - "name": "sort", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.updateSortResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/menu/used": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "更新菜单为启用/禁用", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "更新菜单为启用/禁用", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "used", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.updateUsedResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/menu/{id}": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "菜单详情", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "菜单详情", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.detailResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "delete": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "删除菜单", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "删除菜单", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.deleteResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/menu_action": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "功能权限列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "功能权限列表", - "parameters": [ - { - "type": "string", - "description": "hashID", - "name": "id", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.listActionResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "创建功能权限", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "创建功能权限", - "parameters": [ - { - "type": "string", - "description": "HashID", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "请求方法", - "name": "method", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "请求地址", - "name": "api", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.createActionResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/menu_action/{id}": { - "delete": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "删除功能权限", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "删除功能权限", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.deleteActionResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/site": { - "get": { - "description": "网站列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.site" - ], - "summary": "网站列表", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/site.listRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/site.listResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "put": { - "description": "编辑网站", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.site" - ], - "summary": "编辑网站", - "parameters": [ - { - "type": "integer", - "description": "网站分类id", - "name": "categoryId", - "in": "formData" - }, - { - "type": "string", - "description": "网站描述", - "name": "description", - "in": "formData" - }, - { - "type": "integer", - "name": "id", - "in": "formData" - }, - { - "type": "string", - "description": "网站 logo", - "name": "thumb", - "in": "formData" - }, - { - "type": "string", - "description": "网站标题", - "name": "title", - "in": "formData" - }, - { - "type": "string", - "description": "网站地址", - "name": "url", - "in": "formData" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/site.updateSiteResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "description": "创建网站", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.site" - ], - "summary": "创建网站", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/site.createRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/site.createResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/site/category": { - "get": { - "description": "网站列列表-新增列表分类下拉框数据", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.site" - ], - "summary": "网站列列表-新增列表分类下拉框数据", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/site.listRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/site.listResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/site/used": { - "patch": { - "description": "更新网站为启用/禁用", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.site" - ], - "summary": "更新网站为启用/禁用", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/site.updateUsedRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/site.updateUsedResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/site/{id}": { - "delete": { - "description": "删除网站信息", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.site" - ], - "summary": "删除网站信息", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/site.deleteRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/site.deleteResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/cache/clear": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "清空缓存", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "清空缓存", - "parameters": [ - { - "type": "string", - "description": "Redis Key", - "name": "redis_key", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.searchCacheResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/cache/search": { - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "查询缓存", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "查询缓存", - "parameters": [ - { - "type": "string", - "description": "Redis Key", - "name": "redis_key", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.searchCacheResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/data/dbs": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "查询 DB", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "查询 DB", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.dbsResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/data/mysql": { - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "执行 SQL 语句", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "执行 SQL 语句", - "parameters": [ - { - "type": "string", - "description": "数据库名称", - "name": "db_name", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "数据表名称", - "name": "table_name", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "SQL 语句", - "name": "sql", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.searchMySQLResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/data/tables": { - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "查询 Table", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "查询 Table", - "parameters": [ - { - "type": "string", - "description": "数据库名称", - "name": "db_name", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.tablesResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/hashids/decode/{id}": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "HashIds 解密", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "HashIds 解密", - "parameters": [ - { - "type": "string", - "description": "需解密的密文", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.hashIdsDecodeResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/hashids/encode/{id}": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "HashIds 加密", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "HashIds 加密", - "parameters": [ - { - "type": "string", - "description": "需加密的数字", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.hashIdsEncodeResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/send_message": { - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "发送消息", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "发送消息", - "parameters": [ - { - "type": "string", - "description": "消息内容", - "name": "message", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.sendMessageResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/helper/md5/{str}": { - "get": { - "description": "加密", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Helper" - ], - "summary": "加密", - "parameters": [ - { - "type": "string", - "description": "需要加密的字符串", - "name": "str", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/helper.md5Response" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/helper/sign": { - "post": { - "description": "签名", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Helper" - ], - "summary": "签名", - "parameters": [ - { - "type": "string", - "description": "调用方 KEY", - "name": "key", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "请求路径 (不附带 querystring),例如:/api/login", - "name": "path", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "请求方式,例如:POST", - "name": "method", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "请求参数,例如:username=tom\u0026password=123456", - "name": "params", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/helper.signResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - } - }, - "definitions": { - "admin.ListMenuData": { - "type": "object", - "properties": { - "id": { - "description": "ID", - "type": "integer" - }, - "is_have": { - "description": "是否已拥有权限", - "type": "integer" - }, - "name": { - "description": "菜单名称", - "type": "string" - }, - "pid": { - "description": "父类ID", - "type": "integer" - } - } - }, - "admin.ListMyMenuData": { - "type": "object", - "properties": { - "icon": { - "description": "图标", - "type": "string" - }, - "id": { - "description": "ID", - "type": "integer" - }, - "link": { - "description": "链接地址", - "type": "string" - }, - "name": { - "description": "菜单名称", - "type": "string" - }, - "pid": { - "description": "父类ID", - "type": "integer" - } - } - }, - "admin.createResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "admin.deleteResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "admin.detailResponse": { - "type": "object", - "properties": { - "menu": { - "description": "菜单栏", - "type": "array", - "items": { - "$ref": "#/definitions/admin.ListMyMenuData" - } - }, - "mobile": { - "description": "手机号", - "type": "string" - }, - "nickname": { - "description": "昵称", - "type": "string" - }, - "username": { - "description": "用户名", - "type": "string" - } - } - }, - "admin.listAdminMenuResponse": { - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/admin.ListMenuData" - } - }, - "username": { - "type": "string" - } - } - }, - "admin.listData": { - "type": "object", - "properties": { - "created_at": { - "description": "创建时间", - "type": "string" - }, - "created_user": { - "description": "创建人", - "type": "string" - }, - "hashid": { - "description": "hashid", - "type": "string" - }, - "id": { - "description": "ID", - "type": "integer" - }, - "is_online": { - "description": "是否在线 1:是 -1:否", - "type": "integer" - }, - "is_used": { - "description": "是否启用 1:是 -1:否", - "type": "integer" - }, - "mobile": { - "description": "手机号", - "type": "string" - }, - "nickname": { - "description": "昵称", - "type": "string" - }, - "updated_at": { - "description": "更新时间", - "type": "string" - }, - "updated_user": { - "description": "更新人", - "type": "string" - }, - "username": { - "description": "用户名", - "type": "string" - } - } - }, - "admin.listResponse": { - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/admin.listData" - } - }, - "pagination": { - "type": "object", - "properties": { - "current_page": { - "type": "integer" - }, - "per_page_count": { - "type": "integer" - }, - "total": { - "type": "integer" - } - } - } - } - }, - "admin.loginResponse": { - "type": "object", - "properties": { - "token": { - "description": "用户身份标识", - "type": "string" - } - } - }, - "admin.logoutResponse": { - "type": "object", - "properties": { - "username": { - "description": "用户账号", - "type": "string" - } - } - }, - "admin.modifyPasswordResponse": { - "type": "object", - "properties": { - "username": { - "description": "用户账号", - "type": "string" - } - } - }, - "admin.modifyPersonalInfoResponse": { - "type": "object", - "properties": { - "username": { - "description": "用户账号", - "type": "string" - } - } - }, - "admin.offlineResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "admin.resetPasswordResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "admin.updateUsedResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "authorized.createAPIResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "authorized.createResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "authorized.deleteAPIResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "authorized.deleteResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "authorized.listAPIData": { - "type": "object", - "properties": { - "api": { - "description": "调用方对接人", - "type": "string" - }, - "business_key": { - "description": "调用方key", - "type": "string" - }, - "hash_id": { - "description": "hashID", - "type": "string" - }, - "method": { - "description": "调用方secret", - "type": "string" - } - } - }, - "authorized.listAPIResponse": { - "type": "object", - "properties": { - "business_key": { - "description": "调用方key", - "type": "string" - }, - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/authorized.listAPIData" - } - } - } - }, - "authorized.listData": { - "type": "object", - "properties": { - "business_developer": { - "description": "调用方对接人", - "type": "string" - }, - "business_key": { - "description": "调用方key", - "type": "string" - }, - "business_secret": { - "description": "调用方secret", - "type": "string" - }, - "created_at": { - "description": "创建时间", - "type": "string" - }, - "created_user": { - "description": "创建人", - "type": "string" - }, - "hashid": { - "description": "hashid", - "type": "string" - }, - "id": { - "description": "ID", - "type": "integer" - }, - "is_used": { - "description": "是否启用 1:是 -1:否", - "type": "integer" - }, - "remark": { - "description": "备注", - "type": "string" - }, - "updated_at": { - "description": "更新时间", - "type": "string" - }, - "updated_user": { - "description": "更新人", - "type": "string" - } - } - }, - "authorized.listResponse": { - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/authorized.listData" - } - }, - "pagination": { - "type": "object", - "properties": { - "current_page": { - "type": "integer" - }, - "per_page_count": { - "type": "integer" - }, - "total": { - "type": "integer" - } - } - } - } - }, - "authorized.updateUsedResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "category.createRequest": { - "type": "object", - "properties": { - "icon": { - "description": "图标", - "type": "string" - }, - "id": { - "description": "ID", - "type": "string" - }, - "level": { - "description": "分类等级", - "type": "integer" - }, - "name": { - "description": "分类名称", - "type": "string" - }, - "pid": { - "description": "父类ID", - "type": "integer" - } - } - }, - "category.createResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "category.deleteResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "category.detailResponse": { - "type": "object", - "properties": { - "icon": { - "description": "图标", - "type": "string" - }, - "id": { - "description": "主键ID", - "type": "integer" - }, - "name": { - "description": "分类名称", - "type": "string" - }, - "pid": { - "description": "父类ID", - "type": "integer" - } - } - }, - "category.listData": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryCreateResp": { "type": "object", "properties": { - "hashid": { - "description": "hashid", + "created_at": { + "description": "创建时间", "type": "string" }, "icon": { @@ -3401,375 +214,61 @@ var doc = `{ "type": "string" }, "id": { - "description": "ID", "type": "integer" }, "is_used": { - "description": "是否启用 1=启用 -1=禁用", - "type": "integer" + "description": "是否启用 1:是 0:否", + "type": "boolean" }, "level": { - "description": "分类等级 1 一级分类 2 二级分类", + "description": "分类等级", "type": "integer" }, - "link": { - "description": "链接地址", - "type": "string" - }, - "name": { - "description": "菜单名称", - "type": "string" - }, - "pid": { - "description": "父类ID", + "parent_id": { "type": "integer" }, "sort": { "description": "排序", "type": "integer" - } - } - }, - "category.listRequest": { - "type": "object" - }, - "category.listResponse": { - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/category.listData" - } - } - } - }, - "category.updateSortResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "category.updateUsedResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "code.Failure": { - "type": "object", - "properties": { - "code": { - "description": "业务码", - "type": "integer" - }, - "message": { - "description": "描述信息", - "type": "string" - } - } - }, - "config.emailResponse": { - "type": "object", - "properties": { - "email": { - "description": "邮箱地址", - "type": "string" - } - } - }, - "cron.createResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "cron.detailResponse": { - "type": "object", - "properties": { - "command": { - "description": "执行命令", - "type": "string" - }, - "http_method": { - "description": "http 请求方式 1:get 2:post", - "type": "integer" - }, - "is_used": { - "description": "是否启用 1:是 -1:否", - "type": "integer" - }, - "name": { - "description": "任务名称", - "type": "string" - }, - "notify_keyword": { - "description": "通知匹配关键字(多个用,分割)", - "type": "string" - }, - "notify_receiver_email": { - "description": "通知者邮箱地址(多个用,分割)", - "type": "string" - }, - "notify_status": { - "description": "执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知", - "type": "integer" - }, - "notify_type": { - "description": "通知类型 1:邮件 2:webhook", - "type": "integer" - }, - "protocol": { - "description": "执行方式 1:shell 2:http", - "type": "integer" - }, - "remark": { - "description": "备注", - "type": "string" - }, - "retry_interval": { - "description": "重试间隔(单位:秒)", - "type": "integer" - }, - "retry_times": { - "description": "重试次数", - "type": "integer" - }, - "spec": { - "description": "crontab 表达式", - "type": "string" - }, - "timeout": { - "description": "超时时间(单位:秒)", - "type": "integer" - } - } - }, - "cron.listData": { - "type": "object", - "properties": { - "command": { - "description": "执行命令", - "type": "string" - }, - "created_at": { - "description": "创建时间", - "type": "string" - }, - "created_user": { - "description": "创建人", - "type": "string" - }, - "hashid": { - "description": "hashid", - "type": "string" - }, - "http_method": { - "description": "http 请求方式 1:get 2:post", - "type": "integer" - }, - "http_method_text": { - "description": "http 请求方式", - "type": "string" - }, - "id": { - "description": "ID", - "type": "integer" - }, - "is_used": { - "description": "是否启用 1=启用 2=禁用", - "type": "integer" - }, - "is_used_text": { - "description": "是否启用", - "type": "string" - }, - "name": { - "description": "任务名称", - "type": "string" - }, - "notify_status": { - "description": "执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知", - "type": "integer" - }, - "notify_status_text": { - "description": "执行结束是否通知", - "type": "string" - }, - "protocol": { - "description": "执行方式 1:shell 2:http", - "type": "integer" - }, - "protocol_text": { - "description": "执行方式", - "type": "string" - }, - "retry_interval": { - "description": "重试间隔(单位:秒)", - "type": "integer" - }, - "retry_times": { - "description": "重试次数", - "type": "integer" }, - "spec": { - "description": "crontab 表达式", + "title": { + "description": "名称", "type": "string" }, - "timeout": { - "description": "超时时间(单位:秒)", - "type": "integer" - }, "updated_at": { "description": "更新时间", "type": "string" - }, - "updated_user": { - "description": "更新人", - "type": "string" - } - } - }, - "cron.listResponse": { - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/cron.listData" - } - }, - "pagination": { - "type": "object", - "properties": { - "current_page": { - "type": "integer" - }, - "per_page_count": { - "type": "integer" - }, - "total": { - "type": "integer" - } - } - } - } - }, - "cron.modifyResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "cron.updateUsedResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "helper.md5Response": { - "type": "object", - "properties": { - "md5_str": { - "description": "MD5后的字符串", - "type": "string" - } - } - }, - "helper.signResponse": { - "type": "object", - "properties": { - "authorization": { - "description": "签名信息-Authorization", - "type": "string" - }, - "authorization_date": { - "description": "签名信息-Authorization-Date", - "type": "string" - } - } - }, - "menu.createActionResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" } } }, - "menu.createRequest": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryDeleteReq": { "type": "object", + "required": [ + "id" + ], "properties": { - "icon": { - "description": "图标", - "type": "string" - }, "id": { "description": "ID", - "type": "string" - }, - "level": { - "description": "菜单类型 1:一级菜单 2:二级菜单", - "type": "integer" - }, - "link": { - "description": "链接地址", - "type": "string" - }, - "name": { - "description": "菜单名称", - "type": "string" - }, - "pid": { - "description": "父类ID", - "type": "integer" - } - } - }, - "menu.createResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", "type": "integer" } } }, - "menu.deleteActionResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } + "github_com_ch3nnn_webstack-go_api_v1.CategoryDeleteResp": { + "type": "object" }, - "menu.deleteResponse": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryDetailReq": { "type": "object", + "required": [ + "id" + ], "properties": { "id": { - "description": "主键ID", + "description": "ID", "type": "integer" } } }, - "menu.detailResponse": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryDetailResp": { "type": "object", "properties": { "icon": { @@ -3780,12 +279,8 @@ var doc = `{ "description": "主键ID", "type": "integer" }, - "link": { - "description": "链接地址", - "type": "string" - }, "name": { - "description": "菜单名称", + "description": "分类名称", "type": "string" }, "pid": { @@ -3794,48 +289,9 @@ var doc = `{ } } }, - "menu.listActionData": { - "type": "object", - "properties": { - "api": { - "description": "调用方对接人", - "type": "string" - }, - "hash_id": { - "description": "hashID", - "type": "string" - }, - "menu_id": { - "description": "菜单栏ID", - "type": "integer" - }, - "method": { - "description": "调用方secret", - "type": "string" - } - } - }, - "menu.listActionResponse": { - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/menu.listActionData" - } - }, - "menu_name": { - "type": "string" - } - } - }, - "menu.listData": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryList": { "type": "object", "properties": { - "hashid": { - "description": "hashid", - "type": "string" - }, "icon": { "description": "图标", "type": "string" @@ -3846,6 +302,10 @@ var doc = `{ }, "is_used": { "description": "是否启用 1=启用 -1=禁用", + "type": "boolean" + }, + "level": { + "description": "分类等级 1 一级分类 2 二级分类", "type": "integer" }, "link": { @@ -3866,397 +326,113 @@ var doc = `{ } } }, - "menu.listResponse": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryListResp": { "type": "object", "properties": { "list": { + "description": "分类列表", "type": "array", "items": { - "$ref": "#/definitions/menu.listData" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryList" } } } }, - "menu.updateSortResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "menu.updateUsedResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "site.createRequest": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryUpdateReq": { "type": "object", + "required": [ + "id" + ], "properties": { - "categoryId": { - "type": "integer" - }, - "description": { + "icon": { + "description": "图标", "type": "string" }, - "thumb": { - "type": "string" + "id": { + "description": "ID", + "type": "integer" }, - "title": { + "name": { + "description": "菜单名称", "type": "string" }, - "url": { - "type": "string" - } - } - }, - "site.createResponse": { - "type": "object", - "properties": { - "id": { - "type": "integer" - } - } - }, - "site.deleteRequest": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", + "parent_id": { + "description": "父类ID", "type": "integer" - } - } - }, - "site.deleteResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", + }, + "sort": { + "description": "排序", "type": "integer" + }, + "used": { + "description": "是否启用", + "type": "boolean" } } }, - "site.listData": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryUpdateResp": { "type": "object", "properties": { - "category": { - "description": "分类", - "type": "string" - }, - "category_id": { - "description": "分类id", - "type": "integer" - }, "created_at": { "description": "创建时间", "type": "string" }, - "description": { - "description": "描述", + "icon": { + "description": "图标", "type": "string" }, "id": { - "description": "ID", "type": "integer" }, "is_used": { - "description": "是否启用", - "type": "integer" - }, - "thumb": { - "description": "网站 logo", - "type": "string" - }, - "title": { - "description": "名称简介", - "type": "string" - }, - "updated_at": { - "description": "更新时间", - "type": "string" - }, - "url": { - "description": "链接", - "type": "string" - } - } - }, - "site.listRequest": { - "type": "object", - "properties": { - "businessDeveloper": { - "description": "调用方对接人", - "type": "string" - }, - "businessKey": { - "description": "调用方key", - "type": "string" - }, - "businessSecret": { - "description": "调用方secret", - "type": "string" - }, - "page": { - "description": "第几页", - "type": "integer" + "description": "是否启用 1:是 0:否", + "type": "boolean" }, - "pageSize": { - "description": "每页显示条数", + "level": { + "description": "分类等级", "type": "integer" }, - "remark": { - "description": "备注", - "type": "string" - } - } - }, - "site.listResponse": { - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/site.listData" - } - }, - "pagination": { - "type": "object", - "properties": { - "current_page": { - "type": "integer" - }, - "per_page_count": { - "type": "integer" - }, - "total": { - "type": "integer" - } - } - } - } - }, - "site.updateSiteResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "site.updateUsedRequest": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", + "parent_id": { "type": "integer" }, - "used": { - "description": "是否启用 1:是 -1:否", - "type": "integer" - } - } - }, - "site.updateUsedResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "tool.dbData": { - "type": "object", - "properties": { - "db_name": { - "description": "数据库名称", - "type": "string" - } - } - }, - "tool.dbsResponse": { - "type": "object", - "properties": { - "list": { - "description": "数据库列表", - "type": "array", - "items": { - "$ref": "#/definitions/tool.dbData" - } - } - } - }, - "tool.hashIdsDecodeResponse": { - "type": "object", - "properties": { - "val": { - "description": "解密后的值", + "sort": { + "description": "排序", "type": "integer" - } - } - }, - "tool.hashIdsEncodeResponse": { - "type": "object", - "properties": { - "val": { - "description": "加密后的值", - "type": "string" - } - } - }, - "tool.searchCacheResponse": { - "type": "object", - "properties": { - "ttl": { - "description": "过期时间", - "type": "string" - }, - "val": { - "description": "查询后的值", - "type": "string" - } - } - }, - "tool.searchMySQLResponse": { - "type": "object", - "properties": { - "cols": { - "description": "查询后的行", - "type": "array", - "items": { - "type": "string" - } - }, - "cols_info": { - "description": "行信息", - "type": "array", - "items": { - "$ref": "#/definitions/tool.tableColumn" - } - }, - "list": { - "description": "查询后的数据", - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - } - } - }, - "tool.sendMessageResponse": { - "type": "object", - "properties": { - "status": { - "description": "状态", - "type": "string" - } - } - }, - "tool.tableColumn": { - "type": "object", - "properties": { - "column_comment": { - "description": "字段注释", - "type": "string" }, - "column_name": { - "description": "字段名称", - "type": "string" - } - } - }, - "tool.tableData": { - "type": "object", - "properties": { - "table_comment": { - "description": "数据表备注", + "title": { + "description": "名称", "type": "string" }, - "table_name": { - "description": "数据表名称", + "updated_at": { + "description": "更新时间", "type": "string" } } - }, - "tool.tablesResponse": { - "type": "object", - "properties": { - "list": { - "description": "数据表列表", - "type": "array", - "items": { - "$ref": "#/definitions/tool.tableData" - } - } - } } }, "securityDefinitions": { - "LoginToken": { + "Bearer": { "type": "apiKey", - "name": "token", + "name": "Authorization", "in": "header" } } }` -type swaggerInfo struct { - Version string - Host string - BasePath string - Schemes []string - Title string - Description string -} - // SwaggerInfo holds exported Swagger Info so clients can modify it -var SwaggerInfo = swaggerInfo{ - Version: "2.0", - Host: "", - BasePath: "/", - Schemes: []string{}, - Title: "swagger 接口文档", - Description: "", -} - -type s struct{} - -func (s *s) ReadDoc() string { - sInfo := SwaggerInfo - sInfo.Description = strings.Replace(sInfo.Description, "\n", "\\n", -1) - - t, err := template.New("swagger_info").Funcs(template.FuncMap{ - "marshal": func(v interface{}) string { - a, _ := json.Marshal(v) - return string(a) - }, - "escape": func(v interface{}) string { - // escape tabs - str := strings.Replace(v.(string), "\t", "\\t", -1) - // replace " with \", and if that results in \\", replace that with \\\" - str = strings.Replace(str, "\"", "\\\"", -1) - return strings.Replace(str, "\\\\\"", "\\\\\\\"", -1) - }, - }).Parse(doc) - if err != nil { - return doc - } - - var tpl bytes.Buffer - if err := t.Execute(&tpl, sInfo); err != nil { - return doc - } - - return tpl.String() +var SwaggerInfo = &swag.Spec{ + Version: "1.0.0", + Host: "localhost:8000", + BasePath: "", + Schemes: []string{}, + Title: "webstack-go API", + Description: "This is a sample server celler server.", + InfoInstanceName: "swagger", + SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", } func init() { - swag.Register("swagger", &s{}) + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) } diff --git a/docs/swagger.json b/docs/swagger.json index 55cbf38..60dc249 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -1,460 +1,146 @@ { "swagger": "2.0", "info": { - "title": "swagger 接口文档", - "contact": {}, + "description": "This is a sample server celler server.", + "title": "webstack-go API", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "name": "API Support", + "url": "http://www.swagger.io/support", + "email": "support@swagger.io" + }, "license": { - "name": "MIT", - "url": "https://github.com/xinliangnote/go-gin-api/blob/master/LICENSE" + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" }, - "version": "2.0" + "version": "1.0.0" }, - "basePath": "/", + "host": "localhost:8000", "paths": { - "/api/admin": { + "/api/admin/category": { "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "管理员列表", + "description": "列表分类", "consumes": [ - "application/x-www-form-urlencoded" + "application/json" ], "produces": [ "application/json" ], "tags": [ - "API.admin" - ], - "summary": "管理员列表", - "parameters": [ - { - "type": "integer", - "default": 1, - "description": "第几页", - "name": "page", - "in": "query", - "required": true - }, - { - "type": "integer", - "default": 10, - "description": "每页显示条数", - "name": "page_size", - "in": "query", - "required": true - }, - { - "type": "string", - "description": "用户名", - "name": "username", - "in": "query" - }, - { - "type": "string", - "description": "昵称", - "name": "nickname", - "in": "query" - }, - { - "type": "string", - "description": "手机号", - "name": "mobile", - "in": "query" - } + "分类模块" ], + "summary": "列表分类", "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/admin.listResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryListResp" } } } }, "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "新增管理员", + "description": "新增分类", "consumes": [ - "application/x-www-form-urlencoded" + "application/json" ], "produces": [ "application/json" ], "tags": [ - "API.admin" + "分类模块" ], - "summary": "新增管理员", + "summary": "新增分类", "parameters": [ { - "type": "string", - "description": "用户名", - "name": "username", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "昵称", - "name": "nickname", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "手机号", - "name": "mobile", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "MD5后的密码", - "name": "password", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.createResponse" - } - }, - "400": { - "description": "Bad Request", + "description": "params", + "name": "request", + "in": "body", + "required": true, "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryCreateReq" } } - } - } - }, - "/api/admin/info": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "管理员详情", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.admin" ], - "summary": "管理员详情", "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/admin.detailResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryCreateResp" } } } } }, - "/api/admin/logout": { - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "管理员登出", + "/api/admin/category/:id": { + "get": { + "description": "详情分类", "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ "application/json" ], - "tags": [ - "API.admin" - ], - "summary": "管理员登出", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.logoutResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/admin/menu": { - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "提交菜单授权", - "consumes": [ - "application/x-www-form-urlencoded" - ], "produces": [ "application/json" ], "tags": [ - "API.admin" + "分类模块" ], - "summary": "提交菜单授权", + "summary": "详情分类", "parameters": [ { - "type": "string", - "description": "Hashid", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "功能权限ID,多个用,分割", - "name": "actions", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.createResponse" - } - }, - "400": { - "description": "Bad Request", + "description": "params", + "name": "request", + "in": "body", + "required": true, "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryDetailReq" } } - } - } - }, - "/api/admin/menu/{id}": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "菜单授权列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.admin" - ], - "summary": "菜单授权列表", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/admin.listAdminMenuResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryDetailResp" } } } - } - }, - "/api/admin/modify_password": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "修改密码", + }, + "delete": { + "description": "删除分类", "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ "application/json" ], - "tags": [ - "API.admin" - ], - "summary": "修改密码", - "parameters": [ - { - "type": "string", - "description": "旧密码", - "name": "old_password", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "新密码", - "name": "new_password", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.modifyPasswordResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/admin/modify_personal_info": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "修改个人信息", - "consumes": [ - "application/x-www-form-urlencoded" - ], "produces": [ "application/json" ], "tags": [ - "API.admin" + "分类模块" ], - "summary": "修改个人信息", + "summary": "删除分类", "parameters": [ { - "type": "string", - "description": "昵称", - "name": "nickname", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "手机号", - "name": "mobile", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.modifyPersonalInfoResponse" - } - }, - "400": { - "description": "Bad Request", + "description": "params", + "name": "request", + "in": "body", + "required": true, "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryDeleteReq" } } - } - } - }, - "/api/admin/offline": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "下线管理员", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.admin" - ], - "summary": "下线管理员", - "parameters": [ - { - "type": "string", - "description": "Hashid", - "name": "id", - "in": "formData", - "required": true - } ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/admin.offlineResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryDeleteResp" } } } } }, - "/api/admin/reset_password/{id}": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "重置密码", + "/api/admin/category/update": { + "put": { + "description": "更新分类", "consumes": [ "application/json" ], @@ -462,2922 +148,58 @@ "application/json" ], "tags": [ - "API.admin" + "分类模块" ], - "summary": "重置密码", + "summary": "更新分类", "parameters": [ { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.resetPasswordResponse" - } - }, - "400": { - "description": "Bad Request", + "description": "params", + "name": "request", + "in": "body", + "required": true, "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryUpdateReq" } } - } - } - }, - "/api/admin/used": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "更新管理员为启用/禁用", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.admin" - ], - "summary": "更新管理员为启用/禁用", - "parameters": [ - { - "type": "string", - "description": "Hashid", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "used", - "in": "formData", - "required": true - } ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/admin.updateUsedResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryUpdateResp" } } } } - }, - "/api/admin/{id}": { - "delete": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "删除管理员", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.admin" - ], - "summary": "删除管理员", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.deleteResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } + } + }, + "definitions": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryCreateReq": { + "type": "object", + "properties": { + "icon": { + "description": "图标", + "type": "string" + }, + "level": { + "description": "分类等级 1 一级分类 2 二级分类", + "type": "integer" + }, + "name": { + "description": "菜单名称", + "type": "string" + }, + "parent_id": { + "description": "分类父ID", + "type": "integer" } } }, - "/api/authorized": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "调用方列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.authorized" - ], - "summary": "调用方列表", - "parameters": [ - { - "type": "integer", - "default": 1, - "description": "第几页", - "name": "page", - "in": "query", - "required": true - }, - { - "type": "integer", - "default": 10, - "description": "每页显示条数", - "name": "page_size", - "in": "query", - "required": true - }, - { - "type": "string", - "description": "调用方key", - "name": "business_key", - "in": "query" - }, - { - "type": "string", - "description": "调用方secret", - "name": "business_secret", - "in": "query" - }, - { - "type": "string", - "description": "调用方对接人", - "name": "business_developer", - "in": "query" - }, - { - "type": "string", - "description": "备注", - "name": "remark", - "in": "path" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/authorized.listResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "新增调用方", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.authorized" - ], - "summary": "新增调用方", - "parameters": [ - { - "type": "string", - "description": "调用方key", - "name": "business_key", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "调用方对接人", - "name": "business_developer", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "备注", - "name": "remark", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/authorized.createResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/authorized/used": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "更新调用方为启用/禁用", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.authorized" - ], - "summary": "更新调用方为启用/禁用", - "parameters": [ - { - "type": "string", - "description": "hashID", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "used", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/authorized.updateUsedResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/authorized/{id}": { - "delete": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "删除调用方", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.authorized" - ], - "summary": "删除调用方", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/authorized.deleteResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/authorized_api": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "调用方接口地址列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.authorized" - ], - "summary": "调用方接口地址列表", - "parameters": [ - { - "type": "string", - "description": "hashID", - "name": "id", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/authorized.listAPIResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "授权调用方接口地址", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.authorized" - ], - "summary": "授权调用方接口地址", - "parameters": [ - { - "type": "string", - "description": "HashID", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "请求方法", - "name": "method", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "请求地址", - "name": "api", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/authorized.createAPIResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/authorized_api/{id}": { - "delete": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "删除调用方接口地址", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.authorized" - ], - "summary": "删除调用方接口地址", - "parameters": [ - { - "type": "string", - "description": "主键ID", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/authorized.deleteAPIResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/category": { - "get": { - "description": "分类列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.category" - ], - "summary": "分类列表", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/category.listRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/category.listResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "创建/编辑分类", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.category" - ], - "summary": "创建/编辑分类", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/category.createRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/category.createResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/category/sort": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "更新分类排序", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.category" - ], - "summary": "更新分类排序", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "排序", - "name": "sort", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/category.updateSortResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/category/used": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "更新分类为启用/禁用", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.category" - ], - "summary": "更新分类为启用/禁用", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "used", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/category.updateUsedResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/category/{id}": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "分类详情", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.category" - ], - "summary": "分类详情", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/category.detailResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "delete": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "删除分类", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.category" - ], - "summary": "删除分类", - "parameters": [ - { - "type": "string", - "description": "id", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/category.deleteResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/config/email": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "修改邮件配置", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.config" - ], - "summary": "修改邮件配置", - "parameters": [ - { - "type": "string", - "description": "邮箱服务器", - "name": "host", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "端口", - "name": "port", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "发件人邮箱", - "name": "user", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "发件人密码", - "name": "pass", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "收件人邮箱地址,多个用,分割", - "name": "to", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/config.emailResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/cron": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "任务列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.cron" - ], - "summary": "任务列表", - "parameters": [ - { - "type": "integer", - "default": 1, - "description": "第几页", - "name": "page", - "in": "query", - "required": true - }, - { - "type": "integer", - "default": 10, - "description": "每页显示条数", - "name": "page_size", - "in": "query", - "required": true - }, - { - "type": "string", - "description": "任务名称", - "name": "name", - "in": "query" - }, - { - "type": "integer", - "description": "执行方式 1:shell 2:http", - "name": "protocol", - "in": "query" - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "is_used", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/cron.listResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "创建任务", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.cron" - ], - "summary": "创建任务", - "parameters": [ - { - "type": "string", - "description": "任务名称", - "name": "name", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "crontab 表达式", - "name": "spec", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "执行命令", - "name": "command", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "执行方式 1:shell 2:http", - "name": "protocol", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "http 请求方式 1:get 2:post", - "name": "http_method", - "in": "formData" - }, - { - "type": "integer", - "description": "超时时间(单位:秒)", - "name": "timeout", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "重试次数", - "name": "retry_times", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "重试间隔(单位:秒)", - "name": "retry_interval", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知", - "name": "notify_status", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "通知类型 1:邮件 2:webhook", - "name": "notify_type", - "in": "formData" - }, - { - "type": "string", - "description": "通知者邮箱地址(多个用,分割)", - "name": "notify_receiver_email", - "in": "formData" - }, - { - "type": "string", - "description": "通知匹配关键字(多个用,分割)", - "name": "notify_keyword", - "in": "formData" - }, - { - "type": "string", - "description": "备注", - "name": "remark", - "in": "formData" - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "is_used", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/cron.createResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/cron/exec/{id}": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "手动执行单条任务", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.cron" - ], - "summary": "手动执行单条任务", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/cron.detailResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/cron/used": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "更新任务为启用/禁用", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.cron" - ], - "summary": "更新任务为启用/禁用", - "parameters": [ - { - "type": "string", - "description": "hashID", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "used", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/cron.updateUsedResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/cron/{id}": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "获取单条任务详情", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.cron" - ], - "summary": "获取单条任务详情", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/cron.detailResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "编辑任务", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.cron" - ], - "summary": "编辑任务", - "parameters": [ - { - "type": "string", - "description": "hashID", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "任务名称", - "name": "name", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "crontab 表达式", - "name": "spec", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "执行命令", - "name": "command", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "执行方式 1:shell 2:http", - "name": "protocol", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "http 请求方式 1:get 2:post", - "name": "http_method", - "in": "formData" - }, - { - "type": "integer", - "description": "超时时间(单位:秒)", - "name": "timeout", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "重试次数", - "name": "retry_times", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "重试间隔(单位:秒)", - "name": "retry_interval", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知", - "name": "notify_status", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "通知类型 1:邮件 2:webhook", - "name": "notify_type", - "in": "formData" - }, - { - "type": "string", - "description": "通知者邮箱地址(多个用,分割)", - "name": "notify_receiver_email", - "in": "formData" - }, - { - "type": "string", - "description": "通知匹配关键字(多个用,分割)", - "name": "notify_keyword", - "in": "formData" - }, - { - "type": "string", - "description": "备注", - "name": "remark", - "in": "formData" - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "is_used", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/cron.modifyResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/login": { - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "管理员登录", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.admin" - ], - "summary": "管理员登录", - "parameters": [ - { - "type": "string", - "description": "用户名", - "name": "username", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "MD5后的密码", - "name": "password", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/admin.loginResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/menu": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "菜单列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "菜单列表", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.listResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "创建/编辑菜单", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "创建/编辑菜单", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/menu.createRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.createResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/menu/sort": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "更新菜单排序", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "更新菜单排序", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "排序", - "name": "sort", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.updateSortResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/menu/used": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "更新菜单为启用/禁用", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "更新菜单为启用/禁用", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "integer", - "description": "是否启用 1:是 -1:否", - "name": "used", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.updateUsedResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/menu/{id}": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "菜单详情", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "菜单详情", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.detailResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "delete": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "删除菜单", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "删除菜单", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.deleteResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/menu_action": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "功能权限列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "功能权限列表", - "parameters": [ - { - "type": "string", - "description": "hashID", - "name": "id", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.listActionResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "创建功能权限", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "创建功能权限", - "parameters": [ - { - "type": "string", - "description": "HashID", - "name": "id", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "请求方法", - "name": "method", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "请求地址", - "name": "api", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.createActionResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/menu_action/{id}": { - "delete": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "删除功能权限", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.menu" - ], - "summary": "删除功能权限", - "parameters": [ - { - "type": "string", - "description": "hashId", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/menu.deleteActionResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/site": { - "get": { - "description": "网站列表", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.site" - ], - "summary": "网站列表", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/site.listRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/site.listResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "put": { - "description": "编辑网站", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.site" - ], - "summary": "编辑网站", - "parameters": [ - { - "type": "integer", - "description": "网站分类id", - "name": "categoryId", - "in": "formData" - }, - { - "type": "string", - "description": "网站描述", - "name": "description", - "in": "formData" - }, - { - "type": "integer", - "name": "id", - "in": "formData" - }, - { - "type": "string", - "description": "网站 logo", - "name": "thumb", - "in": "formData" - }, - { - "type": "string", - "description": "网站标题", - "name": "title", - "in": "formData" - }, - { - "type": "string", - "description": "网站地址", - "name": "url", - "in": "formData" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/site.updateSiteResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - }, - "post": { - "description": "创建网站", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.site" - ], - "summary": "创建网站", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/site.createRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/site.createResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/site/category": { - "get": { - "description": "网站列列表-新增列表分类下拉框数据", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.site" - ], - "summary": "网站列列表-新增列表分类下拉框数据", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/site.listRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/site.listResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/site/used": { - "patch": { - "description": "更新网站为启用/禁用", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.site" - ], - "summary": "更新网站为启用/禁用", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/site.updateUsedRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/site.updateUsedResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/site/{id}": { - "delete": { - "description": "删除网站信息", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.site" - ], - "summary": "删除网站信息", - "parameters": [ - { - "description": "请求信息", - "name": "Request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/site.deleteRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/site.deleteResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/cache/clear": { - "patch": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "清空缓存", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "清空缓存", - "parameters": [ - { - "type": "string", - "description": "Redis Key", - "name": "redis_key", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.searchCacheResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/cache/search": { - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "查询缓存", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "查询缓存", - "parameters": [ - { - "type": "string", - "description": "Redis Key", - "name": "redis_key", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.searchCacheResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/data/dbs": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "查询 DB", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "查询 DB", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.dbsResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/data/mysql": { - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "执行 SQL 语句", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "执行 SQL 语句", - "parameters": [ - { - "type": "string", - "description": "数据库名称", - "name": "db_name", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "数据表名称", - "name": "table_name", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "SQL 语句", - "name": "sql", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.searchMySQLResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/data/tables": { - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "查询 Table", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "查询 Table", - "parameters": [ - { - "type": "string", - "description": "数据库名称", - "name": "db_name", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.tablesResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/hashids/decode/{id}": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "HashIds 解密", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "HashIds 解密", - "parameters": [ - { - "type": "string", - "description": "需解密的密文", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.hashIdsDecodeResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/hashids/encode/{id}": { - "get": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "HashIds 加密", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "HashIds 加密", - "parameters": [ - { - "type": "string", - "description": "需加密的数字", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.hashIdsEncodeResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/api/tool/send_message": { - "post": { - "security": [ - { - "LoginToken": [] - } - ], - "description": "发送消息", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "API.tool" - ], - "summary": "发送消息", - "parameters": [ - { - "type": "string", - "description": "消息内容", - "name": "message", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/tool.sendMessageResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/helper/md5/{str}": { - "get": { - "description": "加密", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Helper" - ], - "summary": "加密", - "parameters": [ - { - "type": "string", - "description": "需要加密的字符串", - "name": "str", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/helper.md5Response" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - }, - "/helper/sign": { - "post": { - "description": "签名", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Helper" - ], - "summary": "签名", - "parameters": [ - { - "type": "string", - "description": "调用方 KEY", - "name": "key", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "请求路径 (不附带 querystring),例如:/api/login", - "name": "path", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "请求方式,例如:POST", - "name": "method", - "in": "formData", - "required": true - }, - { - "type": "string", - "description": "请求参数,例如:username=tom\u0026password=123456", - "name": "params", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/helper.signResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/code.Failure" - } - } - } - } - } - }, - "definitions": { - "admin.ListMenuData": { - "type": "object", - "properties": { - "id": { - "description": "ID", - "type": "integer" - }, - "is_have": { - "description": "是否已拥有权限", - "type": "integer" - }, - "name": { - "description": "菜单名称", - "type": "string" - }, - "pid": { - "description": "父类ID", - "type": "integer" - } - } - }, - "admin.ListMyMenuData": { - "type": "object", - "properties": { - "icon": { - "description": "图标", - "type": "string" - }, - "id": { - "description": "ID", - "type": "integer" - }, - "link": { - "description": "链接地址", - "type": "string" - }, - "name": { - "description": "菜单名称", - "type": "string" - }, - "pid": { - "description": "父类ID", - "type": "integer" - } - } - }, - "admin.createResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "admin.deleteResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "admin.detailResponse": { - "type": "object", - "properties": { - "menu": { - "description": "菜单栏", - "type": "array", - "items": { - "$ref": "#/definitions/admin.ListMyMenuData" - } - }, - "mobile": { - "description": "手机号", - "type": "string" - }, - "nickname": { - "description": "昵称", - "type": "string" - }, - "username": { - "description": "用户名", - "type": "string" - } - } - }, - "admin.listAdminMenuResponse": { - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/admin.ListMenuData" - } - }, - "username": { - "type": "string" - } - } - }, - "admin.listData": { - "type": "object", - "properties": { - "created_at": { - "description": "创建时间", - "type": "string" - }, - "created_user": { - "description": "创建人", - "type": "string" - }, - "hashid": { - "description": "hashid", - "type": "string" - }, - "id": { - "description": "ID", - "type": "integer" - }, - "is_online": { - "description": "是否在线 1:是 -1:否", - "type": "integer" - }, - "is_used": { - "description": "是否启用 1:是 -1:否", - "type": "integer" - }, - "mobile": { - "description": "手机号", - "type": "string" - }, - "nickname": { - "description": "昵称", - "type": "string" - }, - "updated_at": { - "description": "更新时间", - "type": "string" - }, - "updated_user": { - "description": "更新人", - "type": "string" - }, - "username": { - "description": "用户名", - "type": "string" - } - } - }, - "admin.listResponse": { - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/admin.listData" - } - }, - "pagination": { - "type": "object", - "properties": { - "current_page": { - "type": "integer" - }, - "per_page_count": { - "type": "integer" - }, - "total": { - "type": "integer" - } - } - } - } - }, - "admin.loginResponse": { - "type": "object", - "properties": { - "token": { - "description": "用户身份标识", - "type": "string" - } - } - }, - "admin.logoutResponse": { - "type": "object", - "properties": { - "username": { - "description": "用户账号", - "type": "string" - } - } - }, - "admin.modifyPasswordResponse": { - "type": "object", - "properties": { - "username": { - "description": "用户账号", - "type": "string" - } - } - }, - "admin.modifyPersonalInfoResponse": { - "type": "object", - "properties": { - "username": { - "description": "用户账号", - "type": "string" - } - } - }, - "admin.offlineResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "admin.resetPasswordResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "admin.updateUsedResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "authorized.createAPIResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "authorized.createResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "authorized.deleteAPIResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "authorized.deleteResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "authorized.listAPIData": { - "type": "object", - "properties": { - "api": { - "description": "调用方对接人", - "type": "string" - }, - "business_key": { - "description": "调用方key", - "type": "string" - }, - "hash_id": { - "description": "hashID", - "type": "string" - }, - "method": { - "description": "调用方secret", - "type": "string" - } - } - }, - "authorized.listAPIResponse": { - "type": "object", - "properties": { - "business_key": { - "description": "调用方key", - "type": "string" - }, - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/authorized.listAPIData" - } - } - } - }, - "authorized.listData": { - "type": "object", - "properties": { - "business_developer": { - "description": "调用方对接人", - "type": "string" - }, - "business_key": { - "description": "调用方key", - "type": "string" - }, - "business_secret": { - "description": "调用方secret", - "type": "string" - }, - "created_at": { - "description": "创建时间", - "type": "string" - }, - "created_user": { - "description": "创建人", - "type": "string" - }, - "hashid": { - "description": "hashid", - "type": "string" - }, - "id": { - "description": "ID", - "type": "integer" - }, - "is_used": { - "description": "是否启用 1:是 -1:否", - "type": "integer" - }, - "remark": { - "description": "备注", - "type": "string" - }, - "updated_at": { - "description": "更新时间", - "type": "string" - }, - "updated_user": { - "description": "更新人", - "type": "string" - } - } - }, - "authorized.listResponse": { - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/authorized.listData" - } - }, - "pagination": { - "type": "object", - "properties": { - "current_page": { - "type": "integer" - }, - "per_page_count": { - "type": "integer" - }, - "total": { - "type": "integer" - } - } - } - } - }, - "authorized.updateUsedResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "category.createRequest": { - "type": "object", - "properties": { - "icon": { - "description": "图标", - "type": "string" - }, - "id": { - "description": "ID", - "type": "string" - }, - "level": { - "description": "分类等级", - "type": "integer" - }, - "name": { - "description": "分类名称", - "type": "string" - }, - "pid": { - "description": "父类ID", - "type": "integer" - } - } - }, - "category.createResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "category.deleteResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "category.detailResponse": { - "type": "object", - "properties": { - "icon": { - "description": "图标", - "type": "string" - }, - "id": { - "description": "主键ID", - "type": "integer" - }, - "name": { - "description": "分类名称", - "type": "string" - }, - "pid": { - "description": "父类ID", - "type": "integer" - } - } - }, - "category.listData": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryCreateResp": { "type": "object", "properties": { - "hashid": { - "description": "hashid", + "created_at": { + "description": "创建时间", "type": "string" }, "icon": { @@ -3385,375 +207,61 @@ "type": "string" }, "id": { - "description": "ID", "type": "integer" }, "is_used": { - "description": "是否启用 1=启用 -1=禁用", - "type": "integer" + "description": "是否启用 1:是 0:否", + "type": "boolean" }, "level": { - "description": "分类等级 1 一级分类 2 二级分类", + "description": "分类等级", "type": "integer" }, - "link": { - "description": "链接地址", - "type": "string" - }, - "name": { - "description": "菜单名称", - "type": "string" - }, - "pid": { - "description": "父类ID", + "parent_id": { "type": "integer" }, "sort": { "description": "排序", "type": "integer" - } - } - }, - "category.listRequest": { - "type": "object" - }, - "category.listResponse": { - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/category.listData" - } - } - } - }, - "category.updateSortResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "category.updateUsedResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "code.Failure": { - "type": "object", - "properties": { - "code": { - "description": "业务码", - "type": "integer" - }, - "message": { - "description": "描述信息", - "type": "string" - } - } - }, - "config.emailResponse": { - "type": "object", - "properties": { - "email": { - "description": "邮箱地址", - "type": "string" - } - } - }, - "cron.createResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "cron.detailResponse": { - "type": "object", - "properties": { - "command": { - "description": "执行命令", - "type": "string" - }, - "http_method": { - "description": "http 请求方式 1:get 2:post", - "type": "integer" - }, - "is_used": { - "description": "是否启用 1:是 -1:否", - "type": "integer" - }, - "name": { - "description": "任务名称", - "type": "string" - }, - "notify_keyword": { - "description": "通知匹配关键字(多个用,分割)", - "type": "string" - }, - "notify_receiver_email": { - "description": "通知者邮箱地址(多个用,分割)", - "type": "string" - }, - "notify_status": { - "description": "执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知", - "type": "integer" - }, - "notify_type": { - "description": "通知类型 1:邮件 2:webhook", - "type": "integer" - }, - "protocol": { - "description": "执行方式 1:shell 2:http", - "type": "integer" - }, - "remark": { - "description": "备注", - "type": "string" - }, - "retry_interval": { - "description": "重试间隔(单位:秒)", - "type": "integer" - }, - "retry_times": { - "description": "重试次数", - "type": "integer" - }, - "spec": { - "description": "crontab 表达式", - "type": "string" - }, - "timeout": { - "description": "超时时间(单位:秒)", - "type": "integer" - } - } - }, - "cron.listData": { - "type": "object", - "properties": { - "command": { - "description": "执行命令", - "type": "string" - }, - "created_at": { - "description": "创建时间", - "type": "string" - }, - "created_user": { - "description": "创建人", - "type": "string" - }, - "hashid": { - "description": "hashid", - "type": "string" - }, - "http_method": { - "description": "http 请求方式 1:get 2:post", - "type": "integer" - }, - "http_method_text": { - "description": "http 请求方式", - "type": "string" - }, - "id": { - "description": "ID", - "type": "integer" - }, - "is_used": { - "description": "是否启用 1=启用 2=禁用", - "type": "integer" - }, - "is_used_text": { - "description": "是否启用", - "type": "string" - }, - "name": { - "description": "任务名称", - "type": "string" - }, - "notify_status": { - "description": "执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知", - "type": "integer" - }, - "notify_status_text": { - "description": "执行结束是否通知", - "type": "string" - }, - "protocol": { - "description": "执行方式 1:shell 2:http", - "type": "integer" - }, - "protocol_text": { - "description": "执行方式", - "type": "string" - }, - "retry_interval": { - "description": "重试间隔(单位:秒)", - "type": "integer" - }, - "retry_times": { - "description": "重试次数", - "type": "integer" - }, - "spec": { - "description": "crontab 表达式", - "type": "string" - }, - "timeout": { - "description": "超时时间(单位:秒)", - "type": "integer" - }, - "updated_at": { - "description": "更新时间", - "type": "string" - }, - "updated_user": { - "description": "更新人", - "type": "string" - } - } - }, - "cron.listResponse": { - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/cron.listData" - } - }, - "pagination": { - "type": "object", - "properties": { - "current_page": { - "type": "integer" - }, - "per_page_count": { - "type": "integer" - }, - "total": { - "type": "integer" - } - } - } - } - }, - "cron.modifyResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "cron.updateUsedResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "helper.md5Response": { - "type": "object", - "properties": { - "md5_str": { - "description": "MD5后的字符串", - "type": "string" - } - } - }, - "helper.signResponse": { - "type": "object", - "properties": { - "authorization": { - "description": "签名信息-Authorization", - "type": "string" - }, - "authorization_date": { - "description": "签名信息-Authorization-Date", - "type": "string" - } - } - }, - "menu.createActionResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "menu.createRequest": { - "type": "object", - "properties": { - "icon": { - "description": "图标", - "type": "string" - }, - "id": { - "description": "ID", - "type": "string" - }, - "level": { - "description": "菜单类型 1:一级菜单 2:二级菜单", - "type": "integer" - }, - "link": { - "description": "链接地址", - "type": "string" }, - "name": { - "description": "菜单名称", - "type": "string" - }, - "pid": { - "description": "父类ID", - "type": "integer" - } - } - }, - "menu.createResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" + "title": { + "description": "名称", + "type": "string" + }, + "updated_at": { + "description": "更新时间", + "type": "string" } } }, - "menu.deleteActionResponse": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryDeleteReq": { "type": "object", + "required": [ + "id" + ], "properties": { "id": { - "description": "主键ID", + "description": "ID", "type": "integer" } } }, - "menu.deleteResponse": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryDeleteResp": { + "type": "object" + }, + "github_com_ch3nnn_webstack-go_api_v1.CategoryDetailReq": { "type": "object", + "required": [ + "id" + ], "properties": { "id": { - "description": "主键ID", + "description": "ID", "type": "integer" } } }, - "menu.detailResponse": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryDetailResp": { "type": "object", "properties": { "icon": { @@ -3764,12 +272,8 @@ "description": "主键ID", "type": "integer" }, - "link": { - "description": "链接地址", - "type": "string" - }, "name": { - "description": "菜单名称", + "description": "分类名称", "type": "string" }, "pid": { @@ -3778,48 +282,9 @@ } } }, - "menu.listActionData": { - "type": "object", - "properties": { - "api": { - "description": "调用方对接人", - "type": "string" - }, - "hash_id": { - "description": "hashID", - "type": "string" - }, - "menu_id": { - "description": "菜单栏ID", - "type": "integer" - }, - "method": { - "description": "调用方secret", - "type": "string" - } - } - }, - "menu.listActionResponse": { - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/menu.listActionData" - } - }, - "menu_name": { - "type": "string" - } - } - }, - "menu.listData": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryList": { "type": "object", "properties": { - "hashid": { - "description": "hashid", - "type": "string" - }, "icon": { "description": "图标", "type": "string" @@ -3830,6 +295,10 @@ }, "is_used": { "description": "是否启用 1=启用 -1=禁用", + "type": "boolean" + }, + "level": { + "description": "分类等级 1 一级分类 2 二级分类", "type": "integer" }, "link": { @@ -3850,342 +319,94 @@ } } }, - "menu.listResponse": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryListResp": { "type": "object", "properties": { "list": { + "description": "分类列表", "type": "array", "items": { - "$ref": "#/definitions/menu.listData" + "$ref": "#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryList" } } } }, - "menu.updateSortResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "menu.updateUsedResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "site.createRequest": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryUpdateReq": { "type": "object", + "required": [ + "id" + ], "properties": { - "categoryId": { - "type": "integer" - }, - "description": { + "icon": { + "description": "图标", "type": "string" }, - "thumb": { - "type": "string" + "id": { + "description": "ID", + "type": "integer" }, - "title": { + "name": { + "description": "菜单名称", "type": "string" }, - "url": { - "type": "string" - } - } - }, - "site.createResponse": { - "type": "object", - "properties": { - "id": { - "type": "integer" - } - } - }, - "site.deleteRequest": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", + "parent_id": { + "description": "父类ID", "type": "integer" - } - } - }, - "site.deleteResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", + }, + "sort": { + "description": "排序", "type": "integer" + }, + "used": { + "description": "是否启用", + "type": "boolean" } } }, - "site.listData": { + "github_com_ch3nnn_webstack-go_api_v1.CategoryUpdateResp": { "type": "object", "properties": { - "category": { - "description": "分类", - "type": "string" - }, - "category_id": { - "description": "分类id", - "type": "integer" - }, "created_at": { "description": "创建时间", "type": "string" }, - "description": { - "description": "描述", + "icon": { + "description": "图标", "type": "string" }, "id": { - "description": "ID", "type": "integer" }, "is_used": { - "description": "是否启用", - "type": "integer" - }, - "thumb": { - "description": "网站 logo", - "type": "string" - }, - "title": { - "description": "名称简介", - "type": "string" - }, - "updated_at": { - "description": "更新时间", - "type": "string" - }, - "url": { - "description": "链接", - "type": "string" - } - } - }, - "site.listRequest": { - "type": "object", - "properties": { - "businessDeveloper": { - "description": "调用方对接人", - "type": "string" - }, - "businessKey": { - "description": "调用方key", - "type": "string" - }, - "businessSecret": { - "description": "调用方secret", - "type": "string" - }, - "page": { - "description": "第几页", - "type": "integer" + "description": "是否启用 1:是 0:否", + "type": "boolean" }, - "pageSize": { - "description": "每页显示条数", + "level": { + "description": "分类等级", "type": "integer" }, - "remark": { - "description": "备注", - "type": "string" - } - } - }, - "site.listResponse": { - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "$ref": "#/definitions/site.listData" - } - }, - "pagination": { - "type": "object", - "properties": { - "current_page": { - "type": "integer" - }, - "per_page_count": { - "type": "integer" - }, - "total": { - "type": "integer" - } - } - } - } - }, - "site.updateSiteResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "site.updateUsedRequest": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", + "parent_id": { "type": "integer" }, - "used": { - "description": "是否启用 1:是 -1:否", - "type": "integer" - } - } - }, - "site.updateUsedResponse": { - "type": "object", - "properties": { - "id": { - "description": "主键ID", - "type": "integer" - } - } - }, - "tool.dbData": { - "type": "object", - "properties": { - "db_name": { - "description": "数据库名称", - "type": "string" - } - } - }, - "tool.dbsResponse": { - "type": "object", - "properties": { - "list": { - "description": "数据库列表", - "type": "array", - "items": { - "$ref": "#/definitions/tool.dbData" - } - } - } - }, - "tool.hashIdsDecodeResponse": { - "type": "object", - "properties": { - "val": { - "description": "解密后的值", + "sort": { + "description": "排序", "type": "integer" - } - } - }, - "tool.hashIdsEncodeResponse": { - "type": "object", - "properties": { - "val": { - "description": "加密后的值", - "type": "string" - } - } - }, - "tool.searchCacheResponse": { - "type": "object", - "properties": { - "ttl": { - "description": "过期时间", - "type": "string" - }, - "val": { - "description": "查询后的值", - "type": "string" - } - } - }, - "tool.searchMySQLResponse": { - "type": "object", - "properties": { - "cols": { - "description": "查询后的行", - "type": "array", - "items": { - "type": "string" - } - }, - "cols_info": { - "description": "行信息", - "type": "array", - "items": { - "$ref": "#/definitions/tool.tableColumn" - } - }, - "list": { - "description": "查询后的数据", - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - } - } - }, - "tool.sendMessageResponse": { - "type": "object", - "properties": { - "status": { - "description": "状态", - "type": "string" - } - } - }, - "tool.tableColumn": { - "type": "object", - "properties": { - "column_comment": { - "description": "字段注释", - "type": "string" }, - "column_name": { - "description": "字段名称", - "type": "string" - } - } - }, - "tool.tableData": { - "type": "object", - "properties": { - "table_comment": { - "description": "数据表备注", + "title": { + "description": "名称", "type": "string" }, - "table_name": { - "description": "数据表名称", + "updated_at": { + "description": "更新时间", "type": "string" } } - }, - "tool.tablesResponse": { - "type": "object", - "properties": { - "list": { - "description": "数据表列表", - "type": "array", - "items": { - "$ref": "#/definitions/tool.tableData" - } - } - } } }, "securityDefinitions": { - "LoginToken": { + "Bearer": { "type": "apiKey", - "name": "token", + "name": "Authorization", "in": "header" } } diff --git a/docs/swagger.yaml b/docs/swagger.yaml index d4ec68b..ecf6b2d 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1,308 +1,66 @@ -basePath: / definitions: - admin.ListMenuData: - properties: - id: - description: ID - type: integer - is_have: - description: 是否已拥有权限 - type: integer - name: - description: 菜单名称 - type: string - pid: - description: 父类ID - type: integer - type: object - admin.ListMyMenuData: + github_com_ch3nnn_webstack-go_api_v1.CategoryCreateReq: properties: icon: description: 图标 type: string - id: - description: ID + level: + description: 分类等级 1 一级分类 2 二级分类 type: integer - link: - description: 链接地址 - type: string name: description: 菜单名称 type: string - pid: - description: 父类ID - type: integer - type: object - admin.createResponse: - properties: - id: - description: 主键ID - type: integer - type: object - admin.deleteResponse: - properties: - id: - description: 主键ID + parent_id: + description: 分类父ID type: integer type: object - admin.detailResponse: - properties: - menu: - description: 菜单栏 - items: - $ref: '#/definitions/admin.ListMyMenuData' - type: array - mobile: - description: 手机号 - type: string - nickname: - description: 昵称 - type: string - username: - description: 用户名 - type: string - type: object - admin.listAdminMenuResponse: - properties: - list: - items: - $ref: '#/definitions/admin.ListMenuData' - type: array - username: - type: string - type: object - admin.listData: + github_com_ch3nnn_webstack-go_api_v1.CategoryCreateResp: properties: created_at: description: 创建时间 type: string - created_user: - description: 创建人 - type: string - hashid: - description: hashid + icon: + description: 图标 type: string id: - description: ID - type: integer - is_online: - description: 是否在线 1:是 -1:否 type: integer is_used: - description: 是否启用 1:是 -1:否 - type: integer - mobile: - description: 手机号 - type: string - nickname: - description: 昵称 - type: string - updated_at: - description: 更新时间 - type: string - updated_user: - description: 更新人 - type: string - username: - description: 用户名 - type: string - type: object - admin.listResponse: - properties: - list: - items: - $ref: '#/definitions/admin.listData' - type: array - pagination: - properties: - current_page: - type: integer - per_page_count: - type: integer - total: - type: integer - type: object - type: object - admin.loginResponse: - properties: - token: - description: 用户身份标识 - type: string - type: object - admin.logoutResponse: - properties: - username: - description: 用户账号 - type: string - type: object - admin.modifyPasswordResponse: - properties: - username: - description: 用户账号 - type: string - type: object - admin.modifyPersonalInfoResponse: - properties: - username: - description: 用户账号 - type: string - type: object - admin.offlineResponse: - properties: - id: - description: 主键ID - type: integer - type: object - admin.resetPasswordResponse: - properties: - id: - description: 主键ID - type: integer - type: object - admin.updateUsedResponse: - properties: - id: - description: 主键ID - type: integer - type: object - authorized.createAPIResponse: - properties: - id: - description: 主键ID - type: integer - type: object - authorized.createResponse: - properties: - id: - description: 主键ID - type: integer - type: object - authorized.deleteAPIResponse: - properties: - id: - description: 主键ID - type: integer - type: object - authorized.deleteResponse: - properties: - id: - description: 主键ID + description: 是否启用 1:是 0:否 + type: boolean + level: + description: 分类等级 type: integer - type: object - authorized.listAPIData: - properties: - api: - description: 调用方对接人 - type: string - business_key: - description: 调用方key - type: string - hash_id: - description: hashID - type: string - method: - description: 调用方secret - type: string - type: object - authorized.listAPIResponse: - properties: - business_key: - description: 调用方key - type: string - list: - items: - $ref: '#/definitions/authorized.listAPIData' - type: array - type: object - authorized.listData: - properties: - business_developer: - description: 调用方对接人 - type: string - business_key: - description: 调用方key - type: string - business_secret: - description: 调用方secret - type: string - created_at: - description: 创建时间 - type: string - created_user: - description: 创建人 - type: string - hashid: - description: hashid - type: string - id: - description: ID + parent_id: type: integer - is_used: - description: 是否启用 1:是 -1:否 + sort: + description: 排序 type: integer - remark: - description: 备注 + title: + description: 名称 type: string updated_at: description: 更新时间 type: string - updated_user: - description: 更新人 - type: string - type: object - authorized.listResponse: - properties: - list: - items: - $ref: '#/definitions/authorized.listData' - type: array - pagination: - properties: - current_page: - type: integer - per_page_count: - type: integer - total: - type: integer - type: object type: object - authorized.updateUsedResponse: + github_com_ch3nnn_webstack-go_api_v1.CategoryDeleteReq: properties: - id: - description: 主键ID - type: integer - type: object - category.createRequest: - properties: - icon: - description: 图标 - type: string id: description: ID - type: string - level: - description: 分类等级 - type: integer - name: - description: 分类名称 - type: string - pid: - description: 父类ID type: integer + required: + - id type: object - category.createResponse: - properties: - id: - description: 主键ID - type: integer + github_com_ch3nnn_webstack-go_api_v1.CategoryDeleteResp: type: object - category.deleteResponse: + github_com_ch3nnn_webstack-go_api_v1.CategoryDetailReq: properties: id: - description: 主键ID + description: ID type: integer + required: + - id type: object - category.detailResponse: + github_com_ch3nnn_webstack-go_api_v1.CategoryDetailResp: properties: icon: description: 图标 @@ -317,11 +75,8 @@ definitions: description: 父类ID type: integer type: object - category.listData: + github_com_ch3nnn_webstack-go_api_v1.CategoryList: properties: - hashid: - description: hashid - type: string icon: description: 图标 type: string @@ -330,7 +85,7 @@ definitions: type: integer is_used: description: 是否启用 1=启用 -1=禁用 - type: integer + type: boolean level: description: 分类等级 1 一级分类 2 二级分类 type: integer @@ -347,2419 +102,183 @@ definitions: description: 排序 type: integer type: object - category.listRequest: - type: object - category.listResponse: + github_com_ch3nnn_webstack-go_api_v1.CategoryListResp: properties: list: + description: 分类列表 items: - $ref: '#/definitions/category.listData' + $ref: '#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryList' type: array type: object - category.updateSortResponse: - properties: - id: - description: 主键ID - type: integer - type: object - category.updateUsedResponse: - properties: - id: - description: 主键ID - type: integer - type: object - code.Failure: - properties: - code: - description: 业务码 - type: integer - message: - description: 描述信息 - type: string - type: object - config.emailResponse: + github_com_ch3nnn_webstack-go_api_v1.CategoryUpdateReq: properties: - email: - description: 邮箱地址 + icon: + description: 图标 type: string - type: object - cron.createResponse: - properties: id: - description: 主键ID - type: integer - type: object - cron.detailResponse: - properties: - command: - description: 执行命令 - type: string - http_method: - description: http 请求方式 1:get 2:post - type: integer - is_used: - description: 是否启用 1:是 -1:否 + description: ID type: integer name: - description: 任务名称 - type: string - notify_keyword: - description: 通知匹配关键字(多个用,分割) - type: string - notify_receiver_email: - description: 通知者邮箱地址(多个用,分割) - type: string - notify_status: - description: 执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知 - type: integer - notify_type: - description: 通知类型 1:邮件 2:webhook - type: integer - protocol: - description: 执行方式 1:shell 2:http - type: integer - remark: - description: 备注 + description: 菜单名称 type: string - retry_interval: - description: 重试间隔(单位:秒) - type: integer - retry_times: - description: 重试次数 + parent_id: + description: 父类ID type: integer - spec: - description: crontab 表达式 - type: string - timeout: - description: 超时时间(单位:秒) + sort: + description: 排序 type: integer + used: + description: 是否启用 + type: boolean + required: + - id type: object - cron.listData: + github_com_ch3nnn_webstack-go_api_v1.CategoryUpdateResp: properties: - command: - description: 执行命令 - type: string created_at: description: 创建时间 type: string - created_user: - description: 创建人 - type: string - hashid: - description: hashid - type: string - http_method: - description: http 请求方式 1:get 2:post - type: integer - http_method_text: - description: http 请求方式 + icon: + description: 图标 type: string id: - description: ID type: integer is_used: - description: 是否启用 1=启用 2=禁用 - type: integer - is_used_text: - description: 是否启用 - type: string - name: - description: 任务名称 - type: string - notify_status: - description: 执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知 - type: integer - notify_status_text: - description: 执行结束是否通知 - type: string - protocol: - description: 执行方式 1:shell 2:http + description: 是否启用 1:是 0:否 + type: boolean + level: + description: 分类等级 type: integer - protocol_text: - description: 执行方式 - type: string - retry_interval: - description: 重试间隔(单位:秒) + parent_id: type: integer - retry_times: - description: 重试次数 + sort: + description: 排序 type: integer - spec: - description: crontab 表达式 + title: + description: 名称 type: string - timeout: - description: 超时时间(单位:秒) - type: integer updated_at: description: 更新时间 type: string - updated_user: - description: 更新人 - type: string - type: object - cron.listResponse: - properties: - list: - items: - $ref: '#/definitions/cron.listData' - type: array - pagination: - properties: - current_page: - type: integer - per_page_count: - type: integer - total: - type: integer - type: object - type: object - cron.modifyResponse: - properties: - id: - description: 主键ID - type: integer - type: object - cron.updateUsedResponse: - properties: - id: - description: 主键ID - type: integer - type: object - helper.md5Response: - properties: - md5_str: - description: MD5后的字符串 - type: string - type: object - helper.signResponse: - properties: - authorization: - description: 签名信息-Authorization - type: string - authorization_date: - description: 签名信息-Authorization-Date - type: string type: object - menu.createActionResponse: - properties: - id: - description: 主键ID - type: integer - type: object - menu.createRequest: - properties: - icon: - description: 图标 - type: string - id: - description: ID - type: string - level: - description: 菜单类型 1:一级菜单 2:二级菜单 - type: integer - link: - description: 链接地址 - type: string - name: - description: 菜单名称 - type: string - pid: - description: 父类ID - type: integer - type: object - menu.createResponse: - properties: - id: - description: 主键ID - type: integer - type: object - menu.deleteActionResponse: - properties: - id: - description: 主键ID - type: integer - type: object - menu.deleteResponse: - properties: - id: - description: 主键ID - type: integer - type: object - menu.detailResponse: - properties: - icon: - description: 图标 - type: string - id: - description: 主键ID - type: integer - link: - description: 链接地址 - type: string - name: - description: 菜单名称 - type: string - pid: - description: 父类ID - type: integer - type: object - menu.listActionData: - properties: - api: - description: 调用方对接人 - type: string - hash_id: - description: hashID - type: string - menu_id: - description: 菜单栏ID - type: integer - method: - description: 调用方secret - type: string - type: object - menu.listActionResponse: - properties: - list: - items: - $ref: '#/definitions/menu.listActionData' - type: array - menu_name: - type: string - type: object - menu.listData: - properties: - hashid: - description: hashid - type: string - icon: - description: 图标 - type: string - id: - description: ID - type: integer - is_used: - description: 是否启用 1=启用 -1=禁用 - type: integer - link: - description: 链接地址 - type: string - name: - description: 菜单名称 - type: string - pid: - description: 父类ID - type: integer - sort: - description: 排序 - type: integer - type: object - menu.listResponse: - properties: - list: - items: - $ref: '#/definitions/menu.listData' - type: array - type: object - menu.updateSortResponse: - properties: - id: - description: 主键ID - type: integer - type: object - menu.updateUsedResponse: - properties: - id: - description: 主键ID - type: integer - type: object - site.createRequest: - properties: - categoryId: - type: integer - description: - type: string - thumb: - type: string - title: - type: string - url: - type: string - type: object - site.createResponse: - properties: - id: - type: integer - type: object - site.deleteRequest: - properties: - id: - description: 主键ID - type: integer - type: object - site.deleteResponse: - properties: - id: - description: 主键ID - type: integer - type: object - site.listData: - properties: - category: - description: 分类 - type: string - category_id: - description: 分类id - type: integer - created_at: - description: 创建时间 - type: string - description: - description: 描述 - type: string - id: - description: ID - type: integer - is_used: - description: 是否启用 - type: integer - thumb: - description: 网站 logo - type: string - title: - description: 名称简介 - type: string - updated_at: - description: 更新时间 - type: string - url: - description: 链接 - type: string - type: object - site.listRequest: - properties: - businessDeveloper: - description: 调用方对接人 - type: string - businessKey: - description: 调用方key - type: string - businessSecret: - description: 调用方secret - type: string - page: - description: 第几页 - type: integer - pageSize: - description: 每页显示条数 - type: integer - remark: - description: 备注 - type: string - type: object - site.listResponse: - properties: - list: - items: - $ref: '#/definitions/site.listData' - type: array - pagination: - properties: - current_page: - type: integer - per_page_count: - type: integer - total: - type: integer - type: object - type: object - site.updateSiteResponse: - properties: - id: - description: 主键ID - type: integer - type: object - site.updateUsedRequest: - properties: - id: - description: 主键ID - type: integer - used: - description: 是否启用 1:是 -1:否 - type: integer - type: object - site.updateUsedResponse: - properties: - id: - description: 主键ID - type: integer - type: object - tool.dbData: - properties: - db_name: - description: 数据库名称 - type: string - type: object - tool.dbsResponse: - properties: - list: - description: 数据库列表 - items: - $ref: '#/definitions/tool.dbData' - type: array - type: object - tool.hashIdsDecodeResponse: - properties: - val: - description: 解密后的值 - type: integer - type: object - tool.hashIdsEncodeResponse: - properties: - val: - description: 加密后的值 - type: string - type: object - tool.searchCacheResponse: - properties: - ttl: - description: 过期时间 - type: string - val: - description: 查询后的值 - type: string - type: object - tool.searchMySQLResponse: - properties: - cols: - description: 查询后的行 - items: - type: string - type: array - cols_info: - description: 行信息 - items: - $ref: '#/definitions/tool.tableColumn' - type: array - list: - description: 查询后的数据 - items: - additionalProperties: true - type: object - type: array - type: object - tool.sendMessageResponse: - properties: - status: - description: 状态 - type: string - type: object - tool.tableColumn: - properties: - column_comment: - description: 字段注释 - type: string - column_name: - description: 字段名称 - type: string - type: object - tool.tableData: - properties: - table_comment: - description: 数据表备注 - type: string - table_name: - description: 数据表名称 - type: string - type: object - tool.tablesResponse: - properties: - list: - description: 数据表列表 - items: - $ref: '#/definitions/tool.tableData' - type: array - type: object -info: - contact: {} - license: - name: MIT - url: https://github.com/xinliangnote/go-gin-api/blob/master/LICENSE - title: swagger 接口文档 - version: "2.0" -paths: - /api/admin: - get: - consumes: - - application/x-www-form-urlencoded - description: 管理员列表 - parameters: - - default: 1 - description: 第几页 - in: query - name: page - required: true - type: integer - - default: 10 - description: 每页显示条数 - in: query - name: page_size - required: true - type: integer - - description: 用户名 - in: query - name: username - type: string - - description: 昵称 - in: query - name: nickname - type: string - - description: 手机号 - in: query - name: mobile - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/admin.listResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 管理员列表 - tags: - - API.admin - post: - consumes: - - application/x-www-form-urlencoded - description: 新增管理员 - parameters: - - description: 用户名 - in: formData - name: username - required: true - type: string - - description: 昵称 - in: formData - name: nickname - required: true - type: string - - description: 手机号 - in: formData - name: mobile - required: true - type: string - - description: MD5后的密码 - in: formData - name: password - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/admin.createResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 新增管理员 - tags: - - API.admin - /api/admin/{id}: - delete: - consumes: - - application/json - description: 删除管理员 - parameters: - - description: hashId - in: path - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/admin.deleteResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 删除管理员 - tags: - - API.admin - /api/admin/info: - get: - consumes: - - application/x-www-form-urlencoded - description: 管理员详情 - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/admin.detailResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 管理员详情 - tags: - - API.admin - /api/admin/logout: - post: - consumes: - - application/x-www-form-urlencoded - description: 管理员登出 - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/admin.logoutResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 管理员登出 - tags: - - API.admin - /api/admin/menu: - post: - consumes: - - application/x-www-form-urlencoded - description: 提交菜单授权 - parameters: - - description: Hashid - in: formData - name: id - required: true - type: string - - description: 功能权限ID,多个用,分割 - in: formData - name: actions - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/admin.createResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 提交菜单授权 - tags: - - API.admin - /api/admin/menu/{id}: - get: - consumes: - - application/x-www-form-urlencoded - description: 菜单授权列表 - parameters: - - description: hashId - in: path - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/admin.listAdminMenuResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 菜单授权列表 - tags: - - API.admin - /api/admin/modify_password: - patch: - consumes: - - application/x-www-form-urlencoded - description: 修改密码 - parameters: - - description: 旧密码 - in: formData - name: old_password - required: true - type: string - - description: 新密码 - in: formData - name: new_password - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/admin.modifyPasswordResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 修改密码 - tags: - - API.admin - /api/admin/modify_personal_info: - patch: - consumes: - - application/x-www-form-urlencoded - description: 修改个人信息 - parameters: - - description: 昵称 - in: formData - name: nickname - required: true - type: string - - description: 手机号 - in: formData - name: mobile - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/admin.modifyPersonalInfoResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 修改个人信息 - tags: - - API.admin - /api/admin/offline: - patch: - consumes: - - application/x-www-form-urlencoded - description: 下线管理员 - parameters: - - description: Hashid - in: formData - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/admin.offlineResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 下线管理员 - tags: - - API.admin - /api/admin/reset_password/{id}: - patch: - consumes: - - application/json - description: 重置密码 - parameters: - - description: hashId - in: path - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/admin.resetPasswordResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 重置密码 - tags: - - API.admin - /api/admin/used: - patch: - consumes: - - application/x-www-form-urlencoded - description: 更新管理员为启用/禁用 - parameters: - - description: Hashid - in: formData - name: id - required: true - type: string - - description: 是否启用 1:是 -1:否 - in: formData - name: used - required: true - type: integer - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/admin.updateUsedResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 更新管理员为启用/禁用 - tags: - - API.admin - /api/authorized: - get: - consumes: - - application/x-www-form-urlencoded - description: 调用方列表 - parameters: - - default: 1 - description: 第几页 - in: query - name: page - required: true - type: integer - - default: 10 - description: 每页显示条数 - in: query - name: page_size - required: true - type: integer - - description: 调用方key - in: query - name: business_key - type: string - - description: 调用方secret - in: query - name: business_secret - type: string - - description: 调用方对接人 - in: query - name: business_developer - type: string - - description: 备注 - in: path - name: remark - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/authorized.listResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 调用方列表 - tags: - - API.authorized - post: - consumes: - - application/x-www-form-urlencoded - description: 新增调用方 - parameters: - - description: 调用方key - in: formData - name: business_key - required: true - type: string - - description: 调用方对接人 - in: formData - name: business_developer - required: true - type: string - - description: 备注 - in: formData - name: remark - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/authorized.createResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 新增调用方 - tags: - - API.authorized - /api/authorized/{id}: - delete: - consumes: - - application/json - description: 删除调用方 - parameters: - - description: hashId - in: path - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/authorized.deleteResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 删除调用方 - tags: - - API.authorized - /api/authorized/used: - patch: - consumes: - - application/x-www-form-urlencoded - description: 更新调用方为启用/禁用 - parameters: - - description: hashID - in: formData - name: id - required: true - type: string - - description: 是否启用 1:是 -1:否 - in: formData - name: used - required: true - type: integer - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/authorized.updateUsedResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 更新调用方为启用/禁用 - tags: - - API.authorized - /api/authorized_api: - get: - consumes: - - application/x-www-form-urlencoded - description: 调用方接口地址列表 - parameters: - - description: hashID - in: query - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/authorized.listAPIResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 调用方接口地址列表 - tags: - - API.authorized - post: - consumes: - - application/x-www-form-urlencoded - description: 授权调用方接口地址 - parameters: - - description: HashID - in: formData - name: id - required: true - type: string - - description: 请求方法 - in: formData - name: method - required: true - type: string - - description: 请求地址 - in: formData - name: api - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/authorized.createAPIResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 授权调用方接口地址 - tags: - - API.authorized - /api/authorized_api/{id}: - delete: - consumes: - - application/json - description: 删除调用方接口地址 - parameters: - - description: 主键ID - in: path - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/authorized.deleteAPIResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 删除调用方接口地址 - tags: - - API.authorized - /api/category: - get: - consumes: - - application/x-www-form-urlencoded - description: 分类列表 - parameters: - - description: 请求信息 - in: body - name: Request - required: true - schema: - $ref: '#/definitions/category.listRequest' - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/category.listResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - summary: 分类列表 - tags: - - API.category - post: - consumes: - - application/x-www-form-urlencoded - description: 创建/编辑分类 - parameters: - - description: 请求信息 - in: body - name: Request - required: true - schema: - $ref: '#/definitions/category.createRequest' - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/category.createResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 创建/编辑分类 - tags: - - API.category - /api/category/{id}: - delete: - consumes: - - application/json - description: 删除分类 - parameters: - - description: id - in: path - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/category.deleteResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 删除分类 - tags: - - API.category - get: - consumes: - - application/x-www-form-urlencoded - description: 分类详情 - parameters: - - description: hashId - in: path - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/category.detailResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 分类详情 - tags: - - API.category - /api/category/sort: - patch: - consumes: - - application/x-www-form-urlencoded - description: 更新分类排序 - parameters: - - description: hashId - in: formData - name: id - required: true - type: string - - description: 排序 - in: formData - name: sort - required: true - type: integer - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/category.updateSortResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 更新分类排序 - tags: - - API.category - /api/category/used: - patch: - consumes: - - application/x-www-form-urlencoded - description: 更新分类为启用/禁用 - parameters: - - description: hashId - in: formData - name: id - required: true - type: string - - description: 是否启用 1:是 -1:否 - in: formData - name: used - required: true - type: integer - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/category.updateUsedResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 更新分类为启用/禁用 - tags: - - API.category - /api/config/email: - patch: - consumes: - - application/x-www-form-urlencoded - description: 修改邮件配置 - parameters: - - description: 邮箱服务器 - in: formData - name: host - required: true - type: string - - description: 端口 - in: formData - name: port - required: true - type: string - - description: 发件人邮箱 - in: formData - name: user - required: true - type: string - - description: 发件人密码 - in: formData - name: pass - required: true - type: string - - description: 收件人邮箱地址,多个用,分割 - in: formData - name: to - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/config.emailResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 修改邮件配置 - tags: - - API.config - /api/cron: - get: - consumes: - - application/x-www-form-urlencoded - description: 任务列表 - parameters: - - default: 1 - description: 第几页 - in: query - name: page - required: true - type: integer - - default: 10 - description: 每页显示条数 - in: query - name: page_size - required: true - type: integer - - description: 任务名称 - in: query - name: name - type: string - - description: 执行方式 1:shell 2:http - in: query - name: protocol - type: integer - - description: 是否启用 1:是 -1:否 - in: query - name: is_used - type: integer - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/cron.listResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 任务列表 - tags: - - API.cron - post: - consumes: - - application/x-www-form-urlencoded - description: 创建任务 - parameters: - - description: 任务名称 - in: formData - name: name - required: true - type: string - - description: crontab 表达式 - in: formData - name: spec - required: true - type: string - - description: 执行命令 - in: formData - name: command - required: true - type: string - - description: 执行方式 1:shell 2:http - in: formData - name: protocol - required: true - type: integer - - description: http 请求方式 1:get 2:post - in: formData - name: http_method - type: integer - - description: 超时时间(单位:秒) - in: formData - name: timeout - required: true - type: integer - - description: 重试次数 - in: formData - name: retry_times - required: true - type: integer - - description: 重试间隔(单位:秒) - in: formData - name: retry_interval - required: true - type: integer - - description: 执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知 - in: formData - name: notify_status - required: true - type: integer - - description: 通知类型 1:邮件 2:webhook - in: formData - name: notify_type - type: integer - - description: 通知者邮箱地址(多个用,分割) - in: formData - name: notify_receiver_email - type: string - - description: 通知匹配关键字(多个用,分割) - in: formData - name: notify_keyword - type: string - - description: 备注 - in: formData - name: remark - type: string - - description: 是否启用 1:是 -1:否 - in: formData - name: is_used - required: true - type: integer - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/cron.createResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 创建任务 - tags: - - API.cron - /api/cron/{id}: - get: - consumes: - - application/json - description: 获取单条任务详情 - parameters: - - description: hashId - in: path - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/cron.detailResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 获取单条任务详情 - tags: - - API.cron - post: - consumes: - - application/x-www-form-urlencoded - description: 编辑任务 - parameters: - - description: hashID - in: formData - name: id - required: true - type: string - - description: 任务名称 - in: formData - name: name - required: true - type: string - - description: crontab 表达式 - in: formData - name: spec - required: true - type: string - - description: 执行命令 - in: formData - name: command - required: true - type: string - - description: 执行方式 1:shell 2:http - in: formData - name: protocol - required: true - type: integer - - description: http 请求方式 1:get 2:post - in: formData - name: http_method - type: integer - - description: 超时时间(单位:秒) - in: formData - name: timeout - required: true - type: integer - - description: 重试次数 - in: formData - name: retry_times - required: true - type: integer - - description: 重试间隔(单位:秒) - in: formData - name: retry_interval - required: true - type: integer - - description: 执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知 - in: formData - name: notify_status - required: true - type: integer - - description: 通知类型 1:邮件 2:webhook - in: formData - name: notify_type - type: integer - - description: 通知者邮箱地址(多个用,分割) - in: formData - name: notify_receiver_email - type: string - - description: 通知匹配关键字(多个用,分割) - in: formData - name: notify_keyword - type: string - - description: 备注 - in: formData - name: remark - type: string - - description: 是否启用 1:是 -1:否 - in: formData - name: is_used - required: true - type: integer - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/cron.modifyResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 编辑任务 - tags: - - API.cron - /api/cron/exec/{id}: - patch: - consumes: - - application/json - description: 手动执行单条任务 - parameters: - - description: hashId - in: path - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/cron.detailResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 手动执行单条任务 - tags: - - API.cron - /api/cron/used: - patch: - consumes: - - application/x-www-form-urlencoded - description: 更新任务为启用/禁用 - parameters: - - description: hashID - in: formData - name: id - required: true - type: string - - description: 是否启用 1:是 -1:否 - in: formData - name: used - required: true - type: integer - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/cron.updateUsedResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 更新任务为启用/禁用 - tags: - - API.cron - /api/login: - post: - consumes: - - application/x-www-form-urlencoded - description: 管理员登录 - parameters: - - description: 用户名 - in: formData - name: username - required: true - type: string - - description: MD5后的密码 - in: formData - name: password - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/admin.loginResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 管理员登录 - tags: - - API.admin - /api/menu: - get: - consumes: - - application/x-www-form-urlencoded - description: 菜单列表 - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/menu.listResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 菜单列表 - tags: - - API.menu - post: - consumes: - - application/x-www-form-urlencoded - description: 创建/编辑菜单 - parameters: - - description: 请求信息 - in: body - name: Request - required: true - schema: - $ref: '#/definitions/menu.createRequest' - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/menu.createResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 创建/编辑菜单 - tags: - - API.menu - /api/menu/{id}: - delete: - consumes: - - application/json - description: 删除菜单 - parameters: - - description: hashId - in: path - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/menu.deleteResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 删除菜单 - tags: - - API.menu +host: localhost:8000 +info: + contact: + email: support@swagger.io + name: API Support + url: http://www.swagger.io/support + description: This is a sample server celler server. + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + termsOfService: http://swagger.io/terms/ + title: webstack-go API + version: 1.0.0 +paths: + /api/admin/category: get: consumes: - - application/x-www-form-urlencoded - description: 菜单详情 - parameters: - - description: hashId - in: path - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/menu.detailResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 菜单详情 - tags: - - API.menu - /api/menu/sort: - patch: - consumes: - - application/x-www-form-urlencoded - description: 更新菜单排序 - parameters: - - description: hashId - in: formData - name: id - required: true - type: string - - description: 排序 - in: formData - name: sort - required: true - type: integer - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/menu.updateSortResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 更新菜单排序 - tags: - - API.menu - /api/menu/used: - patch: - consumes: - - application/x-www-form-urlencoded - description: 更新菜单为启用/禁用 - parameters: - - description: hashId - in: formData - name: id - required: true - type: string - - description: 是否启用 1:是 -1:否 - in: formData - name: used - required: true - type: integer - produces: - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/menu.updateUsedResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 更新菜单为启用/禁用 - tags: - - API.menu - /api/menu_action: - get: - consumes: - - application/x-www-form-urlencoded - description: 功能权限列表 - parameters: - - description: hashID - in: query - name: id - required: true - type: string + description: 列表分类 produces: - application/json responses: "200": description: OK schema: - $ref: '#/definitions/menu.listActionResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 功能权限列表 + $ref: '#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryListResp' + summary: 列表分类 tags: - - API.menu + - 分类模块 post: consumes: - - application/x-www-form-urlencoded - description: 创建功能权限 - parameters: - - description: HashID - in: formData - name: id - required: true - type: string - - description: 请求方法 - in: formData - name: method - required: true - type: string - - description: 请求地址 - in: formData - name: api - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/menu.createActionResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 创建功能权限 - tags: - - API.menu - /api/menu_action/{id}: - delete: - consumes: - - application/json - description: 删除功能权限 - parameters: - - description: hashId - in: path - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/menu.deleteActionResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 删除功能权限 - tags: - - API.menu - /api/site: - get: - consumes: - - application/x-www-form-urlencoded - description: 网站列表 - parameters: - - description: 请求信息 - in: body - name: Request - required: true - schema: - $ref: '#/definitions/site.listRequest' - produces: - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/site.listResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - summary: 网站列表 - tags: - - API.site - post: - consumes: - - application/x-www-form-urlencoded - description: 创建网站 + description: 新增分类 parameters: - - description: 请求信息 + - description: params in: body - name: Request + name: request required: true schema: - $ref: '#/definitions/site.createRequest' - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/site.createResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - summary: 创建网站 - tags: - - API.site - put: - consumes: - - application/x-www-form-urlencoded - description: 编辑网站 - parameters: - - description: 网站分类id - in: formData - name: categoryId - type: integer - - description: 网站描述 - in: formData - name: description - type: string - - in: formData - name: id - type: integer - - description: 网站 logo - in: formData - name: thumb - type: string - - description: 网站标题 - in: formData - name: title - type: string - - description: 网站地址 - in: formData - name: url - type: string + $ref: '#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryCreateReq' produces: - application/json responses: "200": description: OK schema: - $ref: '#/definitions/site.updateSiteResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - summary: 编辑网站 + $ref: '#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryCreateResp' + summary: 新增分类 tags: - - API.site - /api/site/{id}: + - 分类模块 + /api/admin/category/:id: delete: consumes: - - application/x-www-form-urlencoded - description: 删除网站信息 + - application/json + description: 删除分类 parameters: - - description: 请求信息 + - description: params in: body - name: Request + name: request required: true schema: - $ref: '#/definitions/site.deleteRequest' + $ref: '#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryDeleteReq' produces: - application/json responses: "200": description: OK schema: - $ref: '#/definitions/site.deleteResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - summary: 删除网站信息 + $ref: '#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryDeleteResp' + summary: 删除分类 tags: - - API.site - /api/site/category: + - 分类模块 get: consumes: - - application/x-www-form-urlencoded - description: 网站列列表-新增列表分类下拉框数据 - parameters: - - description: 请求信息 - in: body - name: Request - required: true - schema: - $ref: '#/definitions/site.listRequest' - produces: - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/site.listResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - summary: 网站列列表-新增列表分类下拉框数据 - tags: - - API.site - /api/site/used: - patch: - consumes: - - application/x-www-form-urlencoded - description: 更新网站为启用/禁用 + description: 详情分类 parameters: - - description: 请求信息 + - description: params in: body - name: Request + name: request required: true schema: - $ref: '#/definitions/site.updateUsedRequest' - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/site.updateUsedResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - summary: 更新网站为启用/禁用 - tags: - - API.site - /api/tool/cache/clear: - patch: - consumes: - - application/x-www-form-urlencoded - description: 清空缓存 - parameters: - - description: Redis Key - in: formData - name: redis_key - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/tool.searchCacheResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 清空缓存 - tags: - - API.tool - /api/tool/cache/search: - post: - consumes: - - application/x-www-form-urlencoded - description: 查询缓存 - parameters: - - description: Redis Key - in: formData - name: redis_key - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/tool.searchCacheResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 查询缓存 - tags: - - API.tool - /api/tool/data/dbs: - get: - consumes: - - application/x-www-form-urlencoded - description: 查询 DB - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/tool.dbsResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 查询 DB - tags: - - API.tool - /api/tool/data/mysql: - post: - consumes: - - application/x-www-form-urlencoded - description: 执行 SQL 语句 - parameters: - - description: 数据库名称 - in: formData - name: db_name - required: true - type: string - - description: 数据表名称 - in: formData - name: table_name - required: true - type: string - - description: SQL 语句 - in: formData - name: sql - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/tool.searchMySQLResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 执行 SQL 语句 - tags: - - API.tool - /api/tool/data/tables: - post: - consumes: - - application/x-www-form-urlencoded - description: 查询 Table - parameters: - - description: 数据库名称 - in: formData - name: db_name - required: true - type: string + $ref: '#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryDetailReq' produces: - application/json responses: "200": description: OK schema: - $ref: '#/definitions/tool.tablesResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 查询 Table - tags: - - API.tool - /api/tool/hashids/decode/{id}: - get: - consumes: - - application/x-www-form-urlencoded - description: HashIds 解密 - parameters: - - description: 需解密的密文 - in: path - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/tool.hashIdsDecodeResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: HashIds 解密 - tags: - - API.tool - /api/tool/hashids/encode/{id}: - get: - consumes: - - application/x-www-form-urlencoded - description: HashIds 加密 - parameters: - - description: 需加密的数字 - in: path - name: id - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/tool.hashIdsEncodeResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: HashIds 加密 - tags: - - API.tool - /api/tool/send_message: - post: - consumes: - - application/x-www-form-urlencoded - description: 发送消息 - parameters: - - description: 消息内容 - in: formData - name: message - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/tool.sendMessageResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - security: - - LoginToken: [] - summary: 发送消息 + $ref: '#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryDetailResp' + summary: 详情分类 tags: - - API.tool - /helper/md5/{str}: - get: + - 分类模块 + /api/admin/category/update: + put: consumes: - - application/x-www-form-urlencoded - description: 加密 - parameters: - - description: 需要加密的字符串 - in: path - name: str - required: true - type: string - produces: - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/helper.md5Response' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - summary: 加密 - tags: - - Helper - /helper/sign: - post: - consumes: - - application/x-www-form-urlencoded - description: 签名 + description: 更新分类 parameters: - - description: 调用方 KEY - in: formData - name: key - required: true - type: string - - description: 请求路径 (不附带 querystring),例如:/api/login - in: formData - name: path - required: true - type: string - - description: 请求方式,例如:POST - in: formData - name: method - required: true - type: string - - description: 请求参数,例如:username=tom&password=123456 - in: formData - name: params + - description: params + in: body + name: request required: true - type: string + schema: + $ref: '#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryUpdateReq' produces: - application/json responses: "200": description: OK schema: - $ref: '#/definitions/helper.signResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/code.Failure' - summary: 签名 + $ref: '#/definitions/github_com_ch3nnn_webstack-go_api_v1.CategoryUpdateResp' + summary: 更新分类 tags: - - Helper + - 分类模块 securityDefinitions: - LoginToken: + Bearer: in: header - name: token + name: Authorization type: apiKey swagger: "2.0" diff --git a/go.mod b/go.mod index 8f48326..725a2af 100644 --- a/go.mod +++ b/go.mod @@ -1,41 +1,30 @@ module github.com/ch3nnn/webstack-go -go 1.20 +go 1.22 require ( - github.com/99designs/gqlgen v0.17.49 - github.com/dave/dst v0.26.2 github.com/duke-git/lancet/v2 v2.3.1 - github.com/fsnotify/fsnotify v1.5.1 - github.com/gin-contrib/pprof v1.3.0 - github.com/gin-gonic/gin v1.9.1 - github.com/go-playground/locales v0.14.1 - github.com/go-playground/universal-translator v0.18.1 - github.com/go-playground/validator/v10 v10.14.0 - github.com/go-redis/redis/v7 v7.4.1 + github.com/dustin/go-humanize v1.0.1 + github.com/gin-gonic/gin v1.10.0 + github.com/glebarez/sqlite v1.11.0 github.com/gocolly/colly v1.2.0 - github.com/gorilla/websocket v1.5.0 - github.com/jakecoffman/cron v0.0.0-20190106200828-7e2009c226a5 + github.com/golang-jwt/jwt/v5 v5.2.1 + github.com/google/wire v0.6.0 github.com/mat/besticon v0.0.0-20230308222644-ee1fe52e97c1 - github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.11.1 - github.com/rs/cors v1.8.0 github.com/shirou/gopsutil v3.21.11+incompatible - github.com/speps/go-hashids v1.0.0 - github.com/spf13/cast v1.4.1 - github.com/spf13/viper v1.9.0 - github.com/swaggo/gin-swagger v1.3.3 - github.com/swaggo/swag v1.7.4 - github.com/vektah/gqlparser/v2 v2.5.16 - go.uber.org/multierr v1.7.0 - go.uber.org/zap v1.19.1 - golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 - gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df - gopkg.in/natefinch/lumberjack.v2 v2.0.0 - gorm.io/driver/mysql v1.4.4 - gorm.io/gen v0.3.22 - gorm.io/gorm v1.24.2 - gorm.io/plugin/dbresolver v1.3.0 + github.com/sony/sonyflake v1.2.0 + github.com/spf13/viper v1.18.2 + github.com/swaggo/files v1.0.1 + github.com/swaggo/gin-swagger v1.6.0 + github.com/swaggo/swag v1.16.3 + go.uber.org/zap v1.27.0 + golang.org/x/sync v0.6.0 + gopkg.in/natefinch/lumberjack.v2 v2.2.1 + gorm.io/driver/mysql v1.5.6 + gorm.io/driver/postgres v1.5.7 + gorm.io/gen v0.3.26 + gorm.io/gorm v1.25.9 + gorm.io/plugin/dbresolver v1.5.1 ) require ( @@ -43,80 +32,86 @@ require ( github.com/PuerkitoBio/goquery v1.9.2 // indirect github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/agnivade/levenshtein v1.1.1 // indirect github.com/andybalholm/cascadia v1.3.2 // indirect - github.com/antchfx/htmlquery v1.3.0 // indirect - github.com/antchfx/xmlquery v1.3.15 // indirect - github.com/antchfx/xpath v1.2.3 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bytedance/sonic v1.9.1 // indirect - github.com/cespare/xxhash/v2 v2.1.1 // indirect - github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect - github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/antchfx/htmlquery v1.3.1 // indirect + github.com/antchfx/xmlquery v1.4.0 // indirect + github.com/antchfx/xpath v1.3.0 // indirect + github.com/bytedance/sonic v1.11.6 // indirect + github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect + github.com/glebarez/go-sqlite v1.21.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.5 // indirect - github.com/go-openapi/spec v0.20.3 // indirect - github.com/go-openapi/swag v0.19.14 // indirect + github.com/go-openapi/jsonreference v0.19.6 // indirect + github.com/go-openapi/spec v0.20.4 // indirect + github.com/go-openapi/swag v0.19.15 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.20.0 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.4.3 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kennygrant/sanitize v1.2.4 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect - github.com/kr/pretty v0.3.0 // indirect - github.com/leodido/go-urn v1.2.4 // indirect - github.com/magiconair/properties v1.8.5 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.6 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/mattn/go-sqlite3 v1.14.17 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pelletier/go-toml v1.9.4 // indirect - github.com/pelletier/go-toml/v2 v2.0.8 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.26.0 // indirect - github.com/prometheus/procfs v0.6.0 // indirect - github.com/rogpeppe/go-internal v1.8.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d // indirect - github.com/sosodev/duration v1.3.1 // indirect - github.com/spf13/afero v1.6.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/subosito/gotenv v1.2.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect github.com/temoto/robotstxt v1.1.2 // indirect - github.com/tklauser/go-sysconf v0.3.9 // indirect - github.com/tklauser/numcpus v0.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.14 // indirect + github.com/tklauser/numcpus v0.8.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - github.com/ugorji/go/codec v1.2.11 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.uber.org/atomic v1.7.0 // indirect - golang.org/x/arch v0.3.0 // indirect - golang.org/x/crypto v0.24.0 // indirect - golang.org/x/image v0.18.0 // indirect - golang.org/x/mod v0.18.0 // indirect - golang.org/x/net v0.26.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.21.0 // indirect - golang.org/x/text v0.16.0 // indirect - golang.org/x/tools v0.22.0 // indirect - google.golang.org/appengine v1.6.7 // indirect + go.uber.org/multierr v1.10.0 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/image v0.16.0 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect + golang.org/x/tools v0.17.0 // indirect + google.golang.org/appengine v1.6.8 // indirect google.golang.org/protobuf v1.34.1 // indirect - gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect - gopkg.in/ini.v1 v1.63.2 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gorm.io/datatypes v1.1.1-0.20230130040222-c43177d3cf8c // indirect gorm.io/hints v1.1.0 // indirect + modernc.org/libc v1.22.5 // indirect + modernc.org/mathutil v1.5.0 // indirect + modernc.org/memory v1.5.0 // indirect + modernc.org/sqlite v1.23.1 // indirect + ) diff --git a/go.sum b/go.sum index add83f7..fb23127 100644 --- a/go.sum +++ b/go.sum @@ -1,324 +1,113 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/99designs/gqlgen v0.17.49 h1:b3hNGexHd33fBSAd4NDT/c3NCcQzcAVkknhN9ym36YQ= -github.com/99designs/gqlgen v0.17.49/go.mod h1:tC8YFVZMed81x7UJ7ORUwXF4Kn6SXuucFqQBhN8+BU0= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/goquery v1.9.2 h1:4/wZksC3KgkQw7SQgkKotmKljk0M6V8TUvA8Wb4yPeE= github.com/PuerkitoBio/goquery v1.9.2/go.mod h1:GHPCaP0ODyyxqcNoFGYlAprUFH81NuRPd0GX3Zu2Mvk= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= -github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= -github.com/antchfx/htmlquery v1.3.0 h1:5I5yNFOVI+egyia5F2s/5Do2nFWxJz41Tr3DyfKD25E= -github.com/antchfx/htmlquery v1.3.0/go.mod h1:zKPDVTMhfOmcwxheXUsx4rKJy8KEY/PU6eXr/2SebQ8= -github.com/antchfx/xmlquery v1.3.15 h1:aJConNMi1sMha5G8YJoAIF5P+H+qG1L73bSItWHo8Tw= -github.com/antchfx/xmlquery v1.3.15/go.mod h1:zMDv5tIGjOxY/JCNNinnle7V/EwthZ5IT8eeCGJKRWA= -github.com/antchfx/xpath v1.2.3 h1:CCZWOzv5bAqjVv0offZ2LVgVYFbeldKQVuLNbViZdes= -github.com/antchfx/xpath v1.2.3/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= -github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= -github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/antchfx/htmlquery v1.3.1 h1:wm0LxjLMsZhRHfQKKZscDf2COyH4vDYA3wyH+qZ+Ylc= +github.com/antchfx/htmlquery v1.3.1/go.mod h1:PTj+f1V2zksPlwNt7uVvZPsxpKNa7mlVliCRxLX6Nx8= +github.com/antchfx/xmlquery v1.4.0 h1:xg2HkfcRK2TeTbdb0m1jxCYnvsPaGY/oeZWTGqX/0hA= +github.com/antchfx/xmlquery v1.4.0/go.mod h1:Ax2aeaeDjfIw3CwXKDQ0GkwZ6QlxoChlIBP+mGnDFjI= +github.com/antchfx/xpath v1.3.0 h1:nTMlzGAK3IJ0bPpME2urTuFL76o4A96iYvoKFHRXJgc= +github.com/antchfx/xpath v1.3.0/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= +github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= +github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/dave/dst v0.26.2 h1:lnxLAKI3tx7MgLNVDirFCsDTlTG9nKTk7GcptKcWSwY= -github.com/dave/dst v0.26.2/go.mod h1:UMDJuIRPfyUCC78eFuB+SV/WI8oDeyFDvM/JR6NI3IU= -github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ= -github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -github.com/dave/kerr v0.0.0-20170318121727-bc25dd6abe8e/go.mod h1:qZqlPyPvfsDJt+3wHJ1EvSXDuVjFTK0j2p/ca+gtsb8= -github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWEmXBA= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+UbP35JkH8yB7MYb4q/qhBarqZE6g= -github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/duke-git/lancet/v2 v2.3.1 h1:cYZHQp57CZKP41EFkV/7TGbUrmhjaPMI5vi3Q+9KJNo= github.com/duke-git/lancet/v2 v2.3.1/go.mod h1:zGa2R4xswg6EG9I6WnyubDbFO/+A/RROxIbXcwryTsc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/gzip v0.0.3 h1:etUaeesHhEORpZMp18zoOhepboiWnFtXrBZxszWUn4k= -github.com/gin-contrib/gzip v0.0.3/go.mod h1:YxxswVZIqOvcHEQpsSn+QF5guQtO1dCfy0shBPy4jFc= -github.com/gin-contrib/pprof v1.3.0 h1:G9eK6HnbkSqDZBYbzG4wrjCsA4e+cvYAHUZw6W+W9K0= -github.com/gin-contrib/pprof v1.3.0/go.mod h1:waMjT1H9b179t3CxuG1cV3DHpga6ybizwfBaM5OXaB0= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= +github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= -github.com/gin-gonic/gin v1.6.2/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= -github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo= +github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k= +github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= +github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/spec v0.20.3 h1:uH9RQ6vdyPSs2pSy9fL8QPspDF2AMIMPtmK5coSSjtQ= -github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= +github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= +github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M= +github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= -github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-redis/redis/v7 v7.4.1 h1:PASvf36gyUpr2zdOUS/9Zqc80GbM+9BDyiJSJDDOrTI= -github.com/go-redis/redis/v7 v7.4.1/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gocolly/colly v1.2.0 h1:qRz9YAn8FIH0qzgNUw+HT9UN7wm1oF9OBAilwEWpyrI= github.com/gocolly/colly v1.2.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181127221834-b4f47329b966/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= -github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI= +github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= -github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys= -github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= -github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w= -github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E= -github.com/jakecoffman/cron v0.0.0-20190106200828-7e2009c226a5 h1:kCvm3G3u+eTRbjfLPyfsfznJtraYEfZer/UvQ6CaQhI= -github.com/jakecoffman/cron v0.0.0-20190106200828-7e2009c226a5/go.mod h1:6DM2KNNK69jRu0lAHmYK9LYxmqpNjYHOaNp/ZxttD4U= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY= +github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= @@ -327,724 +116,248 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o= github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mat/besticon v0.0.0-20230308222644-ee1fe52e97c1 h1:Hwn3LA5GjxIavXkW5ny5mi2Umh4GG359REkLMyKYCLA= github.com/mat/besticon v0.0.0-20230308222644-ee1fe52e97c1/go.mod h1:g6h/HytyCid7yJPf9pDi6XHgrq9FULjQn1gd7OcoWUs= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= +github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/microsoft/go-mssqldb v0.17.0 h1:Fto83dMZPnYv1Zwx5vHHxpNraeEaUlQ/hhHLgZiaenE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/microsoft/go-mssqldb v0.17.0/go.mod h1:OkoNGhGEs8EZqchVTtochlXruEhEOaO4S0d2sB5aeGQ= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rs/cors v1.8.0 h1:P2KMzcFwrPoSjkF1WLRPsp3UMLyql8L4v9hQpVeK5so= -github.com/rs/cors v1.8.0/go.mod h1:EBwu+T5AvHOcXwvZIkQFjUN6s8Czyqw12GL/Y0tUyRM= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d h1:hrujxIzL1woJ7AwssoOcM/tq5JjjG2yYOc8odClEiXA= github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4= -github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/speps/go-hashids v1.0.0 h1:jdFC07PrExRM4Og5Ev4411Tox75aFpkC77NlmutadNI= -github.com/speps/go-hashids v1.0.0/go.mod h1:P7hqPzMdnZOfyIk+xrlG1QaSMw+gCBdHKsBDnhpaZvc= -github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/sony/sonyflake v1.2.0 h1:Pfr3A+ejSg+0SPqpoAmQgEtNDAhc2G1SUYk205qVMLQ= +github.com/sony/sonyflake v1.2.0/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV9txy/Y= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.9.0 h1:yR6EXjTp0y0cLN8OZg1CRZmOBdI88UcGkhgyJhu6nZk= -github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E= -github.com/swaggo/gin-swagger v1.3.3 h1:XHyYmeNVFG5PbyWHG4jXtxOm2P4kiZapDCWsyDDiQ/I= -github.com/swaggo/gin-swagger v1.3.3/go.mod h1:ymsZuGpbbu+S7ZoQ49QPpZoDBj6uqhb8WizgQPVgWl0= -github.com/swaggo/swag v1.7.4 h1:up+ixy8yOqJKiFcuhMgkuYuF4xnevuhnFAXXF8OSfNg= -github.com/swaggo/swag v1.7.4/go.mod h1:zD8h6h4SPv7t3l+4BKdRquqW1ASWjKZgT6Qv9z3kNqI= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE= +github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg= +github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M= +github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo= +github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg= +github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk= github.com/temoto/robotstxt v1.1.2 h1:W2pOjSJ6SWvldyEuiFXNxz3xZ8aiWX5LbfDiOFd7Fxg= github.com/temoto/robotstxt v1.1.2/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo= -github.com/tklauser/go-sysconf v0.3.9 h1:JeUVdAOWhhxVcU6Eqr/ATFHgXk/mmiItdKeJPev3vTo= -github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= -github.com/tklauser/numcpus v0.3.0 h1:ILuRUQBtssgnxw0XXIjKUC56fgnOrFoQQ/4+DeU2biQ= -github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= +github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= +github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= +github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= +github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/vektah/gqlparser/v2 v2.5.16 h1:1gcmLTvs3JLKXckwCwlUagVn/IlV2bwqle0vJ0vy5p8= -github.com/vektah/gqlparser/v2 v2.5.16/go.mod h1:1lz1OeCqgQbQepsGxPVywrjdBHW2T08PUS3pJqepRww= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -golang.org/x/arch v0.0.0-20180920145803-b19384d3c130/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= -golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= -golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/image v0.16.0 h1:9kloLAKhUufZhA12l5fwnx2NZW39/we1UhBesW433jw= +golang.org/x/image v0.16.0/go.mod h1:ugSZItdV4nOxyqp56HmXwH0Ry0nBCpjnZdpDaIHdoPs= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 h1:GZokNIeuVkl3aZHJchRrr13WCsols02MLUcz1U9is6M= -golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= -gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= -gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= -gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= -gopkg.in/ini.v1 v1.63.2 h1:tGK/CyBg7SMzb60vP1M03vNZ3VDu3wGQJwn7Sxi9r3c= -gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/src-d/go-billy.v4 v4.3.0/go.mod h1:tm33zBoOwxjYHZIE+OV8bxTWFMJLrconzFMd38aARFk= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/datatypes v1.1.1-0.20230130040222-c43177d3cf8c h1:jWdr7cHgl8c/ua5vYbR2WhSp+NQmzhsj0xoY3foTzW8= gorm.io/datatypes v1.1.1-0.20230130040222-c43177d3cf8c/go.mod h1:SH2K9R+2RMjuX1CkCONrPwoe9JzVv2hkQvEu4bXGojE= -gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U= -gorm.io/driver/mysql v1.4.4 h1:MX0K9Qvy0Na4o7qSC/YI7XxqUw5KDw01umqgID+svdQ= -gorm.io/driver/mysql v1.4.4/go.mod h1:BCg8cKI+R0j/rZRQxeKis/forqRwRSYOR8OM3Wo6hOM= -gorm.io/driver/postgres v1.4.5 h1:mTeXTTtHAgnS9PgmhN2YeUbazYpLhUI1doLnw42XUZc= +gorm.io/driver/mysql v1.4.3/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c= +gorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8= +gorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/driver/postgres v1.5.7 h1:8ptbNJTDbEmhdr62uReG5BGkdQyeasu/FZHxI0IMGnM= +gorm.io/driver/postgres v1.5.7/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA= gorm.io/driver/sqlite v1.1.6/go.mod h1:W8LmC/6UvVbHKah0+QOC7Ja66EaZXHwUTjgXY8YNWX8= gorm.io/driver/sqlite v1.4.3 h1:HBBcZSDnWi5BW3B3rwvVTc510KGkBkexlOg0QrmLUuU= +gorm.io/driver/sqlite v1.4.3/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= gorm.io/driver/sqlserver v1.4.1 h1:t4r4r6Jam5E6ejqP7N82qAJIJAht27EGT41HyPfXRw0= -gorm.io/gen v0.3.22 h1:K7u5tCyaZfe1cbQFD8N2xrTqUuqximNFSRl7zOFPq+M= -gorm.io/gen v0.3.22/go.mod h1:dQcELeF/7Kf82M6AQF+O/rKT5r1sjv49TlGz0cerPn4= +gorm.io/driver/sqlserver v1.4.1/go.mod h1:DJ4P+MeZbc5rvY58PnmN1Lnyvb5gw5NPzGshHDnJLig= +gorm.io/gen v0.3.26 h1:sFf1j7vNStimPRRAtH4zz5NiHM+1dr6eA9aaRdplyhY= +gorm.io/gen v0.3.26/go.mod h1:a5lq5y3w4g5LMxBcw0wnO6tYUCdNutWODq5LrIt75LE= gorm.io/gorm v1.21.15/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= gorm.io/gorm v1.22.2/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= -gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/gorm v1.24.2 h1:9wR6CFD+G8nOusLdvkZelOEhpJVwwHzpQOUM+REd6U0= -gorm.io/gorm v1.24.2/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.9 h1:wct0gxZIELDk8+ZqF/MVnHLkA1rvYlBWUMv2EdsK1g8= +gorm.io/gorm v1.25.9/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= gorm.io/hints v1.1.0 h1:Lp4z3rxREufSdxn4qmkK3TLDltrM10FLTHiuqwDPvXw= gorm.io/hints v1.1.0/go.mod h1:lKQ0JjySsPBj3uslFzY3JhYDtqEwzm+G1hv8rWujB6Y= -gorm.io/plugin/dbresolver v1.3.0 h1:uFDX3bIuH9Lhj5LY2oyqR/bU6pqWuDgas35NAPF4X3M= -gorm.io/plugin/dbresolver v1.3.0/go.mod h1:Pr7p5+JFlgDaiM6sOrli5olekJD16YRunMyA2S7ZfKk= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +gorm.io/plugin/dbresolver v1.5.1 h1:s9Dj9f7r+1rE3nx/Ywzc85nXptUEaeOO0pt27xdopM8= +gorm.io/plugin/dbresolver v1.5.1/go.mod h1:l4Cn87EHLEYuqUncpEeTC2tTJQkjngPSD+lo8hIvcT0= +modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= +modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM= +modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/gqlgen.yml b/gqlgen.yml deleted file mode 100755 index fb5343d..0000000 --- a/gqlgen.yml +++ /dev/null @@ -1,56 +0,0 @@ -# Where are all the schema files located? globs are supported eg src/**/*.graphqls -schema: - - internal/graph/schemas/*.graphql - -# Where should the generated server code go? -exec: - filename: internal/graph/generated/generated.go - package: generated - -# Uncomment to enable federation -# federation: -# filename: graph/generated/federation.go -# package: generated - -# Where should any generated models go? -model: - filename: internal/graph/model/generated.go - package: model - -# Where should the resolver implementations go? -resolver: - filename: internal/graph/resolvers/generated/generated.go - type: Resolver - package: resolvers - -# Optional: turn on use `gqlgen:"fieldName"` tags in your models -# struct_tag: json - -# Optional: turn on to use []Thing instead of []*Thing -# omit_slice_element_pointers: false - -# Optional: set to speed up generation time by not performing a final validation pass. -# skip_validation: true - -# gqlgen will search for any type names in the schema in these go packages -# if they match it will use them, otherwise it will generate them. -autobind: - - "github.com/xinliangnote/go-gin-api/internal/graph/model" - -# This section declares type mapping between the GraphQL and go type systems -# -# The first line in each type will be used as defaults for resolver arguments and -# modelgen, the others will be allowed when binding to fields. Configure them to -# your liking -models: - ID: - model: - - github.com/99designs/gqlgen/graphql.ID - - github.com/99designs/gqlgen/graphql.Int - - github.com/99designs/gqlgen/graphql.Int64 - - github.com/99designs/gqlgen/graphql.Int32 - Int: - model: - - github.com/99designs/gqlgen/graphql.Int - - github.com/99designs/gqlgen/graphql.Int64 - - github.com/99designs/gqlgen/graphql.Int32 diff --git a/internal/alert/alert.go b/internal/alert/alert.go deleted file mode 100755 index fc5f558..0000000 --- a/internal/alert/alert.go +++ /dev/null @@ -1,53 +0,0 @@ -package alert - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/pkg/mail" - "github.com/ch3nnn/webstack-go/internal/proposal" - - "go.uber.org/zap" -) - -// NotifyHandler 告警通知 -func NotifyHandler(logger *zap.Logger) func(msg *proposal.AlertMessage) { - if logger == nil { - panic("logger required") - } - - return func(msg *proposal.AlertMessage) { - cfg := configs.Get().Mail - if cfg.Host == "" || cfg.Port == 0 || cfg.User == "" || cfg.Pass == "" || cfg.To == "" { - logger.Error("Mail config error") - return - } - - subject, body, err := newHTMLEmail( - msg.Method, - msg.HOST, - msg.URI, - msg.TraceID, - msg.ErrorMessage, - msg.ErrorStack, - ) - if err != nil { - logger.Error("email template error", zap.Error(err)) - return - } - - options := &mail.Options{ - MailHost: cfg.Host, - MailPort: cfg.Port, - MailUser: cfg.User, - MailPass: cfg.Pass, - MailTo: cfg.To, - Subject: subject, - Body: body, - } - if err := mail.Send(options); err != nil { - logger.Error("发送告警通知邮件失败", zap.Error(errors.WithStack(err))) - } - - return - } -} diff --git a/internal/alert/email_template.go b/internal/alert/email_template.go deleted file mode 100755 index a21fd21..0000000 --- a/internal/alert/email_template.go +++ /dev/null @@ -1,167 +0,0 @@ -package alert - -import ( - "bytes" - "fmt" - "html/template" - "time" -) - -// NewHTMLEmail 告警邮件模板 -func newHTMLEmail(method, host, uri, id string, msg interface{}, stack string) (subject string, body string, err error) { - mailData := &struct { - URL string - ID string - Msg string - Stack string - Year int - }{ - URL: fmt.Sprintf("%s %s%s", method, host, uri), - ID: id, - Msg: fmt.Sprintf("%+v", msg), - Stack: stack, - Year: time.Now().Year(), - } - - // subject 邮件主题 - subject = fmt.Sprintf("[系统告警]-%s", uri) - - // body 邮件内容 - body, err = getEmailHTMLContent(mailTemplate, mailData) - - return -} - -// getEmailHTMLContent 获取邮件模板 -func getEmailHTMLContent(mailTpl string, mailData interface{}) (string, error) { - tpl, err := template.New("email tpl").Parse(mailTpl) - if err != nil { - return "", err - } - - buffer := new(bytes.Buffer) - err = tpl.Execute(buffer, mailData) - if err != nil { - return "", err - } - - return buffer.String(), nil -} - -const mailTemplate = ` - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- 系统告警 -
- - - - -
- -

- Hello! -

- - -

- 您收到此电子邮件,请紧急安排处理。 -

- - - - - - - - - - - - - - - - - - - - - - -
- ID: - - {{.ID}} -
- URL: - - {{.URL}} -
- Error: - - {{.Msg}} -
- Stack: - - {{.Stack}} -
-
-
- - - - -
-

- © {{.Year}} - All rights reserved. -

-
-
-
- - -` diff --git a/internal/api/admin/func_create.go b/internal/api/admin/func_create.go deleted file mode 100755 index fc0574d..0000000 --- a/internal/api/admin/func_create.go +++ /dev/null @@ -1,69 +0,0 @@ -package admin - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/validation" - "github.com/ch3nnn/webstack-go/internal/services/admin" -) - -type createRequest struct { - Username string `form:"username" binding:"required"` // 用户名 - Nickname string `form:"nickname" binding:"required"` // 昵称 - Mobile string `form:"mobile" binding:"required"` // 手机号 - Password string `form:"password" binding:"required"` // MD5后的密码 -} - -type createResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// Create 新增管理员 -// @Summary 新增管理员 -// @Description 新增管理员 -// @Tags API.admin -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param username formData string true "用户名" -// @Param nickname formData string true "昵称" -// @Param mobile formData string true "手机号" -// @Param password formData string true "MD5后的密码" -// @Success 200 {object} createResponse -// @Failure 400 {object} code.Failure -// @Router /api/admin [post] -// @Security LoginToken -func (h *handler) Create() core.HandlerFunc { - return func(c core.Context) { - req := new(createRequest) - res := new(createResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - validation.Error(err)).WithError(err), - ) - return - } - - createData := new(admin.CreateAdminData) - createData.Nickname = req.Nickname - createData.Username = req.Username - createData.Mobile = req.Mobile - createData.Password = req.Password - - id, err := h.adminService.Create(c, createData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminCreateError, - code.Text(code.AdminCreateError)).WithError(err), - ) - return - } - - res.Id = id - c.Payload(res) - } -} diff --git a/internal/api/admin/func_createadminmenu.go b/internal/api/admin/func_createadminmenu.go deleted file mode 100755 index e5be6ed..0000000 --- a/internal/api/admin/func_createadminmenu.go +++ /dev/null @@ -1,72 +0,0 @@ -package admin - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/services/admin" -) - -type createAdminMenuRequest struct { - Id string `form:"id"` // HashID - Actions string `form:"actions"` // 功能权限ID,多个用,分割 -} - -type createAdminMenuResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// CreateAdminMenu 提交菜单授权 -// @Summary 提交菜单授权 -// @Description 提交菜单授权 -// @Tags API.admin -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id formData string true "Hashid" -// @Param actions formData string true "功能权限ID,多个用,分割" -// @Success 200 {object} createResponse -// @Failure 400 {object} code.Failure -// @Router /api/admin/menu [post] -// @Security LoginToken -func (h *handler) CreateAdminMenu() core.HandlerFunc { - return func(c core.Context) { - req := new(createAdminMenuRequest) - res := new(createAdminMenuResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - createData := new(admin.CreateMenuData) - createData.AdminId = int64(ids[0]) - createData.Actions = req.Actions - - err = h.adminService.CreateMenu(c, createData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminMenuCreateError, - code.Text(code.AdminMenuCreateError)).WithError(err), - ) - return - } - - res.Id = int64(ids[0]) - c.Payload(res) - } -} diff --git a/internal/api/admin/func_delete.go b/internal/api/admin/func_delete.go deleted file mode 100755 index 033faca..0000000 --- a/internal/api/admin/func_delete.go +++ /dev/null @@ -1,67 +0,0 @@ -package admin - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type deleteRequest struct { - Id string `uri:"id"` // HashID -} - -type deleteResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// Delete 删除管理员 -// @Summary 删除管理员 -// @Description 删除管理员 -// @Tags API.admin -// @Accept json -// @Produce json -// @Param id path string true "hashId" -// @Success 200 {object} deleteResponse -// @Failure 400 {object} code.Failure -// @Router /api/admin/{id} [delete] -// @Security LoginToken -func (h *handler) Delete() core.HandlerFunc { - return func(c core.Context) { - req := new(deleteRequest) - res := new(deleteResponse) - if err := c.ShouldBindURI(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - id := int64(ids[0]) - - err = h.adminService.Delete(c, id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminDeleteError, - code.Text(code.AdminDeleteError)).WithError(err), - ) - return - } - - res.Id = id - c.Payload(res) - } -} diff --git a/internal/api/admin/func_detail.go b/internal/api/admin/func_detail.go deleted file mode 100755 index e680937..0000000 --- a/internal/api/admin/func_detail.go +++ /dev/null @@ -1,77 +0,0 @@ -package admin - -import ( - "encoding/json" - "net/http" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/password" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - "github.com/ch3nnn/webstack-go/internal/services/admin" -) - -type detailResponse struct { - Username string `json:"username"` // 用户名 - Nickname string `json:"nickname"` // 昵称 - Mobile string `json:"mobile"` // 手机号 - Menu []admin.ListMyMenuData `json:"menu"` // 菜单栏 -} - -// Detail 管理员详情 -// @Summary 管理员详情 -// @Description 管理员详情 -// @Tags API.admin -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Success 200 {object} detailResponse -// @Failure 400 {object} code.Failure -// @Router /api/admin/info [get] -// @Security LoginToken -func (h *handler) Detail() core.HandlerFunc { - return func(ctx core.Context) { - res := new(detailResponse) - - searchOneData := new(admin.SearchOneData) - searchOneData.Id = ctx.SessionUserInfo().UserID - searchOneData.IsUsed = 1 - - info, err := h.adminService.Detail(ctx, searchOneData) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminDetailError, - code.Text(code.AdminDetailError)).WithError(err), - ) - return - } - - menuCacheData, err := h.cache.Get(configs.RedisKeyPrefixLoginUser+password.GenerateLoginToken(searchOneData.Id)+":menu", redis.WithTrace(ctx.Trace())) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminDetailError, - code.Text(code.AdminDetailError)).WithError(err), - ) - return - } - - var menuData []admin.ListMyMenuData - err = json.Unmarshal([]byte(menuCacheData), &menuData) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminDetailError, - code.Text(code.AdminDetailError)).WithError(err), - ) - return - } - - res.Username = info.Username - res.Nickname = info.Nickname - res.Mobile = info.Mobile - res.Menu = menuData - ctx.Payload(res) - } -} diff --git a/internal/api/admin/func_list.go b/internal/api/admin/func_list.go deleted file mode 100755 index 3cc32c4..0000000 --- a/internal/api/admin/func_list.go +++ /dev/null @@ -1,136 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/password" - "github.com/ch3nnn/webstack-go/internal/services/admin" - "github.com/spf13/cast" - "net/http" -) - -type listRequest struct { - Page int64 `form:"page,default=1"` // 第几页 - PageSize int64 `form:"page_size,default=10"` // 每页显示条数 - Username string `form:"username"` // 用户名 - Nickname string `form:"nickname"` // 昵称 - Mobile string `form:"mobile"` // 手机号 -} - -type listData struct { - Id int64 `json:"id"` // ID - HashID string `json:"hashid"` // hashid - Username string `json:"username"` // 用户名 - Nickname string `json:"nickname"` // 昵称 - Mobile string `json:"mobile"` // 手机号 - IsUsed int64 `json:"is_used"` // 是否启用 1:是 -1:否 - IsOnline int64 `json:"is_online"` // 是否在线 1:是 -1:否 - CreatedAt string `json:"created_at"` // 创建时间 - CreatedUser string `json:"created_user"` // 创建人 - UpdatedAt string `json:"updated_at"` // 更新时间 - UpdatedUser string `json:"updated_user"` // 更新人 -} - -type listResponse struct { - List []listData `json:"list"` - Pagination struct { - Total int64 `json:"total"` - CurrentPage int64 `json:"current_page"` - PerPageCount int64 `json:"per_page_count"` - } `json:"pagination"` -} - -// List 管理员列表 -// @Summary 管理员列表 -// @Description 管理员列表 -// @Tags API.admin -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param page query int true "第几页" default(1) -// @Param page_size query int true "每页显示条数" default(10) -// @Param username query string false "用户名" -// @Param nickname query string false "昵称" -// @Param mobile query string false "手机号" -// @Success 200 {object} listResponse -// @Failure 400 {object} code.Failure -// @Router /api/admin [get] -// @Security LoginToken -func (h *handler) List() core.HandlerFunc { - return func(c core.Context) { - req := new(listRequest) - res := new(listResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - searchData := new(admin.SearchData) - searchData.Page = req.Page - searchData.PageSize = req.PageSize - searchData.Username = req.Username - searchData.Nickname = req.Nickname - searchData.Mobile = req.Mobile - - admins, err := h.adminService.PageList(c, searchData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminListError, - code.Text(code.AdminListError)).WithError(err), - ) - return - } - - resCountData, err := h.adminService.PageListCount(c, searchData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminListError, - code.Text(code.AdminListError)).WithError(err), - ) - return - } - res.Pagination.Total = resCountData - res.Pagination.PerPageCount = req.PageSize - res.Pagination.CurrentPage = req.Page - res.List = make([]listData, len(admins)) - - for k, v := range admins { - hashId, err := h.hashids.HashidsEncode([]int{cast.ToInt(v.ID)}) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsEncodeError, - code.Text(code.HashIdsEncodeError)).WithError(err), - ) - return - } - - isOnline := -1 - if h.cache.Exists(configs.RedisKeyPrefixLoginUser + password.GenerateLoginToken(v.ID)) { - isOnline = 1 - } - - res.List[k] = listData{ - Id: v.ID, - HashID: hashId, - Username: v.Username, - Nickname: v.Nickname, - Mobile: v.Mobile, - IsUsed: v.IsUsed, - IsOnline: int64(isOnline), - CreatedAt: v.CreatedAt.Format("2006-01-02 15:04:05"), - CreatedUser: v.CreatedUser, - UpdatedAt: v.UpdatedAt.Format("2006-01-02 15:04:05"), - UpdatedUser: v.UpdatedUser, - } - } - - c.Payload(res) - } -} diff --git a/internal/api/admin/func_listadminmenu.go b/internal/api/admin/func_listadminmenu.go deleted file mode 100755 index bda9458..0000000 --- a/internal/api/admin/func_listadminmenu.go +++ /dev/null @@ -1,86 +0,0 @@ -package admin - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/services/admin" -) - -type listAdminMenuRequest struct { - Id string `uri:"id"` // HashID -} - -type listAdminMenuResponse struct { - List []admin.ListMenuData `json:"list"` - UserName string `json:"username"` -} - -// ListAdminMenu 菜单授权列表 -// @Summary 菜单授权列表 -// @Description 菜单授权列表 -// @Tags API.admin -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id path string true "hashId" -// @Success 200 {object} listAdminMenuResponse -// @Failure 400 {object} code.Failure -// @Router /api/admin/menu/{id} [get] -// @Security LoginToken -func (h *handler) ListAdminMenu() core.HandlerFunc { - return func(c core.Context) { - req := new(listAdminMenuRequest) - res := new(listAdminMenuResponse) - if err := c.ShouldBindURI(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - searchOneData := new(admin.SearchOneData) - searchOneData.Id = int64(ids[0]) - searchOneData.IsUsed = 1 - - info, err := h.adminService.Detail(c, searchOneData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminMenuListError, - code.Text(code.AdminMenuListError)).WithError(err), - ) - return - } - - res.UserName = info.Username - - searchData := new(admin.SearchListMenuData) - searchData.AdminId = int64(ids[0]) - - listData, err := h.adminService.ListMenu(c, searchData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminMenuListError, - code.Text(code.AdminMenuListError)).WithError(err), - ) - return - } - - res.List = listData - c.Payload(res) - } -} diff --git a/internal/api/admin/func_login.go b/internal/api/admin/func_login.go deleted file mode 100755 index 29db1f3..0000000 --- a/internal/api/admin/func_login.go +++ /dev/null @@ -1,149 +0,0 @@ -package admin - -import ( - "encoding/json" - "net/http" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/pkg/password" - "github.com/ch3nnn/webstack-go/internal/proposal" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - "github.com/ch3nnn/webstack-go/internal/services/admin" -) - -type loginRequest struct { - Username string `form:"username"` // 用户名 - Password string `form:"password"` // 密码 -} - -type loginResponse struct { - Token string `json:"token"` // 用户身份标识 -} - -// Login 管理员登录 -// @Summary 管理员登录 -// @Description 管理员登录 -// @Tags API.admin -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param username formData string true "用户名" -// @Param password formData string true "MD5后的密码" -// @Success 200 {object} loginResponse -// @Failure 400 {object} code.Failure -// @Router /api/login [post] -// @Security LoginToken -func (h *handler) Login() core.HandlerFunc { - return func(c core.Context) { - req := new(loginRequest) - res := new(loginResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - searchOneData := new(admin.SearchOneData) - searchOneData.Username = req.Username - searchOneData.Password = password.GeneratePassword(req.Password) - searchOneData.IsUsed = 1 - - info, err := h.adminService.Detail(c, searchOneData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminLoginError, - code.Text(code.AdminLoginError)).WithError(err), - ) - return - } - - if info == nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminLoginError, - code.Text(code.AdminLoginError)).WithError(errors.New("未查询出符合条件的用户")), - ) - return - } - - token := password.GenerateLoginToken(info.ID) - - // 用户信息 - sessionUserInfo := &proposal.SessionUserInfo{ - UserID: info.ID, - UserName: info.Username, - } - - // 将用户信息记录到 Redis 中 - err = h.cache.Set(configs.RedisKeyPrefixLoginUser+token, string(sessionUserInfo.Marshal()), configs.LoginSessionTTL, redis.WithTrace(c.Trace())) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminLoginError, - code.Text(code.AdminLoginError)).WithError(err), - ) - return - } - - searchMenuData := new(admin.SearchMyMenuData) - searchMenuData.AdminId = info.ID - menu, err := h.adminService.MyMenu(c, searchMenuData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminLoginError, - code.Text(code.AdminLoginError)).WithError(err), - ) - return - } - - // 菜单栏信息 - menuJsonInfo, _ := json.Marshal(menu) - - // 将菜单栏信息记录到 Redis 中 - err = h.cache.Set(configs.RedisKeyPrefixLoginUser+token+":menu", string(menuJsonInfo), configs.LoginSessionTTL, redis.WithTrace(c.Trace())) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminLoginError, - code.Text(code.AdminLoginError)).WithError(err), - ) - return - } - - searchActionData := new(admin.SearchMyActionData) - searchActionData.AdminId = info.ID - action, err := h.adminService.MyAction(c, searchActionData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminLoginError, - code.Text(code.AdminLoginError)).WithError(err), - ) - return - } - - // 可访问接口信息 - actionJsonInfo, _ := json.Marshal(action) - - // 将可访问接口信息记录到 Redis 中 - err = h.cache.Set(configs.RedisKeyPrefixLoginUser+token+":action", string(actionJsonInfo), configs.LoginSessionTTL, redis.WithTrace(c.Trace())) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminLoginError, - code.Text(code.AdminLoginError)).WithError(err), - ) - return - } - - res.Token = token - c.Payload(res) - } -} diff --git a/internal/api/admin/func_logout.go b/internal/api/admin/func_logout.go deleted file mode 100755 index 33e09bc..0000000 --- a/internal/api/admin/func_logout.go +++ /dev/null @@ -1,43 +0,0 @@ -package admin - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -type logoutResponse struct { - Username string `json:"username"` // 用户账号 -} - -// Logout 管理员登出 -// @Summary 管理员登出 -// @Description 管理员登出 -// @Tags API.admin -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Success 200 {object} logoutResponse -// @Failure 400 {object} code.Failure -// @Router /api/admin/logout [post] -// @Security LoginToken -func (h *handler) Logout() core.HandlerFunc { - return func(c core.Context) { - res := new(logoutResponse) - res.Username = c.SessionUserInfo().UserName - - if !h.cache.Del(configs.RedisKeyPrefixLoginUser+c.GetHeader(configs.HeaderLoginToken), redis.WithTrace(c.Trace())) { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminLogOutError, - code.Text(code.AdminLogOutError)).WithError(errors.New("cache del err")), - ) - return - } - - c.Payload(res) - } -} diff --git a/internal/api/admin/func_modifypassword.go b/internal/api/admin/func_modifypassword.go deleted file mode 100755 index efffb7d..0000000 --- a/internal/api/admin/func_modifypassword.go +++ /dev/null @@ -1,73 +0,0 @@ -package admin - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/password" - "github.com/ch3nnn/webstack-go/internal/services/admin" -) - -type modifyPasswordRequest struct { - OldPassword string `form:"old_password"` // 旧密码 - NewPassword string `form:"new_password"` // 新密码 -} - -type modifyPasswordResponse struct { - Username string `json:"username"` // 用户账号 -} - -// ModifyPassword 修改密码 -// @Summary 修改密码 -// @Description 修改密码 -// @Tags API.admin -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param old_password formData string true "旧密码" -// @Param new_password formData string true "新密码" -// @Success 200 {object} modifyPasswordResponse -// @Failure 400 {object} code.Failure -// @Router /api/admin/modify_password [patch] -// @Security LoginToken -func (h *handler) ModifyPassword() core.HandlerFunc { - return func(ctx core.Context) { - req := new(modifyPasswordRequest) - res := new(modifyPasswordResponse) - if err := ctx.ShouldBindForm(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - searchOneData := new(admin.SearchOneData) - searchOneData.Id = ctx.SessionUserInfo().UserID - searchOneData.Password = password.GeneratePassword(req.OldPassword) - searchOneData.IsUsed = 1 - - info, err := h.adminService.Detail(ctx, searchOneData) - if err != nil || info == nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminModifyPasswordError, - code.Text(code.AdminModifyPasswordError)).WithError(err), - ) - return - } - - if err := h.adminService.ModifyPassword(ctx, ctx.SessionUserInfo().UserID, req.NewPassword); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminModifyPasswordError, - code.Text(code.AdminModifyPasswordError)).WithError(err), - ) - return - } - - res.Username = ctx.SessionUserInfo().UserName - ctx.Payload(res) - } -} diff --git a/internal/api/admin/func_modifypersonalinfo.go b/internal/api/admin/func_modifypersonalinfo.go deleted file mode 100755 index 2ced3a5..0000000 --- a/internal/api/admin/func_modifypersonalinfo.go +++ /dev/null @@ -1,61 +0,0 @@ -package admin - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/services/admin" -) - -type modifyPersonalInfoRequest struct { - Nickname string `form:"nickname"` // 昵称 - Mobile string `form:"mobile"` // 手机号 -} - -type modifyPersonalInfoResponse struct { - Username string `json:"username"` // 用户账号 -} - -// ModifyPersonalInfo 修改个人信息 -// @Summary 修改个人信息 -// @Description 修改个人信息 -// @Tags API.admin -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param nickname formData string true "昵称" -// @Param mobile formData string true "手机号" -// @Success 200 {object} modifyPersonalInfoResponse -// @Failure 400 {object} code.Failure -// @Router /api/admin/modify_personal_info [patch] -// @Security LoginToken -func (h *handler) ModifyPersonalInfo() core.HandlerFunc { - return func(ctx core.Context) { - req := new(modifyPersonalInfoRequest) - res := new(modifyPersonalInfoResponse) - if err := ctx.ShouldBindForm(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - modifyData := new(admin.ModifyData) - modifyData.Nickname = req.Nickname - modifyData.Mobile = req.Mobile - - if err := h.adminService.ModifyPersonalInfo(ctx, ctx.SessionUserInfo().UserID, modifyData); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminModifyPersonalInfoError, - code.Text(code.AdminModifyPersonalInfoError)).WithError(err), - ) - return - } - - res.Username = ctx.SessionUserInfo().UserName - ctx.Payload(res) - } -} diff --git a/internal/api/admin/func_offline.go b/internal/api/admin/func_offline.go deleted file mode 100755 index f3f8ea1..0000000 --- a/internal/api/admin/func_offline.go +++ /dev/null @@ -1,70 +0,0 @@ -package admin - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/password" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -type offlineRequest struct { - Id string `form:"id"` // 主键ID -} - -type offlineResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// Offline 下线管理员 -// @Summary 下线管理员 -// @Description 下线管理员 -// @Tags API.admin -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id formData string true "Hashid" -// @Success 200 {object} offlineResponse -// @Failure 400 {object} code.Failure -// @Router /api/admin/offline [patch] -// @Security LoginToken -func (h *handler) Offline() core.HandlerFunc { - return func(c core.Context) { - req := new(offlineRequest) - res := new(offlineResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - id := int64(ids[0]) - - b := h.cache.Del(configs.RedisKeyPrefixLoginUser+password.GenerateLoginToken(id), redis.WithTrace(c.Trace())) - if !b { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminOfflineError, - code.Text(code.AdminOfflineError)), - ) - return - } - - res.Id = id - c.Payload(res) - } -} diff --git a/internal/api/admin/func_resetpassword.go b/internal/api/admin/func_resetpassword.go deleted file mode 100755 index 9a52ad2..0000000 --- a/internal/api/admin/func_resetpassword.go +++ /dev/null @@ -1,67 +0,0 @@ -package admin - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type resetPasswordRequest struct { - Id string `uri:"id"` // HashID -} - -type resetPasswordResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// ResetPassword 重置密码 -// @Summary 重置密码 -// @Description 重置密码 -// @Tags API.admin -// @Accept json -// @Produce json -// @Param id path string true "hashId" -// @Success 200 {object} resetPasswordResponse -// @Failure 400 {object} code.Failure -// @Router /api/admin/reset_password/{id} [patch] -// @Security LoginToken -func (h *handler) ResetPassword() core.HandlerFunc { - return func(c core.Context) { - req := new(resetPasswordRequest) - res := new(resetPasswordResponse) - if err := c.ShouldBindURI(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - id := int64(ids[0]) - - err = h.adminService.ResetPassword(c, id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminResetPasswordError, - code.Text(code.AdminResetPasswordError)).WithError(err), - ) - return - } - - res.Id = id - c.Payload(res) - } -} diff --git a/internal/api/admin/func_updateused.go b/internal/api/admin/func_updateused.go deleted file mode 100755 index 72d29ef..0000000 --- a/internal/api/admin/func_updateused.go +++ /dev/null @@ -1,69 +0,0 @@ -package admin - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type updateUsedRequest struct { - Id string `form:"id"` // 主键ID - Used int64 `form:"used"` // 是否启用 1:是 -1:否 -} - -type updateUsedResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// UpdateUsed 更新管理员为启用/禁用 -// @Summary 更新管理员为启用/禁用 -// @Description 更新管理员为启用/禁用 -// @Tags API.admin -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id formData string true "Hashid" -// @Param used formData int true "是否启用 1:是 -1:否" -// @Success 200 {object} updateUsedResponse -// @Failure 400 {object} code.Failure -// @Router /api/admin/used [patch] -// @Security LoginToken -func (h *handler) UpdateUsed() core.HandlerFunc { - return func(c core.Context) { - req := new(updateUsedRequest) - res := new(updateUsedResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - id := int64(ids[0]) - - err = h.adminService.UpdateUsed(c, id, req.Used) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminUpdateError, - code.Text(code.AdminUpdateError)).WithError(err), - ) - return - } - - res.Id = id - c.Payload(res) - } -} diff --git a/internal/api/admin/handler.go b/internal/api/admin/handler.go deleted file mode 100755 index f2e5288..0000000 --- a/internal/api/admin/handler.go +++ /dev/null @@ -1,101 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/hash" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - "github.com/ch3nnn/webstack-go/internal/services/admin" - - "go.uber.org/zap" -) - -var _ Handler = (*handler)(nil) - -type Handler interface { - i() - - // Login 管理员登录 - // @Tags API.admin - // @Router /api/login [post] - Login() core.HandlerFunc - - // Logout 管理员登出 - // @Tags API.admin - // @Router /api/admin/logout [post] - Logout() core.HandlerFunc - - // ModifyPassword 修改密码 - // @Tags API.admin - // @Router /api/admin/modify_password [patch] - ModifyPassword() core.HandlerFunc - - // Detail 个人信息 - // @Tags API.admin - // @Router /api/admin/info [get] - Detail() core.HandlerFunc - - // ModifyPersonalInfo 修改个人信息 - // @Tags API.admin - // @Router /api/admin/modify_personal_info [patch] - ModifyPersonalInfo() core.HandlerFunc - - // Create 新增管理员 - // @Tags API.admin - // @Router /api/admin [post] - Create() core.HandlerFunc - - // List 管理员列表 - // @Tags API.admin - // @Router /api/admin [get] - List() core.HandlerFunc - - // Delete 删除管理员 - // @Tags API.admin - // @Router /api/admin/{id} [delete] - Delete() core.HandlerFunc - - // Offline 下线管理员 - // @Tags API.admin - // @Router /api/admin/offline [patch] - Offline() core.HandlerFunc - - // UpdateUsed 更新管理员为启用/禁用 - // @Tags API.admin - // @Router /api/admin/used [patch] - UpdateUsed() core.HandlerFunc - - // ResetPassword 重置密码 - // @Tags API.admin - // @Router /api/admin/reset_password/{id} [patch] - ResetPassword() core.HandlerFunc - - // CreateAdminMenu 提交菜单授权 - // @Tags API.admin - // @Router /api/admin/menu [post] - CreateAdminMenu() core.HandlerFunc - - // ListAdminMenu 菜单授权列表 - // @Tags API.admin - // @Router /api/admin/menu/{id} [get] - ListAdminMenu() core.HandlerFunc -} - -type handler struct { - logger *zap.Logger - cache redis.Repo - hashids hash.Hash - adminService admin.Service -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) Handler { - return &handler{ - logger: logger, - cache: cache, - hashids: hash.New(configs.Get().HashIds.Secret, configs.Get().HashIds.Length), - adminService: admin.New(db, cache), - } -} - -func (h *handler) i() {} diff --git a/internal/api/authorized/func_create.go b/internal/api/authorized/func_create.go deleted file mode 100755 index 17d048f..0000000 --- a/internal/api/authorized/func_create.go +++ /dev/null @@ -1,65 +0,0 @@ -package authorized - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/services/authorized" -) - -type createRequest struct { - BusinessKey string `form:"business_key"` // 调用方key - BusinessDeveloper string `form:"business_developer"` // 调用方对接人 - Remark string `form:"remark"` // 备注 -} - -type createResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// Create 新增调用方 -// @Summary 新增调用方 -// @Description 新增调用方 -// @Tags API.authorized -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param business_key formData string true "调用方key" -// @Param business_developer formData string true "调用方对接人" -// @Param remark formData string true "备注" -// @Success 200 {object} createResponse -// @Failure 400 {object} code.Failure -// @Router /api/authorized [post] -// @Security LoginToken -func (h *handler) Create() core.HandlerFunc { - return func(c core.Context) { - req := new(createRequest) - res := new(createResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - createData := new(authorized.CreateAuthorizedData) - createData.BusinessKey = req.BusinessKey - createData.BusinessDeveloper = req.BusinessDeveloper - createData.Remark = req.Remark - - id, err := h.authorizedService.Create(c, createData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizedCreateError, - code.Text(code.AuthorizedCreateError)).WithError(err), - ) - return - } - - res.Id = id - c.Payload(res) - } -} diff --git a/internal/api/authorized/func_createapi.go b/internal/api/authorized/func_createapi.go deleted file mode 100755 index d4ba625..0000000 --- a/internal/api/authorized/func_createapi.go +++ /dev/null @@ -1,88 +0,0 @@ -package authorized - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/services/authorized" -) - -type createAPIRequest struct { - Id string `form:"id"` // HashID - Method string `form:"method"` // 请求方法 - API string `form:"api"` // 请求地址 -} - -type createAPIResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// CreateAPI 授权调用方接口地址 -// @Summary 授权调用方接口地址 -// @Description 授权调用方接口地址 -// @Tags API.authorized -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id formData string true "HashID" -// @Param method formData string true "请求方法" -// @Param api formData string true "请求地址" -// @Success 200 {object} createAPIResponse -// @Failure 400 {object} code.Failure -// @Router /api/authorized_api [post] -// @Security LoginToken -func (h *handler) CreateAPI() core.HandlerFunc { - return func(c core.Context) { - req := new(createAPIRequest) - res := new(createAPIResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - id := int64(ids[0]) - - // 通过 id 查询出 business_key - authorizedInfo, err := h.authorizedService.Detail(c, id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizedDetailError, - code.Text(code.AuthorizedDetailError)).WithError(err), - ) - return - } - - createAPIData := new(authorized.CreateAuthorizedAPIData) - createAPIData.BusinessKey = authorizedInfo.BusinessKey - createAPIData.Method = req.Method - createAPIData.API = req.API - - createId, err := h.authorizedService.CreateAPI(c, createAPIData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizedCreateAPIError, - code.Text(code.AuthorizedCreateAPIError)).WithError(err), - ) - return - } - - res.Id = createId - c.Payload(res) - } -} diff --git a/internal/api/authorized/func_delete.go b/internal/api/authorized/func_delete.go deleted file mode 100755 index dc27be5..0000000 --- a/internal/api/authorized/func_delete.go +++ /dev/null @@ -1,67 +0,0 @@ -package authorized - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type deleteRequest struct { - Id string `uri:"id"` // HashID -} - -type deleteResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// Delete 删除调用方 -// @Summary 删除调用方 -// @Description 删除调用方 -// @Tags API.authorized -// @Accept json -// @Produce json -// @Param id path string true "hashId" -// @Success 200 {object} deleteResponse -// @Failure 400 {object} code.Failure -// @Router /api/authorized/{id} [delete] -// @Security LoginToken -func (h *handler) Delete() core.HandlerFunc { - return func(c core.Context) { - req := new(deleteRequest) - res := new(deleteResponse) - if err := c.ShouldBindURI(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - id := int64(ids[0]) - - err = h.authorizedService.Delete(c, id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizedDeleteError, - code.Text(code.AuthorizedDeleteError)).WithError(err), - ) - return - } - - res.Id = id - c.Payload(res) - } -} diff --git a/internal/api/authorized/func_deleteapi.go b/internal/api/authorized/func_deleteapi.go deleted file mode 100755 index 7dfb08e..0000000 --- a/internal/api/authorized/func_deleteapi.go +++ /dev/null @@ -1,67 +0,0 @@ -package authorized - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type deleteAPIRequest struct { - Id string `uri:"id"` // HashID -} - -type deleteAPIResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// DeleteAPI 删除调用方接口地址 -// @Summary 删除调用方接口地址 -// @Description 删除调用方接口地址 -// @Tags API.authorized -// @Accept json -// @Produce json -// @Param id path string true "主键ID" -// @Success 200 {object} deleteAPIResponse -// @Failure 400 {object} code.Failure -// @Router /api/authorized_api/{id} [delete] -// @Security LoginToken -func (h *handler) DeleteAPI() core.HandlerFunc { - return func(c core.Context) { - req := new(deleteAPIRequest) - res := new(deleteAPIResponse) - if err := c.ShouldBindURI(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - id := int64(ids[0]) - - err = h.authorizedService.DeleteAPI(c, id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizedDeleteAPIError, - code.Text(code.AuthorizedDeleteAPIError)).WithError(err), - ) - return - } - - res.Id = id - c.Payload(res) - } -} diff --git a/internal/api/authorized/func_list.go b/internal/api/authorized/func_list.go deleted file mode 100755 index 31a7886..0000000 --- a/internal/api/authorized/func_list.go +++ /dev/null @@ -1,133 +0,0 @@ -package authorized - -import ( - "github.com/spf13/cast" - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/timeutil" - "github.com/ch3nnn/webstack-go/internal/services/authorized" -) - -type listRequest struct { - Page int64 `form:"page,default=1"` // 第几页 - PageSize int64 `form:"page_size,default=10"` // 每页显示条数 - BusinessKey string `form:"business_key"` // 调用方key - BusinessSecret string `form:"business_secret"` // 调用方secret - BusinessDeveloper string `form:"business_developer"` // 调用方对接人 - Remark string `form:"remark"` // 备注 -} - -type listData struct { - Id int64 `json:"id"` // ID - HashID string `json:"hashid"` // hashid - BusinessKey string `json:"business_key"` // 调用方key - BusinessSecret string `json:"business_secret"` // 调用方secret - BusinessDeveloper string `json:"business_developer"` // 调用方对接人 - Remark string `json:"remark"` // 备注 - IsUsed int64 `json:"is_used"` // 是否启用 1:是 -1:否 - CreatedAt string `json:"created_at"` // 创建时间 - CreatedUser string `json:"created_user"` // 创建人 - UpdatedAt string `json:"updated_at"` // 更新时间 - UpdatedUser string `json:"updated_user"` // 更新人 -} - -type listResponse struct { - List []listData `json:"list"` - Pagination struct { - Total int64 `json:"total"` - CurrentPage int64 `json:"current_page"` - PerPageCount int64 `json:"per_page_count"` - } `json:"pagination"` -} - -// List 调用方列表 -// @Summary 调用方列表 -// @Description 调用方列表 -// @Tags API.authorized -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param page query int true "第几页" default(1) -// @Param page_size query int true "每页显示条数" default(10) -// @Param business_key query string false "调用方key" -// @Param business_secret query string false "调用方secret" -// @Param business_developer query string false "调用方对接人" -// @Param remark path string false "备注" -// @Success 200 {object} listResponse -// @Failure 400 {object} code.Failure -// @Router /api/authorized [get] -// @Security LoginToken -func (h *handler) List() core.HandlerFunc { - return func(c core.Context) { - req := new(listRequest) - res := new(listResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - searchData := new(authorized.SearchData) - searchData.Page = req.Page - searchData.PageSize = req.PageSize - searchData.BusinessKey = req.BusinessKey - searchData.BusinessSecret = req.BusinessSecret - searchData.Remark = req.Remark - - resListData, err := h.authorizedService.PageList(c, searchData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizedListError, - code.Text(code.AuthorizedListError)).WithError(err), - ) - return - } - - resCountData, err := h.authorizedService.PageListCount(c, searchData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizedListError, - code.Text(code.AuthorizedListError)).WithError(err), - ) - return - } - res.Pagination.Total = resCountData - res.Pagination.PerPageCount = req.PageSize - res.Pagination.CurrentPage = req.Page - res.List = make([]listData, len(resListData)) - - for k, v := range resListData { - hashId, err := h.hashids.HashidsEncode([]int{cast.ToInt(v.ID)}) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsEncodeError, - code.Text(code.HashIdsEncodeError)).WithError(err), - ) - return - } - - res.List[k] = listData{ - Id: v.ID, - HashID: hashId, - BusinessKey: v.BusinessKey, - BusinessSecret: v.BusinessSecret, - BusinessDeveloper: v.BusinessDeveloper, - Remark: v.Remark, - IsUsed: v.IsUsed, - CreatedAt: v.CreatedAt.Format(timeutil.CSTLayout), - CreatedUser: v.CreatedUser, - UpdatedAt: v.UpdatedAt.Format(timeutil.CSTLayout), - UpdatedUser: v.UpdatedUser, - } - } - - c.Payload(res) - } -} diff --git a/internal/api/authorized/func_listapi.go b/internal/api/authorized/func_listapi.go deleted file mode 100755 index 3a8cd47..0000000 --- a/internal/api/authorized/func_listapi.go +++ /dev/null @@ -1,116 +0,0 @@ -package authorized - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/services/authorized" - - "github.com/spf13/cast" -) - -type listAPIRequest struct { - Id string `form:"id"` // hashID -} - -type listAPIData struct { - HashId string `json:"hash_id"` // hashID - BusinessKey string `json:"business_key"` // 调用方key - Method string `json:"method"` // 调用方secret - API string `json:"api"` // 调用方对接人 -} - -type listAPIResponse struct { - BusinessKey string `json:"business_key"` // 调用方key - List []listAPIData `json:"list"` -} - -// ListAPI 调用方接口地址列表 -// @Summary 调用方接口地址列表 -// @Description 调用方接口地址列表 -// @Tags API.authorized -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id query string true "hashID" -// @Success 200 {object} listAPIResponse -// @Failure 400 {object} code.Failure -// @Router /api/authorized_api [get] -// @Security LoginToken -func (h *handler) ListAPI() core.HandlerFunc { - return func(c core.Context) { - req := new(listAPIRequest) - res := new(listAPIResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - id := int64(ids[0]) - - // 通过 id 查询出 business_key - authorizedInfo, err := h.authorizedService.Detail(c, id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizedDetailError, - code.Text(code.AuthorizedDetailError)).WithError(err), - ) - return - } - - res.BusinessKey = authorizedInfo.BusinessKey - - searchAPIData := new(authorized.SearchAPIData) - searchAPIData.BusinessKey = authorizedInfo.BusinessKey - - resListData, err := h.authorizedService.ListAPI(c, searchAPIData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizedListAPIError, - code.Text(code.AuthorizedListAPIError)).WithError(err), - ) - return - } - - res.List = make([]listAPIData, len(resListData)) - - for k, v := range resListData { - hashId, err := h.hashids.HashidsEncode([]int{cast.ToInt(v.ID)}) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsEncodeError, - code.Text(code.HashIdsEncodeError)).WithError(err), - ) - return - } - - data := listAPIData{ - HashId: hashId, - BusinessKey: v.BusinessKey, - Method: v.Method, - API: v.API, - } - - res.List[k] = data - } - - c.Payload(res) - } -} diff --git a/internal/api/authorized/func_updateused.go b/internal/api/authorized/func_updateused.go deleted file mode 100755 index 5e12a9a..0000000 --- a/internal/api/authorized/func_updateused.go +++ /dev/null @@ -1,69 +0,0 @@ -package authorized - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type updateUsedRequest struct { - Id string `form:"id"` // 主键ID - Used int64 `form:"used"` // 是否启用 1:是 -1:否 -} - -type updateUsedResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// UpdateUsed 更新调用方为启用/禁用 -// @Summary 更新调用方为启用/禁用 -// @Description 更新调用方为启用/禁用 -// @Tags API.authorized -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id formData string true "hashID" -// @Param used formData int true "是否启用 1:是 -1:否" -// @Success 200 {object} updateUsedResponse -// @Failure 400 {object} code.Failure -// @Router /api/authorized/used [patch] -// @Security LoginToken -func (h *handler) UpdateUsed() core.HandlerFunc { - return func(c core.Context) { - req := new(updateUsedRequest) - res := new(updateUsedResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - id := int64(ids[0]) - - err = h.authorizedService.UpdateUsed(c, id, req.Used) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizedUpdateError, - code.Text(code.AuthorizedUpdateError)).WithError(err), - ) - return - } - - res.Id = id - c.Payload(res) - } -} diff --git a/internal/api/authorized/handler.go b/internal/api/authorized/handler.go deleted file mode 100755 index cad3e70..0000000 --- a/internal/api/authorized/handler.go +++ /dev/null @@ -1,71 +0,0 @@ -package authorized - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/hash" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - "github.com/ch3nnn/webstack-go/internal/services/authorized" - - "go.uber.org/zap" -) - -var _ Handler = (*handler)(nil) - -type Handler interface { - i() - - // Create 新增调用方 - // @Tags API.authorized - // @Router /api/authorized [post] - Create() core.HandlerFunc - - // CreateAPI 授权调用方接口地址 - // @Tags API.authorized - // @Router /api/authorized_api [post] - CreateAPI() core.HandlerFunc - - // List 调用方列表 - // @Tags API.authorized - // @Router /api/authorized [get] - List() core.HandlerFunc - - // ListAPI 调用方接口地址列表 - // @Tags API.authorized - // @Router /api/authorized_api [get] - ListAPI() core.HandlerFunc - - // Delete 删除调用方 - // @Tags API.authorized - // @Router /api/authorized/{id} [delete] - Delete() core.HandlerFunc - - // DeleteAPI 删除调用方接口地址 - // @Tags API.authorized - // @Router /api/authorized_api/{id} [delete] - DeleteAPI() core.HandlerFunc - - // UpdateUsed 更新调用方为启用/禁用 - // @Tags API.authorized - // @Router /api/authorized/used [patch] - UpdateUsed() core.HandlerFunc -} - -type handler struct { - logger *zap.Logger - cache redis.Repo - authorizedService authorized.Service - hashids hash.Hash -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) Handler { - return &handler{ - logger: logger, - cache: cache, - authorizedService: authorized.New(db, cache), - hashids: hash.New(configs.Get().HashIds.Secret, configs.Get().HashIds.Length), - } -} - -func (h *handler) i() {} diff --git a/internal/api/category/func_create.go b/internal/api/category/func_create.go deleted file mode 100755 index 58b44a5..0000000 --- a/internal/api/category/func_create.go +++ /dev/null @@ -1,91 +0,0 @@ -package category - -import ( - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/services/category" - "net/http" -) - -type createRequest struct { - Id int64 `form:"id"` // ID - Pid int64 `form:"pid"` // 父类ID - Name string `form:"name"` // 分类名称 - Icon string `form:"icon"` // 图标 - Level int64 `form:"level"` // 分类等级 -} - -type createResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// Create 创建/编辑分类 -// @Summary 创建/编辑分类 -// @Description 创建/编辑分类 -// @Tags API.category -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body createRequest true "请求信息" -// @Success 200 {object} createResponse -// @Failure 400 {object} code.Failure -// @Router /api/category [post] -// @Security LoginToken -func (h *handler) Create() core.HandlerFunc { - return func(c core.Context) { - req := new(createRequest) - res := new(createResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - if req.Id != 0 { // 编辑功能 - - updateCategory := new(category.UpdateCategory) - updateCategory.Name = req.Name - updateCategory.Icon = req.Icon - - if err := h.categoryService.Modify(c, req.Id, updateCategory); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.CategoryUpdateError, - code.Text(code.CategoryUpdateError)).WithError(err), - ) - return - } - - res.Id = req.Id - c.Payload(res) - - } else { // 新增功能 - pid := req.Level - level := 2 - - if req.Level == -1 { - pid = 0 - level = 1 - } - - createData := new(category.CreateCategoryData) - createData.Pid = pid - createData.Name = req.Name - createData.Icon = req.Icon - createData.Level = int64(level) - - if err := h.categoryService.Create(c, createData); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.CategoryCreateError, - code.Text(code.CategoryCreateError)).WithError(err), - ) - return - } - - c.Payload(res) - } - } -} diff --git a/internal/api/category/func_delete.go b/internal/api/category/func_delete.go deleted file mode 100755 index 1a75e92..0000000 --- a/internal/api/category/func_delete.go +++ /dev/null @@ -1,53 +0,0 @@ -package category - -import ( - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "net/http" -) - -type deleteRequest struct { - Id int64 `uri:"id"` // 主键 id -} - -type deleteResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// Delete 删除分类 -// @Summary 删除分类 -// @Description 删除分类 -// @Tags API.category -// @Accept json -// @Produce json -// @Param id path string true "id" -// @Success 200 {object} deleteResponse -// @Failure 400 {object} code.Failure -// @Router /api/category/{id} [delete] -// @Security LoginToken -func (h *handler) Delete() core.HandlerFunc { - return func(c core.Context) { - req := new(deleteRequest) - res := new(deleteResponse) - if err := c.ShouldBindURI(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - if err := h.categoryService.Delete(c, req.Id); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.CategoryDeleteError, - code.Text(code.CategoryDeleteError)).WithError(err), - ) - return - } - - res.Id = req.Id - c.Payload(res) - } -} diff --git a/internal/api/category/func_detail.go b/internal/api/category/func_detail.go deleted file mode 100755 index 2587211..0000000 --- a/internal/api/category/func_detail.go +++ /dev/null @@ -1,60 +0,0 @@ -package category - -import ( - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "net/http" -) - -type detailRequest struct { - Id int64 `uri:"id"` // 主键 id -} - -type detailResponse struct { - Id int64 `json:"id"` // 主键ID - Pid int64 `json:"pid"` // 父类ID - Name string `json:"name"` // 分类名称 - Icon string `json:"icon"` // 图标 -} - -// Detail 分类详情 -// @Summary 分类详情 -// @Description 分类详情 -// @Tags API.category -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id path string true "hashId" -// @Success 200 {object} detailResponse -// @Failure 400 {object} code.Failure -// @Router /api/category/{id} [get] -// @Security LoginToken -func (h *handler) Detail() core.HandlerFunc { - return func(c core.Context) { - req := new(detailRequest) - if err := c.ShouldBindURI(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - cat, err := h.categoryService.Detail(c, req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.CategoryDetailError, - code.Text(code.CategoryDetailError)).WithError(err), - ) - return - } - - c.Payload(detailResponse{ - Id: cat.ID, - Pid: cat.ParentID, - Name: cat.Title, - Icon: cat.Icon, - }) - } -} diff --git a/internal/api/category/func_list.go b/internal/api/category/func_list.go deleted file mode 100755 index 25f2960..0000000 --- a/internal/api/category/func_list.go +++ /dev/null @@ -1,77 +0,0 @@ -package category - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/spf13/cast" -) - -type listData struct { - Id int64 `json:"id"` // ID - HashID string `json:"hashid"` // hashid - Pid int64 `json:"pid"` // 父类ID - Name string `json:"name"` // 菜单名称 - Link string `json:"link"` // 链接地址 - Icon string `json:"icon"` // 图标 - IsUsed int64 `json:"is_used"` // 是否启用 1=启用 -1=禁用 - Sort int64 `json:"sort"` // 排序 - Level int64 `json:"level"` // 分类等级 1 一级分类 2 二级分类 -} - -type listResponse struct { - List []listData `json:"list"` -} - -// List 分类列表 -// @Summary 分类列表 -// @Description 分类列表 -// @Tags API.category -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body listRequest true "请求信息" -// @Success 200 {object} listResponse -// @Failure 400 {object} code.Failure -// @Router /api/category [get] -func (h *handler) List() core.HandlerFunc { - return func(c core.Context) { - res := new(listResponse) - categories, err := h.categoryService.List(c) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.CategoryListError, - code.Text(code.CategoryListError)).WithError(err), - ) - return - } - - res.List = make([]listData, len(categories)) - - for i, cat := range categories { - hashId, err := h.hashids.HashidsEncode([]int{cast.ToInt(cat.ID)}) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsEncodeError, - code.Text(code.HashIdsEncodeError)).WithError(err), - ) - return - } - - res.List[i] = listData{ - Id: cat.ID, - HashID: hashId, - Pid: cat.ParentID, - Name: cat.Title, - Icon: cat.Icon, - IsUsed: cat.IsUsed, - Sort: cat.Sort, - Level: cat.Level, - } - } - - c.Payload(res) - } -} diff --git a/internal/api/category/func_updatesort.go b/internal/api/category/func_updatesort.go deleted file mode 100755 index f3b0022..0000000 --- a/internal/api/category/func_updatesort.go +++ /dev/null @@ -1,55 +0,0 @@ -package category - -import ( - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "net/http" -) - -type updateSortRequest struct { - Id int64 `form:"id"` // 主键 id - Sort int64 `form:"sort"` // 排序 -} - -type updateSortResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// UpdateSort 更新分类排序 -// @Summary 更新分类排序 -// @Description 更新分类排序 -// @Tags API.category -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id formData string true "hashId" -// @Param sort formData int true "排序" -// @Success 200 {object} updateSortResponse -// @Failure 400 {object} code.Failure -// @Router /api/category/sort [patch] -// @Security LoginToken -func (h *handler) UpdateSort() core.HandlerFunc { - return func(c core.Context) { - req := new(updateSortRequest) - res := new(updateSortResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - if err := h.categoryService.UpdateSort(c, req.Id, req.Sort); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.CategoryUpdateError, - code.Text(code.CategoryUpdateError)).WithError(err), - ) - return - } - - res.Id = req.Id - c.Payload(res) - } -} diff --git a/internal/api/category/func_updateused.go b/internal/api/category/func_updateused.go deleted file mode 100755 index c345db8..0000000 --- a/internal/api/category/func_updateused.go +++ /dev/null @@ -1,55 +0,0 @@ -package category - -import ( - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "net/http" -) - -type updateUsedRequest struct { - Id int64 `form:"id"` // 主键ID - Used int64 `form:"used"` // 是否启用 1:是 -1:否 -} - -type updateUsedResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// UpdateUsed 更新分类为启用/禁用 -// @Summary 更新分类为启用/禁用 -// @Description 更新分类为启用/禁用 -// @Tags API.category -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id formData string true "hashId" -// @Param used formData int true "是否启用 1:是 -1:否" -// @Success 200 {object} updateUsedResponse -// @Failure 400 {object} code.Failure -// @Router /api/category/used [patch] -// @Security LoginToken -func (h *handler) UpdateUsed() core.HandlerFunc { - return func(c core.Context) { - req := new(updateUsedRequest) - res := new(updateUsedResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - if err := h.categoryService.UpdateUsed(c, req.Id, req.Used); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.CategoryUpdateError, - code.Text(code.CategoryUpdateError)).WithError(err), - ) - return - } - - res.Id = req.Id - c.Payload(res) - } -} diff --git a/internal/api/category/handler.go b/internal/api/category/handler.go deleted file mode 100755 index 9771c01..0000000 --- a/internal/api/category/handler.go +++ /dev/null @@ -1,66 +0,0 @@ -package category - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/hash" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - "github.com/ch3nnn/webstack-go/internal/services/category" - - "go.uber.org/zap" -) - -var _ Handler = (*handler)(nil) - -type Handler interface { - i() - - // Create 新增网站分类 - // @Tags API.category - // @Router /api/category [post] - Create() core.HandlerFunc - - // List 分类列表 - // @Tags API.category - // @Router /api/category [get] - List() core.HandlerFunc - - // Delete 删除分类 - // @Tags API.category - // @Router /api/category/{id} [delete] - Delete() core.HandlerFunc - - // UpdateUsed 更新分了启用/禁用 - // @Tags API.category - // @Router /api/category/used [patch] - UpdateUsed() core.HandlerFunc - - // Detail 获取分类详情数据 - // @Tags API.category - // @Router /api/category/used [patch] - Detail() core.HandlerFunc - - // UpdateSort 更新分类排序 - // @Tags API.category - // @Router /api/category/used [patch] - UpdateSort() core.HandlerFunc -} - -type handler struct { - logger *zap.Logger - cache redis.Repo - hashids hash.Hash - categoryService category.Service -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) Handler { - return &handler{ - logger: logger, - cache: cache, - hashids: hash.New(configs.Get().HashIds.Secret, configs.Get().HashIds.Length), - categoryService: category.New(db, cache), - } -} - -func (h *handler) i() {} diff --git a/internal/api/config/func_email.go b/internal/api/config/func_email.go deleted file mode 100755 index be74eba..0000000 --- a/internal/api/config/func_email.go +++ /dev/null @@ -1,94 +0,0 @@ -package config - -import ( - "fmt" - "net/http" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/env" - "github.com/ch3nnn/webstack-go/internal/pkg/mail" - - "github.com/spf13/cast" - "github.com/spf13/viper" -) - -type emailRequest struct { - Host string `form:"host"` // 邮箱服务器 - Port string `form:"port"` // 端口 - User string `form:"user"` // 发件人邮箱 - Pass string `form:"pass"` // 发件人密码 - To string `form:"to"` // 收件人邮箱地址,多个用,分割 -} - -type emailResponse struct { - Email string `json:"email"` // 邮箱地址 -} - -// Email 修改邮件配置 -// @Summary 修改邮件配置 -// @Description 修改邮件配置 -// @Tags API.config -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param host formData string true "邮箱服务器" -// @Param port formData string true "端口" -// @Param user formData string true "发件人邮箱" -// @Param pass formData string true "发件人密码" -// @Param to formData string true "收件人邮箱地址,多个用,分割" -// @Success 200 {object} emailResponse -// @Failure 400 {object} code.Failure -// @Router /api/config/email [patch] -// @Security LoginToken -func (h *handler) Email() core.HandlerFunc { - return func(c core.Context) { - req := new(emailRequest) - res := new(emailResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - options := &mail.Options{ - MailHost: req.Host, - MailPort: cast.ToInt(req.Port), - MailUser: req.User, - MailPass: req.Pass, - MailTo: req.To, - Subject: fmt.Sprintf("%s[%s] 邮箱告警人调整通知。", configs.ProjectName, env.Active().Value()), - Body: fmt.Sprintf("%s[%s] 已添加您为系统告警通知人。", configs.ProjectName, env.Active().Value()), - } - if err := mail.Send(options); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.SendEmailError, - code.Text(code.SendEmailError)+err.Error()).WithError(err), - ) - return - } - - viper.Set("mail.host", req.Host) - viper.Set("mail.port", cast.ToInt(req.Port)) - viper.Set("mail.user", req.User) - viper.Set("mail.pass", req.Pass) - viper.Set("mail.to", req.To) - - err := viper.WriteConfig() - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.WriteConfigError, - code.Text(code.WriteConfigError)).WithError(err), - ) - return - } - - res.Email = req.To - c.Payload(res) - } -} diff --git a/internal/api/config/handler.go b/internal/api/config/handler.go deleted file mode 100755 index f887757..0000000 --- a/internal/api/config/handler.go +++ /dev/null @@ -1,34 +0,0 @@ -package config - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "go.uber.org/zap" -) - -var _ Handler = (*handler)(nil) - -type Handler interface { - i() - - // Email 修改邮件配置 - // @Tags API.config - // @Router /api/config/email [patch] - Email() core.HandlerFunc -} - -type handler struct { - logger *zap.Logger - cache redis.Repo -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) Handler { - return &handler{ - logger: logger, - cache: cache, - } -} - -func (h *handler) i() {} diff --git a/internal/api/cron/func_create.go b/internal/api/cron/func_create.go deleted file mode 100755 index 509c353..0000000 --- a/internal/api/cron/func_create.go +++ /dev/null @@ -1,99 +0,0 @@ -package cron - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/validation" - "github.com/ch3nnn/webstack-go/internal/services/cron" -) - -type createRequest struct { - Name string `form:"name" binding:"required"` // 任务名称 - Spec string `form:"spec" binding:"required"` // crontab 表达式 - Command string `form:"command" binding:"required"` // 执行命令 - Protocol int64 `form:"protocol" binding:"required"` // 执行方式 1:shell 2:http - HttpMethod int64 `form:"http_method"` // http 请求方式 1:get 2:post - Timeout int64 `form:"timeout" binding:"required"` // 超时时间(单位:秒) - RetryTimes int64 `form:"retry_times" binding:"required"` // 重试次数 - RetryInterval int64 `form:"retry_interval" binding:"required"` // 重试间隔(单位:秒) - NotifyStatus int64 `form:"notify_status" binding:"required"` // 执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知 - NotifyType int64 `form:"notify_type"` // 通知类型 1:邮件 2:webhook - NotifyReceiverEmail string `form:"notify_receiver_email"` // 通知者邮箱地址(多个用,分割) - NotifyKeyword string `form:"notify_keyword"` // 通知匹配关键字(多个用,分割) - Remark string `form:"remark"` // 备注 - IsUsed int64 `form:"is_used" binding:"required"` // 是否启用 1:是 -1:否 -} - -type createResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// Create 创建任务 -// @Summary 创建任务 -// @Description 创建任务 -// @Tags API.cron -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param name formData string true "任务名称" -// @Param spec formData string true "crontab 表达式" -// @Param command formData string true "执行命令" -// @Param protocol formData int true "执行方式 1:shell 2:http" -// @Param http_method formData int false "http 请求方式 1:get 2:post" -// @Param timeout formData int true "超时时间(单位:秒)" -// @Param retry_times formData int true "重试次数" -// @Param retry_interval formData int true "重试间隔(单位:秒)" -// @Param notify_status formData int true "执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知" -// @Param notify_type formData int false "通知类型 1:邮件 2:webhook" -// @Param notify_receiver_email formData string false "通知者邮箱地址(多个用,分割)" -// @Param notify_keyword formData string false "通知匹配关键字(多个用,分割)" -// @Param remark formData string false "备注" -// @Param is_used formData int true "是否启用 1:是 -1:否" -// @Success 200 {object} createResponse -// @Failure 400 {object} code.Failure -// @Router /api/cron [post] -// @Security LoginToken -func (h *handler) Create() core.HandlerFunc { - return func(ctx core.Context) { - req := new(createRequest) - res := new(createResponse) - if err := ctx.ShouldBindForm(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - validation.Error(err)).WithError(err), - ) - return - } - - createData := new(cron.CreateCronTaskData) - createData.Name = req.Name - createData.Spec = req.Spec - createData.Command = req.Command - createData.Protocol = req.Protocol - createData.HttpMethod = req.HttpMethod - createData.Timeout = req.Timeout - createData.RetryTimes = req.RetryTimes - createData.RetryInterval = req.RetryInterval - createData.NotifyStatus = req.NotifyStatus - createData.NotifyType = req.NotifyType - createData.NotifyReceiverEmail = req.NotifyReceiverEmail - createData.NotifyKeyword = req.NotifyKeyword - createData.Remark = req.Remark - createData.IsUsed = req.IsUsed - - id, err := h.cronService.Create(ctx, createData) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.CronCreateError, - code.Text(code.CronCreateError)).WithError(err), - ) - return - } - - res.Id = id - ctx.Payload(res) - } -} diff --git a/internal/api/cron/func_detail.go b/internal/api/cron/func_detail.go deleted file mode 100755 index 598dd99..0000000 --- a/internal/api/cron/func_detail.go +++ /dev/null @@ -1,97 +0,0 @@ -package cron - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/validation" - "github.com/ch3nnn/webstack-go/internal/services/cron" -) - -type detailRequest struct { - Id string `uri:"id"` // HashID -} - -type detailResponse struct { - Name string `json:"name"` // 任务名称 - Spec string `json:"spec"` // crontab 表达式 - Command string `json:"command"` // 执行命令 - Protocol int64 `json:"protocol"` // 执行方式 1:shell 2:http - HttpMethod int64 `json:"http_method"` // http 请求方式 1:get 2:post - Timeout int64 `json:"timeout"` // 超时时间(单位:秒) - RetryTimes int64 `json:"retry_times"` // 重试次数 - RetryInterval int64 `json:"retry_interval"` // 重试间隔(单位:秒) - NotifyStatus int64 `json:"notify_status"` // 执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知 - NotifyType int64 `json:"notify_type"` // 通知类型 1:邮件 2:webhook - NotifyReceiverEmail string `json:"notify_receiver_email"` // 通知者邮箱地址(多个用,分割) - NotifyKeyword string `json:"notify_keyword"` // 通知匹配关键字(多个用,分割) - Remark string `json:"remark"` // 备注 - IsUsed int64 `json:"is_used"` // 是否启用 1:是 -1:否 -} - -// Detail 获取单条任务详情 -// @Summary 获取单条任务详情 -// @Description 获取单条任务详情 -// @Tags API.cron -// @Accept json -// @Produce json -// @Param id path string true "hashId" -// @Success 200 {object} detailResponse -// @Failure 400 {object} code.Failure -// @Router /api/cron/{id} [get] -// @Security LoginToken -func (h *handler) Detail() core.HandlerFunc { - return func(ctx core.Context) { - req := new(detailRequest) - res := new(detailResponse) - if err := ctx.ShouldBindURI(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - validation.Error(err)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - searchOneData := new(cron.SearchOneData) - searchOneData.Id = int64(ids[0]) - - info, err := h.cronService.Detail(ctx, searchOneData) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.CronDetailError, - code.Text(code.CronDetailError)).WithError(err), - ) - return - } - - res.Name = info.Name - res.Spec = info.Spec - res.Command = info.Command - res.Protocol = info.Protocol - res.HttpMethod = info.HTTPMethod - res.Timeout = info.Timeout - res.RetryTimes = info.RetryTimes - res.RetryInterval = info.RetryInterval - res.NotifyStatus = info.NotifyStatus - res.NotifyType = info.NotifyType - res.NotifyReceiverEmail = info.NotifyReceiverEmail - res.NotifyKeyword = info.NotifyKeyword - res.Remark = info.Remark - res.IsUsed = info.IsUsed - - ctx.Payload(res) - } -} diff --git a/internal/api/cron/func_execute.go b/internal/api/cron/func_execute.go deleted file mode 100755 index 5ec4033..0000000 --- a/internal/api/cron/func_execute.go +++ /dev/null @@ -1,66 +0,0 @@ -package cron - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/validation" -) - -type executeRequest struct { - Id string `uri:"id"` // HashID -} - -type executeResponse struct { - Id int64 `json:"id"` // ID -} - -// Execute 手动执行单条任务 -// @Summary 手动执行单条任务 -// @Description 手动执行单条任务 -// @Tags API.cron -// @Accept json -// @Produce json -// @Param id path string true "hashId" -// @Success 200 {object} detailResponse -// @Failure 400 {object} code.Failure -// @Router /api/cron/exec/{id} [patch] -// @Security LoginToken -func (h *handler) Execute() core.HandlerFunc { - return func(ctx core.Context) { - req := new(executeRequest) - res := new(executeResponse) - if err := ctx.ShouldBindURI(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - validation.Error(err)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - err = h.cronService.Execute(ctx, int64(ids[0])) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.CronExecuteError, - code.Text(code.CronExecuteError)).WithError(err), - ) - return - } - - res.Id = int64(ids[0]) - ctx.Payload(res) - } -} diff --git a/internal/api/cron/func_list.go b/internal/api/cron/func_list.go deleted file mode 100755 index 7980883..0000000 --- a/internal/api/cron/func_list.go +++ /dev/null @@ -1,152 +0,0 @@ -package cron - -import ( - "github.com/ch3nnn/webstack-go/internal/repository/mysql/constant" - "github.com/spf13/cast" - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/timeutil" - "github.com/ch3nnn/webstack-go/internal/pkg/validation" - "github.com/ch3nnn/webstack-go/internal/services/cron" -) - -type listRequest struct { - Page int64 `form:"page,default=1"` // 第几页 - PageSize int64 `form:"page_size,default=10"` // 每页显示条数 - Name string `form:"name"` // 任务名称 - Protocol int64 `form:"protocol"` // 执行方式 1:shell 2:http - IsUsed int64 `form:"is_used"` // 是否启用 1:是 -1:否 -} - -type listData struct { - Id int64 `json:"id"` // ID - HashID string `json:"hashid"` // hashid - Name string `json:"name"` // 任务名称 - Protocol int64 `json:"protocol"` // 执行方式 1:shell 2:http - ProtocolText string `json:"protocol_text"` // 执行方式 - Spec string `json:"spec"` // crontab 表达式 - Command string `json:"command"` // 执行命令 - HttpMethod int64 `json:"http_method"` // http 请求方式 1:get 2:post - HttpMethodText string `json:"http_method_text"` // http 请求方式 - Timeout int64 `json:"timeout"` // 超时时间(单位:秒) - RetryTimes int64 `json:"retry_times"` // 重试次数 - RetryInterval int64 `json:"retry_interval"` // 重试间隔(单位:秒) - NotifyStatus int64 `json:"notify_status"` // 执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知 - NotifyStatusText string `json:"notify_status_text"` // 执行结束是否通知 - IsUsed int64 `json:"is_used"` // 是否启用 1=启用 2=禁用 - IsUsedText string `json:"is_used_text"` // 是否启用 - CreatedAt string `json:"created_at"` // 创建时间 - CreatedUser string `json:"created_user"` // 创建人 - UpdatedAt string `json:"updated_at"` // 更新时间 - UpdatedUser string `json:"updated_user"` // 更新人 -} - -type listResponse struct { - List []listData `json:"list"` - Pagination struct { - Total int64 `json:"total"` - CurrentPage int64 `json:"current_page"` - PerPageCount int64 `json:"per_page_count"` - } `json:"pagination"` -} - -// List 任务列表 -// @Summary 任务列表 -// @Description 任务列表 -// @Tags API.cron -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param page query int true "第几页" default(1) -// @Param page_size query int true "每页显示条数" default(10) -// @Param name query string false "任务名称" -// @Param protocol query int false "执行方式 1:shell 2:http" -// @Param is_used query int false "是否启用 1:是 -1:否" -// @Success 200 {object} listResponse -// @Failure 400 {object} code.Failure -// @Router /api/cron [get] -// @Security LoginToken -func (h *handler) List() core.HandlerFunc { - return func(ctx core.Context) { - req := new(listRequest) - res := new(listResponse) - if err := ctx.ShouldBindForm(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - validation.Error(err)).WithError(err), - ) - return - } - - searchData := new(cron.SearchData) - searchData.Page = req.Page - searchData.PageSize = req.PageSize - searchData.Name = req.Name - searchData.Protocol = req.Protocol - searchData.IsUsed = req.IsUsed - - resListData, err := h.cronService.PageList(ctx, searchData) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.CronListError, - code.Text(code.CronListError)).WithError(err), - ) - return - } - - resCountData, err := h.cronService.PageListCount(ctx, searchData) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.CronListError, - code.Text(code.CronListError)).WithError(err), - ) - return - } - - res.Pagination.Total = resCountData - res.Pagination.PerPageCount = req.PageSize - res.Pagination.CurrentPage = req.Page - res.List = make([]listData, len(resListData)) - - for k, v := range resListData { - hashId, err := h.hashids.HashidsEncode([]int{cast.ToInt(v.ID)}) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsEncodeError, - code.Text(code.HashIdsEncodeError)).WithError(err), - ) - return - } - - res.List[k] = listData{ - Id: v.ID, - HashID: hashId, - Name: v.Name, - Protocol: v.Protocol, - ProtocolText: constant.ProtocolText[v.Protocol], - Spec: v.Spec, - Command: v.Command, - HttpMethod: v.HTTPMethod, - HttpMethodText: constant.HttpMethodText[v.HTTPMethod], - Timeout: v.Timeout, - RetryTimes: v.RetryTimes, - RetryInterval: v.RetryInterval, - NotifyStatus: v.NotifyStatus, - NotifyStatusText: constant.NotifyStatusText[v.NotifyStatus], - IsUsed: v.IsUsed, - IsUsedText: constant.IsUsedText[v.IsUsed], - CreatedAt: v.CreatedAt.Format(timeutil.CSTLayout), - CreatedUser: v.CreatedUser, - UpdatedAt: v.UpdatedAt.Format(timeutil.CSTLayout), - UpdatedUser: v.UpdatedUser, - } - } - - ctx.Payload(res) - } -} diff --git a/internal/api/cron/func_modify.go b/internal/api/cron/func_modify.go deleted file mode 100755 index f9b43d6..0000000 --- a/internal/api/cron/func_modify.go +++ /dev/null @@ -1,112 +0,0 @@ -package cron - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/validation" - "github.com/ch3nnn/webstack-go/internal/services/cron" -) - -type modifyRequest struct { - Id string `form:"id" binding:"required"` // 任务ID - Name string `form:"name" binding:"required"` // 任务名称 - Spec string `form:"spec" binding:"required"` // crontab 表达式 - Command string `form:"command" binding:"required"` // 执行命令 - Protocol int64 `form:"protocol" binding:"required"` // 执行方式 1:shell 2:http - HttpMethod int64 `form:"http_method"` // http 请求方式 1:get 2:post - Timeout int64 `form:"timeout" binding:"required"` // 超时时间(单位:秒) - RetryTimes int64 `form:"retry_times" binding:"required"` // 重试次数 - RetryInterval int64 `form:"retry_interval" binding:"required"` // 重试间隔(单位:秒) - NotifyStatus int64 `form:"notify_status" binding:"required"` // 执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知 - NotifyType int64 `form:"notify_type"` // 通知类型 1:邮件 2:webhook - NotifyReceiverEmail string `form:"notify_receiver_email"` // 通知者邮箱地址(多个用,分割) - NotifyKeyword string `form:"notify_keyword"` // 通知匹配关键字(多个用,分割) - Remark string `form:"remark"` // 备注 - IsUsed int64 `form:"is_used" binding:"required"` // 是否启用 1:是 -1:否 -} - -type modifyResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// Modify 编辑任务 -// @Summary 编辑任务 -// @Description 编辑任务 -// @Tags API.cron -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id formData string true "hashID" -// @Param name formData string true "任务名称" -// @Param spec formData string true "crontab 表达式" -// @Param command formData string true "执行命令" -// @Param protocol formData int true "执行方式 1:shell 2:http" -// @Param http_method formData int false "http 请求方式 1:get 2:post" -// @Param timeout formData int true "超时时间(单位:秒)" -// @Param retry_times formData int true "重试次数" -// @Param retry_interval formData int true "重试间隔(单位:秒)" -// @Param notify_status formData int true "执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知" -// @Param notify_type formData int false "通知类型 1:邮件 2:webhook" -// @Param notify_receiver_email formData string false "通知者邮箱地址(多个用,分割)" -// @Param notify_keyword formData string false "通知匹配关键字(多个用,分割)" -// @Param remark formData string false "备注" -// @Param is_used formData int true "是否启用 1:是 -1:否" -// @Success 200 {object} modifyResponse -// @Failure 400 {object} code.Failure -// @Router /api/cron/{id} [post] -// @Security LoginToken -func (h *handler) Modify() core.HandlerFunc { - return func(ctx core.Context) { - req := new(modifyRequest) - res := new(modifyResponse) - if err := ctx.ShouldBindForm(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - validation.Error(err)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - id := int64(ids[0]) - - modifyData := new(cron.ModifyCronTaskData) - modifyData.Name = req.Name - modifyData.Spec = req.Spec - modifyData.Command = req.Command - modifyData.Protocol = req.Protocol - modifyData.HttpMethod = req.HttpMethod - modifyData.Timeout = req.Timeout - modifyData.RetryTimes = req.RetryTimes - modifyData.RetryInterval = req.RetryInterval - modifyData.NotifyStatus = req.NotifyStatus - modifyData.NotifyType = req.NotifyType - modifyData.NotifyReceiverEmail = req.NotifyReceiverEmail - modifyData.NotifyKeyword = req.NotifyKeyword - modifyData.Remark = req.Remark - modifyData.IsUsed = req.IsUsed - - if err := h.cronService.Modify(ctx, id, modifyData); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.CronUpdateError, - code.Text(code.CronUpdateError)).WithError(err), - ) - return - } - - res.Id = id - ctx.Payload(res) - } -} diff --git a/internal/api/cron/func_updateused.go b/internal/api/cron/func_updateused.go deleted file mode 100755 index ec688bb..0000000 --- a/internal/api/cron/func_updateused.go +++ /dev/null @@ -1,70 +0,0 @@ -package cron - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/validation" -) - -type updateUsedRequest struct { - Id string `form:"id"` // 主键ID - Used int64 `form:"used"` // 是否启用 1:是 -1:否 -} - -type updateUsedResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// UpdateUsed 更新任务为启用/禁用 -// @Summary 更新任务为启用/禁用 -// @Description 更新任务为启用/禁用 -// @Tags API.cron -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id formData string true "hashID" -// @Param used formData int true "是否启用 1:是 -1:否" -// @Success 200 {object} updateUsedResponse -// @Failure 400 {object} code.Failure -// @Router /api/cron/used [patch] -// @Security LoginToken -func (h *handler) UpdateUsed() core.HandlerFunc { - return func(ctx core.Context) { - req := new(updateUsedRequest) - res := new(updateUsedResponse) - if err := ctx.ShouldBindForm(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - validation.Error(err)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - id := int64(ids[0]) - - err = h.cronService.UpdateUsed(ctx, id, req.Used) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.AdminUpdateError, - code.Text(code.AdminUpdateError)).WithError(err), - ) - return - } - - res.Id = id - ctx.Payload(res) - } -} diff --git a/internal/api/cron/handler.go b/internal/api/cron/handler.go deleted file mode 100755 index f076991..0000000 --- a/internal/api/cron/handler.go +++ /dev/null @@ -1,67 +0,0 @@ -package cron - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/hash" - cronRepo "github.com/ch3nnn/webstack-go/internal/repository/cron" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - "github.com/ch3nnn/webstack-go/internal/services/cron" - - "go.uber.org/zap" -) - -var _ Handler = (*handler)(nil) - -type Handler interface { - i() - - // Create 创建任务 - // @Tags API.cron - // @Router /api/cron [post] - Create() core.HandlerFunc - - // Modify 编辑任务 - // @Tags API.cron - // @Router /api/cron/{id} [post] - Modify() core.HandlerFunc - - // List 任务列表 - // @Tags API.cron - // @Router /api/cron [get] - List() core.HandlerFunc - - // UpdateUsed 更新任务为启用/禁用 - // @Tags API.cron - // @Router /api/cron/used [patch] - UpdateUsed() core.HandlerFunc - - // Detail 获取单条任务详情 - // @Tags API.cron - // @Router /api/cron/{id} [get] - Detail() core.HandlerFunc - - // Execute 手动执行任务 - // @Tags API.cron - // @Router /api/cron/exec/{id} [patch] - Execute() core.HandlerFunc -} - -type handler struct { - logger *zap.Logger - cache redis.Repo - hashids hash.Hash - cronService cron.Service -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo, cronServer cronRepo.Server) Handler { - return &handler{ - logger: logger, - cache: cache, - hashids: hash.New(configs.Get().HashIds.Secret, configs.Get().HashIds.Length), - cronService: cron.New(db, cache, cronServer), - } -} - -func (h *handler) i() {} diff --git a/internal/api/helper/func_md5.go b/internal/api/helper/func_md5.go deleted file mode 100755 index 1178671..0000000 --- a/internal/api/helper/func_md5.go +++ /dev/null @@ -1,49 +0,0 @@ -package helper - -import ( - "crypto/md5" - "encoding/hex" - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type md5Request struct { - Str string `uri:"str" binding:"required"` // 需要加密的字符串 -} - -type md5Response struct { - Md5Str string `json:"md5_str"` // MD5后的字符串 -} - -// Md5 加密 -// @Summary 加密 -// @Description 加密 -// @Tags Helper -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param str path string true "需要加密的字符串" -// @Success 200 {object} md5Response -// @Failure 400 {object} code.Failure -// @Router /helper/md5/{str} [get] -func (h *handler) Md5() core.HandlerFunc { - return func(ctx core.Context) { - req := new(md5Request) - res := new(md5Response) - - if err := ctx.ShouldBindURI(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - m := md5.New() - m.Write([]byte(req.Str)) - res.Md5Str = hex.EncodeToString(m.Sum(nil)) - ctx.Payload(res) - } -} diff --git a/internal/api/helper/func_sign.go b/internal/api/helper/func_sign.go deleted file mode 100755 index 19e9670..0000000 --- a/internal/api/helper/func_sign.go +++ /dev/null @@ -1,100 +0,0 @@ -package helper - -import ( - "fmt" - "net/http" - "net/url" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/pkg/signature" -) - -type signRequest struct { - Key string `form:"key" binding:"required"` // 调用方 KEY - Path string `form:"path" binding:"required"` // 请求路径 (不附带 querystring),例如:/api/login - Method string `form:"method" binding:"required"` // 请求方式,例如:POST - Params string `form:"params" binding:"required"` // 请求参数,例如:username=tom&password=123456 -} - -type signResponse struct { - Authorization string `json:"authorization"` // 签名信息-Authorization - AuthorizationDate string `json:"authorization_date"` // 签名信息-Authorization-Date -} - -// Sign 签名 -// @Summary 签名 -// @Description 签名 -// @Tags Helper -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param key formData string true "调用方 KEY" -// @Param path formData string true "请求路径 (不附带 querystring),例如:/api/login" -// @Param method formData string true "请求方式,例如:POST" -// @Param params formData string true "请求参数,例如:username=tom&password=123456" -// @Success 200 {object} signResponse -// @Failure 400 {object} code.Failure -// @Router /helper/sign [post] -func (h *handler) Sign() core.HandlerFunc { - return func(ctx core.Context) { - req := new(signRequest) - res := new(signResponse) - - if err := ctx.ShouldBindForm(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - authorizedInfo, err := h.authorizedService.DetailByKey(ctx, req.Key) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(err), - ) - return - } - - if authorizedInfo.IsUsed == -1 { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(errors.New(req.Key + " 已被禁止调用")), - ) - return - } - - fmt.Println(req.Params) - - params, err := url.ParseQuery(req.Params) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizationError, - "params 传递格式不正确"), - ) - return - } - - sign := signature.New(req.Key, authorizedInfo.Secret, configs.HeaderSignTokenTimeout) - authorized, date, err := sign.Generate(req.Path, req.Method, params) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizationError, - "sign 生成失败"), - ) - return - } - - res.Authorization = authorized - res.AuthorizationDate = date - ctx.Payload(res) - } -} diff --git a/internal/api/helper/handler.go b/internal/api/helper/handler.go deleted file mode 100755 index f72d1c9..0000000 --- a/internal/api/helper/handler.go +++ /dev/null @@ -1,42 +0,0 @@ -package helper - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - "github.com/ch3nnn/webstack-go/internal/services/authorized" - - "go.uber.org/zap" -) - -var _ Handler = (*handler)(nil) - -type Handler interface { - i() - - // Md5 加密 - // @Tags Helper - // @Router /helper/md5/{str} [get] - Md5() core.HandlerFunc - - // Sign 签名 - // @Tags Helper - // @Router /helper/sign [post] - Sign() core.HandlerFunc -} - -type handler struct { - logger *zap.Logger - db mysql.Repo - authorizedService authorized.Service -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) Handler { - return &handler{ - logger: logger, - db: db, - authorizedService: authorized.New(db, cache), - } -} - -func (h *handler) i() {} diff --git a/internal/api/index/func_about.go b/internal/api/index/func_about.go deleted file mode 100644 index fb46259..0000000 --- a/internal/api/index/func_about.go +++ /dev/null @@ -1,12 +0,0 @@ -package index - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -func (h *handler) About() core.HandlerFunc { - return func(c core.Context) { - c.HTML("about", nil) - } - -} diff --git a/internal/api/index/func_index.go b/internal/api/index/func_index.go deleted file mode 100644 index 1a55a0d..0000000 --- a/internal/api/index/func_index.go +++ /dev/null @@ -1,52 +0,0 @@ -package index - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/file" - "github.com/ch3nnn/webstack-go/internal/services/category" - "github.com/ch3nnn/webstack-go/internal/services/site" - "net/http" -) - -type indexResponse struct { - CategoryTree []*category.TreeNode - CategorySites []*site.CategorySite -} - -func (h *handler) Index() core.HandlerFunc { - return func(c core.Context) { - - if _, ok := file.IsExists(configs.ProjectInstallMark); !ok { - c.Redirect(http.StatusTemporaryRedirect, "/install") - } - - categoryTree, err := h.categoryService.Tree(c) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MenuListError, - code.Text(code.MenuListError)).WithError(err), - ) - return - } - - categorySites, err := h.siteService.CategorySite(c) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MenuListError, - code.Text(code.MenuListError)).WithError(err), - ) - return - } - - response := indexResponse{ - CategoryTree: categoryTree, - CategorySites: categorySites, - } - - c.HTML("index", response) - } -} diff --git a/internal/api/index/handler.go b/internal/api/index/handler.go deleted file mode 100755 index 77f5104..0000000 --- a/internal/api/index/handler.go +++ /dev/null @@ -1,52 +0,0 @@ -package index - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/hash" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - "github.com/ch3nnn/webstack-go/internal/services/category" - "github.com/ch3nnn/webstack-go/internal/services/index" - "github.com/ch3nnn/webstack-go/internal/services/site" - - "go.uber.org/zap" -) - -var _ Handler = (*handler)(nil) - -type Handler interface { - i() - - // Index 导航网站首页 - // @Tags API.admin - // @Router / [get] - Index() core.HandlerFunc - - // About 导航网站关于页 - // @Tags API.admin - // @Router /about [get] - About() core.HandlerFunc -} - -type handler struct { - logger *zap.Logger - cache redis.Repo - hashids hash.Hash - indexService index.Service - categoryService category.Service - siteService site.Service -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) Handler { - return &handler{ - logger: logger, - cache: cache, - hashids: hash.New(configs.Get().HashIds.Secret, configs.Get().HashIds.Length), - indexService: index.New(db, cache), - categoryService: category.New(db, cache), - siteService: site.New(db, cache), - } -} - -func (h *handler) i() {} diff --git a/internal/api/menu/func_create.go b/internal/api/menu/func_create.go deleted file mode 100755 index 83ee3a5..0000000 --- a/internal/api/menu/func_create.go +++ /dev/null @@ -1,110 +0,0 @@ -package menu - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/services/menu" -) - -type createRequest struct { - Id string `form:"id"` // ID - Pid int64 `form:"pid"` // 父类ID - Name string `form:"name"` // 菜单名称 - Link string `form:"link"` // 链接地址 - Icon string `form:"icon"` // 图标 - Level int64 `form:"level"` // 菜单类型 1:一级菜单 2:二级菜单 -} - -type createResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// Create 创建/编辑菜单 -// @Summary 创建/编辑菜单 -// @Description 创建/编辑菜单 -// @Tags API.menu -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body createRequest true "请求信息" -// @Success 200 {object} createResponse -// @Failure 400 {object} code.Failure -// @Router /api/menu [post] -// @Security LoginToken -func (h *handler) Create() core.HandlerFunc { - return func(c core.Context) { - req := new(createRequest) - res := new(createResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - if req.Id != "" { // 编辑功能 - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - id := int64(ids[0]) - - updateData := new(menu.UpdateMenuData) - updateData.Name = req.Name - updateData.Icon = req.Icon - updateData.Link = req.Link - - err = h.menuService.Modify(c, id, updateData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MenuUpdateError, - code.Text(code.MenuUpdateError)).WithError(err), - ) - return - } - - res.Id = id - c.Payload(res) - - } else { // 新增功能 - - pid := req.Level - level := 2 - - if req.Level == -1 { - pid = 0 - level = 1 - } - - createData := new(menu.CreateMenuData) - createData.Pid = pid - createData.Name = req.Name - createData.Icon = req.Icon - createData.Link = req.Link - createData.Level = int64(level) - - id, err := h.menuService.Create(c, createData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MenuCreateError, - code.Text(code.MenuCreateError)).WithError(err), - ) - return - } - - res.Id = id - c.Payload(res) - } - } -} diff --git a/internal/api/menu/func_createaction.go b/internal/api/menu/func_createaction.go deleted file mode 100755 index 9b16d95..0000000 --- a/internal/api/menu/func_createaction.go +++ /dev/null @@ -1,87 +0,0 @@ -package menu - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/services/menu" -) - -type createActionRequest struct { - Id string `form:"id"` // HashID - Method string `form:"method"` // 请求方法 - API string `form:"api"` // 请求地址 -} - -type createActionResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// CreateAction 创建功能权限 -// @Summary 创建功能权限 -// @Description 创建功能权限 -// @Tags API.menu -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id formData string true "HashID" -// @Param method formData string true "请求方法" -// @Param api formData string true "请求地址" -// @Success 200 {object} createActionResponse -// @Failure 400 {object} code.Failure -// @Router /api/menu_action [post] -// @Security LoginToken -func (h *handler) CreateAction() core.HandlerFunc { - return func(c core.Context) { - req := new(createActionRequest) - res := new(createActionResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - searchOneData := new(menu.SearchOneData) - searchOneData.Id = int64(ids[0]) - menuInfo, err := h.menuService.Detail(c, searchOneData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MenuDetailError, - code.Text(code.MenuDetailError)).WithError(err), - ) - return - } - - createActionData := new(menu.CreateMenuActionData) - createActionData.MenuId = menuInfo.ID - createActionData.Method = req.Method - createActionData.API = req.API - - createId, err := h.menuService.CreateAction(c, createActionData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MenuCreateActionError, - code.Text(code.MenuCreateActionError)).WithError(err), - ) - return - } - - res.Id = int64(createId) - c.Payload(res) - } -} diff --git a/internal/api/menu/func_delete.go b/internal/api/menu/func_delete.go deleted file mode 100755 index 6099e0b..0000000 --- a/internal/api/menu/func_delete.go +++ /dev/null @@ -1,65 +0,0 @@ -package menu - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type deleteRequest struct { - Id string `uri:"id"` // HashID -} - -type deleteResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// Delete 删除菜单 -// @Summary 删除菜单 -// @Description 删除菜单 -// @Tags API.menu -// @Accept json -// @Produce json -// @Param id path string true "hashId" -// @Success 200 {object} deleteResponse -// @Failure 400 {object} code.Failure -// @Router /api/menu/{id} [delete] -// @Security LoginToken -func (h *handler) Delete() core.HandlerFunc { - return func(c core.Context) { - req := new(deleteRequest) - res := new(deleteResponse) - if err := c.ShouldBindURI(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - err = h.menuService.Delete(c, int64(ids[0])) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MenuDeleteError, - code.Text(code.MenuDeleteError)).WithError(err), - ) - return - } - - res.Id = int64(ids[0]) - c.Payload(res) - } -} diff --git a/internal/api/menu/func_deleteaction.go b/internal/api/menu/func_deleteaction.go deleted file mode 100755 index c615d7b..0000000 --- a/internal/api/menu/func_deleteaction.go +++ /dev/null @@ -1,67 +0,0 @@ -package menu - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type deleteActionRequest struct { - Id string `uri:"id"` // HashID -} - -type deleteActionResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// DeleteAction 删除功能权限 -// @Summary 删除功能权限 -// @Description 删除功能权限 -// @Tags API.menu -// @Accept json -// @Produce json -// @Param id path string true "hashId" -// @Success 200 {object} deleteActionResponse -// @Failure 400 {object} code.Failure -// @Router /api/menu_action/{id} [delete] -// @Security LoginToken -func (h *handler) DeleteAction() core.HandlerFunc { - return func(c core.Context) { - req := new(deleteActionRequest) - res := new(deleteActionResponse) - if err := c.ShouldBindURI(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - id := int64(ids[0]) - - err = h.menuService.DeleteAction(c, id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MenuDeleteActionError, - code.Text(code.MenuDeleteActionError)).WithError(err), - ) - return - } - - res.Id = id - c.Payload(res) - } -} diff --git a/internal/api/menu/func_detail.go b/internal/api/menu/func_detail.go deleted file mode 100755 index f5fc68f..0000000 --- a/internal/api/menu/func_detail.go +++ /dev/null @@ -1,77 +0,0 @@ -package menu - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/services/menu" -) - -type detailRequest struct { - Id string `uri:"id"` // HashID -} - -type detailResponse struct { - Id int64 `json:"id"` // 主键ID - Pid int64 `json:"pid"` // 父类ID - Name string `json:"name"` // 菜单名称 - Link string `json:"link"` // 链接地址 - Icon string `json:"icon"` // 图标 -} - -// Detail 菜单详情 -// @Summary 菜单详情 -// @Description 菜单详情 -// @Tags API.menu -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id path string true "hashId" -// @Success 200 {object} detailResponse -// @Failure 400 {object} code.Failure -// @Router /api/menu/{id} [get] -// @Security LoginToken -func (h *handler) Detail() core.HandlerFunc { - return func(c core.Context) { - req := new(detailRequest) - res := new(detailResponse) - if err := c.ShouldBindURI(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - searchOneData := new(menu.SearchOneData) - searchOneData.Id = int64(ids[0]) - - info, err := h.menuService.Detail(c, searchOneData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MenuDetailError, - code.Text(code.MenuDetailError)).WithError(err), - ) - return - } - - res.Id = info.ID - res.Pid = info.Pid - res.Name = info.Name - res.Link = info.Link - res.Icon = info.Icon - c.Payload(res) - } -} diff --git a/internal/api/menu/func_list.go b/internal/api/menu/func_list.go deleted file mode 100755 index 8819039..0000000 --- a/internal/api/menu/func_list.go +++ /dev/null @@ -1,78 +0,0 @@ -package menu - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/services/menu" - - "github.com/spf13/cast" -) - -type listData struct { - Id int64 `json:"id"` // ID - HashID string `json:"hashid"` // hashid - Pid int64 `json:"pid"` // 父类ID - Name string `json:"name"` // 菜单名称 - Link string `json:"link"` // 链接地址 - Icon string `json:"icon"` // 图标 - IsUsed int64 `json:"is_used"` // 是否启用 1=启用 -1=禁用 - Sort int64 `json:"sort"` // 排序 -} - -type listResponse struct { - List []listData `json:"list"` -} - -// List 菜单列表 -// @Summary 菜单列表 -// @Description 菜单列表 -// @Tags API.menu -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Success 200 {object} listResponse -// @Failure 400 {object} code.Failure -// @Router /api/menu [get] -// @Security LoginToken -func (h *handler) List() core.HandlerFunc { - return func(c core.Context) { - res := new(listResponse) - menus, err := h.menuService.List(c, new(menu.SearchData)) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MenuListError, - code.Text(code.MenuListError)).WithError(err), - ) - return - } - - res.List = make([]listData, len(menus)) - - for i, m := range menus { - hashId, err := h.hashids.HashidsEncode([]int{cast.ToInt(m.ID)}) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsEncodeError, - code.Text(code.HashIdsEncodeError)).WithError(err), - ) - return - } - - res.List[i] = listData{ - Id: m.ID, - HashID: hashId, - Pid: m.Pid, - Name: m.Name, - Link: m.Link, - Icon: m.Icon, - IsUsed: m.IsUsed, - Sort: m.Sort, - } - } - - c.Payload(res) - } -} diff --git a/internal/api/menu/func_listaction.go b/internal/api/menu/func_listaction.go deleted file mode 100755 index b154b25..0000000 --- a/internal/api/menu/func_listaction.go +++ /dev/null @@ -1,116 +0,0 @@ -package menu - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/services/menu" - - "github.com/spf13/cast" -) - -type listActionRequest struct { - Id string `form:"id"` // hashID -} - -type listActionData struct { - HashId string `json:"hash_id"` // hashID - MenuId int64 `json:"menu_id"` // 菜单栏ID - Method string `json:"method"` // 调用方secret - API string `json:"api"` // 调用方对接人 -} - -type listActionResponse struct { - MenuName string `json:"menu_name"` - List []listActionData `json:"list"` -} - -// ListAction 功能权限列表 -// @Summary 功能权限列表 -// @Description 功能权限列表 -// @Tags API.menu -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id query string true "hashID" -// @Success 200 {object} listActionResponse -// @Failure 400 {object} code.Failure -// @Router /api/menu_action [get] -// @Security LoginToken -func (h *handler) ListAction() core.HandlerFunc { - return func(c core.Context) { - req := new(listActionRequest) - res := new(listActionResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - searchOneData := new(menu.SearchOneData) - searchOneData.Id = int64(ids[0]) - - menuInfo, err := h.menuService.Detail(c, searchOneData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MenuDetailError, - code.Text(code.MenuDetailError)).WithError(err), - ) - return - } - - res.MenuName = menuInfo.Name - - searchListData := new(menu.SearchListActionData) - searchListData.MenuId = menuInfo.ID - - resListData, err := h.menuService.ListAction(c, searchListData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizedListAPIError, - code.Text(code.AuthorizedListAPIError)).WithError(err), - ) - return - } - - res.List = make([]listActionData, len(resListData)) - - for k, v := range resListData { - hashId, err := h.hashids.HashidsEncode([]int{cast.ToInt(v.ID)}) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsEncodeError, - code.Text(code.HashIdsEncodeError)).WithError(err), - ) - return - } - - data := listActionData{ - HashId: hashId, - MenuId: v.MenuID, - Method: v.Method, - API: v.API, - } - - res.List[k] = data - } - - c.Payload(res) - } -} diff --git a/internal/api/menu/func_updatesort.go b/internal/api/menu/func_updatesort.go deleted file mode 100755 index add5e5b..0000000 --- a/internal/api/menu/func_updatesort.go +++ /dev/null @@ -1,69 +0,0 @@ -package menu - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type updateSortRequest struct { - Id string `form:"id"` // HashId - Sort int64 `form:"sort"` // 排序 -} - -type updateSortResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// UpdateSort 更新菜单排序 -// @Summary 更新菜单排序 -// @Description 更新菜单排序 -// @Tags API.menu -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id formData string true "hashId" -// @Param sort formData int true "排序" -// @Success 200 {object} updateSortResponse -// @Failure 400 {object} code.Failure -// @Router /api/menu/sort [patch] -// @Security LoginToken -func (h *handler) UpdateSort() core.HandlerFunc { - return func(c core.Context) { - req := new(updateSortRequest) - res := new(updateSortResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - id := int64(ids[0]) - - err = h.menuService.UpdateSort(c, id, req.Sort) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MenuUpdateError, - code.Text(code.MenuUpdateError)).WithError(err), - ) - return - } - - res.Id = id - c.Payload(res) - } -} diff --git a/internal/api/menu/func_updateused.go b/internal/api/menu/func_updateused.go deleted file mode 100755 index fe5ee56..0000000 --- a/internal/api/menu/func_updateused.go +++ /dev/null @@ -1,69 +0,0 @@ -package menu - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type updateUsedRequest struct { - Id string `form:"id"` // 主键ID - Used int64 `form:"used"` // 是否启用 1:是 -1:否 -} - -type updateUsedResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// UpdateUsed 更新菜单为启用/禁用 -// @Summary 更新菜单为启用/禁用 -// @Description 更新菜单为启用/禁用 -// @Tags API.menu -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id formData string true "hashId" -// @Param used formData int true "是否启用 1:是 -1:否" -// @Success 200 {object} updateUsedResponse -// @Failure 400 {object} code.Failure -// @Router /api/menu/used [patch] -// @Security LoginToken -func (h *handler) UpdateUsed() core.HandlerFunc { - return func(c core.Context) { - req := new(updateUsedRequest) - res := new(updateUsedResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - ids, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - id := int64(ids[0]) - - err = h.menuService.UpdateUsed(c, id, req.Used) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MenuUpdateError, - code.Text(code.MenuUpdateError)).WithError(err), - ) - return - } - - res.Id = id - c.Payload(res) - } -} diff --git a/internal/api/menu/handler.go b/internal/api/menu/handler.go deleted file mode 100755 index beaa953..0000000 --- a/internal/api/menu/handler.go +++ /dev/null @@ -1,81 +0,0 @@ -package menu - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/hash" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - "github.com/ch3nnn/webstack-go/internal/services/menu" - - "go.uber.org/zap" -) - -var _ Handler = (*handler)(nil) - -type Handler interface { - i() - - // Create 创建/编辑菜单 - // @Tags API.menu - // @Router /api/menu [post] - Create() core.HandlerFunc - - // Detail 菜单详情 - // @Tags API.menu - // @Router /api/menu/{id} [get] - Detail() core.HandlerFunc - - // Delete 删除菜单 - // @Tags API.menu - // @Router /api/menu/{id} [delete] - Delete() core.HandlerFunc - - // UpdateUsed 更新菜单为启用/禁用 - // @Tags API.menu - // @Router /api/menu/used [patch] - UpdateUsed() core.HandlerFunc - - // UpdateSort 更新菜单排序 - // @Tags API.menu - // @Router /api/menu/sort [patch] - UpdateSort() core.HandlerFunc - - // List 菜单列表 - // @Tags API.menu - // @Router /api/menu [get] - List() core.HandlerFunc - - // CreateAction 创建功能权限 - // @Tags API.menu - // @Router /api/menu_action [post] - CreateAction() core.HandlerFunc - - // ListAction 功能权限列表 - // @Tags API.menu - // @Router /api/menu_action [get] - ListAction() core.HandlerFunc - - // DeleteAction 删除功能权限 - // @Tags API.menu - // @Router /api/menu_action/{id} [delete] - DeleteAction() core.HandlerFunc -} - -type handler struct { - logger *zap.Logger - cache redis.Repo - hashids hash.Hash - menuService menu.Service -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) Handler { - return &handler{ - logger: logger, - cache: cache, - hashids: hash.New(configs.Get().HashIds.Secret, configs.Get().HashIds.Length), - menuService: menu.New(db, cache), - } -} - -func (h *handler) i() {} diff --git a/internal/api/site/func_categorylist.go b/internal/api/site/func_categorylist.go deleted file mode 100644 index 69725f9..0000000 --- a/internal/api/site/func_categorylist.go +++ /dev/null @@ -1,79 +0,0 @@ -package site - -import ( - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/spf13/cast" - "net/http" -) - -type categoryListData struct { - Id int64 `json:"id"` // ID - HashID string `json:"hashid"` // hashid - Pid int64 `json:"pid"` // 父类ID - Name string `json:"name"` // 分类名称 - Link string `json:"link"` // 链接地址 - Icon string `json:"icon"` // 图标 - IsUsed int64 `json:"is_used"` // 是否启用 1=启用 -1=禁用 - Sort int64 `json:"sort"` // 排序 - Level int64 `json:"level"` // 分类等级 1 一级分类 2 二级分类 - -} - -type categoryListResponse struct { - List []categoryListData `json:"list"` -} - -// CategoryList 网站列列表-新增列表分类下拉框数据 -// @Summary 网站列列表-新增列表分类下拉框数据 -// @Description 网站列列表-新增列表分类下拉框数据 -// @Tags API.site -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body listRequest true "请求信息" -// @Success 200 {object} listResponse -// @Failure 400 {object} code.Failure -// @Router /api/site/category [get] -func (h *handler) CategoryList() core.HandlerFunc { - return func(c core.Context) { - res := new(categoryListResponse) - categories, err := h.siteService.CategoryList(c) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.SiteCategoryError, - code.Text(code.SiteCategoryError)).WithError(err), - ) - return - } - - res.List = make([]categoryListData, len(categories)) - - for i, cat := range categories { - hashId, err := h.hashids.HashidsEncode([]int{cast.ToInt(cat.ID)}) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsEncodeError, - code.Text(code.HashIdsEncodeError)).WithError(err), - ) - return - } - - data := categoryListData{ - Id: cat.ID, - HashID: hashId, - Pid: cat.ParentID, - Name: cat.Title, - Icon: cat.Icon, - IsUsed: cat.IsUsed, - Sort: cat.Sort, - Level: cat.Level, - } - - res.List[i] = data - } - - c.Payload(res) - } -} diff --git a/internal/api/site/func_create.go b/internal/api/site/func_create.go deleted file mode 100755 index bc5c712..0000000 --- a/internal/api/site/func_create.go +++ /dev/null @@ -1,61 +0,0 @@ -package site - -import ( - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/services/site" - "github.com/go-playground/validator/v10" - "net/http" - "strings" -) - -type createRequest struct { - CategoryId int64 `form:"category_id"` - Url string `form:"url"` -} - -type createResponse struct { - SuccessCount int64 `json:"successCount"` - FailCount int64 `json:"failCount"` -} - -// Create 创建网站 -// @Summary 创建网站 -// @Description 创建网站 -// @Tags API.site -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body createRequest true "请求信息" -// @Success 200 {object} createResponse -// @Failure 400 {object} code.Failure -// @Router /api/site [post] -func (h *handler) Create() core.HandlerFunc { - return func(c core.Context) { - req := new(createRequest) - res := new(createResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - sites := make([]*site.CreateSiteData, 0, 10) - for _, url := range strings.Split(req.Url, "\n") { - // 校验网址格式 - if err := validator.New().Var(url, "http_url"); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - sites = append(sites, &site.CreateSiteData{CategoryId: req.CategoryId, Url: url}) - } - res.SuccessCount, res.FailCount = h.siteService.Create(c, sites) - - c.Payload(res) - } -} diff --git a/internal/api/site/func_delete.go b/internal/api/site/func_delete.go deleted file mode 100755 index c1cc0fc..0000000 --- a/internal/api/site/func_delete.go +++ /dev/null @@ -1,52 +0,0 @@ -package site - -import ( - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "net/http" -) - -type deleteRequest struct { - Id int64 `uri:"id"` // 主键ID -} - -type deleteResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// Delete 删除网站信息 -// @Summary 删除网站信息 -// @Description 删除网站信息 -// @Tags API.site -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body deleteRequest true "请求信息" -// @Success 200 {object} deleteResponse -// @Failure 400 {object} code.Failure -// @Router /api/site/{id} [delete] -func (h *handler) Delete() core.HandlerFunc { - return func(c core.Context) { - req := new(deleteRequest) - res := new(deleteResponse) - if err := c.ShouldBindURI(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - if err := h.siteService.Delete(c, req.Id); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.SiteDeleteError, - code.Text(code.SiteDeleteError)).WithError(err), - ) - return - } - - res.Id = req.Id - c.Payload(res) - } -} diff --git a/internal/api/site/func_list.go b/internal/api/site/func_list.go deleted file mode 100755 index e2ce885..0000000 --- a/internal/api/site/func_list.go +++ /dev/null @@ -1,125 +0,0 @@ -package site - -import ( - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/services/site" - "github.com/spf13/cast" - "net/http" - "strings" -) - -type listRequest struct { - Page int64 `form:"page,default=1"` // 第几页 - PageSize int64 `form:"page_size,default=10" ` // 每页显示条数 - BusinessKey string `form:"business_key"` // 调用方key - BusinessSecret string `form:"business_secret"` // 调用方secret - BusinessDeveloper string `form:"business_developer"` // 调用方对接人 - Remark string `form:"remark"` // 备注 -} -type listData struct { - Id int `json:"id"` // ID - Thumb string `json:"thumb"` // 网站 logo - Title string `json:"title"` // 名称简介 - Url string `json:"url"` // 链接 - Category string `json:"category"` // 分类 - CategoryId int64 `json:"category_id"` // 分类id - Description string `json:"description"` // 描述 - IsUsed int64 `json:"is_used"` // 是否启用 - CreatedAt string `json:"created_at"` // 创建时间 - UpdatedAt string `json:"updated_at"` // 更新时间 -} - -type listResponse struct { - List []listData `json:"list"` - Pagination struct { - Total int64 `json:"total"` - CurrentPage int64 `json:"current_page"` - PerPageCount int64 `json:"per_page_count"` - } `json:"pagination"` -} - -// List 网站列表 -// @Summary 网站列表 -// @Description 网站列表 -// @Tags API.site -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body listRequest true "请求信息" -// @Success 200 {object} listResponse -// @Failure 400 {object} code.Failure -// @Router /api/site [get] -func (h *handler) List() core.HandlerFunc { - return func(c core.Context) { - req := new(listRequest) - res := new(listResponse) - if err := c.ShouldBind(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - searchData := new(site.SearchData) - searchData.Page = req.Page - searchData.PageSize = req.PageSize - searchData.BusinessKey = req.BusinessKey - searchData.BusinessSecret = req.BusinessSecret - searchData.Remark = req.Remark - searchData.Search = strings.TrimSpace(c.Query("search")) - - sites, err := h.siteService.PageList(c, searchData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizedListError, - code.Text(code.AuthorizedListError)).WithError(err), - ) - return - } - - total, err := h.siteService.PageListCount(c, searchData) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.SiteListError, - code.Text(code.SiteListError)).WithError(err), - ) - return - } - - res.List = make([]listData, len(sites)) - for i, sit := range sites { - _, err := h.hashids.HashidsEncode([]int{cast.ToInt(sit.ID)}) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsEncodeError, - code.Text(code.HashIdsEncodeError)).WithError(err), - ) - return - } - - res.List[i] = listData{ - Id: cast.ToInt(sit.ID), - Thumb: sit.Thumb, - Title: sit.Title, - Url: sit.URL, - Category: sit.Category.Title, - CategoryId: sit.Category.ID, - Description: sit.Description, - IsUsed: sit.IsUsed, - CreatedAt: sit.CreatedAt.Format("2006-01-02 15:04:05"), - UpdatedAt: sit.UpdatedAt.Format("2006-01-02 15:04:05"), - } - } - - res.Pagination.Total = total - res.Pagination.PerPageCount = req.PageSize - res.Pagination.CurrentPage = req.Page - - c.Payload(res) - } -} diff --git a/internal/api/site/func_sync.go b/internal/api/site/func_sync.go deleted file mode 100644 index 135c3be..0000000 --- a/internal/api/site/func_sync.go +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @Author: chentong - * @Date: 2024/05/19 下午7:12 - */ - -package site - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type syncRequest struct { - Id int64 `uri:"id"` // 主键ID -} - -type syncResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// SyncSite 一键同步 -// @Summary 一键同步 -// @Description 一键同步 -// @Tags API.site -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body syncRequest true "请求信息" -// @Success 200 {object} syncResponse -// @Failure 400 {object} code.Failure -// @Router /api/site/sync [patch] -func (h *handler) SyncSite() core.HandlerFunc { - return func(c core.Context) { - req := new(syncRequest) - res := new(syncResponse) - if err := c.ShouldBindURI(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - if err := h.siteService.Sync(c, req.Id); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.SiteUpdateError, - code.Text(code.SiteUpdateError)).WithError(err), - ) - return - } - - res.Id = req.Id - c.Payload(res) - } -} diff --git a/internal/api/site/func_updatesite.go b/internal/api/site/func_updatesite.go deleted file mode 100644 index efc5d25..0000000 --- a/internal/api/site/func_updatesite.go +++ /dev/null @@ -1,61 +0,0 @@ -package site - -import ( - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/services/site" - "mime/multipart" - "net/http" -) - -type updateSiteRequest struct { - Id int64 `form:"id,omitempty"` - CategoryId int64 `form:"category_id,omitempty"` // 网站分类id - Title string `form:"title,omitempty"` // 网站标题 - Thumb string `form:"thumb,omitempty"` // 网站 logo - Description string `form:"description,omitempty"` // 网站描述 - Url string `form:"url,omitempty"` // 网站地址 - File *multipart.FileHeader `json:"file"` // 上传 logo 图片 -} - -type updateSiteResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// UpdateSite 编辑网站 -// @Summary 编辑网站 -// @Description 编辑网站 -// @Tags API.site -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request formData updateSiteRequest true "请求信息" -// @Success 200 {object} updateSiteResponse -// @Failure 400 {object} code.Failure -// @Router /api/site [put] -func (h *handler) UpdateSite() core.HandlerFunc { - return func(c core.Context) { - req := new(updateSiteRequest) - res := new(updateSiteResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - if file, _ := c.FormFile("file"); file != nil { - req.File = file - } - if err := h.siteService.UpdateSite(c, (*site.UpdateSiteRequest)(req)); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.SiteUpdateError, - code.Text(code.SiteUpdateError)).WithError(err), - ) - return - } - res.Id = req.Id - c.Payload(res) - } -} diff --git a/internal/api/site/func_updateused.go b/internal/api/site/func_updateused.go deleted file mode 100755 index 8e85933..0000000 --- a/internal/api/site/func_updateused.go +++ /dev/null @@ -1,53 +0,0 @@ -package site - -import ( - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "net/http" -) - -type updateUsedRequest struct { - Id int64 `form:"id"` // 主键ID - Used int64 `form:"used"` // 是否启用 1:是 -1:否 -} - -type updateUsedResponse struct { - Id int64 `json:"id"` // 主键ID -} - -// UpdateUsed 更新网站为启用/禁用 -// @Summary 更新网站为启用/禁用 -// @Description 更新网站为启用/禁用 -// @Tags API.site -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body updateUsedRequest true "请求信息" -// @Success 200 {object} updateUsedResponse -// @Failure 400 {object} code.Failure -// @Router /api/site/used [patch] -func (h *handler) UpdateUsed() core.HandlerFunc { - return func(c core.Context) { - req := new(updateUsedRequest) - res := new(updateUsedResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - if err := h.siteService.UpdateUsed(c, req.Id, req.Used); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.SiteUpdateError, - code.Text(code.SiteUpdateError)).WithError(err), - ) - return - } - - res.Id = req.Id - c.Payload(res) - } -} diff --git a/internal/api/site/handler.go b/internal/api/site/handler.go deleted file mode 100755 index 49bb550..0000000 --- a/internal/api/site/handler.go +++ /dev/null @@ -1,71 +0,0 @@ -package site - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/hash" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - "github.com/ch3nnn/webstack-go/internal/services/site" - - "go.uber.org/zap" -) - -var _ Handler = (*handler)(nil) - -type Handler interface { - i() - - // Create 创建/编辑网站列表 - // @Tags API.site - // @Router /api/site [post] - Create() core.HandlerFunc - - // Delete 删除网站列表 - // @Tags API.site - // @Router /api/site/{id} [delete] - Delete() core.HandlerFunc - - // UpdateUsed 更新网站为启用/禁用 - // @Tags API.site - // @Router /api/site/used [patch] - UpdateUsed() core.HandlerFunc - - // List 网站列表 - // @Tags API.site - // @Router /api/site [get] - List() core.HandlerFunc - - // CategoryList 新增网站-分类目录列表 - // @Tags API.site - // @Router /api/site/category_list [get] - CategoryList() core.HandlerFunc - - // UpdateSite 编辑网站 - // @Tags API.site - // @Router /api/site [put] - UpdateSite() core.HandlerFunc - - // SyncSite 一键同步 - // @Tags API.site - // @Router /api/site/sync [patch] - SyncSite() core.HandlerFunc -} - -type handler struct { - logger *zap.Logger - cache redis.Repo - hashids hash.Hash - siteService site.Service -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) Handler { - return &handler{ - logger: logger, - cache: cache, - hashids: hash.New(configs.Get().HashIds.Secret, configs.Get().HashIds.Length), - siteService: site.New(db, cache), - } -} - -func (h *handler) i() {} diff --git a/internal/api/tool/func_clearcache.go b/internal/api/tool/func_clearcache.go deleted file mode 100755 index e5f1f01..0000000 --- a/internal/api/tool/func_clearcache.go +++ /dev/null @@ -1,65 +0,0 @@ -package tool - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -type clearCacheRequest struct { - RedisKey string `form:"redis_key"` // Redis Key -} - -type clearCacheResponse struct { - Bool bool `json:"bool"` // 删除结果 -} - -// ClearCache 清空缓存 -// @Summary 清空缓存 -// @Description 清空缓存 -// @Tags API.tool -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param redis_key formData string true "Redis Key" -// @Success 200 {object} searchCacheResponse -// @Failure 400 {object} code.Failure -// @Router /api/tool/cache/clear [patch] -// @Security LoginToken -func (h *handler) ClearCache() core.HandlerFunc { - return func(c core.Context) { - req := new(clearCacheRequest) - res := new(clearCacheResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - if b := h.cache.Exists(req.RedisKey); b != true { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.CacheNotExist, - code.Text(code.CacheNotExist)), - ) - return - } - - b := h.cache.Del(req.RedisKey, redis.WithTrace(c.Trace())) - if b != true { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.CacheDelError, - code.Text(code.CacheDelError)), - ) - return - } - - res.Bool = b - c.Payload(res) - } -} diff --git a/internal/api/tool/func_dbs.go b/internal/api/tool/func_dbs.go deleted file mode 100755 index 5bff50f..0000000 --- a/internal/api/tool/func_dbs.go +++ /dev/null @@ -1,38 +0,0 @@ -package tool - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type dbsResponse struct { - List []dbData `json:"list"` // 数据库列表 -} - -type dbData struct { - DbName string `json:"db_name"` // 数据库名称 -} - -// Dbs 查询 DB -// @Summary 查询 DB -// @Description 查询 DB -// @Tags API.tool -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Success 200 {object} dbsResponse -// @Failure 400 {object} code.Failure -// @Router /api/tool/data/dbs [get] -// @Security LoginToken -func (h *handler) Dbs() core.HandlerFunc { - return func(c core.Context) { - res := new(dbsResponse) - - // TODO 后期支持查询多个数据库 - data := dbData{ - DbName: configs.Get().MySQL.Read.Name, - } - - res.List = append(res.List, data) - c.Payload(res) - } -} diff --git a/internal/api/tool/func_hashidsdecode.go b/internal/api/tool/func_hashidsdecode.go deleted file mode 100755 index 756dc32..0000000 --- a/internal/api/tool/func_hashidsdecode.go +++ /dev/null @@ -1,56 +0,0 @@ -package tool - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type hashIdsDecodeRequest struct { - Id string `uri:"id"` // 需解密的密文 -} - -type hashIdsDecodeResponse struct { - Val int `json:"val"` // 解密后的值 -} - -// HashIdsDecode HashIds 解密 -// @Summary HashIds 解密 -// @Description HashIds 解密 -// @Tags API.tool -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id path string true "需解密的密文" -// @Success 200 {object} hashIdsDecodeResponse -// @Failure 400 {object} code.Failure -// @Router /api/tool/hashids/decode/{id} [get] -// @Security LoginToken -func (h *handler) HashIdsDecode() core.HandlerFunc { - return func(c core.Context) { - req := new(hashIdsDecodeRequest) - res := new(hashIdsDecodeResponse) - if err := c.ShouldBindURI(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - hashId, err := h.hashids.HashidsDecode(req.Id) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsDecodeError, - code.Text(code.HashIdsDecodeError)).WithError(err), - ) - return - } - - res.Val = hashId[0] - - c.Payload(res) - } -} diff --git a/internal/api/tool/func_hashidsencode.go b/internal/api/tool/func_hashidsencode.go deleted file mode 100755 index f92f59d..0000000 --- a/internal/api/tool/func_hashidsencode.go +++ /dev/null @@ -1,58 +0,0 @@ -package tool - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - - "github.com/spf13/cast" -) - -type hashIdsEncodeRequest struct { - Id int32 `uri:"id"` // 需加密的数字 -} - -type hashIdsEncodeResponse struct { - Val string `json:"val"` // 加密后的值 -} - -// HashIdsEncode HashIds 加密 -// @Summary HashIds 加密 -// @Description HashIds 加密 -// @Tags API.tool -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param id path string true "需加密的数字" -// @Success 200 {object} hashIdsEncodeResponse -// @Failure 400 {object} code.Failure -// @Router /api/tool/hashids/encode/{id} [get] -// @Security LoginToken -func (h *handler) HashIdsEncode() core.HandlerFunc { - return func(c core.Context) { - req := new(hashIdsEncodeRequest) - res := new(hashIdsEncodeResponse) - if err := c.ShouldBindURI(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - hashId, err := h.hashids.HashidsEncode([]int{cast.ToInt(req.Id)}) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.HashIdsEncodeError, - code.Text(code.HashIdsEncodeError)).WithError(err), - ) - return - } - - res.Val = hashId - - c.Payload(res) - } -} diff --git a/internal/api/tool/func_searchcache.go b/internal/api/tool/func_searchcache.go deleted file mode 100755 index 261fa6b..0000000 --- a/internal/api/tool/func_searchcache.go +++ /dev/null @@ -1,77 +0,0 @@ -package tool - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -type searchCacheRequest struct { - RedisKey string `form:"redis_key"` // Redis Key -} - -type searchCacheResponse struct { - Val string `json:"val"` // 查询后的值 - TTL string `json:"ttl"` // 过期时间 -} - -// SearchCache 查询缓存 -// @Summary 查询缓存 -// @Description 查询缓存 -// @Tags API.tool -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param redis_key formData string true "Redis Key" -// @Success 200 {object} searchCacheResponse -// @Failure 400 {object} code.Failure -// @Router /api/tool/cache/search [post] -// @Security LoginToken -func (h *handler) SearchCache() core.HandlerFunc { - return func(c core.Context) { - req := new(searchCacheRequest) - res := new(searchCacheResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - if b := h.cache.Exists(req.RedisKey); b != true { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.CacheNotExist, - code.Text(code.CacheNotExist)), - ) - return - } - - val, err := h.cache.Get(req.RedisKey, redis.WithTrace(c.Trace())) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.CacheGetError, - code.Text(code.CacheGetError)).WithError(err), - ) - return - } - - ttl, err := h.cache.TTL(req.RedisKey) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.CacheGetError, - code.Text(code.CacheGetError)).WithError(err), - ) - return - } - - res.Val = val - res.TTL = ttl.String() - c.Payload(res) - } -} diff --git a/internal/api/tool/func_searchmysql.go b/internal/api/tool/func_searchmysql.go deleted file mode 100755 index bdf7ac1..0000000 --- a/internal/api/tool/func_searchmysql.go +++ /dev/null @@ -1,223 +0,0 @@ -package tool - -import ( - "fmt" - "net/http" - "strings" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - - "github.com/spf13/cast" -) - -type tableColumn struct { - ColumnName string `json:"column_name"` // 字段名称 - ColumnComment string `json:"column_comment"` // 字段注释 -} - -type searchMySQLRequest struct { - DbName string `form:"db_name"` // 数据库名称 - TableName string `form:"table_name"` // 数据表名称 - SQL string `form:"sql"` // SQL 语句 -} - -type searchMySQLResponse struct { - Cols []string `json:"cols"` // 查询后的行 - ColsInfo []tableColumn `json:"cols_info"` // 行信息 - List []map[string]interface{} `json:"list"` // 查询后的数据 -} - -var preFilterList = map[string]bool{ - "insert": true, - "update": true, - "delete": true, - "create": true, - "source": true, - "rename": true, -} - -var whiteListKeyword = []string{ - "is_deleted", - "updated_at", - "created_at", - "updated_user", - "created_user", - "show create table", -} - -var filterListKeyword = []string{ - "insert", - "update", - "truncate", - "delete", - "create", - "alter", - "rename", - "drop", - "replace", - "sleep", - "grant", - "revoke", - "load_file", - "outfile", - "transaction", - "commit", - "mysqldump", - "into", -} - -// SearchMySQL 执行 SQL 语句 -// @Summary 执行 SQL 语句 -// @Description 执行 SQL 语句 -// @Tags API.tool -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param db_name formData string true "数据库名称" -// @Param table_name formData string true "数据表名称" -// @Param sql formData string true "SQL 语句" -// @Success 200 {object} searchMySQLResponse -// @Failure 400 {object} code.Failure -// @Router /api/tool/data/mysql [post] -// @Security LoginToken -func (h *handler) SearchMySQL() core.HandlerFunc { - return func(c core.Context) { - req := new(searchMySQLRequest) - res := new(searchMySQLResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - sql := strings.ToLower(strings.TrimSpace(req.SQL)) - if sql == "" { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MySQLExecError, - "SQL 语句不能为空!"), - ) - return - } - - if preFilterList[string([]byte(sql)[:6])] { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MySQLExecError, - "SQL 语句不能以 "+string([]byte(sql)[:6])+" 开头!"), - ) - return - } - - for _, f := range filterListKeyword { - if find := strings.Contains(sql, f); find { - - isWhiteList := false - for _, w := range whiteListKeyword { - if whiteFind := strings.Contains(sql, w); whiteFind { - isWhiteList = true - break - } - } - - if !isWhiteList { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MySQLExecError, - "SQL 语句存在敏感词: "+f+"!"), - ) - return - } - - } - } - - if strings.ToLower(string([]byte(sql)[:6])) == "select" { - sql += " LIMIT 100" - } - - // TODO 后期支持查询多个数据库 - rows, err := h.db.GetDbR().Raw(sql).Rows() - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MySQLExecError, - "MySQL "+err.Error()).WithError(err), - ) - return - } - - defer rows.Close() - - cols, _ := rows.Columns() - - var data []map[string]interface{} - - for rows.Next() { - // Create a slice of interface{}'s to represent each column, - // and a second slice to contain pointers to each item in the columns slice. - columns := make([]interface{}, len(cols)) - columnPointers := make([]interface{}, len(cols)) - for i := range columns { - columnPointers[i] = &columns[i] - } - - // Scan the result into the column pointers... - if err := rows.Scan(columnPointers...); err != nil { - fmt.Printf("query table scan error, detail is [%v]\n", err.Error()) - continue - } - - // Create our map, and retrieve the value for each column from the pointers slice, - // storing it in the map with the name of the column as the key. - m := make(map[string]interface{}) - for i, colName := range cols { - val := columnPointers[i].(*interface{}) - m[colName] = cast.ToString(*val) - } - - data = append(data, m) - - } - - res.List = data - res.Cols = cols - - sqlTableColumn := fmt.Sprintf("SELECT `COLUMN_NAME`, `COLUMN_COMMENT` FROM `information_schema`.`columns` WHERE `table_schema`= '%s' AND `table_name`= '%s' ORDER BY `ORDINAL_POSITION` ASC", - req.DbName, req.TableName) - - rows, err = h.db.GetDbR().Raw(sqlTableColumn).Rows() - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MySQLExecError, - "MySQL "+err.Error()).WithError(err), - ) - return - } - defer rows.Close() - - var tableColumns []tableColumn - - for rows.Next() { - var column tableColumn - err = rows.Scan( - &column.ColumnName, - &column.ColumnComment) - - if err != nil { - fmt.Printf("query table column scan error, detail is [%v]\n", err.Error()) - continue - } - - tableColumns = append(tableColumns, column) - } - - res.ColsInfo = tableColumns - - c.Payload(res) - } -} diff --git a/internal/api/tool/func_sendmessage.go b/internal/api/tool/func_sendmessage.go deleted file mode 100755 index ba428f5..0000000 --- a/internal/api/tool/func_sendmessage.go +++ /dev/null @@ -1,90 +0,0 @@ -package tool - -import ( - "encoding/json" - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/timeutil" - "github.com/ch3nnn/webstack-go/internal/pkg/validation" - "github.com/ch3nnn/webstack-go/internal/websocket/sysmessage" -) - -type sendMessageRequest struct { - Message string `form:"message"` // 消息内容 -} - -type sendMessageResponse struct { - Status string `json:"status"` // 状态 -} - -// SendMessage 发送消息 -// @Summary 发送消息 -// @Description 发送消息 -// @Tags API.tool -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param message formData string true "消息内容" -// @Success 200 {object} sendMessageResponse -// @Failure 400 {object} code.Failure -// @Router /api/tool/send_message [post] -// @Security LoginToken -func (h *handler) SendMessage() core.HandlerFunc { - type messageBody struct { - Username string `json:"username"` - Message string `json:"message"` - Time string `json:"time"` - } - - return func(ctx core.Context) { - req := new(sendMessageRequest) - res := new(sendMessageResponse) - if err := ctx.ShouldBindForm(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - validation.Error(err)).WithError(err), - ) - return - } - - conn, err := sysmessage.GetConn() - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.SocketConnectError, - code.Text(code.SocketConnectError)).WithError(err), - ) - return - } - - messageData := new(messageBody) - messageData.Username = ctx.SessionUserInfo().UserName - messageData.Message = req.Message - messageData.Time = timeutil.CSTLayoutString() - - messageJsonData, err := json.Marshal(messageData) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.SocketSendError, - code.Text(code.SocketSendError)).WithError(err), - ) - return - } - - err = conn.OnSend(messageJsonData) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.SocketSendError, - code.Text(code.SocketSendError)).WithError(err), - ) - return - } - - res.Status = "OK" - ctx.Payload(res) - } -} diff --git a/internal/api/tool/func_tables.go b/internal/api/tool/func_tables.go deleted file mode 100755 index bb51132..0000000 --- a/internal/api/tool/func_tables.go +++ /dev/null @@ -1,76 +0,0 @@ -package tool - -import ( - "fmt" - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type tablesRequest struct { - DbName string `form:"db_name"` // 数据库名称 -} - -type tablesResponse struct { - List []tableData `json:"list"` // 数据表列表 -} - -type tableData struct { - Name string `json:"table_name"` // 数据表名称 - Comment string `json:"table_comment"` // 数据表备注 -} - -// Tables 查询 Table -// @Summary 查询 Table -// @Description 查询 Table -// @Tags API.tool -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param db_name formData string true "数据库名称" -// @Success 200 {object} tablesResponse -// @Failure 400 {object} code.Failure -// @Router /api/tool/data/tables [post] -// @Security LoginToken -func (h *handler) Tables() core.HandlerFunc { - return func(c core.Context) { - req := new(tablesRequest) - res := new(tablesResponse) - if err := c.ShouldBindForm(req); err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - sqlTables := fmt.Sprintf("SELECT `table_name`,`table_comment` FROM `information_schema`.`tables` WHERE `table_schema`= '%s'", req.DbName) - - // TODO 后期支持查询多个数据库 - rows, err := h.db.GetDbR().Raw(sqlTables).Rows() - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.MySQLExecError, - code.Text(code.MySQLExecError)).WithError(err), - ) - return - } - - defer rows.Close() - - for rows.Next() { - var info tableData - err = rows.Scan(&info.Name, &info.Comment) - if err != nil { - fmt.Printf("execute query tables action error,had ignored, detail is [%v]\n", err.Error()) - continue - } - - res.List = append(res.List, info) - } - - c.Payload(res) - } -} diff --git a/internal/api/tool/handler.go b/internal/api/tool/handler.go deleted file mode 100755 index 04b3bb7..0000000 --- a/internal/api/tool/handler.go +++ /dev/null @@ -1,75 +0,0 @@ -package tool - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/hash" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "go.uber.org/zap" -) - -var _ Handler = (*handler)(nil) - -type Handler interface { - i() - - // HashIdsEncode HashIds 加密 - // @Tags API.tool - // @Router /api/tool/hashids/encode/{id} [get] - HashIdsEncode() core.HandlerFunc - - // HashIdsDecode HashIds 解密 - // @Tags API.tool - // @Router /api/tool/hashids/decode/{id} [get] - HashIdsDecode() core.HandlerFunc - - // SearchCache 查询缓存 - // @Tags API.tool - // @Router /api/tool/cache/search [post] - SearchCache() core.HandlerFunc - - // ClearCache 清空缓存 - // @Tags API.tool - // @Router /api/tool/cache/clear [patch] - ClearCache() core.HandlerFunc - - // Dbs 查询 DB - // @Tags API.tool - // @Router /api/tool/data/dbs [get] - Dbs() core.HandlerFunc - - // Tables 查询 Table - // @Tags API.tool - // @Router /api/tool/data/tables [post] - Tables() core.HandlerFunc - - // SearchMySQL 执行 SQL 语句 - // @Tags API.tool - // @Router /api/tool/data/mysql [post] - SearchMySQL() core.HandlerFunc - - // SendMessage 发送消息 - // @Tags API.tool - // @Router /api/tool/send_message [post] - SendMessage() core.HandlerFunc -} - -type handler struct { - logger *zap.Logger - db mysql.Repo - cache redis.Repo - hashids hash.Hash -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) Handler { - return &handler{ - logger: logger, - db: db, - cache: cache, - hashids: hash.New(configs.Get().HashIds.Secret, configs.Get().HashIds.Length), - } -} - -func (h *handler) i() {} diff --git a/internal/code/README.md b/internal/code/README.md deleted file mode 100755 index 2b09761..0000000 --- a/internal/code/README.md +++ /dev/null @@ -1,13 +0,0 @@ -## 错误码规则 - -- 错误码需在 `code` 包中进行定义。 - -#### 错误码为 5 位数 - -| 1 | 01 | 01 | -| :------ | :------ | :------ | -| 服务级错误码 | 模块级错误码 | 具体错误码 | - -- 服务级错误码:1 位数进行表示,比如 1 为系统级错误;2 为普通错误,通常是由用户非法操作引起。 -- 模块级错误码:2 位数进行表示,比如 01 为用户模块;02 为订单模块。 -- 具体的错误码:2 位数进行表示,比如 01 为手机号不合法;02 为验证码输入错误。 \ No newline at end of file diff --git a/internal/code/code.go b/internal/code/code.go deleted file mode 100755 index 1990970..0000000 --- a/internal/code/code.go +++ /dev/null @@ -1,104 +0,0 @@ -package code - -import ( - _ "embed" - - "github.com/ch3nnn/webstack-go/configs" -) - -//go:embed code.go -var ByteCodeFile []byte - -// Failure 错误时返回结构 -type Failure struct { - Code int `json:"code"` // 业务码 - Message string `json:"message"` // 描述信息 -} - -const ( - ServerError = 10101 - TooManyRequests = 10102 - ParamBindError = 10103 - AuthorizationError = 10104 - UrlSignError = 10105 - CacheSetError = 10106 - CacheGetError = 10107 - CacheDelError = 10108 - CacheNotExist = 10109 - ResubmitError = 10110 - HashIdsEncodeError = 10111 - HashIdsDecodeError = 10112 - RBACError = 10113 - RedisConnectError = 10114 - MySQLConnectError = 10115 - WriteConfigError = 10116 - SendEmailError = 10117 - MySQLExecError = 10118 - GoVersionError = 10119 - SocketConnectError = 10120 - SocketSendError = 10121 - - AuthorizedCreateError = 20101 - AuthorizedListError = 20102 - AuthorizedDeleteError = 20103 - AuthorizedUpdateError = 20104 - AuthorizedDetailError = 20105 - AuthorizedCreateAPIError = 20106 - AuthorizedListAPIError = 20107 - AuthorizedDeleteAPIError = 20108 - - AdminCreateError = 20201 - AdminListError = 20202 - AdminDeleteError = 20203 - AdminUpdateError = 20204 - AdminResetPasswordError = 20205 - AdminLoginError = 20206 - AdminLogOutError = 20207 - AdminModifyPasswordError = 20208 - AdminModifyPersonalInfoError = 20209 - AdminMenuListError = 20210 - AdminMenuCreateError = 20211 - AdminOfflineError = 20212 - AdminDetailError = 20213 - - MenuCreateError = 20301 - MenuUpdateError = 20302 - MenuListError = 20303 - MenuDeleteError = 20304 - MenuDetailError = 20305 - MenuCreateActionError = 20306 - MenuListActionError = 20307 - MenuDeleteActionError = 20308 - - CronCreateError = 20401 - CronUpdateError = 20402 - CronListError = 20403 - CronDetailError = 20404 - CronExecuteError = 20405 - - CategoryCreateError = 20501 - CategoryUpdateError = 20502 - CategoryListError = 20503 - CategoryDeleteError = 20504 - CategoryDetailError = 20505 - - SiteCreateError = 20601 - SiteUpdateError = 20602 - SiteListError = 20603 - SiteDeleteError = 20604 - SiteCategoryError = 20605 -) - -func Text(code int) string { - lang := configs.Get().Language.Local - - if lang == configs.ZhCN { - return zhCNText[code] - } - - if lang == configs.EnUS { - return enUSText[code] - } - - return zhCNText[code] -} diff --git a/internal/code/en-us.go b/internal/code/en-us.go deleted file mode 100755 index b1b50e4..0000000 --- a/internal/code/en-us.go +++ /dev/null @@ -1,63 +0,0 @@ -package code - -var enUSText = map[int]string{ - ServerError: "Internal server error", - TooManyRequests: "Too many requests", - ParamBindError: "Parameter error", - AuthorizationError: "Authorization error", - UrlSignError: "URL signature error", - CacheSetError: "Failed to set cache", - CacheGetError: "Failed to get cache", - CacheDelError: "Failed to del cache", - CacheNotExist: "Cache does not exist", - ResubmitError: "Please do not submit repeatedly", - HashIdsEncodeError: "HashID encryption failed", - HashIdsDecodeError: "HashID decryption failed", - RBACError: "No access", - RedisConnectError: "Failed to connection Redis", - MySQLConnectError: "Failed to connection MySQL", - WriteConfigError: "Failed to write configuration file", - SendEmailError: "Failed to send mail", - MySQLExecError: "SQL execution failed", - GoVersionError: "Go Version mismatch", - SocketConnectError: "Socket not connected", - SocketSendError: "Socket message sending failed", - - AuthorizedCreateError: "Failed to create caller", - AuthorizedListError: "Failed to get caller list", - AuthorizedDeleteError: "Failed to delete caller", - AuthorizedUpdateError: "Failed to update caller", - AuthorizedDetailError: "Failed to get caller details", - AuthorizedCreateAPIError: "Failed to create caller API address", - AuthorizedListAPIError: "Failed to get caller API address list", - AuthorizedDeleteAPIError: "Failed to delete caller API address", - - AdminCreateError: "Failed to create administrator", - AdminListError: "Failed to get administrator list", - AdminDeleteError: "Failed to delete administrator", - AdminUpdateError: "Failed to update administrator", - AdminResetPasswordError: "Reset password failed", - AdminLoginError: "Login failed", - AdminLogOutError: "Exit failed", - AdminModifyPasswordError: "Failed to modify password", - AdminModifyPersonalInfoError: "Failed to modify personal information", - AdminMenuListError: "Failed to get administrator menu authorization list", - AdminMenuCreateError: "Administrator menu authorization failed", - AdminOfflineError: "Offline administrator failed", - AdminDetailError: "Failed to get personal information", - - MenuCreateError: "Failed to create menu", - MenuUpdateError: "Failed to update menu", - MenuDeleteError: "Failed to delete menu", - MenuListError: "Failed to get menu list", - MenuDetailError: "Failed to get menu details", - MenuCreateActionError: "Failed to create menu action", - MenuListActionError: "Failed to get menu action list", - MenuDeleteActionError: "Failed to delete menu action", - - CronCreateError: "Failed to create cron", - CronUpdateError: "Failed to update menu", - CronListError: "Failed to get cron list", - CronDetailError: "Failed to get cron detail", - CronExecuteError: "Failed to execute cron", -} diff --git a/internal/code/zh-cn.go b/internal/code/zh-cn.go deleted file mode 100755 index 0819abc..0000000 --- a/internal/code/zh-cn.go +++ /dev/null @@ -1,75 +0,0 @@ -package code - -var zhCNText = map[int]string{ - ServerError: "内部服务器错误", - TooManyRequests: "请求过多", - ParamBindError: "参数信息错误", - AuthorizationError: "签名信息错误", - UrlSignError: "参数签名错误", - CacheSetError: "设置缓存失败", - CacheGetError: "获取缓存失败", - CacheDelError: "删除缓存失败", - CacheNotExist: "缓存不存在", - ResubmitError: "请勿重复提交", - HashIdsEncodeError: "HashID 加密失败", - HashIdsDecodeError: "HashID 解密失败", - RBACError: "暂无访问权限", - RedisConnectError: "Redis 连接失败", - MySQLConnectError: "MySQL 连接失败", - WriteConfigError: "写入配置文件失败", - SendEmailError: "发送邮件失败", - MySQLExecError: "SQL 执行失败", - GoVersionError: "Go 版本不满足要求", - SocketConnectError: "Socket 未连接", - SocketSendError: "Socket 消息发送失败", - - AuthorizedCreateError: "创建调用方失败", - AuthorizedListError: "获取调用方列表失败", - AuthorizedDeleteError: "删除调用方失败", - AuthorizedUpdateError: "更新调用方失败", - AuthorizedDetailError: "获取调用方详情失败", - AuthorizedCreateAPIError: "创建调用方 API 地址失败", - AuthorizedListAPIError: "获取调用方 API 地址列表失败", - AuthorizedDeleteAPIError: "删除调用方 API 地址失败", - - AdminCreateError: "创建管理员失败", - AdminListError: "获取管理员列表失败", - AdminDeleteError: "删除管理员失败", - AdminUpdateError: "更新管理员失败", - AdminResetPasswordError: "重置密码失败", - AdminLoginError: "登录失败", - AdminLogOutError: "退出失败", - AdminModifyPasswordError: "修改密码失败", - AdminModifyPersonalInfoError: "修改个人信息失败", - AdminMenuListError: "获取管理员菜单授权列表失败", - AdminMenuCreateError: "管理员菜单授权失败", - AdminOfflineError: "下线管理员失败", - AdminDetailError: "获取个人信息失败", - - MenuCreateError: "创建菜单失败", - MenuUpdateError: "更新菜单失败", - MenuDeleteError: "删除菜单失败", - MenuListError: "获取菜单列表失败", - MenuDetailError: "获取菜单详情失败", - MenuCreateActionError: "创建菜单栏功能权限失败", - MenuListActionError: "获取菜单栏功能权限列表失败", - MenuDeleteActionError: "删除菜单栏功能权限失败", - - CronCreateError: "创建后台任务失败", - CronUpdateError: "更新后台任务失败", - CronListError: "获取定时任务列表失败", - CronDetailError: "获取定时任务详情失败", - CronExecuteError: "手动执行定时任务失败", - - CategoryCreateError: "创建网站分类失败", - CategoryDeleteError: "删除网站分类失败", - CategoryDetailError: "获取网站分类失败", - CategoryListError: "获取网站分类列表失败", - CategoryUpdateError: "更新网站分类失败", - - SiteCreateError: "创建网站信息失败", - SiteDeleteError: "删除网站信息失败", - SiteListError: "获取网站信息列表失败", - SiteUpdateError: "更新网站信息失败", - SiteCategoryError: "获取网站信息-分类失败", -} diff --git a/internal/dal/model/st_category.gen.go b/internal/dal/model/st_category.gen.go new file mode 100644 index 0000000..a57ebab --- /dev/null +++ b/internal/dal/model/st_category.gen.go @@ -0,0 +1,30 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" +) + +const TableNameStCategory = "st_category" + +// StCategory mapped from table +type StCategory struct { + ID int `gorm:"column:id;type:INTEGER" json:"id"` + ParentID int `gorm:"column:parent_id;type:int(11);not null" json:"parent_id"` + Sort int `gorm:"column:sort;type:int(11);not null" json:"sort"` + Title string `gorm:"column:title;type:varchar(50);not null" json:"title"` + Icon string `gorm:"column:icon;type:varchar(20);not null" json:"icon"` + Level int32 `gorm:"column:level;type:integer;not null" json:"level"` + IsUsed bool `gorm:"column:is_used;type:bool;default:false" json:"is_used"` + CreatedAt *time.Time `gorm:"column:created_at;type:datetime;not null;default:CURRENT_TIMESTAMP not null" json:"created_at"` + UpdatedAt *time.Time `gorm:"column:updated_at;type:datetime;not null;default:CURRENT_TIMESTAMP not null" json:"updated_at"` + DeletedAt *time.Time `gorm:"column:deleted_at;type:datetime" json:"deleted_at"` +} + +// TableName StCategory's table name +func (*StCategory) TableName() string { + return TableNameStCategory +} diff --git a/internal/dal/model/st_site.gen.go b/internal/dal/model/st_site.gen.go new file mode 100644 index 0000000..23d94f7 --- /dev/null +++ b/internal/dal/model/st_site.gen.go @@ -0,0 +1,30 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" +) + +const TableNameStSite = "st_site" + +// StSite mapped from table +type StSite struct { + ID int `gorm:"column:id;type:INTEGER" json:"id"` + CategoryID int `gorm:"column:category_id;type:int(11)" json:"category_id"` + Title string `gorm:"column:title;type:varchar(50)" json:"title"` + Icon string `gorm:"column:icon;type:varchar(255)" json:"icon"` + Description string `gorm:"column:description;type:varchar(500)" json:"description"` + URL string `gorm:"column:url;type:varchar(255);not null" json:"url"` + IsUsed bool `gorm:"column:is_used;type:bool;default:false" json:"is_used"` + CreatedAt *time.Time `gorm:"column:created_at;type:datetime;not null;default:CURRENT_TIMESTAMP not null" json:"created_at"` + UpdatedAt *time.Time `gorm:"column:updated_at;type:datetime;not null;default:CURRENT_TIMESTAMP not null" json:"updated_at"` + DeletedAt *time.Time `gorm:"column:deleted_at;type:datetime" json:"deleted_at"` +} + +// TableName StSite's table name +func (*StSite) TableName() string { + return TableNameStSite +} diff --git a/internal/dal/model/sys_menu.gen.go b/internal/dal/model/sys_menu.gen.go new file mode 100644 index 0000000..f2e461e --- /dev/null +++ b/internal/dal/model/sys_menu.gen.go @@ -0,0 +1,31 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" +) + +const TableNameSysMenu = "sys_menu" + +// SysMenu mapped from table +type SysMenu struct { + ID int `gorm:"column:id;type:INTEGER" json:"id"` + Pid int `gorm:"column:pid;type:int(11);not null" json:"pid"` + Name string `gorm:"column:name;type:varchar(32);not null" json:"name"` + Link string `gorm:"column:link;type:varchar(100);not null" json:"link"` + Icon string `gorm:"column:icon;type:varchar(60);not null" json:"icon"` + Level int `gorm:"column:level;type:int(11);default:1" json:"level"` + Sort int `gorm:"column:sort;type:int(11);not null" json:"sort"` + IsUsed bool `gorm:"column:is_used;type:bool;default:false" json:"is_used"` + CreatedAt *time.Time `gorm:"column:created_at;type:datetime;not null;default:CURRENT_TIMESTAMP not null" json:"created_at"` + UpdatedAt *time.Time `gorm:"column:updated_at;type:datetime;not null;default:CURRENT_TIMESTAMP not null" json:"updated_at"` + DeletedAt *time.Time `gorm:"column:deleted_at;type:datetime" json:"deleted_at"` +} + +// TableName SysMenu's table name +func (*SysMenu) TableName() string { + return TableNameSysMenu +} diff --git a/internal/dal/model/sys_user.gen.go b/internal/dal/model/sys_user.gen.go new file mode 100644 index 0000000..6945037 --- /dev/null +++ b/internal/dal/model/sys_user.gen.go @@ -0,0 +1,26 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" +) + +const TableNameSysUser = "sys_user" + +// SysUser mapped from table +type SysUser struct { + ID int `gorm:"column:id;type:INTEGER" json:"id"` + Username string `gorm:"column:username;type:varchar(32);not null" json:"username"` + Password string `gorm:"column:password;type:varchar(100);not null" json:"password"` + CreatedAt *time.Time `gorm:"column:created_at;type:datetime;not null;default:CURRENT_TIMESTAMP not null" json:"created_at"` + UpdatedAt *time.Time `gorm:"column:updated_at;type:datetime;not null;default:CURRENT_TIMESTAMP not null" json:"updated_at"` + DeletedAt *time.Time `gorm:"column:deleted_at;type:datetime" json:"deleted_at"` +} + +// TableName SysUser's table name +func (*SysUser) TableName() string { + return TableNameSysUser +} diff --git a/internal/dal/model/sys_user_menu.gen.go b/internal/dal/model/sys_user_menu.gen.go new file mode 100644 index 0000000..48c486d --- /dev/null +++ b/internal/dal/model/sys_user_menu.gen.go @@ -0,0 +1,26 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" +) + +const TableNameSysUserMenu = "sys_user_menu" + +// SysUserMenu mapped from table +type SysUserMenu struct { + ID int `gorm:"column:id;type:INTEGER" json:"id"` + UserID int `gorm:"column:user_id;type:int(11);not null" json:"user_id"` + MenuID int `gorm:"column:menu_id;type:int(11);not null" json:"menu_id"` + CreatedAt *time.Time `gorm:"column:created_at;type:datetime;not null;default:CURRENT_TIMESTAMP not null" json:"created_at"` + UpdatedAt *time.Time `gorm:"column:updated_at;type:datetime;not null;default:CURRENT_TIMESTAMP not null" json:"updated_at"` + DeletedAt *time.Time `gorm:"column:deleted_at;type:datetime" json:"deleted_at"` +} + +// TableName SysUserMenu's table name +func (*SysUserMenu) TableName() string { + return TableNameSysUserMenu +} diff --git a/internal/dal/query/gen.go b/internal/dal/query/gen.go new file mode 100644 index 0000000..a34956e --- /dev/null +++ b/internal/dal/query/gen.go @@ -0,0 +1,135 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package query + +import ( + "context" + "database/sql" + + "gorm.io/gorm" + + "gorm.io/gen" + + "gorm.io/plugin/dbresolver" +) + +var ( + Q = new(Query) + StCategory *stCategory + StSite *stSite + SysMenu *sysMenu + SysUser *sysUser + SysUserMenu *sysUserMenu +) + +func SetDefault(db *gorm.DB, opts ...gen.DOOption) { + *Q = *Use(db, opts...) + StCategory = &Q.StCategory + StSite = &Q.StSite + SysMenu = &Q.SysMenu + SysUser = &Q.SysUser + SysUserMenu = &Q.SysUserMenu +} + +func Use(db *gorm.DB, opts ...gen.DOOption) *Query { + return &Query{ + db: db, + StCategory: newStCategory(db, opts...), + StSite: newStSite(db, opts...), + SysMenu: newSysMenu(db, opts...), + SysUser: newSysUser(db, opts...), + SysUserMenu: newSysUserMenu(db, opts...), + } +} + +type Query struct { + db *gorm.DB + + StCategory stCategory + StSite stSite + SysMenu sysMenu + SysUser sysUser + SysUserMenu sysUserMenu +} + +func (q *Query) Available() bool { return q.db != nil } + +func (q *Query) clone(db *gorm.DB) *Query { + return &Query{ + db: db, + StCategory: q.StCategory.clone(db), + StSite: q.StSite.clone(db), + SysMenu: q.SysMenu.clone(db), + SysUser: q.SysUser.clone(db), + SysUserMenu: q.SysUserMenu.clone(db), + } +} + +func (q *Query) ReadDB() *Query { + return q.ReplaceDB(q.db.Clauses(dbresolver.Read)) +} + +func (q *Query) WriteDB() *Query { + return q.ReplaceDB(q.db.Clauses(dbresolver.Write)) +} + +func (q *Query) ReplaceDB(db *gorm.DB) *Query { + return &Query{ + db: db, + StCategory: q.StCategory.replaceDB(db), + StSite: q.StSite.replaceDB(db), + SysMenu: q.SysMenu.replaceDB(db), + SysUser: q.SysUser.replaceDB(db), + SysUserMenu: q.SysUserMenu.replaceDB(db), + } +} + +type queryCtx struct { + StCategory IStCategoryDo + StSite IStSiteDo + SysMenu ISysMenuDo + SysUser ISysUserDo + SysUserMenu ISysUserMenuDo +} + +func (q *Query) WithContext(ctx context.Context) *queryCtx { + return &queryCtx{ + StCategory: q.StCategory.WithContext(ctx), + StSite: q.StSite.WithContext(ctx), + SysMenu: q.SysMenu.WithContext(ctx), + SysUser: q.SysUser.WithContext(ctx), + SysUserMenu: q.SysUserMenu.WithContext(ctx), + } +} + +func (q *Query) Transaction(fc func(tx *Query) error, opts ...*sql.TxOptions) error { + return q.db.Transaction(func(tx *gorm.DB) error { return fc(q.clone(tx)) }, opts...) +} + +func (q *Query) Begin(opts ...*sql.TxOptions) *QueryTx { + tx := q.db.Begin(opts...) + return &QueryTx{Query: q.clone(tx), Error: tx.Error} +} + +type QueryTx struct { + *Query + Error error +} + +func (q *QueryTx) Commit() error { + return q.db.Commit().Error +} + +func (q *QueryTx) Rollback() error { + return q.db.Rollback().Error +} + +func (q *QueryTx) SavePoint(name string) error { + return q.db.SavePoint(name).Error +} + +func (q *QueryTx) RollbackTo(name string) error { + return q.db.RollbackTo(name).Error +} diff --git a/internal/dal/query/st_category.gen.go b/internal/dal/query/st_category.gen.go new file mode 100644 index 0000000..0b78bb3 --- /dev/null +++ b/internal/dal/query/st_category.gen.go @@ -0,0 +1,426 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package query + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "github.com/ch3nnn/webstack-go/internal/dal/model" +) + +func newStCategory(db *gorm.DB, opts ...gen.DOOption) stCategory { + _stCategory := stCategory{} + + _stCategory.stCategoryDo.UseDB(db, opts...) + _stCategory.stCategoryDo.UseModel(&model.StCategory{}) + + tableName := _stCategory.stCategoryDo.TableName() + _stCategory.ALL = field.NewAsterisk(tableName) + _stCategory.ID = field.NewInt(tableName, "id") + _stCategory.ParentID = field.NewInt(tableName, "parent_id") + _stCategory.Sort = field.NewInt(tableName, "sort") + _stCategory.Title = field.NewString(tableName, "title") + _stCategory.Icon = field.NewString(tableName, "icon") + _stCategory.Level = field.NewInt32(tableName, "level") + _stCategory.IsUsed = field.NewBool(tableName, "is_used") + _stCategory.CreatedAt = field.NewTime(tableName, "created_at") + _stCategory.UpdatedAt = field.NewTime(tableName, "updated_at") + _stCategory.DeletedAt = field.NewTime(tableName, "deleted_at") + + _stCategory.fillFieldMap() + + return _stCategory +} + +type stCategory struct { + stCategoryDo stCategoryDo + + ALL field.Asterisk + ID field.Int + ParentID field.Int + Sort field.Int + Title field.String + Icon field.String + Level field.Int32 + IsUsed field.Bool + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Time + + fieldMap map[string]field.Expr +} + +func (s stCategory) Table(newTableName string) *stCategory { + s.stCategoryDo.UseTable(newTableName) + return s.updateTableName(newTableName) +} + +func (s stCategory) As(alias string) *stCategory { + s.stCategoryDo.DO = *(s.stCategoryDo.As(alias).(*gen.DO)) + return s.updateTableName(alias) +} + +func (s *stCategory) updateTableName(table string) *stCategory { + s.ALL = field.NewAsterisk(table) + s.ID = field.NewInt(table, "id") + s.ParentID = field.NewInt(table, "parent_id") + s.Sort = field.NewInt(table, "sort") + s.Title = field.NewString(table, "title") + s.Icon = field.NewString(table, "icon") + s.Level = field.NewInt32(table, "level") + s.IsUsed = field.NewBool(table, "is_used") + s.CreatedAt = field.NewTime(table, "created_at") + s.UpdatedAt = field.NewTime(table, "updated_at") + s.DeletedAt = field.NewTime(table, "deleted_at") + + s.fillFieldMap() + + return s +} + +func (s *stCategory) WithContext(ctx context.Context) IStCategoryDo { + return s.stCategoryDo.WithContext(ctx) +} + +func (s stCategory) TableName() string { return s.stCategoryDo.TableName() } + +func (s stCategory) Alias() string { return s.stCategoryDo.Alias() } + +func (s stCategory) Columns(cols ...field.Expr) gen.Columns { return s.stCategoryDo.Columns(cols...) } + +func (s *stCategory) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := s.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (s *stCategory) fillFieldMap() { + s.fieldMap = make(map[string]field.Expr, 10) + s.fieldMap["id"] = s.ID + s.fieldMap["parent_id"] = s.ParentID + s.fieldMap["sort"] = s.Sort + s.fieldMap["title"] = s.Title + s.fieldMap["icon"] = s.Icon + s.fieldMap["level"] = s.Level + s.fieldMap["is_used"] = s.IsUsed + s.fieldMap["created_at"] = s.CreatedAt + s.fieldMap["updated_at"] = s.UpdatedAt + s.fieldMap["deleted_at"] = s.DeletedAt +} + +func (s stCategory) clone(db *gorm.DB) stCategory { + s.stCategoryDo.ReplaceConnPool(db.Statement.ConnPool) + return s +} + +func (s stCategory) replaceDB(db *gorm.DB) stCategory { + s.stCategoryDo.ReplaceDB(db) + return s +} + +type stCategoryDo struct{ gen.DO } + +type IStCategoryDo interface { + gen.SubQuery + Debug() IStCategoryDo + WithContext(ctx context.Context) IStCategoryDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IStCategoryDo + WriteDB() IStCategoryDo + As(alias string) gen.Dao + Session(config *gorm.Session) IStCategoryDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IStCategoryDo + Not(conds ...gen.Condition) IStCategoryDo + Or(conds ...gen.Condition) IStCategoryDo + Select(conds ...field.Expr) IStCategoryDo + Where(conds ...gen.Condition) IStCategoryDo + Order(conds ...field.Expr) IStCategoryDo + Distinct(cols ...field.Expr) IStCategoryDo + Omit(cols ...field.Expr) IStCategoryDo + Join(table schema.Tabler, on ...field.Expr) IStCategoryDo + LeftJoin(table schema.Tabler, on ...field.Expr) IStCategoryDo + RightJoin(table schema.Tabler, on ...field.Expr) IStCategoryDo + Group(cols ...field.Expr) IStCategoryDo + Having(conds ...gen.Condition) IStCategoryDo + Limit(limit int) IStCategoryDo + Offset(offset int) IStCategoryDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IStCategoryDo + Unscoped() IStCategoryDo + Create(values ...*model.StCategory) error + CreateInBatches(values []*model.StCategory, batchSize int) error + Save(values ...*model.StCategory) error + First() (*model.StCategory, error) + Take() (*model.StCategory, error) + Last() (*model.StCategory, error) + Find() ([]*model.StCategory, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.StCategory, err error) + FindInBatches(result *[]*model.StCategory, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.StCategory) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IStCategoryDo + Assign(attrs ...field.AssignExpr) IStCategoryDo + Joins(fields ...field.RelationField) IStCategoryDo + Preload(fields ...field.RelationField) IStCategoryDo + FirstOrInit() (*model.StCategory, error) + FirstOrCreate() (*model.StCategory, error) + FindByPage(offset int, limit int) (result []*model.StCategory, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IStCategoryDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (s stCategoryDo) Debug() IStCategoryDo { + return s.withDO(s.DO.Debug()) +} + +func (s stCategoryDo) WithContext(ctx context.Context) IStCategoryDo { + return s.withDO(s.DO.WithContext(ctx)) +} + +func (s stCategoryDo) ReadDB() IStCategoryDo { + return s.Clauses(dbresolver.Read) +} + +func (s stCategoryDo) WriteDB() IStCategoryDo { + return s.Clauses(dbresolver.Write) +} + +func (s stCategoryDo) Session(config *gorm.Session) IStCategoryDo { + return s.withDO(s.DO.Session(config)) +} + +func (s stCategoryDo) Clauses(conds ...clause.Expression) IStCategoryDo { + return s.withDO(s.DO.Clauses(conds...)) +} + +func (s stCategoryDo) Returning(value interface{}, columns ...string) IStCategoryDo { + return s.withDO(s.DO.Returning(value, columns...)) +} + +func (s stCategoryDo) Not(conds ...gen.Condition) IStCategoryDo { + return s.withDO(s.DO.Not(conds...)) +} + +func (s stCategoryDo) Or(conds ...gen.Condition) IStCategoryDo { + return s.withDO(s.DO.Or(conds...)) +} + +func (s stCategoryDo) Select(conds ...field.Expr) IStCategoryDo { + return s.withDO(s.DO.Select(conds...)) +} + +func (s stCategoryDo) Where(conds ...gen.Condition) IStCategoryDo { + return s.withDO(s.DO.Where(conds...)) +} + +func (s stCategoryDo) Order(conds ...field.Expr) IStCategoryDo { + return s.withDO(s.DO.Order(conds...)) +} + +func (s stCategoryDo) Distinct(cols ...field.Expr) IStCategoryDo { + return s.withDO(s.DO.Distinct(cols...)) +} + +func (s stCategoryDo) Omit(cols ...field.Expr) IStCategoryDo { + return s.withDO(s.DO.Omit(cols...)) +} + +func (s stCategoryDo) Join(table schema.Tabler, on ...field.Expr) IStCategoryDo { + return s.withDO(s.DO.Join(table, on...)) +} + +func (s stCategoryDo) LeftJoin(table schema.Tabler, on ...field.Expr) IStCategoryDo { + return s.withDO(s.DO.LeftJoin(table, on...)) +} + +func (s stCategoryDo) RightJoin(table schema.Tabler, on ...field.Expr) IStCategoryDo { + return s.withDO(s.DO.RightJoin(table, on...)) +} + +func (s stCategoryDo) Group(cols ...field.Expr) IStCategoryDo { + return s.withDO(s.DO.Group(cols...)) +} + +func (s stCategoryDo) Having(conds ...gen.Condition) IStCategoryDo { + return s.withDO(s.DO.Having(conds...)) +} + +func (s stCategoryDo) Limit(limit int) IStCategoryDo { + return s.withDO(s.DO.Limit(limit)) +} + +func (s stCategoryDo) Offset(offset int) IStCategoryDo { + return s.withDO(s.DO.Offset(offset)) +} + +func (s stCategoryDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IStCategoryDo { + return s.withDO(s.DO.Scopes(funcs...)) +} + +func (s stCategoryDo) Unscoped() IStCategoryDo { + return s.withDO(s.DO.Unscoped()) +} + +func (s stCategoryDo) Create(values ...*model.StCategory) error { + if len(values) == 0 { + return nil + } + return s.DO.Create(values) +} + +func (s stCategoryDo) CreateInBatches(values []*model.StCategory, batchSize int) error { + return s.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (s stCategoryDo) Save(values ...*model.StCategory) error { + if len(values) == 0 { + return nil + } + return s.DO.Save(values) +} + +func (s stCategoryDo) First() (*model.StCategory, error) { + if result, err := s.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.StCategory), nil + } +} + +func (s stCategoryDo) Take() (*model.StCategory, error) { + if result, err := s.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.StCategory), nil + } +} + +func (s stCategoryDo) Last() (*model.StCategory, error) { + if result, err := s.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.StCategory), nil + } +} + +func (s stCategoryDo) Find() ([]*model.StCategory, error) { + result, err := s.DO.Find() + return result.([]*model.StCategory), err +} + +func (s stCategoryDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.StCategory, err error) { + buf := make([]*model.StCategory, 0, batchSize) + err = s.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (s stCategoryDo) FindInBatches(result *[]*model.StCategory, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return s.DO.FindInBatches(result, batchSize, fc) +} + +func (s stCategoryDo) Attrs(attrs ...field.AssignExpr) IStCategoryDo { + return s.withDO(s.DO.Attrs(attrs...)) +} + +func (s stCategoryDo) Assign(attrs ...field.AssignExpr) IStCategoryDo { + return s.withDO(s.DO.Assign(attrs...)) +} + +func (s stCategoryDo) Joins(fields ...field.RelationField) IStCategoryDo { + for _, _f := range fields { + s = *s.withDO(s.DO.Joins(_f)) + } + return &s +} + +func (s stCategoryDo) Preload(fields ...field.RelationField) IStCategoryDo { + for _, _f := range fields { + s = *s.withDO(s.DO.Preload(_f)) + } + return &s +} + +func (s stCategoryDo) FirstOrInit() (*model.StCategory, error) { + if result, err := s.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.StCategory), nil + } +} + +func (s stCategoryDo) FirstOrCreate() (*model.StCategory, error) { + if result, err := s.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.StCategory), nil + } +} + +func (s stCategoryDo) FindByPage(offset int, limit int) (result []*model.StCategory, count int64, err error) { + result, err = s.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = s.Offset(-1).Limit(-1).Count() + return +} + +func (s stCategoryDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = s.Count() + if err != nil { + return + } + + err = s.Offset(offset).Limit(limit).Scan(result) + return +} + +func (s stCategoryDo) Scan(result interface{}) (err error) { + return s.DO.Scan(result) +} + +func (s stCategoryDo) Delete(models ...*model.StCategory) (result gen.ResultInfo, err error) { + return s.DO.Delete(models) +} + +func (s *stCategoryDo) withDO(do gen.Dao) *stCategoryDo { + s.DO = *do.(*gen.DO) + return s +} diff --git a/internal/dal/query/st_site.gen.go b/internal/dal/query/st_site.gen.go new file mode 100644 index 0000000..50f172f --- /dev/null +++ b/internal/dal/query/st_site.gen.go @@ -0,0 +1,424 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package query + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "github.com/ch3nnn/webstack-go/internal/dal/model" +) + +func newStSite(db *gorm.DB, opts ...gen.DOOption) stSite { + _stSite := stSite{} + + _stSite.stSiteDo.UseDB(db, opts...) + _stSite.stSiteDo.UseModel(&model.StSite{}) + + tableName := _stSite.stSiteDo.TableName() + _stSite.ALL = field.NewAsterisk(tableName) + _stSite.ID = field.NewInt(tableName, "id") + _stSite.CategoryID = field.NewInt(tableName, "category_id") + _stSite.Title = field.NewString(tableName, "title") + _stSite.Icon = field.NewString(tableName, "icon") + _stSite.Description = field.NewString(tableName, "description") + _stSite.URL = field.NewString(tableName, "url") + _stSite.IsUsed = field.NewBool(tableName, "is_used") + _stSite.CreatedAt = field.NewTime(tableName, "created_at") + _stSite.UpdatedAt = field.NewTime(tableName, "updated_at") + _stSite.DeletedAt = field.NewTime(tableName, "deleted_at") + + _stSite.fillFieldMap() + + return _stSite +} + +type stSite struct { + stSiteDo stSiteDo + + ALL field.Asterisk + ID field.Int + CategoryID field.Int + Title field.String + Icon field.String + Description field.String + URL field.String + IsUsed field.Bool + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Time + + fieldMap map[string]field.Expr +} + +func (s stSite) Table(newTableName string) *stSite { + s.stSiteDo.UseTable(newTableName) + return s.updateTableName(newTableName) +} + +func (s stSite) As(alias string) *stSite { + s.stSiteDo.DO = *(s.stSiteDo.As(alias).(*gen.DO)) + return s.updateTableName(alias) +} + +func (s *stSite) updateTableName(table string) *stSite { + s.ALL = field.NewAsterisk(table) + s.ID = field.NewInt(table, "id") + s.CategoryID = field.NewInt(table, "category_id") + s.Title = field.NewString(table, "title") + s.Icon = field.NewString(table, "icon") + s.Description = field.NewString(table, "description") + s.URL = field.NewString(table, "url") + s.IsUsed = field.NewBool(table, "is_used") + s.CreatedAt = field.NewTime(table, "created_at") + s.UpdatedAt = field.NewTime(table, "updated_at") + s.DeletedAt = field.NewTime(table, "deleted_at") + + s.fillFieldMap() + + return s +} + +func (s *stSite) WithContext(ctx context.Context) IStSiteDo { return s.stSiteDo.WithContext(ctx) } + +func (s stSite) TableName() string { return s.stSiteDo.TableName() } + +func (s stSite) Alias() string { return s.stSiteDo.Alias() } + +func (s stSite) Columns(cols ...field.Expr) gen.Columns { return s.stSiteDo.Columns(cols...) } + +func (s *stSite) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := s.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (s *stSite) fillFieldMap() { + s.fieldMap = make(map[string]field.Expr, 10) + s.fieldMap["id"] = s.ID + s.fieldMap["category_id"] = s.CategoryID + s.fieldMap["title"] = s.Title + s.fieldMap["icon"] = s.Icon + s.fieldMap["description"] = s.Description + s.fieldMap["url"] = s.URL + s.fieldMap["is_used"] = s.IsUsed + s.fieldMap["created_at"] = s.CreatedAt + s.fieldMap["updated_at"] = s.UpdatedAt + s.fieldMap["deleted_at"] = s.DeletedAt +} + +func (s stSite) clone(db *gorm.DB) stSite { + s.stSiteDo.ReplaceConnPool(db.Statement.ConnPool) + return s +} + +func (s stSite) replaceDB(db *gorm.DB) stSite { + s.stSiteDo.ReplaceDB(db) + return s +} + +type stSiteDo struct{ gen.DO } + +type IStSiteDo interface { + gen.SubQuery + Debug() IStSiteDo + WithContext(ctx context.Context) IStSiteDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IStSiteDo + WriteDB() IStSiteDo + As(alias string) gen.Dao + Session(config *gorm.Session) IStSiteDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IStSiteDo + Not(conds ...gen.Condition) IStSiteDo + Or(conds ...gen.Condition) IStSiteDo + Select(conds ...field.Expr) IStSiteDo + Where(conds ...gen.Condition) IStSiteDo + Order(conds ...field.Expr) IStSiteDo + Distinct(cols ...field.Expr) IStSiteDo + Omit(cols ...field.Expr) IStSiteDo + Join(table schema.Tabler, on ...field.Expr) IStSiteDo + LeftJoin(table schema.Tabler, on ...field.Expr) IStSiteDo + RightJoin(table schema.Tabler, on ...field.Expr) IStSiteDo + Group(cols ...field.Expr) IStSiteDo + Having(conds ...gen.Condition) IStSiteDo + Limit(limit int) IStSiteDo + Offset(offset int) IStSiteDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IStSiteDo + Unscoped() IStSiteDo + Create(values ...*model.StSite) error + CreateInBatches(values []*model.StSite, batchSize int) error + Save(values ...*model.StSite) error + First() (*model.StSite, error) + Take() (*model.StSite, error) + Last() (*model.StSite, error) + Find() ([]*model.StSite, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.StSite, err error) + FindInBatches(result *[]*model.StSite, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.StSite) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IStSiteDo + Assign(attrs ...field.AssignExpr) IStSiteDo + Joins(fields ...field.RelationField) IStSiteDo + Preload(fields ...field.RelationField) IStSiteDo + FirstOrInit() (*model.StSite, error) + FirstOrCreate() (*model.StSite, error) + FindByPage(offset int, limit int) (result []*model.StSite, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IStSiteDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (s stSiteDo) Debug() IStSiteDo { + return s.withDO(s.DO.Debug()) +} + +func (s stSiteDo) WithContext(ctx context.Context) IStSiteDo { + return s.withDO(s.DO.WithContext(ctx)) +} + +func (s stSiteDo) ReadDB() IStSiteDo { + return s.Clauses(dbresolver.Read) +} + +func (s stSiteDo) WriteDB() IStSiteDo { + return s.Clauses(dbresolver.Write) +} + +func (s stSiteDo) Session(config *gorm.Session) IStSiteDo { + return s.withDO(s.DO.Session(config)) +} + +func (s stSiteDo) Clauses(conds ...clause.Expression) IStSiteDo { + return s.withDO(s.DO.Clauses(conds...)) +} + +func (s stSiteDo) Returning(value interface{}, columns ...string) IStSiteDo { + return s.withDO(s.DO.Returning(value, columns...)) +} + +func (s stSiteDo) Not(conds ...gen.Condition) IStSiteDo { + return s.withDO(s.DO.Not(conds...)) +} + +func (s stSiteDo) Or(conds ...gen.Condition) IStSiteDo { + return s.withDO(s.DO.Or(conds...)) +} + +func (s stSiteDo) Select(conds ...field.Expr) IStSiteDo { + return s.withDO(s.DO.Select(conds...)) +} + +func (s stSiteDo) Where(conds ...gen.Condition) IStSiteDo { + return s.withDO(s.DO.Where(conds...)) +} + +func (s stSiteDo) Order(conds ...field.Expr) IStSiteDo { + return s.withDO(s.DO.Order(conds...)) +} + +func (s stSiteDo) Distinct(cols ...field.Expr) IStSiteDo { + return s.withDO(s.DO.Distinct(cols...)) +} + +func (s stSiteDo) Omit(cols ...field.Expr) IStSiteDo { + return s.withDO(s.DO.Omit(cols...)) +} + +func (s stSiteDo) Join(table schema.Tabler, on ...field.Expr) IStSiteDo { + return s.withDO(s.DO.Join(table, on...)) +} + +func (s stSiteDo) LeftJoin(table schema.Tabler, on ...field.Expr) IStSiteDo { + return s.withDO(s.DO.LeftJoin(table, on...)) +} + +func (s stSiteDo) RightJoin(table schema.Tabler, on ...field.Expr) IStSiteDo { + return s.withDO(s.DO.RightJoin(table, on...)) +} + +func (s stSiteDo) Group(cols ...field.Expr) IStSiteDo { + return s.withDO(s.DO.Group(cols...)) +} + +func (s stSiteDo) Having(conds ...gen.Condition) IStSiteDo { + return s.withDO(s.DO.Having(conds...)) +} + +func (s stSiteDo) Limit(limit int) IStSiteDo { + return s.withDO(s.DO.Limit(limit)) +} + +func (s stSiteDo) Offset(offset int) IStSiteDo { + return s.withDO(s.DO.Offset(offset)) +} + +func (s stSiteDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IStSiteDo { + return s.withDO(s.DO.Scopes(funcs...)) +} + +func (s stSiteDo) Unscoped() IStSiteDo { + return s.withDO(s.DO.Unscoped()) +} + +func (s stSiteDo) Create(values ...*model.StSite) error { + if len(values) == 0 { + return nil + } + return s.DO.Create(values) +} + +func (s stSiteDo) CreateInBatches(values []*model.StSite, batchSize int) error { + return s.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (s stSiteDo) Save(values ...*model.StSite) error { + if len(values) == 0 { + return nil + } + return s.DO.Save(values) +} + +func (s stSiteDo) First() (*model.StSite, error) { + if result, err := s.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.StSite), nil + } +} + +func (s stSiteDo) Take() (*model.StSite, error) { + if result, err := s.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.StSite), nil + } +} + +func (s stSiteDo) Last() (*model.StSite, error) { + if result, err := s.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.StSite), nil + } +} + +func (s stSiteDo) Find() ([]*model.StSite, error) { + result, err := s.DO.Find() + return result.([]*model.StSite), err +} + +func (s stSiteDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.StSite, err error) { + buf := make([]*model.StSite, 0, batchSize) + err = s.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (s stSiteDo) FindInBatches(result *[]*model.StSite, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return s.DO.FindInBatches(result, batchSize, fc) +} + +func (s stSiteDo) Attrs(attrs ...field.AssignExpr) IStSiteDo { + return s.withDO(s.DO.Attrs(attrs...)) +} + +func (s stSiteDo) Assign(attrs ...field.AssignExpr) IStSiteDo { + return s.withDO(s.DO.Assign(attrs...)) +} + +func (s stSiteDo) Joins(fields ...field.RelationField) IStSiteDo { + for _, _f := range fields { + s = *s.withDO(s.DO.Joins(_f)) + } + return &s +} + +func (s stSiteDo) Preload(fields ...field.RelationField) IStSiteDo { + for _, _f := range fields { + s = *s.withDO(s.DO.Preload(_f)) + } + return &s +} + +func (s stSiteDo) FirstOrInit() (*model.StSite, error) { + if result, err := s.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.StSite), nil + } +} + +func (s stSiteDo) FirstOrCreate() (*model.StSite, error) { + if result, err := s.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.StSite), nil + } +} + +func (s stSiteDo) FindByPage(offset int, limit int) (result []*model.StSite, count int64, err error) { + result, err = s.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = s.Offset(-1).Limit(-1).Count() + return +} + +func (s stSiteDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = s.Count() + if err != nil { + return + } + + err = s.Offset(offset).Limit(limit).Scan(result) + return +} + +func (s stSiteDo) Scan(result interface{}) (err error) { + return s.DO.Scan(result) +} + +func (s stSiteDo) Delete(models ...*model.StSite) (result gen.ResultInfo, err error) { + return s.DO.Delete(models) +} + +func (s *stSiteDo) withDO(do gen.Dao) *stSiteDo { + s.DO = *do.(*gen.DO) + return s +} diff --git a/internal/dal/query/sys_menu.gen.go b/internal/dal/query/sys_menu.gen.go new file mode 100644 index 0000000..e4d7f9d --- /dev/null +++ b/internal/dal/query/sys_menu.gen.go @@ -0,0 +1,428 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package query + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "github.com/ch3nnn/webstack-go/internal/dal/model" +) + +func newSysMenu(db *gorm.DB, opts ...gen.DOOption) sysMenu { + _sysMenu := sysMenu{} + + _sysMenu.sysMenuDo.UseDB(db, opts...) + _sysMenu.sysMenuDo.UseModel(&model.SysMenu{}) + + tableName := _sysMenu.sysMenuDo.TableName() + _sysMenu.ALL = field.NewAsterisk(tableName) + _sysMenu.ID = field.NewInt(tableName, "id") + _sysMenu.Pid = field.NewInt(tableName, "pid") + _sysMenu.Name = field.NewString(tableName, "name") + _sysMenu.Link = field.NewString(tableName, "link") + _sysMenu.Icon = field.NewString(tableName, "icon") + _sysMenu.Level = field.NewInt(tableName, "level") + _sysMenu.Sort = field.NewInt(tableName, "sort") + _sysMenu.IsUsed = field.NewBool(tableName, "is_used") + _sysMenu.CreatedAt = field.NewTime(tableName, "created_at") + _sysMenu.UpdatedAt = field.NewTime(tableName, "updated_at") + _sysMenu.DeletedAt = field.NewTime(tableName, "deleted_at") + + _sysMenu.fillFieldMap() + + return _sysMenu +} + +type sysMenu struct { + sysMenuDo sysMenuDo + + ALL field.Asterisk + ID field.Int + Pid field.Int + Name field.String + Link field.String + Icon field.String + Level field.Int + Sort field.Int + IsUsed field.Bool + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Time + + fieldMap map[string]field.Expr +} + +func (s sysMenu) Table(newTableName string) *sysMenu { + s.sysMenuDo.UseTable(newTableName) + return s.updateTableName(newTableName) +} + +func (s sysMenu) As(alias string) *sysMenu { + s.sysMenuDo.DO = *(s.sysMenuDo.As(alias).(*gen.DO)) + return s.updateTableName(alias) +} + +func (s *sysMenu) updateTableName(table string) *sysMenu { + s.ALL = field.NewAsterisk(table) + s.ID = field.NewInt(table, "id") + s.Pid = field.NewInt(table, "pid") + s.Name = field.NewString(table, "name") + s.Link = field.NewString(table, "link") + s.Icon = field.NewString(table, "icon") + s.Level = field.NewInt(table, "level") + s.Sort = field.NewInt(table, "sort") + s.IsUsed = field.NewBool(table, "is_used") + s.CreatedAt = field.NewTime(table, "created_at") + s.UpdatedAt = field.NewTime(table, "updated_at") + s.DeletedAt = field.NewTime(table, "deleted_at") + + s.fillFieldMap() + + return s +} + +func (s *sysMenu) WithContext(ctx context.Context) ISysMenuDo { return s.sysMenuDo.WithContext(ctx) } + +func (s sysMenu) TableName() string { return s.sysMenuDo.TableName() } + +func (s sysMenu) Alias() string { return s.sysMenuDo.Alias() } + +func (s sysMenu) Columns(cols ...field.Expr) gen.Columns { return s.sysMenuDo.Columns(cols...) } + +func (s *sysMenu) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := s.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (s *sysMenu) fillFieldMap() { + s.fieldMap = make(map[string]field.Expr, 11) + s.fieldMap["id"] = s.ID + s.fieldMap["pid"] = s.Pid + s.fieldMap["name"] = s.Name + s.fieldMap["link"] = s.Link + s.fieldMap["icon"] = s.Icon + s.fieldMap["level"] = s.Level + s.fieldMap["sort"] = s.Sort + s.fieldMap["is_used"] = s.IsUsed + s.fieldMap["created_at"] = s.CreatedAt + s.fieldMap["updated_at"] = s.UpdatedAt + s.fieldMap["deleted_at"] = s.DeletedAt +} + +func (s sysMenu) clone(db *gorm.DB) sysMenu { + s.sysMenuDo.ReplaceConnPool(db.Statement.ConnPool) + return s +} + +func (s sysMenu) replaceDB(db *gorm.DB) sysMenu { + s.sysMenuDo.ReplaceDB(db) + return s +} + +type sysMenuDo struct{ gen.DO } + +type ISysMenuDo interface { + gen.SubQuery + Debug() ISysMenuDo + WithContext(ctx context.Context) ISysMenuDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() ISysMenuDo + WriteDB() ISysMenuDo + As(alias string) gen.Dao + Session(config *gorm.Session) ISysMenuDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) ISysMenuDo + Not(conds ...gen.Condition) ISysMenuDo + Or(conds ...gen.Condition) ISysMenuDo + Select(conds ...field.Expr) ISysMenuDo + Where(conds ...gen.Condition) ISysMenuDo + Order(conds ...field.Expr) ISysMenuDo + Distinct(cols ...field.Expr) ISysMenuDo + Omit(cols ...field.Expr) ISysMenuDo + Join(table schema.Tabler, on ...field.Expr) ISysMenuDo + LeftJoin(table schema.Tabler, on ...field.Expr) ISysMenuDo + RightJoin(table schema.Tabler, on ...field.Expr) ISysMenuDo + Group(cols ...field.Expr) ISysMenuDo + Having(conds ...gen.Condition) ISysMenuDo + Limit(limit int) ISysMenuDo + Offset(offset int) ISysMenuDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) ISysMenuDo + Unscoped() ISysMenuDo + Create(values ...*model.SysMenu) error + CreateInBatches(values []*model.SysMenu, batchSize int) error + Save(values ...*model.SysMenu) error + First() (*model.SysMenu, error) + Take() (*model.SysMenu, error) + Last() (*model.SysMenu, error) + Find() ([]*model.SysMenu, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.SysMenu, err error) + FindInBatches(result *[]*model.SysMenu, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.SysMenu) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) ISysMenuDo + Assign(attrs ...field.AssignExpr) ISysMenuDo + Joins(fields ...field.RelationField) ISysMenuDo + Preload(fields ...field.RelationField) ISysMenuDo + FirstOrInit() (*model.SysMenu, error) + FirstOrCreate() (*model.SysMenu, error) + FindByPage(offset int, limit int) (result []*model.SysMenu, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) ISysMenuDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (s sysMenuDo) Debug() ISysMenuDo { + return s.withDO(s.DO.Debug()) +} + +func (s sysMenuDo) WithContext(ctx context.Context) ISysMenuDo { + return s.withDO(s.DO.WithContext(ctx)) +} + +func (s sysMenuDo) ReadDB() ISysMenuDo { + return s.Clauses(dbresolver.Read) +} + +func (s sysMenuDo) WriteDB() ISysMenuDo { + return s.Clauses(dbresolver.Write) +} + +func (s sysMenuDo) Session(config *gorm.Session) ISysMenuDo { + return s.withDO(s.DO.Session(config)) +} + +func (s sysMenuDo) Clauses(conds ...clause.Expression) ISysMenuDo { + return s.withDO(s.DO.Clauses(conds...)) +} + +func (s sysMenuDo) Returning(value interface{}, columns ...string) ISysMenuDo { + return s.withDO(s.DO.Returning(value, columns...)) +} + +func (s sysMenuDo) Not(conds ...gen.Condition) ISysMenuDo { + return s.withDO(s.DO.Not(conds...)) +} + +func (s sysMenuDo) Or(conds ...gen.Condition) ISysMenuDo { + return s.withDO(s.DO.Or(conds...)) +} + +func (s sysMenuDo) Select(conds ...field.Expr) ISysMenuDo { + return s.withDO(s.DO.Select(conds...)) +} + +func (s sysMenuDo) Where(conds ...gen.Condition) ISysMenuDo { + return s.withDO(s.DO.Where(conds...)) +} + +func (s sysMenuDo) Order(conds ...field.Expr) ISysMenuDo { + return s.withDO(s.DO.Order(conds...)) +} + +func (s sysMenuDo) Distinct(cols ...field.Expr) ISysMenuDo { + return s.withDO(s.DO.Distinct(cols...)) +} + +func (s sysMenuDo) Omit(cols ...field.Expr) ISysMenuDo { + return s.withDO(s.DO.Omit(cols...)) +} + +func (s sysMenuDo) Join(table schema.Tabler, on ...field.Expr) ISysMenuDo { + return s.withDO(s.DO.Join(table, on...)) +} + +func (s sysMenuDo) LeftJoin(table schema.Tabler, on ...field.Expr) ISysMenuDo { + return s.withDO(s.DO.LeftJoin(table, on...)) +} + +func (s sysMenuDo) RightJoin(table schema.Tabler, on ...field.Expr) ISysMenuDo { + return s.withDO(s.DO.RightJoin(table, on...)) +} + +func (s sysMenuDo) Group(cols ...field.Expr) ISysMenuDo { + return s.withDO(s.DO.Group(cols...)) +} + +func (s sysMenuDo) Having(conds ...gen.Condition) ISysMenuDo { + return s.withDO(s.DO.Having(conds...)) +} + +func (s sysMenuDo) Limit(limit int) ISysMenuDo { + return s.withDO(s.DO.Limit(limit)) +} + +func (s sysMenuDo) Offset(offset int) ISysMenuDo { + return s.withDO(s.DO.Offset(offset)) +} + +func (s sysMenuDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ISysMenuDo { + return s.withDO(s.DO.Scopes(funcs...)) +} + +func (s sysMenuDo) Unscoped() ISysMenuDo { + return s.withDO(s.DO.Unscoped()) +} + +func (s sysMenuDo) Create(values ...*model.SysMenu) error { + if len(values) == 0 { + return nil + } + return s.DO.Create(values) +} + +func (s sysMenuDo) CreateInBatches(values []*model.SysMenu, batchSize int) error { + return s.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (s sysMenuDo) Save(values ...*model.SysMenu) error { + if len(values) == 0 { + return nil + } + return s.DO.Save(values) +} + +func (s sysMenuDo) First() (*model.SysMenu, error) { + if result, err := s.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.SysMenu), nil + } +} + +func (s sysMenuDo) Take() (*model.SysMenu, error) { + if result, err := s.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.SysMenu), nil + } +} + +func (s sysMenuDo) Last() (*model.SysMenu, error) { + if result, err := s.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.SysMenu), nil + } +} + +func (s sysMenuDo) Find() ([]*model.SysMenu, error) { + result, err := s.DO.Find() + return result.([]*model.SysMenu), err +} + +func (s sysMenuDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.SysMenu, err error) { + buf := make([]*model.SysMenu, 0, batchSize) + err = s.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (s sysMenuDo) FindInBatches(result *[]*model.SysMenu, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return s.DO.FindInBatches(result, batchSize, fc) +} + +func (s sysMenuDo) Attrs(attrs ...field.AssignExpr) ISysMenuDo { + return s.withDO(s.DO.Attrs(attrs...)) +} + +func (s sysMenuDo) Assign(attrs ...field.AssignExpr) ISysMenuDo { + return s.withDO(s.DO.Assign(attrs...)) +} + +func (s sysMenuDo) Joins(fields ...field.RelationField) ISysMenuDo { + for _, _f := range fields { + s = *s.withDO(s.DO.Joins(_f)) + } + return &s +} + +func (s sysMenuDo) Preload(fields ...field.RelationField) ISysMenuDo { + for _, _f := range fields { + s = *s.withDO(s.DO.Preload(_f)) + } + return &s +} + +func (s sysMenuDo) FirstOrInit() (*model.SysMenu, error) { + if result, err := s.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.SysMenu), nil + } +} + +func (s sysMenuDo) FirstOrCreate() (*model.SysMenu, error) { + if result, err := s.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.SysMenu), nil + } +} + +func (s sysMenuDo) FindByPage(offset int, limit int) (result []*model.SysMenu, count int64, err error) { + result, err = s.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = s.Offset(-1).Limit(-1).Count() + return +} + +func (s sysMenuDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = s.Count() + if err != nil { + return + } + + err = s.Offset(offset).Limit(limit).Scan(result) + return +} + +func (s sysMenuDo) Scan(result interface{}) (err error) { + return s.DO.Scan(result) +} + +func (s sysMenuDo) Delete(models ...*model.SysMenu) (result gen.ResultInfo, err error) { + return s.DO.Delete(models) +} + +func (s *sysMenuDo) withDO(do gen.Dao) *sysMenuDo { + s.DO = *do.(*gen.DO) + return s +} diff --git a/internal/dal/query/sys_user.gen.go b/internal/dal/query/sys_user.gen.go new file mode 100644 index 0000000..4d94b8b --- /dev/null +++ b/internal/dal/query/sys_user.gen.go @@ -0,0 +1,408 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package query + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "github.com/ch3nnn/webstack-go/internal/dal/model" +) + +func newSysUser(db *gorm.DB, opts ...gen.DOOption) sysUser { + _sysUser := sysUser{} + + _sysUser.sysUserDo.UseDB(db, opts...) + _sysUser.sysUserDo.UseModel(&model.SysUser{}) + + tableName := _sysUser.sysUserDo.TableName() + _sysUser.ALL = field.NewAsterisk(tableName) + _sysUser.ID = field.NewInt(tableName, "id") + _sysUser.Username = field.NewString(tableName, "username") + _sysUser.Password = field.NewString(tableName, "password") + _sysUser.CreatedAt = field.NewTime(tableName, "created_at") + _sysUser.UpdatedAt = field.NewTime(tableName, "updated_at") + _sysUser.DeletedAt = field.NewTime(tableName, "deleted_at") + + _sysUser.fillFieldMap() + + return _sysUser +} + +type sysUser struct { + sysUserDo sysUserDo + + ALL field.Asterisk + ID field.Int + Username field.String + Password field.String + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Time + + fieldMap map[string]field.Expr +} + +func (s sysUser) Table(newTableName string) *sysUser { + s.sysUserDo.UseTable(newTableName) + return s.updateTableName(newTableName) +} + +func (s sysUser) As(alias string) *sysUser { + s.sysUserDo.DO = *(s.sysUserDo.As(alias).(*gen.DO)) + return s.updateTableName(alias) +} + +func (s *sysUser) updateTableName(table string) *sysUser { + s.ALL = field.NewAsterisk(table) + s.ID = field.NewInt(table, "id") + s.Username = field.NewString(table, "username") + s.Password = field.NewString(table, "password") + s.CreatedAt = field.NewTime(table, "created_at") + s.UpdatedAt = field.NewTime(table, "updated_at") + s.DeletedAt = field.NewTime(table, "deleted_at") + + s.fillFieldMap() + + return s +} + +func (s *sysUser) WithContext(ctx context.Context) ISysUserDo { return s.sysUserDo.WithContext(ctx) } + +func (s sysUser) TableName() string { return s.sysUserDo.TableName() } + +func (s sysUser) Alias() string { return s.sysUserDo.Alias() } + +func (s sysUser) Columns(cols ...field.Expr) gen.Columns { return s.sysUserDo.Columns(cols...) } + +func (s *sysUser) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := s.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (s *sysUser) fillFieldMap() { + s.fieldMap = make(map[string]field.Expr, 6) + s.fieldMap["id"] = s.ID + s.fieldMap["username"] = s.Username + s.fieldMap["password"] = s.Password + s.fieldMap["created_at"] = s.CreatedAt + s.fieldMap["updated_at"] = s.UpdatedAt + s.fieldMap["deleted_at"] = s.DeletedAt +} + +func (s sysUser) clone(db *gorm.DB) sysUser { + s.sysUserDo.ReplaceConnPool(db.Statement.ConnPool) + return s +} + +func (s sysUser) replaceDB(db *gorm.DB) sysUser { + s.sysUserDo.ReplaceDB(db) + return s +} + +type sysUserDo struct{ gen.DO } + +type ISysUserDo interface { + gen.SubQuery + Debug() ISysUserDo + WithContext(ctx context.Context) ISysUserDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() ISysUserDo + WriteDB() ISysUserDo + As(alias string) gen.Dao + Session(config *gorm.Session) ISysUserDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) ISysUserDo + Not(conds ...gen.Condition) ISysUserDo + Or(conds ...gen.Condition) ISysUserDo + Select(conds ...field.Expr) ISysUserDo + Where(conds ...gen.Condition) ISysUserDo + Order(conds ...field.Expr) ISysUserDo + Distinct(cols ...field.Expr) ISysUserDo + Omit(cols ...field.Expr) ISysUserDo + Join(table schema.Tabler, on ...field.Expr) ISysUserDo + LeftJoin(table schema.Tabler, on ...field.Expr) ISysUserDo + RightJoin(table schema.Tabler, on ...field.Expr) ISysUserDo + Group(cols ...field.Expr) ISysUserDo + Having(conds ...gen.Condition) ISysUserDo + Limit(limit int) ISysUserDo + Offset(offset int) ISysUserDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) ISysUserDo + Unscoped() ISysUserDo + Create(values ...*model.SysUser) error + CreateInBatches(values []*model.SysUser, batchSize int) error + Save(values ...*model.SysUser) error + First() (*model.SysUser, error) + Take() (*model.SysUser, error) + Last() (*model.SysUser, error) + Find() ([]*model.SysUser, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.SysUser, err error) + FindInBatches(result *[]*model.SysUser, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.SysUser) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) ISysUserDo + Assign(attrs ...field.AssignExpr) ISysUserDo + Joins(fields ...field.RelationField) ISysUserDo + Preload(fields ...field.RelationField) ISysUserDo + FirstOrInit() (*model.SysUser, error) + FirstOrCreate() (*model.SysUser, error) + FindByPage(offset int, limit int) (result []*model.SysUser, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) ISysUserDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (s sysUserDo) Debug() ISysUserDo { + return s.withDO(s.DO.Debug()) +} + +func (s sysUserDo) WithContext(ctx context.Context) ISysUserDo { + return s.withDO(s.DO.WithContext(ctx)) +} + +func (s sysUserDo) ReadDB() ISysUserDo { + return s.Clauses(dbresolver.Read) +} + +func (s sysUserDo) WriteDB() ISysUserDo { + return s.Clauses(dbresolver.Write) +} + +func (s sysUserDo) Session(config *gorm.Session) ISysUserDo { + return s.withDO(s.DO.Session(config)) +} + +func (s sysUserDo) Clauses(conds ...clause.Expression) ISysUserDo { + return s.withDO(s.DO.Clauses(conds...)) +} + +func (s sysUserDo) Returning(value interface{}, columns ...string) ISysUserDo { + return s.withDO(s.DO.Returning(value, columns...)) +} + +func (s sysUserDo) Not(conds ...gen.Condition) ISysUserDo { + return s.withDO(s.DO.Not(conds...)) +} + +func (s sysUserDo) Or(conds ...gen.Condition) ISysUserDo { + return s.withDO(s.DO.Or(conds...)) +} + +func (s sysUserDo) Select(conds ...field.Expr) ISysUserDo { + return s.withDO(s.DO.Select(conds...)) +} + +func (s sysUserDo) Where(conds ...gen.Condition) ISysUserDo { + return s.withDO(s.DO.Where(conds...)) +} + +func (s sysUserDo) Order(conds ...field.Expr) ISysUserDo { + return s.withDO(s.DO.Order(conds...)) +} + +func (s sysUserDo) Distinct(cols ...field.Expr) ISysUserDo { + return s.withDO(s.DO.Distinct(cols...)) +} + +func (s sysUserDo) Omit(cols ...field.Expr) ISysUserDo { + return s.withDO(s.DO.Omit(cols...)) +} + +func (s sysUserDo) Join(table schema.Tabler, on ...field.Expr) ISysUserDo { + return s.withDO(s.DO.Join(table, on...)) +} + +func (s sysUserDo) LeftJoin(table schema.Tabler, on ...field.Expr) ISysUserDo { + return s.withDO(s.DO.LeftJoin(table, on...)) +} + +func (s sysUserDo) RightJoin(table schema.Tabler, on ...field.Expr) ISysUserDo { + return s.withDO(s.DO.RightJoin(table, on...)) +} + +func (s sysUserDo) Group(cols ...field.Expr) ISysUserDo { + return s.withDO(s.DO.Group(cols...)) +} + +func (s sysUserDo) Having(conds ...gen.Condition) ISysUserDo { + return s.withDO(s.DO.Having(conds...)) +} + +func (s sysUserDo) Limit(limit int) ISysUserDo { + return s.withDO(s.DO.Limit(limit)) +} + +func (s sysUserDo) Offset(offset int) ISysUserDo { + return s.withDO(s.DO.Offset(offset)) +} + +func (s sysUserDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ISysUserDo { + return s.withDO(s.DO.Scopes(funcs...)) +} + +func (s sysUserDo) Unscoped() ISysUserDo { + return s.withDO(s.DO.Unscoped()) +} + +func (s sysUserDo) Create(values ...*model.SysUser) error { + if len(values) == 0 { + return nil + } + return s.DO.Create(values) +} + +func (s sysUserDo) CreateInBatches(values []*model.SysUser, batchSize int) error { + return s.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (s sysUserDo) Save(values ...*model.SysUser) error { + if len(values) == 0 { + return nil + } + return s.DO.Save(values) +} + +func (s sysUserDo) First() (*model.SysUser, error) { + if result, err := s.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.SysUser), nil + } +} + +func (s sysUserDo) Take() (*model.SysUser, error) { + if result, err := s.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.SysUser), nil + } +} + +func (s sysUserDo) Last() (*model.SysUser, error) { + if result, err := s.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.SysUser), nil + } +} + +func (s sysUserDo) Find() ([]*model.SysUser, error) { + result, err := s.DO.Find() + return result.([]*model.SysUser), err +} + +func (s sysUserDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.SysUser, err error) { + buf := make([]*model.SysUser, 0, batchSize) + err = s.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (s sysUserDo) FindInBatches(result *[]*model.SysUser, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return s.DO.FindInBatches(result, batchSize, fc) +} + +func (s sysUserDo) Attrs(attrs ...field.AssignExpr) ISysUserDo { + return s.withDO(s.DO.Attrs(attrs...)) +} + +func (s sysUserDo) Assign(attrs ...field.AssignExpr) ISysUserDo { + return s.withDO(s.DO.Assign(attrs...)) +} + +func (s sysUserDo) Joins(fields ...field.RelationField) ISysUserDo { + for _, _f := range fields { + s = *s.withDO(s.DO.Joins(_f)) + } + return &s +} + +func (s sysUserDo) Preload(fields ...field.RelationField) ISysUserDo { + for _, _f := range fields { + s = *s.withDO(s.DO.Preload(_f)) + } + return &s +} + +func (s sysUserDo) FirstOrInit() (*model.SysUser, error) { + if result, err := s.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.SysUser), nil + } +} + +func (s sysUserDo) FirstOrCreate() (*model.SysUser, error) { + if result, err := s.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.SysUser), nil + } +} + +func (s sysUserDo) FindByPage(offset int, limit int) (result []*model.SysUser, count int64, err error) { + result, err = s.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = s.Offset(-1).Limit(-1).Count() + return +} + +func (s sysUserDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = s.Count() + if err != nil { + return + } + + err = s.Offset(offset).Limit(limit).Scan(result) + return +} + +func (s sysUserDo) Scan(result interface{}) (err error) { + return s.DO.Scan(result) +} + +func (s sysUserDo) Delete(models ...*model.SysUser) (result gen.ResultInfo, err error) { + return s.DO.Delete(models) +} + +func (s *sysUserDo) withDO(do gen.Dao) *sysUserDo { + s.DO = *do.(*gen.DO) + return s +} diff --git a/internal/dal/query/sys_user_menu.gen.go b/internal/dal/query/sys_user_menu.gen.go new file mode 100644 index 0000000..c1e5003 --- /dev/null +++ b/internal/dal/query/sys_user_menu.gen.go @@ -0,0 +1,410 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package query + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "github.com/ch3nnn/webstack-go/internal/dal/model" +) + +func newSysUserMenu(db *gorm.DB, opts ...gen.DOOption) sysUserMenu { + _sysUserMenu := sysUserMenu{} + + _sysUserMenu.sysUserMenuDo.UseDB(db, opts...) + _sysUserMenu.sysUserMenuDo.UseModel(&model.SysUserMenu{}) + + tableName := _sysUserMenu.sysUserMenuDo.TableName() + _sysUserMenu.ALL = field.NewAsterisk(tableName) + _sysUserMenu.ID = field.NewInt(tableName, "id") + _sysUserMenu.UserID = field.NewInt(tableName, "user_id") + _sysUserMenu.MenuID = field.NewInt(tableName, "menu_id") + _sysUserMenu.CreatedAt = field.NewTime(tableName, "created_at") + _sysUserMenu.UpdatedAt = field.NewTime(tableName, "updated_at") + _sysUserMenu.DeletedAt = field.NewTime(tableName, "deleted_at") + + _sysUserMenu.fillFieldMap() + + return _sysUserMenu +} + +type sysUserMenu struct { + sysUserMenuDo sysUserMenuDo + + ALL field.Asterisk + ID field.Int + UserID field.Int + MenuID field.Int + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Time + + fieldMap map[string]field.Expr +} + +func (s sysUserMenu) Table(newTableName string) *sysUserMenu { + s.sysUserMenuDo.UseTable(newTableName) + return s.updateTableName(newTableName) +} + +func (s sysUserMenu) As(alias string) *sysUserMenu { + s.sysUserMenuDo.DO = *(s.sysUserMenuDo.As(alias).(*gen.DO)) + return s.updateTableName(alias) +} + +func (s *sysUserMenu) updateTableName(table string) *sysUserMenu { + s.ALL = field.NewAsterisk(table) + s.ID = field.NewInt(table, "id") + s.UserID = field.NewInt(table, "user_id") + s.MenuID = field.NewInt(table, "menu_id") + s.CreatedAt = field.NewTime(table, "created_at") + s.UpdatedAt = field.NewTime(table, "updated_at") + s.DeletedAt = field.NewTime(table, "deleted_at") + + s.fillFieldMap() + + return s +} + +func (s *sysUserMenu) WithContext(ctx context.Context) ISysUserMenuDo { + return s.sysUserMenuDo.WithContext(ctx) +} + +func (s sysUserMenu) TableName() string { return s.sysUserMenuDo.TableName() } + +func (s sysUserMenu) Alias() string { return s.sysUserMenuDo.Alias() } + +func (s sysUserMenu) Columns(cols ...field.Expr) gen.Columns { return s.sysUserMenuDo.Columns(cols...) } + +func (s *sysUserMenu) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := s.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (s *sysUserMenu) fillFieldMap() { + s.fieldMap = make(map[string]field.Expr, 6) + s.fieldMap["id"] = s.ID + s.fieldMap["user_id"] = s.UserID + s.fieldMap["menu_id"] = s.MenuID + s.fieldMap["created_at"] = s.CreatedAt + s.fieldMap["updated_at"] = s.UpdatedAt + s.fieldMap["deleted_at"] = s.DeletedAt +} + +func (s sysUserMenu) clone(db *gorm.DB) sysUserMenu { + s.sysUserMenuDo.ReplaceConnPool(db.Statement.ConnPool) + return s +} + +func (s sysUserMenu) replaceDB(db *gorm.DB) sysUserMenu { + s.sysUserMenuDo.ReplaceDB(db) + return s +} + +type sysUserMenuDo struct{ gen.DO } + +type ISysUserMenuDo interface { + gen.SubQuery + Debug() ISysUserMenuDo + WithContext(ctx context.Context) ISysUserMenuDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() ISysUserMenuDo + WriteDB() ISysUserMenuDo + As(alias string) gen.Dao + Session(config *gorm.Session) ISysUserMenuDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) ISysUserMenuDo + Not(conds ...gen.Condition) ISysUserMenuDo + Or(conds ...gen.Condition) ISysUserMenuDo + Select(conds ...field.Expr) ISysUserMenuDo + Where(conds ...gen.Condition) ISysUserMenuDo + Order(conds ...field.Expr) ISysUserMenuDo + Distinct(cols ...field.Expr) ISysUserMenuDo + Omit(cols ...field.Expr) ISysUserMenuDo + Join(table schema.Tabler, on ...field.Expr) ISysUserMenuDo + LeftJoin(table schema.Tabler, on ...field.Expr) ISysUserMenuDo + RightJoin(table schema.Tabler, on ...field.Expr) ISysUserMenuDo + Group(cols ...field.Expr) ISysUserMenuDo + Having(conds ...gen.Condition) ISysUserMenuDo + Limit(limit int) ISysUserMenuDo + Offset(offset int) ISysUserMenuDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) ISysUserMenuDo + Unscoped() ISysUserMenuDo + Create(values ...*model.SysUserMenu) error + CreateInBatches(values []*model.SysUserMenu, batchSize int) error + Save(values ...*model.SysUserMenu) error + First() (*model.SysUserMenu, error) + Take() (*model.SysUserMenu, error) + Last() (*model.SysUserMenu, error) + Find() ([]*model.SysUserMenu, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.SysUserMenu, err error) + FindInBatches(result *[]*model.SysUserMenu, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.SysUserMenu) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) ISysUserMenuDo + Assign(attrs ...field.AssignExpr) ISysUserMenuDo + Joins(fields ...field.RelationField) ISysUserMenuDo + Preload(fields ...field.RelationField) ISysUserMenuDo + FirstOrInit() (*model.SysUserMenu, error) + FirstOrCreate() (*model.SysUserMenu, error) + FindByPage(offset int, limit int) (result []*model.SysUserMenu, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) ISysUserMenuDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (s sysUserMenuDo) Debug() ISysUserMenuDo { + return s.withDO(s.DO.Debug()) +} + +func (s sysUserMenuDo) WithContext(ctx context.Context) ISysUserMenuDo { + return s.withDO(s.DO.WithContext(ctx)) +} + +func (s sysUserMenuDo) ReadDB() ISysUserMenuDo { + return s.Clauses(dbresolver.Read) +} + +func (s sysUserMenuDo) WriteDB() ISysUserMenuDo { + return s.Clauses(dbresolver.Write) +} + +func (s sysUserMenuDo) Session(config *gorm.Session) ISysUserMenuDo { + return s.withDO(s.DO.Session(config)) +} + +func (s sysUserMenuDo) Clauses(conds ...clause.Expression) ISysUserMenuDo { + return s.withDO(s.DO.Clauses(conds...)) +} + +func (s sysUserMenuDo) Returning(value interface{}, columns ...string) ISysUserMenuDo { + return s.withDO(s.DO.Returning(value, columns...)) +} + +func (s sysUserMenuDo) Not(conds ...gen.Condition) ISysUserMenuDo { + return s.withDO(s.DO.Not(conds...)) +} + +func (s sysUserMenuDo) Or(conds ...gen.Condition) ISysUserMenuDo { + return s.withDO(s.DO.Or(conds...)) +} + +func (s sysUserMenuDo) Select(conds ...field.Expr) ISysUserMenuDo { + return s.withDO(s.DO.Select(conds...)) +} + +func (s sysUserMenuDo) Where(conds ...gen.Condition) ISysUserMenuDo { + return s.withDO(s.DO.Where(conds...)) +} + +func (s sysUserMenuDo) Order(conds ...field.Expr) ISysUserMenuDo { + return s.withDO(s.DO.Order(conds...)) +} + +func (s sysUserMenuDo) Distinct(cols ...field.Expr) ISysUserMenuDo { + return s.withDO(s.DO.Distinct(cols...)) +} + +func (s sysUserMenuDo) Omit(cols ...field.Expr) ISysUserMenuDo { + return s.withDO(s.DO.Omit(cols...)) +} + +func (s sysUserMenuDo) Join(table schema.Tabler, on ...field.Expr) ISysUserMenuDo { + return s.withDO(s.DO.Join(table, on...)) +} + +func (s sysUserMenuDo) LeftJoin(table schema.Tabler, on ...field.Expr) ISysUserMenuDo { + return s.withDO(s.DO.LeftJoin(table, on...)) +} + +func (s sysUserMenuDo) RightJoin(table schema.Tabler, on ...field.Expr) ISysUserMenuDo { + return s.withDO(s.DO.RightJoin(table, on...)) +} + +func (s sysUserMenuDo) Group(cols ...field.Expr) ISysUserMenuDo { + return s.withDO(s.DO.Group(cols...)) +} + +func (s sysUserMenuDo) Having(conds ...gen.Condition) ISysUserMenuDo { + return s.withDO(s.DO.Having(conds...)) +} + +func (s sysUserMenuDo) Limit(limit int) ISysUserMenuDo { + return s.withDO(s.DO.Limit(limit)) +} + +func (s sysUserMenuDo) Offset(offset int) ISysUserMenuDo { + return s.withDO(s.DO.Offset(offset)) +} + +func (s sysUserMenuDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ISysUserMenuDo { + return s.withDO(s.DO.Scopes(funcs...)) +} + +func (s sysUserMenuDo) Unscoped() ISysUserMenuDo { + return s.withDO(s.DO.Unscoped()) +} + +func (s sysUserMenuDo) Create(values ...*model.SysUserMenu) error { + if len(values) == 0 { + return nil + } + return s.DO.Create(values) +} + +func (s sysUserMenuDo) CreateInBatches(values []*model.SysUserMenu, batchSize int) error { + return s.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (s sysUserMenuDo) Save(values ...*model.SysUserMenu) error { + if len(values) == 0 { + return nil + } + return s.DO.Save(values) +} + +func (s sysUserMenuDo) First() (*model.SysUserMenu, error) { + if result, err := s.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.SysUserMenu), nil + } +} + +func (s sysUserMenuDo) Take() (*model.SysUserMenu, error) { + if result, err := s.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.SysUserMenu), nil + } +} + +func (s sysUserMenuDo) Last() (*model.SysUserMenu, error) { + if result, err := s.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.SysUserMenu), nil + } +} + +func (s sysUserMenuDo) Find() ([]*model.SysUserMenu, error) { + result, err := s.DO.Find() + return result.([]*model.SysUserMenu), err +} + +func (s sysUserMenuDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.SysUserMenu, err error) { + buf := make([]*model.SysUserMenu, 0, batchSize) + err = s.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (s sysUserMenuDo) FindInBatches(result *[]*model.SysUserMenu, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return s.DO.FindInBatches(result, batchSize, fc) +} + +func (s sysUserMenuDo) Attrs(attrs ...field.AssignExpr) ISysUserMenuDo { + return s.withDO(s.DO.Attrs(attrs...)) +} + +func (s sysUserMenuDo) Assign(attrs ...field.AssignExpr) ISysUserMenuDo { + return s.withDO(s.DO.Assign(attrs...)) +} + +func (s sysUserMenuDo) Joins(fields ...field.RelationField) ISysUserMenuDo { + for _, _f := range fields { + s = *s.withDO(s.DO.Joins(_f)) + } + return &s +} + +func (s sysUserMenuDo) Preload(fields ...field.RelationField) ISysUserMenuDo { + for _, _f := range fields { + s = *s.withDO(s.DO.Preload(_f)) + } + return &s +} + +func (s sysUserMenuDo) FirstOrInit() (*model.SysUserMenu, error) { + if result, err := s.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.SysUserMenu), nil + } +} + +func (s sysUserMenuDo) FirstOrCreate() (*model.SysUserMenu, error) { + if result, err := s.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.SysUserMenu), nil + } +} + +func (s sysUserMenuDo) FindByPage(offset int, limit int) (result []*model.SysUserMenu, count int64, err error) { + result, err = s.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = s.Offset(-1).Limit(-1).Count() + return +} + +func (s sysUserMenuDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = s.Count() + if err != nil { + return + } + + err = s.Offset(offset).Limit(limit).Scan(result) + return +} + +func (s sysUserMenuDo) Scan(result interface{}) (err error) { + return s.DO.Scan(result) +} + +func (s sysUserMenuDo) Delete(models ...*model.SysUserMenu) (result gen.ResultInfo, err error) { + return s.DO.Delete(models) +} + +func (s *sysUserMenuDo) withDO(do gen.Dao) *sysUserMenuDo { + s.DO = *do.(*gen.DO) + return s +} diff --git a/internal/dal/repository/repository.go b/internal/dal/repository/repository.go new file mode 100644 index 0000000..1a5661b --- /dev/null +++ b/internal/dal/repository/repository.go @@ -0,0 +1,185 @@ +package repository + +import ( + "context" + "fmt" + "os" + "time" + + "github.com/duke-git/lancet/v2/cryptor" + "github.com/glebarez/sqlite" + "github.com/spf13/viper" + "gorm.io/driver/mysql" + "gorm.io/driver/postgres" + "gorm.io/gorm" + + "github.com/ch3nnn/webstack-go/internal/dal/model" + "github.com/ch3nnn/webstack-go/internal/dal/query" + "github.com/ch3nnn/webstack-go/pkg/log" + "github.com/ch3nnn/webstack-go/pkg/zapgorm2" +) + +type Repository struct { + logger *log.Logger + // cache *cache.Cache + db *gorm.DB +} + +func NewRepository( + logger *log.Logger, + // cache *cache.Cache, + db *gorm.DB, +) *Repository { + return &Repository{ + logger: logger, + // cache: cache, + db: db, + } +} + +//func NewCache() *cache.Cache { +// return cache.New(5*time.Minute, 10*time.Minute) +//} + +func NewDB(conf *viper.Viper, l *log.Logger) *gorm.DB { + var ( + db *gorm.DB + err error + dialector gorm.Dialector + ) + + dsn := conf.GetString("data.db.user.dsn") + switch conf.GetString("data.db.user.driver") { + case "mysql": + dialector = mysql.Open(dsn) + case "postgres": + dialector = postgres.Open(dsn) + case "sqlite": + + dialector = sqlite.Open(dsn) + default: + panic("unknown db driver") + } + + db, err = gorm.Open(dialector, &gorm.Config{ + QueryFields: true, + TranslateError: true, // 方言转换错误 + Logger: zapgorm2.New(l.Logger), + }) + if err != nil { + panic(err) + } + + // Connection Pool config + sqlDB, err := db.DB() + if err != nil { + panic(err) + } + + sqlDB.SetMaxIdleConns(10) + sqlDB.SetMaxOpenConns(100) + sqlDB.SetConnMaxLifetime(time.Hour) + + // set gorm-gen + query.SetDefault(db) + + // 迁移和初始化操作 + autoMigrateAndInitialize(db) + + return db.Debug() +} + +func autoMigrateAndInitialize(db *gorm.DB) { + err := db.AutoMigrate( + &model.SysUser{}, + &model.SysUserMenu{}, + &model.SysMenu{}, + &model.StCategory{}, + &model.StSite{}, + ) + if err != nil { + fmt.Println("user migrate error") + os.Exit(0) + } + + ctx := context.Background() + + umCtn, err := query.SysUserMenu.WithContext(ctx).Count() + if err != nil { + os.Exit(0) + } + + uCtn, err := query.SysUser.WithContext(ctx).Count() + if err != nil { + os.Exit(0) + } + + mCtn, err := query.SysMenu.WithContext(ctx).Count() + if err != nil { + os.Exit(0) + } + + if umCtn == 0 && uCtn == 0 && mCtn == 0 { + err := query.SysUser.WithContext(ctx).Create(&model.SysUser{ + ID: 1, + Username: "admin", + Password: cryptor.Md5String("admin"), + }) + if err != nil { + os.Exit(0) + } + + err = query.SysMenu.WithContext(ctx).Create( + &model.SysMenu{ + ID: 1, + Pid: 0, + Name: "网站管理", + Icon: "users", + Level: 1, + Sort: 500, + IsUsed: true, + }, + &model.SysMenu{ + ID: 2, + Pid: 1, + Name: "网站分类", + Link: "/admin/category", + Level: 1, + Sort: 501, + IsUsed: true, + }, + &model.SysMenu{ + ID: 3, + Pid: 1, + Name: "网站信息", + Link: "/admin/site", + Level: 1, + Sort: 502, + IsUsed: true, + }, + ) + if err != nil { + os.Exit(0) + } + + err = query.SysUserMenu.WithContext(ctx).Create( + &model.SysUserMenu{ + UserID: 1, + MenuID: 1, + }, + &model.SysUserMenu{ + UserID: 1, + MenuID: 2, + }, + &model.SysUserMenu{ + UserID: 1, + MenuID: 3, + }, + ) + if err != nil { + os.Exit(0) + } + + fmt.Println("success initialize") + } +} diff --git a/internal/dal/repository/st_category.gen.go b/internal/dal/repository/st_category.gen.go new file mode 100644 index 0000000..a2f97e7 --- /dev/null +++ b/internal/dal/repository/st_category.gen.go @@ -0,0 +1,174 @@ +// Code generated by gen-table. DO NOT EDIT. +// Code generated by gen-table. DO NOT EDIT. +// Code generated by gen-table. DO NOT EDIT. + +package repository + +import ( + "time" + + "github.com/ch3nnn/webstack-go/internal/dal/model" + "github.com/ch3nnn/webstack-go/internal/dal/query" + + "gorm.io/gen" + "gorm.io/gen/field" +) + +var _ iStCategoryDao = (*stCategoryDao)(nil) + +// ------------------------------------ +// StCategory ColumnName +// ------------------------------------ +type iWhereStCategoryFunc interface { + WhereByID(id int) func(dao gen.Dao) gen.Dao + WhereByParentID(parentId int) func(dao gen.Dao) gen.Dao + WhereBySort(sort int) func(dao gen.Dao) gen.Dao + WhereByTitle(title string) func(dao gen.Dao) gen.Dao + WhereByIcon(icon string) func(dao gen.Dao) gen.Dao + WhereByLevel(level int32) func(dao gen.Dao) gen.Dao + WhereByIsUsed(isUsed bool) func(dao gen.Dao) gen.Dao + WhereByCreatedAt(createdAt time.Time) func(dao gen.Dao) gen.Dao + WhereByUpdatedAt(updatedAt time.Time) func(dao gen.Dao) gen.Dao + WhereByDeletedAt(deletedAt time.Time) func(dao gen.Dao) gen.Dao +} + +// ------------------------------------ +// StCategory Generate Function +// ------------------------------------ +type iGenStCategoryFunc interface { + Create(m *model.StCategory) (*model.StCategory, error) + Delete(whereFunc ...func(dao gen.Dao) gen.Dao) error + DeletePhysical(whereFunc ...func(dao gen.Dao) gen.Dao) error + Update(v interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (rowsAffected int64, err error) + FindCount(whereFunc ...func(dao gen.Dao) gen.Dao) (int64, error) + FindOne(whereFunc ...func(dao gen.Dao) gen.Dao) (*model.StCategory, error) + FindAll(whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.StCategory, error) + FindPage(page int, pageSize int, orderColumns []field.Expr, whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.StCategory, int64, error) + Scan(result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (err error) + ScanPage(page int, pageSize int, orderColumns []field.Expr, result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (count int64, err error) +} + +type iStCategoryDao interface { + iWhereStCategoryFunc + iGenStCategoryFunc +} + +type stCategoryDao struct { + stCategoryDo query.IStCategoryDo +} + +func (s *stCategoryDao) WhereByID(id int) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StCategory.ID.Eq(id)) + } +} + +func (s *stCategoryDao) WhereByParentID(parentId int) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StCategory.ParentID.Eq(parentId)) + } +} + +func (s *stCategoryDao) WhereBySort(sort int) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StCategory.Sort.Eq(sort)) + } +} + +func (s *stCategoryDao) WhereByTitle(title string) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StCategory.Title.Eq(title)) + } +} + +func (s *stCategoryDao) WhereByIcon(icon string) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StCategory.Icon.Eq(icon)) + } +} + +func (s *stCategoryDao) WhereByLevel(level int32) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StCategory.Level.Eq(level)) + } +} + +func (s *stCategoryDao) WhereByIsUsed(isUsed bool) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StCategory.IsUsed.Is(isUsed)) + } +} + +func (s *stCategoryDao) WhereByCreatedAt(createdAt time.Time) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StCategory.CreatedAt.Eq(createdAt)) + } +} + +func (s *stCategoryDao) WhereByUpdatedAt(updatedAt time.Time) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StCategory.UpdatedAt.Eq(updatedAt)) + } +} + +func (s *stCategoryDao) WhereByDeletedAt(deletedAt time.Time) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StCategory.DeletedAt.Eq(deletedAt)) + } +} + +func (s *stCategoryDao) Create(m *model.StCategory) (*model.StCategory, error) { + if err := s.stCategoryDo.Create(m); err != nil { + return nil, err + } + return s.FindOne(s.WhereByID(m.ID)) +} + +func (s *stCategoryDao) FindCount(whereFunc ...func(dao gen.Dao) gen.Dao) (int64, error) { + return s.stCategoryDo.Scopes(whereFunc...).Count() +} + +func (s *stCategoryDao) FindOne(whereFunc ...func(dao gen.Dao) gen.Dao) (*model.StCategory, error) { + return s.stCategoryDo.Scopes(whereFunc...).First() +} + +func (s *stCategoryDao) FindAll(whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.StCategory, error) { + return s.stCategoryDo.Scopes(whereFunc...).Find() +} + +func (s *stCategoryDao) FindPage(page int, pageSize int, orderColumns []field.Expr, whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.StCategory, int64, error) { + return s.stCategoryDo.Scopes(whereFunc...).Order(orderColumns...).FindByPage((page-1)*pageSize, pageSize) +} + +// 注意 当通过 struct 更新时,GORM 只会更新非零字段 +// 如果想确保指定字段被更新,使用 map 来完成更新操作 +func (s *stCategoryDao) Update(v interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (rowsAffected int64, err error) { + info, err := s.stCategoryDo.Scopes(whereFunc...).Updates(v) + if err != nil { + return rowsAffected, err + } + + return info.RowsAffected, nil +} + +func (s *stCategoryDao) Delete(whereFunc ...func(dao gen.Dao) gen.Dao) error { + if _, err := s.stCategoryDo.Scopes(whereFunc...).Delete(); err != nil { + return err + } + return nil +} + +func (s *stCategoryDao) DeletePhysical(whereFunc ...func(dao gen.Dao) gen.Dao) error { + if _, err := s.stCategoryDo.Unscoped().Scopes(whereFunc...).Delete(); err != nil { + return err + } + return nil +} + +func (s *stCategoryDao) Scan(result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (err error) { + return s.stCategoryDo.Scopes(whereFunc...).Scan(result) +} + +func (s *stCategoryDao) ScanPage(page int, pageSize int, orderColumns []field.Expr, result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (count int64, err error) { + return s.stCategoryDo.Scopes(whereFunc...).Order(orderColumns...).ScanByPage(result, (page-1)*pageSize, pageSize) +} diff --git a/internal/dal/repository/st_category.go b/internal/dal/repository/st_category.go new file mode 100644 index 0000000..5bc7d6d --- /dev/null +++ b/internal/dal/repository/st_category.go @@ -0,0 +1,56 @@ +package repository + +import ( + "context" + + "gorm.io/gen" + "gorm.io/gen/field" + + "github.com/ch3nnn/webstack-go/internal/dal/model" + "github.com/ch3nnn/webstack-go/internal/dal/query" +) + +var _ iCustomGenStCategoryFunc = (*customStCategoryDao)(nil) + +type ( + // IStCategoryDao not edit interface name + IStCategoryDao interface { + iWhereStCategoryFunc + WithContext(ctx context.Context) iCustomGenStCategoryFunc + + // TODO Custom WhereFunc .... + // ... + } + + // not edit interface name + iCustomGenStCategoryFunc interface { + iGenStCategoryFunc + + // TODO Custom DaoFunc .... + // ... + + FindAllOrderBySort(orderColumn field.Expr, whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.StCategory, error) + } + + // not edit interface name + customStCategoryDao struct { + stCategoryDao + } +) + +func NewStCategoryDao() IStCategoryDao { + return &customStCategoryDao{ + stCategoryDao{ + stCategoryDo: query.StCategory.WithContext(context.Background()), + }, + } +} + +func (d *customStCategoryDao) WithContext(ctx context.Context) iCustomGenStCategoryFunc { + d.stCategoryDo = d.stCategoryDo.WithContext(ctx) + return d +} + +func (d *customStCategoryDao) FindAllOrderBySort(orderColumn field.Expr, whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.StCategory, error) { + return d.stCategoryDo.Scopes(whereFunc...).Order(orderColumn).Find() +} diff --git a/internal/dal/repository/st_site.gen.go b/internal/dal/repository/st_site.gen.go new file mode 100644 index 0000000..329cd9f --- /dev/null +++ b/internal/dal/repository/st_site.gen.go @@ -0,0 +1,174 @@ +// Code generated by gen-table. DO NOT EDIT. +// Code generated by gen-table. DO NOT EDIT. +// Code generated by gen-table. DO NOT EDIT. + +package repository + +import ( + "time" + + "github.com/ch3nnn/webstack-go/internal/dal/model" + "github.com/ch3nnn/webstack-go/internal/dal/query" + + "gorm.io/gen" + "gorm.io/gen/field" +) + +var _ iStSiteDao = (*stSiteDao)(nil) + +// ------------------------------------ +// StSite ColumnName +// ------------------------------------ +type iWhereStSiteFunc interface { + WhereByID(id int) func(dao gen.Dao) gen.Dao + WhereByCategoryID(categoryId int) func(dao gen.Dao) gen.Dao + WhereByTitle(title string) func(dao gen.Dao) gen.Dao + WhereByIcon(icon string) func(dao gen.Dao) gen.Dao + WhereByDescription(description string) func(dao gen.Dao) gen.Dao + WhereByURL(url string) func(dao gen.Dao) gen.Dao + WhereByIsUsed(isUsed bool) func(dao gen.Dao) gen.Dao + WhereByCreatedAt(createdAt time.Time) func(dao gen.Dao) gen.Dao + WhereByUpdatedAt(updatedAt time.Time) func(dao gen.Dao) gen.Dao + WhereByDeletedAt(deletedAt time.Time) func(dao gen.Dao) gen.Dao +} + +// ------------------------------------ +// StSite Generate Function +// ------------------------------------ +type iGenStSiteFunc interface { + Create(m *model.StSite) (*model.StSite, error) + Delete(whereFunc ...func(dao gen.Dao) gen.Dao) error + DeletePhysical(whereFunc ...func(dao gen.Dao) gen.Dao) error + Update(v interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (rowsAffected int64, err error) + FindCount(whereFunc ...func(dao gen.Dao) gen.Dao) (int64, error) + FindOne(whereFunc ...func(dao gen.Dao) gen.Dao) (*model.StSite, error) + FindAll(whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.StSite, error) + FindPage(page int, pageSize int, orderColumns []field.Expr, whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.StSite, int64, error) + Scan(result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (err error) + ScanPage(page int, pageSize int, orderColumns []field.Expr, result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (count int64, err error) +} + +type iStSiteDao interface { + iWhereStSiteFunc + iGenStSiteFunc +} + +type stSiteDao struct { + stSiteDo query.IStSiteDo +} + +func (s *stSiteDao) WhereByID(id int) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StSite.ID.Eq(id)) + } +} + +func (s *stSiteDao) WhereByCategoryID(categoryId int) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StSite.CategoryID.Eq(categoryId)) + } +} + +func (s *stSiteDao) WhereByTitle(title string) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StSite.Title.Eq(title)) + } +} + +func (s *stSiteDao) WhereByIcon(icon string) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StSite.Icon.Eq(icon)) + } +} + +func (s *stSiteDao) WhereByDescription(description string) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StSite.Description.Eq(description)) + } +} + +func (s *stSiteDao) WhereByURL(url string) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StSite.URL.Eq(url)) + } +} + +func (s *stSiteDao) WhereByIsUsed(isUsed bool) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StSite.IsUsed.Is(isUsed)) + } +} + +func (s *stSiteDao) WhereByCreatedAt(createdAt time.Time) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StSite.CreatedAt.Eq(createdAt)) + } +} + +func (s *stSiteDao) WhereByUpdatedAt(updatedAt time.Time) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StSite.UpdatedAt.Eq(updatedAt)) + } +} + +func (s *stSiteDao) WhereByDeletedAt(deletedAt time.Time) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.StSite.DeletedAt.Eq(deletedAt)) + } +} + +func (s *stSiteDao) Create(m *model.StSite) (*model.StSite, error) { + if err := s.stSiteDo.Create(m); err != nil { + return nil, err + } + return s.FindOne(s.WhereByID(m.ID)) +} + +func (s *stSiteDao) FindCount(whereFunc ...func(dao gen.Dao) gen.Dao) (int64, error) { + return s.stSiteDo.Scopes(whereFunc...).Count() +} + +func (s *stSiteDao) FindOne(whereFunc ...func(dao gen.Dao) gen.Dao) (*model.StSite, error) { + return s.stSiteDo.Scopes(whereFunc...).First() +} + +func (s *stSiteDao) FindAll(whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.StSite, error) { + return s.stSiteDo.Scopes(whereFunc...).Find() +} + +func (s *stSiteDao) FindPage(page int, pageSize int, orderColumns []field.Expr, whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.StSite, int64, error) { + return s.stSiteDo.Scopes(whereFunc...).Order(orderColumns...).FindByPage((page-1)*pageSize, pageSize) +} + +// 注意 当通过 struct 更新时,GORM 只会更新非零字段 +// 如果想确保指定字段被更新,使用 map 来完成更新操作 +func (s *stSiteDao) Update(v interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (rowsAffected int64, err error) { + info, err := s.stSiteDo.Scopes(whereFunc...).Updates(v) + if err != nil { + return rowsAffected, err + } + + return info.RowsAffected, nil +} + +func (s *stSiteDao) Delete(whereFunc ...func(dao gen.Dao) gen.Dao) error { + if _, err := s.stSiteDo.Scopes(whereFunc...).Delete(); err != nil { + return err + } + return nil +} + +func (s *stSiteDao) DeletePhysical(whereFunc ...func(dao gen.Dao) gen.Dao) error { + if _, err := s.stSiteDo.Unscoped().Scopes(whereFunc...).Delete(); err != nil { + return err + } + return nil +} + +func (s *stSiteDao) Scan(result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (err error) { + return s.stSiteDo.Scopes(whereFunc...).Scan(result) +} + +func (s *stSiteDao) ScanPage(page int, pageSize int, orderColumns []field.Expr, result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (count int64, err error) { + return s.stSiteDo.Scopes(whereFunc...).Order(orderColumns...).ScanByPage(result, (page-1)*pageSize, pageSize) +} diff --git a/internal/dal/repository/st_site.go b/internal/dal/repository/st_site.go new file mode 100644 index 0000000..b5f3648 --- /dev/null +++ b/internal/dal/repository/st_site.go @@ -0,0 +1,58 @@ +package repository + +import ( + "context" + + "gorm.io/gen" + + "github.com/ch3nnn/webstack-go/internal/dal/query" +) + +var _ iCustomGenStSiteFunc = (*customStSiteDao)(nil) + +type ( + // IStSiteDao not edit interface name + IStSiteDao interface { + iWhereStSiteFunc + WithContext(ctx context.Context) iCustomGenStSiteFunc + + // TODO Custom WhereFunc .... + // ... + LikeInByTitleOrDescOrURL(search string) func(dao gen.Dao) gen.Dao + } + + // not edit interface name + iCustomGenStSiteFunc interface { + iGenStSiteFunc + + // TODO Custom DaoFunc .... + // ... + } + + // not edit interface name + customStSiteDao struct { + stSiteDao + } +) + +func NewStSiteDao() IStSiteDao { + return &customStSiteDao{ + stSiteDao{ + stSiteDo: query.StSite.WithContext(context.Background()), + }, + } +} + +func (d *customStSiteDao) WithContext(ctx context.Context) iCustomGenStSiteFunc { + d.stSiteDo = d.stSiteDo.WithContext(ctx) + return d +} + +func (d *customStSiteDao) LikeInByTitleOrDescOrURL(search string) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao. + Where(query.StSite.Title.Like("%" + search + "%")). + Or(query.StSite.Description.Like("%" + search + "%")). + Or(query.StSite.URL.Like("%" + search + "%")) + } +} diff --git a/internal/dal/repository/sys_menu.gen.go b/internal/dal/repository/sys_menu.gen.go new file mode 100644 index 0000000..f7247ff --- /dev/null +++ b/internal/dal/repository/sys_menu.gen.go @@ -0,0 +1,181 @@ +// Code generated by gen-table. DO NOT EDIT. +// Code generated by gen-table. DO NOT EDIT. +// Code generated by gen-table. DO NOT EDIT. + +package repository + +import ( + "time" + + "github.com/ch3nnn/webstack-go/internal/dal/model" + "github.com/ch3nnn/webstack-go/internal/dal/query" + + "gorm.io/gen" + "gorm.io/gen/field" +) + +var _ iSysMenuDao = (*sysMenuDao)(nil) + +// ------------------------------------ +// SysMenu ColumnName +// ------------------------------------ +type iWhereSysMenuFunc interface { + WhereByID(id int) func(dao gen.Dao) gen.Dao + WhereByPid(pid int) func(dao gen.Dao) gen.Dao + WhereByName(name string) func(dao gen.Dao) gen.Dao + WhereByLink(link string) func(dao gen.Dao) gen.Dao + WhereByIcon(icon string) func(dao gen.Dao) gen.Dao + WhereByLevel(level int) func(dao gen.Dao) gen.Dao + WhereBySort(sort int) func(dao gen.Dao) gen.Dao + WhereByIsUsed(isUsed bool) func(dao gen.Dao) gen.Dao + WhereByCreatedAt(createdAt time.Time) func(dao gen.Dao) gen.Dao + WhereByUpdatedAt(updatedAt time.Time) func(dao gen.Dao) gen.Dao + WhereByDeletedAt(deletedAt time.Time) func(dao gen.Dao) gen.Dao +} + +// ------------------------------------ +// SysMenu Generate Function +// ------------------------------------ +type iGenSysMenuFunc interface { + Create(m *model.SysMenu) (*model.SysMenu, error) + Delete(whereFunc ...func(dao gen.Dao) gen.Dao) error + DeletePhysical(whereFunc ...func(dao gen.Dao) gen.Dao) error + Update(v interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (rowsAffected int64, err error) + FindCount(whereFunc ...func(dao gen.Dao) gen.Dao) (int64, error) + FindOne(whereFunc ...func(dao gen.Dao) gen.Dao) (*model.SysMenu, error) + FindAll(whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.SysMenu, error) + FindPage(page int, pageSize int, orderColumns []field.Expr, whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.SysMenu, int64, error) + Scan(result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (err error) + ScanPage(page int, pageSize int, orderColumns []field.Expr, result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (count int64, err error) +} + +type iSysMenuDao interface { + iWhereSysMenuFunc + iGenSysMenuFunc +} + +type sysMenuDao struct { + sysMenuDo query.ISysMenuDo +} + +func (s *sysMenuDao) WhereByID(id int) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysMenu.ID.Eq(id)) + } +} + +func (s *sysMenuDao) WhereByPid(pid int) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysMenu.Pid.Eq(pid)) + } +} + +func (s *sysMenuDao) WhereByName(name string) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysMenu.Name.Eq(name)) + } +} + +func (s *sysMenuDao) WhereByLink(link string) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysMenu.Link.Eq(link)) + } +} + +func (s *sysMenuDao) WhereByIcon(icon string) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysMenu.Icon.Eq(icon)) + } +} + +func (s *sysMenuDao) WhereByLevel(level int) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysMenu.Level.Eq(level)) + } +} + +func (s *sysMenuDao) WhereBySort(sort int) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysMenu.Sort.Eq(sort)) + } +} + +func (s *sysMenuDao) WhereByIsUsed(isUsed bool) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysMenu.IsUsed.Is(isUsed)) + } +} + +func (s *sysMenuDao) WhereByCreatedAt(createdAt time.Time) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysMenu.CreatedAt.Eq(createdAt)) + } +} + +func (s *sysMenuDao) WhereByUpdatedAt(updatedAt time.Time) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysMenu.UpdatedAt.Eq(updatedAt)) + } +} + +func (s *sysMenuDao) WhereByDeletedAt(deletedAt time.Time) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysMenu.DeletedAt.Eq(deletedAt)) + } +} + +func (s *sysMenuDao) Create(m *model.SysMenu) (*model.SysMenu, error) { + if err := s.sysMenuDo.Create(m); err != nil { + return nil, err + } + return s.FindOne(s.WhereByID(m.ID)) +} + +func (s *sysMenuDao) FindCount(whereFunc ...func(dao gen.Dao) gen.Dao) (int64, error) { + return s.sysMenuDo.Scopes(whereFunc...).Count() +} + +func (s *sysMenuDao) FindOne(whereFunc ...func(dao gen.Dao) gen.Dao) (*model.SysMenu, error) { + return s.sysMenuDo.Scopes(whereFunc...).First() +} + +func (s *sysMenuDao) FindAll(whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.SysMenu, error) { + return s.sysMenuDo.Scopes(whereFunc...).Find() +} + +func (s *sysMenuDao) FindPage(page int, pageSize int, orderColumns []field.Expr, whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.SysMenu, int64, error) { + return s.sysMenuDo.Scopes(whereFunc...).Order(orderColumns...).FindByPage((page-1)*pageSize, pageSize) +} + +// 注意 当通过 struct 更新时,GORM 只会更新非零字段 +// 如果想确保指定字段被更新,使用 map 来完成更新操作 +func (s *sysMenuDao) Update(v interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (rowsAffected int64, err error) { + info, err := s.sysMenuDo.Scopes(whereFunc...).Updates(v) + if err != nil { + return rowsAffected, err + } + + return info.RowsAffected, nil +} + +func (s *sysMenuDao) Delete(whereFunc ...func(dao gen.Dao) gen.Dao) error { + if _, err := s.sysMenuDo.Scopes(whereFunc...).Delete(); err != nil { + return err + } + return nil +} + +func (s *sysMenuDao) DeletePhysical(whereFunc ...func(dao gen.Dao) gen.Dao) error { + if _, err := s.sysMenuDo.Unscoped().Scopes(whereFunc...).Delete(); err != nil { + return err + } + return nil +} + +func (s *sysMenuDao) Scan(result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (err error) { + return s.sysMenuDo.Scopes(whereFunc...).Scan(result) +} + +func (s *sysMenuDao) ScanPage(page int, pageSize int, orderColumns []field.Expr, result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (count int64, err error) { + return s.sysMenuDo.Scopes(whereFunc...).Order(orderColumns...).ScanByPage(result, (page-1)*pageSize, pageSize) +} diff --git a/internal/dal/repository/sys_menu.go b/internal/dal/repository/sys_menu.go new file mode 100644 index 0000000..80f5066 --- /dev/null +++ b/internal/dal/repository/sys_menu.go @@ -0,0 +1,46 @@ +package repository + +import ( + "context" + + "github.com/ch3nnn/webstack-go/internal/dal/query" +) + +var _ iCustomGenSysMenuFunc = (*customSysMenuDao)(nil) + +type ( + // ISysMenuDao not edit interface name + ISysMenuDao interface { + iWhereSysMenuFunc + WithContext(ctx context.Context) iCustomGenSysMenuFunc + + // TODO Custom WhereFunc .... + // ... + } + + // not edit interface name + iCustomGenSysMenuFunc interface { + iGenSysMenuFunc + + // TODO Custom DaoFunc .... + // ... + } + + // not edit interface name + customSysMenuDao struct { + sysMenuDao + } +) + +func NewSysMenuDao() ISysMenuDao { + return &customSysMenuDao{ + sysMenuDao{ + sysMenuDo: query.SysMenu.WithContext(context.Background()), + }, + } +} + +func (d *customSysMenuDao) WithContext(ctx context.Context) iCustomGenSysMenuFunc { + d.sysMenuDo = d.sysMenuDo.WithContext(ctx) + return d +} diff --git a/internal/dal/repository/sys_user.gen.go b/internal/dal/repository/sys_user.gen.go new file mode 100644 index 0000000..7db0033 --- /dev/null +++ b/internal/dal/repository/sys_user.gen.go @@ -0,0 +1,146 @@ +// Code generated by gen-table. DO NOT EDIT. +// Code generated by gen-table. DO NOT EDIT. +// Code generated by gen-table. DO NOT EDIT. + +package repository + +import ( + "time" + + "github.com/ch3nnn/webstack-go/internal/dal/model" + "github.com/ch3nnn/webstack-go/internal/dal/query" + + "gorm.io/gen" + "gorm.io/gen/field" +) + +var _ iSysUserDao = (*sysUserDao)(nil) + +// ------------------------------------ +// SysUser ColumnName +// ------------------------------------ +type iWhereSysUserFunc interface { + WhereByID(id int) func(dao gen.Dao) gen.Dao + WhereByUsername(username string) func(dao gen.Dao) gen.Dao + WhereByPassword(password string) func(dao gen.Dao) gen.Dao + WhereByCreatedAt(createdAt time.Time) func(dao gen.Dao) gen.Dao + WhereByUpdatedAt(updatedAt time.Time) func(dao gen.Dao) gen.Dao + WhereByDeletedAt(deletedAt time.Time) func(dao gen.Dao) gen.Dao +} + +// ------------------------------------ +// SysUser Generate Function +// ------------------------------------ +type iGenSysUserFunc interface { + Create(m *model.SysUser) (*model.SysUser, error) + Delete(whereFunc ...func(dao gen.Dao) gen.Dao) error + DeletePhysical(whereFunc ...func(dao gen.Dao) gen.Dao) error + Update(v interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (rowsAffected int64, err error) + FindCount(whereFunc ...func(dao gen.Dao) gen.Dao) (int64, error) + FindOne(whereFunc ...func(dao gen.Dao) gen.Dao) (*model.SysUser, error) + FindAll(whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.SysUser, error) + FindPage(page int, pageSize int, orderColumns []field.Expr, whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.SysUser, int64, error) + Scan(result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (err error) + ScanPage(page int, pageSize int, orderColumns []field.Expr, result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (count int64, err error) +} + +type iSysUserDao interface { + iWhereSysUserFunc + iGenSysUserFunc +} + +type sysUserDao struct { + sysUserDo query.ISysUserDo +} + +func (s *sysUserDao) WhereByID(id int) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysUser.ID.Eq(id)) + } +} + +func (s *sysUserDao) WhereByUsername(username string) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysUser.Username.Eq(username)) + } +} + +func (s *sysUserDao) WhereByPassword(password string) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysUser.Password.Eq(password)) + } +} + +func (s *sysUserDao) WhereByCreatedAt(createdAt time.Time) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysUser.CreatedAt.Eq(createdAt)) + } +} + +func (s *sysUserDao) WhereByUpdatedAt(updatedAt time.Time) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysUser.UpdatedAt.Eq(updatedAt)) + } +} + +func (s *sysUserDao) WhereByDeletedAt(deletedAt time.Time) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysUser.DeletedAt.Eq(deletedAt)) + } +} + +func (s *sysUserDao) Create(m *model.SysUser) (*model.SysUser, error) { + if err := s.sysUserDo.Create(m); err != nil { + return nil, err + } + return s.FindOne(s.WhereByID(m.ID)) +} + +func (s *sysUserDao) FindCount(whereFunc ...func(dao gen.Dao) gen.Dao) (int64, error) { + return s.sysUserDo.Scopes(whereFunc...).Count() +} + +func (s *sysUserDao) FindOne(whereFunc ...func(dao gen.Dao) gen.Dao) (*model.SysUser, error) { + return s.sysUserDo.Scopes(whereFunc...).First() +} + +func (s *sysUserDao) FindAll(whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.SysUser, error) { + return s.sysUserDo.Scopes(whereFunc...).Find() +} + +func (s *sysUserDao) FindPage(page int, pageSize int, orderColumns []field.Expr, whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.SysUser, int64, error) { + return s.sysUserDo.Scopes(whereFunc...).Order(orderColumns...).FindByPage((page-1)*pageSize, pageSize) +} + +// 注意 当通过 struct 更新时,GORM 只会更新非零字段 +// 如果想确保指定字段被更新,使用 map 来完成更新操作 +func (s *sysUserDao) Update(v interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (rowsAffected int64, err error) { + info, err := s.sysUserDo.Scopes(whereFunc...).Updates(v) + if err != nil { + return rowsAffected, err + } + + return info.RowsAffected, nil +} + +func (s *sysUserDao) Delete(whereFunc ...func(dao gen.Dao) gen.Dao) error { + if _, err := s.sysUserDo.Scopes(whereFunc...).Delete(); err != nil { + return err + } + return nil +} + +func (s *sysUserDao) DeletePhysical(whereFunc ...func(dao gen.Dao) gen.Dao) error { + if _, err := s.sysUserDo.Unscoped().Scopes(whereFunc...).Delete(); err != nil { + return err + } + return nil +} + +func (s *sysUserDao) Scan(result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (err error) { + return s.sysUserDo.Scopes(whereFunc...).Scan(result) +} + +func (s *sysUserDao) ScanPage(page int, pageSize int, orderColumns []field.Expr, result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (count int64, err error) { + return s.sysUserDo.Scopes(whereFunc...).Order(orderColumns...).ScanByPage(result, (page-1)*pageSize, pageSize) +} diff --git a/internal/dal/repository/sys_user.go b/internal/dal/repository/sys_user.go new file mode 100644 index 0000000..d37a227 --- /dev/null +++ b/internal/dal/repository/sys_user.go @@ -0,0 +1,46 @@ +package repository + +import ( + "context" + + "github.com/ch3nnn/webstack-go/internal/dal/query" +) + +var _ iCustomGenSysUserFunc = (*customSysUserDao)(nil) + +type ( + // ISysUserDao not edit interface name + ISysUserDao interface { + iWhereSysUserFunc + WithContext(ctx context.Context) iCustomGenSysUserFunc + + // TODO Custom WhereFunc .... + // ... + } + + // not edit interface name + iCustomGenSysUserFunc interface { + iGenSysUserFunc + + // TODO Custom DaoFunc .... + // ... + } + + // not edit interface name + customSysUserDao struct { + sysUserDao + } +) + +func NewSysUserDao() ISysUserDao { + return &customSysUserDao{ + sysUserDao{ + sysUserDo: query.SysUser.WithContext(context.Background()), + }, + } +} + +func (d *customSysUserDao) WithContext(ctx context.Context) iCustomGenSysUserFunc { + d.sysUserDo = d.sysUserDo.WithContext(ctx) + return d +} diff --git a/internal/dal/repository/sys_user_menu.gen.go b/internal/dal/repository/sys_user_menu.gen.go new file mode 100644 index 0000000..e148c96 --- /dev/null +++ b/internal/dal/repository/sys_user_menu.gen.go @@ -0,0 +1,146 @@ +// Code generated by gen-table. DO NOT EDIT. +// Code generated by gen-table. DO NOT EDIT. +// Code generated by gen-table. DO NOT EDIT. + +package repository + +import ( + "time" + + "github.com/ch3nnn/webstack-go/internal/dal/model" + "github.com/ch3nnn/webstack-go/internal/dal/query" + + "gorm.io/gen" + "gorm.io/gen/field" +) + +var _ iSysUserMenuDao = (*sysUserMenuDao)(nil) + +// ------------------------------------ +// SysUserMenu ColumnName +// ------------------------------------ +type iWhereSysUserMenuFunc interface { + WhereByID(id int) func(dao gen.Dao) gen.Dao + WhereByUserID(userId int) func(dao gen.Dao) gen.Dao + WhereByMenuID(menuId int) func(dao gen.Dao) gen.Dao + WhereByCreatedAt(createdAt time.Time) func(dao gen.Dao) gen.Dao + WhereByUpdatedAt(updatedAt time.Time) func(dao gen.Dao) gen.Dao + WhereByDeletedAt(deletedAt time.Time) func(dao gen.Dao) gen.Dao +} + +// ------------------------------------ +// SysUserMenu Generate Function +// ------------------------------------ +type iGenSysUserMenuFunc interface { + Create(m *model.SysUserMenu) (*model.SysUserMenu, error) + Delete(whereFunc ...func(dao gen.Dao) gen.Dao) error + DeletePhysical(whereFunc ...func(dao gen.Dao) gen.Dao) error + Update(v interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (rowsAffected int64, err error) + FindCount(whereFunc ...func(dao gen.Dao) gen.Dao) (int64, error) + FindOne(whereFunc ...func(dao gen.Dao) gen.Dao) (*model.SysUserMenu, error) + FindAll(whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.SysUserMenu, error) + FindPage(page int, pageSize int, orderColumns []field.Expr, whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.SysUserMenu, int64, error) + Scan(result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (err error) + ScanPage(page int, pageSize int, orderColumns []field.Expr, result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (count int64, err error) +} + +type iSysUserMenuDao interface { + iWhereSysUserMenuFunc + iGenSysUserMenuFunc +} + +type sysUserMenuDao struct { + sysUserMenuDo query.ISysUserMenuDo +} + +func (s *sysUserMenuDao) WhereByID(id int) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysUserMenu.ID.Eq(id)) + } +} + +func (s *sysUserMenuDao) WhereByUserID(userId int) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysUserMenu.UserID.Eq(userId)) + } +} + +func (s *sysUserMenuDao) WhereByMenuID(menuId int) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysUserMenu.MenuID.Eq(menuId)) + } +} + +func (s *sysUserMenuDao) WhereByCreatedAt(createdAt time.Time) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysUserMenu.CreatedAt.Eq(createdAt)) + } +} + +func (s *sysUserMenuDao) WhereByUpdatedAt(updatedAt time.Time) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysUserMenu.UpdatedAt.Eq(updatedAt)) + } +} + +func (s *sysUserMenuDao) WhereByDeletedAt(deletedAt time.Time) func(dao gen.Dao) gen.Dao { + return func(dao gen.Dao) gen.Dao { + return dao.Where(query.SysUserMenu.DeletedAt.Eq(deletedAt)) + } +} + +func (s *sysUserMenuDao) Create(m *model.SysUserMenu) (*model.SysUserMenu, error) { + if err := s.sysUserMenuDo.Create(m); err != nil { + return nil, err + } + return s.FindOne(s.WhereByID(m.ID)) +} + +func (s *sysUserMenuDao) FindCount(whereFunc ...func(dao gen.Dao) gen.Dao) (int64, error) { + return s.sysUserMenuDo.Scopes(whereFunc...).Count() +} + +func (s *sysUserMenuDao) FindOne(whereFunc ...func(dao gen.Dao) gen.Dao) (*model.SysUserMenu, error) { + return s.sysUserMenuDo.Scopes(whereFunc...).First() +} + +func (s *sysUserMenuDao) FindAll(whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.SysUserMenu, error) { + return s.sysUserMenuDo.Scopes(whereFunc...).Find() +} + +func (s *sysUserMenuDao) FindPage(page int, pageSize int, orderColumns []field.Expr, whereFunc ...func(dao gen.Dao) gen.Dao) ([]*model.SysUserMenu, int64, error) { + return s.sysUserMenuDo.Scopes(whereFunc...).Order(orderColumns...).FindByPage((page-1)*pageSize, pageSize) +} + +// 注意 当通过 struct 更新时,GORM 只会更新非零字段 +// 如果想确保指定字段被更新,使用 map 来完成更新操作 +func (s *sysUserMenuDao) Update(v interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (rowsAffected int64, err error) { + info, err := s.sysUserMenuDo.Scopes(whereFunc...).Updates(v) + if err != nil { + return rowsAffected, err + } + + return info.RowsAffected, nil +} + +func (s *sysUserMenuDao) Delete(whereFunc ...func(dao gen.Dao) gen.Dao) error { + if _, err := s.sysUserMenuDo.Scopes(whereFunc...).Delete(); err != nil { + return err + } + return nil +} + +func (s *sysUserMenuDao) DeletePhysical(whereFunc ...func(dao gen.Dao) gen.Dao) error { + if _, err := s.sysUserMenuDo.Unscoped().Scopes(whereFunc...).Delete(); err != nil { + return err + } + return nil +} + +func (s *sysUserMenuDao) Scan(result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (err error) { + return s.sysUserMenuDo.Scopes(whereFunc...).Scan(result) +} + +func (s *sysUserMenuDao) ScanPage(page int, pageSize int, orderColumns []field.Expr, result interface{}, whereFunc ...func(dao gen.Dao) gen.Dao) (count int64, err error) { + return s.sysUserMenuDo.Scopes(whereFunc...).Order(orderColumns...).ScanByPage(result, (page-1)*pageSize, pageSize) +} diff --git a/internal/dal/repository/sys_user_menu.go b/internal/dal/repository/sys_user_menu.go new file mode 100644 index 0000000..0f41252 --- /dev/null +++ b/internal/dal/repository/sys_user_menu.go @@ -0,0 +1,46 @@ +package repository + +import ( + "context" + + "github.com/ch3nnn/webstack-go/internal/dal/query" +) + +var _ iCustomGenSysUserMenuFunc = (*customSysUserMenuDao)(nil) + +type ( + // ISysUserMenuDao not edit interface name + ISysUserMenuDao interface { + iWhereSysUserMenuFunc + WithContext(ctx context.Context) iCustomGenSysUserMenuFunc + + // TODO Custom WhereFunc .... + // ... + } + + // not edit interface name + iCustomGenSysUserMenuFunc interface { + iGenSysUserMenuFunc + + // TODO Custom DaoFunc .... + // ... + } + + // not edit interface name + customSysUserMenuDao struct { + sysUserMenuDao + } +) + +func NewSysUserMenuDao() ISysUserMenuDao { + return &customSysUserMenuDao{ + sysUserMenuDao{ + sysUserMenuDo: query.SysUserMenu.WithContext(context.Background()), + }, + } +} + +func (d *customSysUserMenuDao) WithContext(ctx context.Context) iCustomGenSysUserMenuFunc { + d.sysUserMenuDo = d.sysUserMenuDo.WithContext(ctx) + return d +} diff --git a/internal/graph/README.md b/internal/graph/README.md deleted file mode 100755 index fc8e979..0000000 --- a/internal/graph/README.md +++ /dev/null @@ -1,24 +0,0 @@ -## example - -```cassandraql -1. -query { - bySex(sex: "男") { - id - name - sex - mobile - } -} - -2. -mutation { - updateUserMobile(data: {id: "1", mobile: "13299999999"}) { - id - name - sex - mobile - } -} - -``` \ No newline at end of file diff --git a/internal/graph/generated/generated.go b/internal/graph/generated/generated.go deleted file mode 100755 index a8f714b..0000000 --- a/internal/graph/generated/generated.go +++ /dev/null @@ -1,2744 +0,0 @@ -// Code generated by github.com/99designs/gqlgen, DO NOT EDIT. - -package generated - -import ( - "bytes" - "context" - "errors" - "strconv" - "sync" - - "github.com/ch3nnn/webstack-go/internal/graph/model" - - "github.com/99designs/gqlgen/graphql" - "github.com/99designs/gqlgen/graphql/introspection" - gqlparser "github.com/vektah/gqlparser/v2" - "github.com/vektah/gqlparser/v2/ast" -) - -// region ************************** generated!.gotpl ************************** - -// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. -func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { - return &executableSchema{ - resolvers: cfg.Resolvers, - directives: cfg.Directives, - complexity: cfg.Complexity, - } -} - -type Config struct { - Resolvers ResolverRoot - Directives DirectiveRoot - Complexity ComplexityRoot -} - -type ResolverRoot interface { - Mutation() MutationResolver - Query() QueryResolver -} - -type DirectiveRoot struct { -} - -type ComplexityRoot struct { - Mutation struct { - UpdateUserMobile func(childComplexity int, data model.UpdateUserMobileInput) int - } - - Query struct { - BySex func(childComplexity int, sex string) int - } - - User struct { - ID func(childComplexity int) int - Mobile func(childComplexity int) int - Name func(childComplexity int) int - Sex func(childComplexity int) int - } -} - -type MutationResolver interface { - UpdateUserMobile(ctx context.Context, data model.UpdateUserMobileInput) (*model.User, error) -} -type QueryResolver interface { - BySex(ctx context.Context, sex string) ([]*model.User, error) -} - -type executableSchema struct { - resolvers ResolverRoot - directives DirectiveRoot - complexity ComplexityRoot -} - -func (e *executableSchema) Schema() *ast.Schema { - return parsedSchema -} - -func (e *executableSchema) Complexity(typeName, field string, childComplexity int, rawArgs map[string]interface{}) (int, bool) { - ec := executionContext{nil, e} - _ = ec - switch typeName + "." + field { - - case "Mutation.updateUserMobile": - if e.complexity.Mutation.UpdateUserMobile == nil { - break - } - - args, err := ec.field_Mutation_updateUserMobile_args(context.TODO(), rawArgs) - if err != nil { - return 0, false - } - - return e.complexity.Mutation.UpdateUserMobile(childComplexity, args["data"].(model.UpdateUserMobileInput)), true - - case "Query.bySex": - if e.complexity.Query.BySex == nil { - break - } - - args, err := ec.field_Query_bySex_args(context.TODO(), rawArgs) - if err != nil { - return 0, false - } - - return e.complexity.Query.BySex(childComplexity, args["sex"].(string)), true - - case "User.id": - if e.complexity.User.ID == nil { - break - } - - return e.complexity.User.ID(childComplexity), true - - case "User.mobile": - if e.complexity.User.Mobile == nil { - break - } - - return e.complexity.User.Mobile(childComplexity), true - - case "User.name": - if e.complexity.User.Name == nil { - break - } - - return e.complexity.User.Name(childComplexity), true - - case "User.sex": - if e.complexity.User.Sex == nil { - break - } - - return e.complexity.User.Sex(childComplexity), true - - } - return 0, false -} - -func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { - rc := graphql.GetOperationContext(ctx) - ec := executionContext{rc, e} - first := true - - switch rc.Operation.Operation { - case ast.Query: - return func(ctx context.Context) *graphql.Response { - if !first { - return nil - } - first = false - data := ec._Query(ctx, rc.Operation.SelectionSet) - var buf bytes.Buffer - data.MarshalGQL(&buf) - - return &graphql.Response{ - Data: buf.Bytes(), - } - } - case ast.Mutation: - return func(ctx context.Context) *graphql.Response { - if !first { - return nil - } - first = false - data := ec._Mutation(ctx, rc.Operation.SelectionSet) - var buf bytes.Buffer - data.MarshalGQL(&buf) - - return &graphql.Response{ - Data: buf.Bytes(), - } - } - - default: - return graphql.OneShot(graphql.ErrorResponse(ctx, "unsupported GraphQL operation")) - } -} - -type executionContext struct { - *graphql.OperationContext - *executableSchema -} - -func (ec *executionContext) introspectSchema() (*introspection.Schema, error) { - if ec.DisableIntrospection { - return nil, errors.New("introspection disabled") - } - return introspection.WrapSchema(parsedSchema), nil -} - -func (ec *executionContext) introspectType(name string) (*introspection.Type, error) { - if ec.DisableIntrospection { - return nil, errors.New("introspection disabled") - } - return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]), nil -} - -var sources = []*ast.Source{ - {Name: "internal/graph/schemas/user.graphql", Input: `type User { - id: String! - name: String! - sex: String! - mobile: String! -} - -# 查询 集合 -type Query { - bySex(sex: String!): [User!] -} - -# 输入类型: 一般用户更改资源中的输入是列表对象,完成复杂任务 -input updateUserMobileInput { - id:ID! - mobile: String! -} - -# 更改或者创建 集合 -type Mutation { - updateUserMobile(data: updateUserMobileInput!): User -}`, BuiltIn: false}, -} -var parsedSchema = gqlparser.MustLoadSchema(sources...) - -// endregion ************************** generated!.gotpl ************************** - -// region ***************************** args.gotpl ***************************** - -func (ec *executionContext) field_Mutation_updateUserMobile_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { - var err error - args := map[string]interface{}{} - var arg0 model.UpdateUserMobileInput - if tmp, ok := rawArgs["data"]; ok { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("data")) - arg0, err = ec.unmarshalNupdateUserMobileInput2githubᚗcomᚋxinliangnoteᚋgoᚑginᚑapiᚋinternalᚋgraphᚋmodelᚐUpdateUserMobileInput(ctx, tmp) - if err != nil { - return nil, err - } - } - args["data"] = arg0 - return args, nil -} - -func (ec *executionContext) field_Query___type_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { - var err error - args := map[string]interface{}{} - var arg0 string - if tmp, ok := rawArgs["name"]; ok { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) - arg0, err = ec.unmarshalNString2string(ctx, tmp) - if err != nil { - return nil, err - } - } - args["name"] = arg0 - return args, nil -} - -func (ec *executionContext) field_Query_bySex_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { - var err error - args := map[string]interface{}{} - var arg0 string - if tmp, ok := rawArgs["sex"]; ok { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("sex")) - arg0, err = ec.unmarshalNString2string(ctx, tmp) - if err != nil { - return nil, err - } - } - args["sex"] = arg0 - return args, nil -} - -func (ec *executionContext) field___Type_enumValues_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { - var err error - args := map[string]interface{}{} - var arg0 bool - if tmp, ok := rawArgs["includeDeprecated"]; ok { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated")) - arg0, err = ec.unmarshalOBoolean2bool(ctx, tmp) - if err != nil { - return nil, err - } - } - args["includeDeprecated"] = arg0 - return args, nil -} - -func (ec *executionContext) field___Type_fields_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { - var err error - args := map[string]interface{}{} - var arg0 bool - if tmp, ok := rawArgs["includeDeprecated"]; ok { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated")) - arg0, err = ec.unmarshalOBoolean2bool(ctx, tmp) - if err != nil { - return nil, err - } - } - args["includeDeprecated"] = arg0 - return args, nil -} - -// endregion ***************************** args.gotpl ***************************** - -// region ************************** directives.gotpl ************************** - -// endregion ************************** directives.gotpl ************************** - -// region **************************** field.gotpl ***************************** - -func (ec *executionContext) _Mutation_updateUserMobile(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "Mutation", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: true, - } - - ctx = graphql.WithFieldContext(ctx, fc) - rawArgs := field.ArgumentMap(ec.Variables) - args, err := ec.field_Mutation_updateUserMobile_args(ctx, rawArgs) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - fc.Args = args - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().UpdateUserMobile(rctx, args["data"].(model.UpdateUserMobileInput)) - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*model.User) - fc.Result = res - return ec.marshalOUser2ᚖgithubᚗcomᚋxinliangnoteᚋgoᚑginᚑapiᚋinternalᚋgraphᚋmodelᚐUser(ctx, field.Selections, res) -} - -func (ec *executionContext) _Query_bySex(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "Query", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: true, - } - - ctx = graphql.WithFieldContext(ctx, fc) - rawArgs := field.ArgumentMap(ec.Variables) - args, err := ec.field_Query_bySex_args(ctx, rawArgs) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - fc.Args = args - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().BySex(rctx, args["sex"].(string)) - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.([]*model.User) - fc.Result = res - return ec.marshalOUser2ᚕᚖgithubᚗcomᚋxinliangnoteᚋgoᚑginᚑapiᚋinternalᚋgraphᚋmodelᚐUserᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "Query", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - rawArgs := field.ArgumentMap(ec.Variables) - args, err := ec.field_Query___type_args(ctx, rawArgs) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - fc.Args = args - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return ec.introspectType(args["name"].(string)) - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*introspection.Type) - fc.Result = res - return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) -} - -func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "Query", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return ec.introspectSchema() - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*introspection.Schema) - fc.Result = res - return ec.marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema(ctx, field.Selections, res) -} - -func (ec *executionContext) _User_id(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "User", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.ID, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) _User_name(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "User", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Name, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) _User_sex(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "User", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Sex, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) _User_mobile(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "User", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Mobile, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Directive", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Name, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Directive_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Directive", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Description, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalOString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Directive", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Locations, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.([]string) - fc.Result = res - return ec.marshalN__DirectiveLocation2ᚕstringᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Directive", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Args, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.([]introspection.InputValue) - fc.Result = res - return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Directive_isRepeatable(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Directive", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.IsRepeatable, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(bool) - fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) -} - -func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__EnumValue", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Name, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) ___EnumValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__EnumValue", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Description, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalOString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__EnumValue", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.IsDeprecated(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(bool) - fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) -} - -func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__EnumValue", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.DeprecationReason(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Field", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Name, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Field_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Field", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Description, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalOString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Field", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Args, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.([]introspection.InputValue) - fc.Result = res - return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Field", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Type, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(*introspection.Type) - fc.Result = res - return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Field", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.IsDeprecated(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(bool) - fc.Result = res - return ec.marshalNBoolean2bool(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Field", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.DeprecationReason(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) -} - -func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__InputValue", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Name, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) ___InputValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__InputValue", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Description, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalOString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__InputValue", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Type, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(*introspection.Type) - fc.Result = res - return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) -} - -func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__InputValue", - Field: field, - Args: nil, - IsMethod: false, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.DefaultValue, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Schema", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Types(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.([]introspection.Type) - fc.Result = res - return ec.marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Schema", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.QueryType(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(*introspection.Type) - fc.Result = res - return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Schema", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.MutationType(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*introspection.Type) - fc.Result = res - return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Schema", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.SubscriptionType(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*introspection.Type) - fc.Result = res - return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Schema_directives(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Schema", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Directives(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.([]introspection.Directive) - fc.Result = res - return ec.marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Type", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Kind(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalN__TypeKind2string(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Type", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Name(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*string) - fc.Result = res - return ec.marshalOString2ᚖstring(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Type", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Description(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalOString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Type", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - rawArgs := field.ArgumentMap(ec.Variables) - args, err := ec.field___Type_fields_args(ctx, rawArgs) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - fc.Args = args - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Fields(args["includeDeprecated"].(bool)), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.([]introspection.Field) - fc.Result = res - return ec.marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Type", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.Interfaces(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.([]introspection.Type) - fc.Result = res - return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Type", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.PossibleTypes(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.([]introspection.Type) - fc.Result = res - return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Type", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - rawArgs := field.ArgumentMap(ec.Variables) - args, err := ec.field___Type_enumValues_args(ctx, rawArgs) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - fc.Args = args - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.EnumValues(args["includeDeprecated"].(bool)), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.([]introspection.EnumValue) - fc.Result = res - return ec.marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Type", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.InputFields(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.([]introspection.InputValue) - fc.Result = res - return ec.marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) -} - -func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - fc := &graphql.FieldContext{ - Object: "__Type", - Field: field, - Args: nil, - IsMethod: true, - IsResolver: false, - } - - ctx = graphql.WithFieldContext(ctx, fc) - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return obj.OfType(), nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.(*introspection.Type) - fc.Result = res - return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) -} - -// endregion **************************** field.gotpl ***************************** - -// region **************************** input.gotpl ***************************** - -func (ec *executionContext) unmarshalInputupdateUserMobileInput(ctx context.Context, obj interface{}) (model.UpdateUserMobileInput, error) { - var it model.UpdateUserMobileInput - asMap := map[string]interface{}{} - for k, v := range obj.(map[string]interface{}) { - asMap[k] = v - } - - for k, v := range asMap { - switch k { - case "id": - var err error - - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) - it.ID, err = ec.unmarshalNID2string(ctx, v) - if err != nil { - return it, err - } - case "mobile": - var err error - - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("mobile")) - it.Mobile, err = ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - } - } - - return it, nil -} - -// endregion **************************** input.gotpl ***************************** - -// region ************************** interface.gotpl *************************** - -// endregion ************************** interface.gotpl *************************** - -// region **************************** object.gotpl **************************** - -var mutationImplementors = []string{"Mutation"} - -func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, mutationImplementors) - - ctx = graphql.WithFieldContext(ctx, &graphql.FieldContext{ - Object: "Mutation", - }) - - out := graphql.NewFieldSet(fields) - var invalids uint32 - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("Mutation") - case "updateUserMobile": - out.Values[i] = ec._Mutation_updateUserMobile(ctx, field) - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if invalids > 0 { - return graphql.Null - } - return out -} - -var queryImplementors = []string{"Query"} - -func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, queryImplementors) - - ctx = graphql.WithFieldContext(ctx, &graphql.FieldContext{ - Object: "Query", - }) - - out := graphql.NewFieldSet(fields) - var invalids uint32 - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("Query") - case "bySex": - field := field - out.Concurrently(i, func(ctx context.Context) (res graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - } - }() - res = ec._Query_bySex(ctx, field) - return res - }) - case "__type": - out.Values[i] = ec._Query___type(ctx, field) - case "__schema": - out.Values[i] = ec._Query___schema(ctx, field) - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if invalids > 0 { - return graphql.Null - } - return out -} - -var userImplementors = []string{"User"} - -func (ec *executionContext) _User(ctx context.Context, sel ast.SelectionSet, obj *model.User) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, userImplementors) - - out := graphql.NewFieldSet(fields) - var invalids uint32 - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("User") - case "id": - out.Values[i] = ec._User_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "name": - out.Values[i] = ec._User_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "sex": - out.Values[i] = ec._User_sex(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "mobile": - out.Values[i] = ec._User_mobile(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if invalids > 0 { - return graphql.Null - } - return out -} - -var __DirectiveImplementors = []string{"__Directive"} - -func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, __DirectiveImplementors) - - out := graphql.NewFieldSet(fields) - var invalids uint32 - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("__Directive") - case "name": - out.Values[i] = ec.___Directive_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "description": - out.Values[i] = ec.___Directive_description(ctx, field, obj) - case "locations": - out.Values[i] = ec.___Directive_locations(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "args": - out.Values[i] = ec.___Directive_args(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "isRepeatable": - out.Values[i] = ec.___Directive_isRepeatable(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if invalids > 0 { - return graphql.Null - } - return out -} - -var __EnumValueImplementors = []string{"__EnumValue"} - -func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, __EnumValueImplementors) - - out := graphql.NewFieldSet(fields) - var invalids uint32 - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("__EnumValue") - case "name": - out.Values[i] = ec.___EnumValue_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "description": - out.Values[i] = ec.___EnumValue_description(ctx, field, obj) - case "isDeprecated": - out.Values[i] = ec.___EnumValue_isDeprecated(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "deprecationReason": - out.Values[i] = ec.___EnumValue_deprecationReason(ctx, field, obj) - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if invalids > 0 { - return graphql.Null - } - return out -} - -var __FieldImplementors = []string{"__Field"} - -func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, __FieldImplementors) - - out := graphql.NewFieldSet(fields) - var invalids uint32 - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("__Field") - case "name": - out.Values[i] = ec.___Field_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "description": - out.Values[i] = ec.___Field_description(ctx, field, obj) - case "args": - out.Values[i] = ec.___Field_args(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "type": - out.Values[i] = ec.___Field_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "isDeprecated": - out.Values[i] = ec.___Field_isDeprecated(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "deprecationReason": - out.Values[i] = ec.___Field_deprecationReason(ctx, field, obj) - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if invalids > 0 { - return graphql.Null - } - return out -} - -var __InputValueImplementors = []string{"__InputValue"} - -func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, __InputValueImplementors) - - out := graphql.NewFieldSet(fields) - var invalids uint32 - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("__InputValue") - case "name": - out.Values[i] = ec.___InputValue_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "description": - out.Values[i] = ec.___InputValue_description(ctx, field, obj) - case "type": - out.Values[i] = ec.___InputValue_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "defaultValue": - out.Values[i] = ec.___InputValue_defaultValue(ctx, field, obj) - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if invalids > 0 { - return graphql.Null - } - return out -} - -var __SchemaImplementors = []string{"__Schema"} - -func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, __SchemaImplementors) - - out := graphql.NewFieldSet(fields) - var invalids uint32 - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("__Schema") - case "types": - out.Values[i] = ec.___Schema_types(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "queryType": - out.Values[i] = ec.___Schema_queryType(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "mutationType": - out.Values[i] = ec.___Schema_mutationType(ctx, field, obj) - case "subscriptionType": - out.Values[i] = ec.___Schema_subscriptionType(ctx, field, obj) - case "directives": - out.Values[i] = ec.___Schema_directives(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if invalids > 0 { - return graphql.Null - } - return out -} - -var __TypeImplementors = []string{"__Type"} - -func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, __TypeImplementors) - - out := graphql.NewFieldSet(fields) - var invalids uint32 - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("__Type") - case "kind": - out.Values[i] = ec.___Type_kind(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } - case "name": - out.Values[i] = ec.___Type_name(ctx, field, obj) - case "description": - out.Values[i] = ec.___Type_description(ctx, field, obj) - case "fields": - out.Values[i] = ec.___Type_fields(ctx, field, obj) - case "interfaces": - out.Values[i] = ec.___Type_interfaces(ctx, field, obj) - case "possibleTypes": - out.Values[i] = ec.___Type_possibleTypes(ctx, field, obj) - case "enumValues": - out.Values[i] = ec.___Type_enumValues(ctx, field, obj) - case "inputFields": - out.Values[i] = ec.___Type_inputFields(ctx, field, obj) - case "ofType": - out.Values[i] = ec.___Type_ofType(ctx, field, obj) - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if invalids > 0 { - return graphql.Null - } - return out -} - -// endregion **************************** object.gotpl **************************** - -// region ***************************** type.gotpl ***************************** - -func (ec *executionContext) unmarshalNBoolean2bool(ctx context.Context, v interface{}) (bool, error) { - res, err := graphql.UnmarshalBoolean(v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) marshalNBoolean2bool(ctx context.Context, sel ast.SelectionSet, v bool) graphql.Marshaler { - res := graphql.MarshalBoolean(v) - if res == graphql.Null { - if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { - ec.Errorf(ctx, "must not be null") - } - } - return res -} - -func (ec *executionContext) unmarshalNID2string(ctx context.Context, v interface{}) (string, error) { - res, err := graphql.UnmarshalID(v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) marshalNID2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { - res := graphql.MarshalID(v) - if res == graphql.Null { - if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { - ec.Errorf(ctx, "must not be null") - } - } - return res -} - -func (ec *executionContext) unmarshalNString2string(ctx context.Context, v interface{}) (string, error) { - res, err := graphql.UnmarshalString(v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) marshalNString2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { - res := graphql.MarshalString(v) - if res == graphql.Null { - if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { - ec.Errorf(ctx, "must not be null") - } - } - return res -} - -func (ec *executionContext) marshalNUser2ᚖgithubᚗcomᚋxinliangnoteᚋgoᚑginᚑapiᚋinternalᚋgraphᚋmodelᚐUser(ctx context.Context, sel ast.SelectionSet, v *model.User) graphql.Marshaler { - if v == nil { - if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - return ec._User(ctx, sel, v) -} - -func (ec *executionContext) marshalN__Directive2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirective(ctx context.Context, sel ast.SelectionSet, v introspection.Directive) graphql.Marshaler { - return ec.___Directive(ctx, sel, &v) -} - -func (ec *executionContext) marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Directive) graphql.Marshaler { - ret := make(graphql.Array, len(v)) - var wg sync.WaitGroup - isLen1 := len(v) == 1 - if !isLen1 { - wg.Add(len(v)) - } - for i := range v { - i := i - fc := &graphql.FieldContext{ - Index: &i, - Result: &v[i], - } - ctx := graphql.WithFieldContext(ctx, fc) - f := func(i int) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = nil - } - }() - if !isLen1 { - defer wg.Done() - } - ret[i] = ec.marshalN__Directive2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirective(ctx, sel, v[i]) - } - if isLen1 { - f(i) - } else { - go f(i) - } - - } - wg.Wait() - - for _, e := range ret { - if e == graphql.Null { - return graphql.Null - } - } - - return ret -} - -func (ec *executionContext) unmarshalN__DirectiveLocation2string(ctx context.Context, v interface{}) (string, error) { - res, err := graphql.UnmarshalString(v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) marshalN__DirectiveLocation2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { - res := graphql.MarshalString(v) - if res == graphql.Null { - if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { - ec.Errorf(ctx, "must not be null") - } - } - return res -} - -func (ec *executionContext) unmarshalN__DirectiveLocation2ᚕstringᚄ(ctx context.Context, v interface{}) ([]string, error) { - var vSlice []interface{} - if v != nil { - if tmp1, ok := v.([]interface{}); ok { - vSlice = tmp1 - } else { - vSlice = []interface{}{v} - } - } - var err error - res := make([]string, len(vSlice)) - for i := range vSlice { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i)) - res[i], err = ec.unmarshalN__DirectiveLocation2string(ctx, vSlice[i]) - if err != nil { - return nil, err - } - } - return res, nil -} - -func (ec *executionContext) marshalN__DirectiveLocation2ᚕstringᚄ(ctx context.Context, sel ast.SelectionSet, v []string) graphql.Marshaler { - ret := make(graphql.Array, len(v)) - var wg sync.WaitGroup - isLen1 := len(v) == 1 - if !isLen1 { - wg.Add(len(v)) - } - for i := range v { - i := i - fc := &graphql.FieldContext{ - Index: &i, - Result: &v[i], - } - ctx := graphql.WithFieldContext(ctx, fc) - f := func(i int) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = nil - } - }() - if !isLen1 { - defer wg.Done() - } - ret[i] = ec.marshalN__DirectiveLocation2string(ctx, sel, v[i]) - } - if isLen1 { - f(i) - } else { - go f(i) - } - - } - wg.Wait() - - for _, e := range ret { - if e == graphql.Null { - return graphql.Null - } - } - - return ret -} - -func (ec *executionContext) marshalN__EnumValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValue(ctx context.Context, sel ast.SelectionSet, v introspection.EnumValue) graphql.Marshaler { - return ec.___EnumValue(ctx, sel, &v) -} - -func (ec *executionContext) marshalN__Field2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐField(ctx context.Context, sel ast.SelectionSet, v introspection.Field) graphql.Marshaler { - return ec.___Field(ctx, sel, &v) -} - -func (ec *executionContext) marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx context.Context, sel ast.SelectionSet, v introspection.InputValue) graphql.Marshaler { - return ec.___InputValue(ctx, sel, &v) -} - -func (ec *executionContext) marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.InputValue) graphql.Marshaler { - ret := make(graphql.Array, len(v)) - var wg sync.WaitGroup - isLen1 := len(v) == 1 - if !isLen1 { - wg.Add(len(v)) - } - for i := range v { - i := i - fc := &graphql.FieldContext{ - Index: &i, - Result: &v[i], - } - ctx := graphql.WithFieldContext(ctx, fc) - f := func(i int) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = nil - } - }() - if !isLen1 { - defer wg.Done() - } - ret[i] = ec.marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx, sel, v[i]) - } - if isLen1 { - f(i) - } else { - go f(i) - } - - } - wg.Wait() - - for _, e := range ret { - if e == graphql.Null { - return graphql.Null - } - } - - return ret -} - -func (ec *executionContext) marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v introspection.Type) graphql.Marshaler { - return ec.___Type(ctx, sel, &v) -} - -func (ec *executionContext) marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Type) graphql.Marshaler { - ret := make(graphql.Array, len(v)) - var wg sync.WaitGroup - isLen1 := len(v) == 1 - if !isLen1 { - wg.Add(len(v)) - } - for i := range v { - i := i - fc := &graphql.FieldContext{ - Index: &i, - Result: &v[i], - } - ctx := graphql.WithFieldContext(ctx, fc) - f := func(i int) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = nil - } - }() - if !isLen1 { - defer wg.Done() - } - ret[i] = ec.marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, sel, v[i]) - } - if isLen1 { - f(i) - } else { - go f(i) - } - - } - wg.Wait() - - for _, e := range ret { - if e == graphql.Null { - return graphql.Null - } - } - - return ret -} - -func (ec *executionContext) marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v *introspection.Type) graphql.Marshaler { - if v == nil { - if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - return ec.___Type(ctx, sel, v) -} - -func (ec *executionContext) unmarshalN__TypeKind2string(ctx context.Context, v interface{}) (string, error) { - res, err := graphql.UnmarshalString(v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) marshalN__TypeKind2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { - res := graphql.MarshalString(v) - if res == graphql.Null { - if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { - ec.Errorf(ctx, "must not be null") - } - } - return res -} - -func (ec *executionContext) unmarshalNupdateUserMobileInput2githubᚗcomᚋxinliangnoteᚋgoᚑginᚑapiᚋinternalᚋgraphᚋmodelᚐUpdateUserMobileInput(ctx context.Context, v interface{}) (model.UpdateUserMobileInput, error) { - res, err := ec.unmarshalInputupdateUserMobileInput(ctx, v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) unmarshalOBoolean2bool(ctx context.Context, v interface{}) (bool, error) { - res, err := graphql.UnmarshalBoolean(v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) marshalOBoolean2bool(ctx context.Context, sel ast.SelectionSet, v bool) graphql.Marshaler { - return graphql.MarshalBoolean(v) -} - -func (ec *executionContext) unmarshalOBoolean2ᚖbool(ctx context.Context, v interface{}) (*bool, error) { - if v == nil { - return nil, nil - } - res, err := graphql.UnmarshalBoolean(v) - return &res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) marshalOBoolean2ᚖbool(ctx context.Context, sel ast.SelectionSet, v *bool) graphql.Marshaler { - if v == nil { - return graphql.Null - } - return graphql.MarshalBoolean(*v) -} - -func (ec *executionContext) unmarshalOString2string(ctx context.Context, v interface{}) (string, error) { - res, err := graphql.UnmarshalString(v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) marshalOString2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { - return graphql.MarshalString(v) -} - -func (ec *executionContext) unmarshalOString2ᚖstring(ctx context.Context, v interface{}) (*string, error) { - if v == nil { - return nil, nil - } - res, err := graphql.UnmarshalString(v) - return &res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) marshalOString2ᚖstring(ctx context.Context, sel ast.SelectionSet, v *string) graphql.Marshaler { - if v == nil { - return graphql.Null - } - return graphql.MarshalString(*v) -} - -func (ec *executionContext) marshalOUser2ᚕᚖgithubᚗcomᚋxinliangnoteᚋgoᚑginᚑapiᚋinternalᚋgraphᚋmodelᚐUserᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.User) graphql.Marshaler { - if v == nil { - return graphql.Null - } - ret := make(graphql.Array, len(v)) - var wg sync.WaitGroup - isLen1 := len(v) == 1 - if !isLen1 { - wg.Add(len(v)) - } - for i := range v { - i := i - fc := &graphql.FieldContext{ - Index: &i, - Result: &v[i], - } - ctx := graphql.WithFieldContext(ctx, fc) - f := func(i int) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = nil - } - }() - if !isLen1 { - defer wg.Done() - } - ret[i] = ec.marshalNUser2ᚖgithubᚗcomᚋxinliangnoteᚋgoᚑginᚑapiᚋinternalᚋgraphᚋmodelᚐUser(ctx, sel, v[i]) - } - if isLen1 { - f(i) - } else { - go f(i) - } - - } - wg.Wait() - - for _, e := range ret { - if e == graphql.Null { - return graphql.Null - } - } - - return ret -} - -func (ec *executionContext) marshalOUser2ᚖgithubᚗcomᚋxinliangnoteᚋgoᚑginᚑapiᚋinternalᚋgraphᚋmodelᚐUser(ctx context.Context, sel ast.SelectionSet, v *model.User) graphql.Marshaler { - if v == nil { - return graphql.Null - } - return ec._User(ctx, sel, v) -} - -func (ec *executionContext) marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.EnumValue) graphql.Marshaler { - if v == nil { - return graphql.Null - } - ret := make(graphql.Array, len(v)) - var wg sync.WaitGroup - isLen1 := len(v) == 1 - if !isLen1 { - wg.Add(len(v)) - } - for i := range v { - i := i - fc := &graphql.FieldContext{ - Index: &i, - Result: &v[i], - } - ctx := graphql.WithFieldContext(ctx, fc) - f := func(i int) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = nil - } - }() - if !isLen1 { - defer wg.Done() - } - ret[i] = ec.marshalN__EnumValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValue(ctx, sel, v[i]) - } - if isLen1 { - f(i) - } else { - go f(i) - } - - } - wg.Wait() - - for _, e := range ret { - if e == graphql.Null { - return graphql.Null - } - } - - return ret -} - -func (ec *executionContext) marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Field) graphql.Marshaler { - if v == nil { - return graphql.Null - } - ret := make(graphql.Array, len(v)) - var wg sync.WaitGroup - isLen1 := len(v) == 1 - if !isLen1 { - wg.Add(len(v)) - } - for i := range v { - i := i - fc := &graphql.FieldContext{ - Index: &i, - Result: &v[i], - } - ctx := graphql.WithFieldContext(ctx, fc) - f := func(i int) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = nil - } - }() - if !isLen1 { - defer wg.Done() - } - ret[i] = ec.marshalN__Field2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐField(ctx, sel, v[i]) - } - if isLen1 { - f(i) - } else { - go f(i) - } - - } - wg.Wait() - - for _, e := range ret { - if e == graphql.Null { - return graphql.Null - } - } - - return ret -} - -func (ec *executionContext) marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.InputValue) graphql.Marshaler { - if v == nil { - return graphql.Null - } - ret := make(graphql.Array, len(v)) - var wg sync.WaitGroup - isLen1 := len(v) == 1 - if !isLen1 { - wg.Add(len(v)) - } - for i := range v { - i := i - fc := &graphql.FieldContext{ - Index: &i, - Result: &v[i], - } - ctx := graphql.WithFieldContext(ctx, fc) - f := func(i int) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = nil - } - }() - if !isLen1 { - defer wg.Done() - } - ret[i] = ec.marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx, sel, v[i]) - } - if isLen1 { - f(i) - } else { - go f(i) - } - - } - wg.Wait() - - for _, e := range ret { - if e == graphql.Null { - return graphql.Null - } - } - - return ret -} - -func (ec *executionContext) marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema(ctx context.Context, sel ast.SelectionSet, v *introspection.Schema) graphql.Marshaler { - if v == nil { - return graphql.Null - } - return ec.___Schema(ctx, sel, v) -} - -func (ec *executionContext) marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Type) graphql.Marshaler { - if v == nil { - return graphql.Null - } - ret := make(graphql.Array, len(v)) - var wg sync.WaitGroup - isLen1 := len(v) == 1 - if !isLen1 { - wg.Add(len(v)) - } - for i := range v { - i := i - fc := &graphql.FieldContext{ - Index: &i, - Result: &v[i], - } - ctx := graphql.WithFieldContext(ctx, fc) - f := func(i int) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = nil - } - }() - if !isLen1 { - defer wg.Done() - } - ret[i] = ec.marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, sel, v[i]) - } - if isLen1 { - f(i) - } else { - go f(i) - } - - } - wg.Wait() - - for _, e := range ret { - if e == graphql.Null { - return graphql.Null - } - } - - return ret -} - -func (ec *executionContext) marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v *introspection.Type) graphql.Marshaler { - if v == nil { - return graphql.Null - } - return ec.___Type(ctx, sel, v) -} - -// endregion ***************************** type.gotpl ***************************** diff --git a/internal/graph/handler/handler.go b/internal/graph/handler/handler.go deleted file mode 100755 index a3fbad7..0000000 --- a/internal/graph/handler/handler.go +++ /dev/null @@ -1,102 +0,0 @@ -package handler - -import ( - "context" - "time" - - "github.com/ch3nnn/webstack-go/internal/graph/generated" - "github.com/ch3nnn/webstack-go/internal/graph/resolvers" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "github.com/99designs/gqlgen/graphql" - "github.com/99designs/gqlgen/graphql/handler" - "github.com/99designs/gqlgen/graphql/handler/extension" - "github.com/99designs/gqlgen/graphql/handler/lru" - "github.com/99designs/gqlgen/graphql/handler/transport" - "github.com/99designs/gqlgen/graphql/playground" - "go.uber.org/zap" -) - -var _ Gql = (*gql)(nil) - -type Gql interface { - i() - Playground() core.HandlerFunc - Query() core.HandlerFunc -} - -type gql struct { - logger *zap.Logger - db mysql.Repo - cache redis.Repo -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) Gql { - return &gql{ - logger: logger, - cache: cache, - db: db, - } -} - -func (g *gql) i() {} - -func (g *gql) Query() core.HandlerFunc { - - // 定义扩展字段 - extensions := make(map[string]interface{}) - - h := handler.New(generated.NewExecutableSchema( - resolvers.NewRootResolvers(g.logger, g.db, g.cache)), - ) - - h.AddTransport(transport.Websocket{ - KeepAlivePingInterval: 10 * time.Second, - }) - - // 设置 transport - h.AddTransport(transport.Options{}) - h.AddTransport(transport.GET{}) - h.AddTransport(transport.POST{}) - - h.SetQueryCache(lru.New(1000)) - - // 启用侧边栏文档 - h.Use(extension.Introspection{}) - - h.Use(extension.AutomaticPersistedQuery{ - Cache: lru.New(100), - }) - - return func(c core.Context) { - var responses interface{} - - defer func() { - // 设置 core log - c.GraphPayload(responses) - }() - - // 设置 core trace_id - extensions["trace_id"] = c.Trace().ID() - - h.AroundResponses(func(ctx context.Context, next graphql.ResponseHandler) *graphql.Response { - resp := next(ctx) - resp.Extensions = extensions - responses = resp - return resp - }) - - // 设置 core context - coreContext := context.WithValue(c.Request().Context(), resolvers.CoreContextKey, c) - h.ServeHTTP(c.ResponseWriter(), c.Request().WithContext(coreContext)) - } -} - -func (g *gql) Playground() core.HandlerFunc { - h := playground.Handler("GraphQL", "/graphql/query") - return func(c core.Context) { - h.ServeHTTP(c.ResponseWriter(), c.Request()) - } -} diff --git a/internal/graph/model/generated.go b/internal/graph/model/generated.go deleted file mode 100755 index f0f4363..0000000 --- a/internal/graph/model/generated.go +++ /dev/null @@ -1,15 +0,0 @@ -// Code generated by github.com/99designs/gqlgen, DO NOT EDIT. - -package model - -type User struct { - ID string `json:"id"` - Name string `json:"name"` - Sex string `json:"sex"` - Mobile string `json:"mobile"` -} - -type UpdateUserMobileInput struct { - ID string `json:"id"` - Mobile string `json:"mobile"` -} diff --git a/internal/graph/resolvers/generated/generated.go b/internal/graph/resolvers/generated/generated.go deleted file mode 100755 index e20b6f6..0000000 --- a/internal/graph/resolvers/generated/generated.go +++ /dev/null @@ -1,29 +0,0 @@ -package resolvers - -// THIS CODE IS A STARTING POINT ONLY. IT WILL NOT BE UPDATED WITH SCHEMA CHANGES. - -import ( - "context" - - "github.com/ch3nnn/webstack-go/internal/graph/generated" - "github.com/ch3nnn/webstack-go/internal/graph/model" -) - -type Resolver struct{} - -func (r *mutationResolver) UpdateUserMobile(ctx context.Context, data model.UpdateUserMobileInput) (*model.User, error) { - panic("not implemented") -} - -func (r *queryResolver) BySex(ctx context.Context, sex string) ([]*model.User, error) { - panic("not implemented") -} - -// Mutation returns generated.MutationResolver implementation. -func (r *Resolver) Mutation() generated.MutationResolver { return &mutationResolver{r} } - -// Query returns generated.QueryResolver implementation. -func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} } - -type mutationResolver struct{ *Resolver } -type queryResolver struct{ *Resolver } diff --git a/internal/graph/resolvers/resolvers.go b/internal/graph/resolvers/resolvers.go deleted file mode 100755 index 221e767..0000000 --- a/internal/graph/resolvers/resolvers.go +++ /dev/null @@ -1,50 +0,0 @@ -package resolvers - -import ( - "context" - - "github.com/ch3nnn/webstack-go/internal/graph/generated" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "go.uber.org/zap" -) - -type coreCtxKeyType struct{ name string } - -var CoreContextKey = coreCtxKeyType{"_core_context"} - -type mutationResolver struct{ *Resolver } - -type queryResolver struct{ *Resolver } - -type Resolver struct { - logger *zap.Logger - cache redis.Repo - //userService user_service.UserService -} - -func NewRootResolvers(logger *zap.Logger, db mysql.Repo, cache redis.Repo) generated.Config { - c := generated.Config{ - Resolvers: &Resolver{ - logger: logger, - cache: cache, - //userService: user_service.NewUserService(db, cache), - }, - } - return c -} - -func (r *Resolver) Mutation() generated.MutationResolver { - return &mutationResolver{r} -} - -func (r *Resolver) Query() generated.QueryResolver { - return &queryResolver{r} -} - -// getCoreContextByCtx 获取 core context -func (r *Resolver) getCoreContextByCtx(ctx context.Context) core.Context { - return ctx.Value(CoreContextKey).(core.Context) -} diff --git a/internal/graph/resolvers/user.go b/internal/graph/resolvers/user.go deleted file mode 100755 index 60bdd33..0000000 --- a/internal/graph/resolvers/user.go +++ /dev/null @@ -1,46 +0,0 @@ -package resolvers - -import ( - "context" - - "github.com/ch3nnn/webstack-go/internal/graph/model" - "github.com/ch3nnn/webstack-go/internal/pkg/errors" -) - -func (r *queryResolver) BySex(ctx context.Context, sex string) ([]*model.User, error) { - if sex == "" { - return nil, errors.New("sex required") - } - - //模拟数据 - var users []*model.User - users = append(users, &model.User{ID: "1", Name: "Tom", Sex: sex, Mobile: "13266666666"}) - users = append(users, &model.User{ID: "1", Name: "Jack", Sex: sex, Mobile: "13288888888"}) - - return users, nil -} - -func (r *mutationResolver) UpdateUserMobile(ctx context.Context, data model.UpdateUserMobileInput) (*model.User, error) { - if data.ID == "" { - return nil, errors.New("id required") - } - - if data.Mobile == "" { - return nil, errors.New("mobile required") - } - - //模拟数据 - user := new(model.User) - user.ID = data.ID - user.Mobile = data.Mobile - user.Sex = "男" - user.Name = "Jack" - - //操作数据库 - //userData, err := r.userService.GetUserByUserName(r.getCoreContextByCtx(ctx), "test_user") - //if err != nil { - // return nil, err - //} - - return user, nil -} diff --git a/internal/graph/schemas/user.graphql b/internal/graph/schemas/user.graphql deleted file mode 100755 index eb5ddfd..0000000 --- a/internal/graph/schemas/user.graphql +++ /dev/null @@ -1,22 +0,0 @@ -type User { - id: String! - name: String! - sex: String! - mobile: String! -} - -# 查询 集合 -type Query { - bySex(sex: String!): [User!] -} - -# 输入类型: 一般用户更改资源中的输入是列表对象,完成复杂任务 -input updateUserMobileInput { - id:ID! - mobile: String! -} - -# 更改或者创建 集合 -type Mutation { - updateUserMobile(data: updateUserMobileInput!): User -} \ No newline at end of file diff --git a/internal/handler/category/create.go b/internal/handler/category/create.go new file mode 100644 index 0000000..3beaaa3 --- /dev/null +++ b/internal/handler/category/create.go @@ -0,0 +1,41 @@ +/** + * @Author: chentong + * @Date: 2024/06/27 下午11:55 + */ + +package category + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +// Create +// Register godoc +// @Summary 新增分类 +// @Schemes +// @Description 新增分类 +// @Tags 分类模块 +// @Accept json +// @Produce json +// @Param request body v1.CategoryCreateReq true "params" +// @Success 200 {object} v1.CategoryCreateResp +// @Router /api/admin/category [post] +func (h *Handler) Create(ctx *gin.Context) { + var req v1.CategoryCreateReq + if err := ctx.ShouldBind(&req); err != nil { + v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil) + return + } + + resp, err := h.categoryService.Create(ctx, &req) + if err != nil { + v1.HandleError(ctx, http.StatusInternalServerError, err, nil) + return + } + + v1.HandleSuccess(ctx, resp) +} diff --git a/internal/handler/category/delete.go b/internal/handler/category/delete.go new file mode 100644 index 0000000..aade981 --- /dev/null +++ b/internal/handler/category/delete.go @@ -0,0 +1,40 @@ +/** + * @Author: chentong + * @Date: 2024/06/27 下午11:30 + */ + +package category + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +// Delete +// Register godoc +// @Summary 删除分类 +// @Schemes +// @Description 删除分类 +// @Tags 分类模块 +// @Accept json +// @Produce json +// @Param request body v1.CategoryDeleteReq true "params" +// @Success 200 {object} v1.CategoryDeleteResp +// @Router /api/admin/category/:id [delete] +func (h *Handler) Delete(ctx *gin.Context) { + var req v1.CategoryDeleteReq + if err := ctx.ShouldBindUri(&req); err != nil { + v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil) + return + } + + if _, err := h.categoryService.Delete(ctx, &req); err != nil { + v1.HandleError(ctx, http.StatusInternalServerError, err, nil) + return + } + + v1.HandleSuccess(ctx, nil) +} diff --git a/internal/handler/category/detail.go b/internal/handler/category/detail.go new file mode 100644 index 0000000..63dc442 --- /dev/null +++ b/internal/handler/category/detail.go @@ -0,0 +1,41 @@ +/** + * @Author: chentong + * @Date: 2024/06/13 下午11:55 + */ + +package category + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +// Detail +// Register godoc +// @Summary 详情分类 +// @Schemes +// @Description 详情分类 +// @Tags 分类模块 +// @Accept json +// @Produce json +// @Param request body v1.CategoryDetailReq true "params" +// @Success 200 {object} v1.CategoryDetailResp +// @Router /api/admin/category/:id [get] +func (h *Handler) Detail(ctx *gin.Context) { + var req v1.CategoryDetailReq + if err := ctx.ShouldBindUri(&req); err != nil { + v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil) + return + } + + resp, err := h.categoryService.Detail(ctx, &req) + if err != nil { + v1.HandleError(ctx, http.StatusInternalServerError, err, nil) + return + } + + v1.HandleSuccess(ctx, resp) +} diff --git a/internal/handler/category/handler.go b/internal/handler/category/handler.go new file mode 100644 index 0000000..4ea7f24 --- /dev/null +++ b/internal/handler/category/handler.go @@ -0,0 +1,23 @@ +/** + * @Author: chentong + * @Date: 2024/05/26 上午1:46 + */ + +package category + +import ( + "github.com/ch3nnn/webstack-go/internal/handler" + "github.com/ch3nnn/webstack-go/internal/service/category" +) + +type Handler struct { + *handler.Handler + categoryService category.Service +} + +func NewHandler(handler *handler.Handler, categoryService category.Service) *Handler { + return &Handler{ + Handler: handler, + categoryService: categoryService, + } +} diff --git a/internal/handler/category/list.go b/internal/handler/category/list.go new file mode 100644 index 0000000..0adfb7e --- /dev/null +++ b/internal/handler/category/list.go @@ -0,0 +1,34 @@ +/** + * @Author: chentong + * @Date: 2024/06/11 下午11:49 + */ + +package category + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +// List +// Register godoc +// @Summary 列表分类 +// @Schemes +// @Description 列表分类 +// @Tags 分类模块 +// @Accept json +// @Produce json +// @Success 200 {object} v1.CategoryListResp +// @Router /api/admin/category [get] +func (h *Handler) List(ctx *gin.Context) { + resp, err := h.categoryService.List(ctx, nil) + if err != nil { + v1.HandleError(ctx, http.StatusInternalServerError, err, nil) + return + } + + v1.HandleSuccess(ctx, resp) +} diff --git a/internal/handler/category/update.go b/internal/handler/category/update.go new file mode 100644 index 0000000..432aaa6 --- /dev/null +++ b/internal/handler/category/update.go @@ -0,0 +1,41 @@ +/** + * @Author: chentong + * @Date: 2024/06/13 下午11:13 + */ + +package category + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +// Update +// Register godoc +// @Summary 更新分类 +// @Schemes +// @Description 更新分类 +// @Tags 分类模块 +// @Accept json +// @Produce json +// @Param request body v1.CategoryUpdateReq true "params" +// @Success 200 {object} v1.CategoryUpdateResp +// @Router /api/admin/category/update [put] +func (h *Handler) Update(ctx *gin.Context) { + var req v1.CategoryUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil) + return + } + + resp, err := h.categoryService.Update(ctx, &req) + if err != nil { + v1.HandleError(ctx, http.StatusInternalServerError, err, nil) + return + } + + v1.HandleSuccess(ctx, resp) +} diff --git a/internal/handler/dashboard/handler.go b/internal/handler/dashboard/handler.go new file mode 100644 index 0000000..c01f42c --- /dev/null +++ b/internal/handler/dashboard/handler.go @@ -0,0 +1,95 @@ +/** + * @Author: chentong + * @Date: 2024/05/26 上午1:46 + */ + +package index + +import ( + "math/big" + "net/http" + "os" + "runtime" + "strings" + "time" + + "github.com/duke-git/lancet/v2/mathutil" + humanize "github.com/dustin/go-humanize" + "github.com/gin-gonic/gin" + "github.com/shirou/gopsutil/cpu" + "github.com/shirou/gopsutil/disk" + "github.com/shirou/gopsutil/mem" + + v1 "github.com/ch3nnn/webstack-go/api/v1" + "github.com/ch3nnn/webstack-go/internal/handler" +) + +type Handler struct { + *handler.Handler +} + +func NewHandler(handler *handler.Handler) *Handler { + return &Handler{Handler: handler} +} + +func (h *Handler) memory() (m mem.VirtualMemoryStat) { + info, err := mem.VirtualMemory() + if err != nil { + return m + } + + return *info +} + +func (h *Handler) disk() (d disk.UsageStat) { + info, err := disk.Usage("/") + if err != nil { + return d + } + + return *info +} + +func (h *Handler) cpu() (c cpu.InfoStat) { + info, err := cpu.Info() + if err != nil { + return c + } + + if len(info) > 0 { + return info[0] + } + + return c +} + +func (h *Handler) Dashboard(ctx *gin.Context) { + memoryInfo := h.memory() + diskInfo := h.disk() + cpuInfo := h.cpu() + + dir, _ := os.Getwd() + + var cpuPercent float64 + cpuPercents, _ := cpu.Percent(time.Second, false) + if len(cpuPercents) > 0 { + cpuPercent = mathutil.RoundToFloat(cpuPercents[0], 2) + } + + ctx.HTML(http.StatusOK, "dashboard.html", v1.DashboardResp{ + ProjectVersion: "2.0", + GoOS: runtime.GOOS, + GoArch: runtime.GOARCH, + GoVersion: runtime.Version(), + ProjectPath: strings.Replace(dir, "\\", "/", -1), + MemTotal: humanize.BigBytes(big.NewInt(int64(memoryInfo.Total))), + MemUsed: humanize.BigBytes(big.NewInt(int64(memoryInfo.Used))), + MemUsedPercent: mathutil.RoundToFloat(memoryInfo.UsedPercent, 2), + DiskTotal: humanize.BigBytes(big.NewInt(int64(diskInfo.Total))), + DiskUsed: humanize.BigBytes(big.NewInt(int64(diskInfo.Used))), + DiskUsedPercent: mathutil.RoundToFloat(diskInfo.UsedPercent, 2), + CpuName: cpuInfo.ModelName, + CpuCores: cpuInfo.Cores, + CpuUsedPercent: cpuPercent, + }) +} diff --git a/internal/handler/handler.go b/internal/handler/handler.go new file mode 100644 index 0000000..20f94d3 --- /dev/null +++ b/internal/handler/handler.go @@ -0,0 +1,15 @@ +package handler + +import ( + "github.com/ch3nnn/webstack-go/pkg/log" +) + +type Handler struct { + logger *log.Logger +} + +func NewHandler(logger *log.Logger) *Handler { + return &Handler{ + logger: logger, + } +} diff --git a/internal/handler/index/handler.go b/internal/handler/index/handler.go new file mode 100644 index 0000000..a28cc3c --- /dev/null +++ b/internal/handler/index/handler.go @@ -0,0 +1,20 @@ +/** + * @Author: chentong + * @Date: 2024/05/26 上午1:46 + */ + +package index + +import ( + "github.com/ch3nnn/webstack-go/internal/handler" + "github.com/ch3nnn/webstack-go/internal/service/index" +) + +type Handler struct { + *handler.Handler + indexService index.Service +} + +func NewHandler(handler *handler.Handler, indexService index.Service) *Handler { + return &Handler{Handler: handler, indexService: indexService} +} diff --git a/internal/handler/index/index.go b/internal/handler/index/index.go new file mode 100644 index 0000000..dda230f --- /dev/null +++ b/internal/handler/index/index.go @@ -0,0 +1,24 @@ +/** + * @Author: chentong + * @Date: 2024/05/26 上午1:46 + */ + +package index + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (h *Handler) Index(ctx *gin.Context) { + resp, err := h.indexService.Index(ctx) + if err != nil { + v1.HandleError(ctx, http.StatusInternalServerError, err, nil) + return + } + + ctx.HTML(http.StatusOK, "index.html", resp) +} diff --git a/internal/handler/site/create.go b/internal/handler/site/create.go new file mode 100644 index 0000000..9d07004 --- /dev/null +++ b/internal/handler/site/create.go @@ -0,0 +1,30 @@ +/** + * @Author: chentong + * @Date: 2024/06/04 下午5:55 + */ + +package site + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (h *Handler) Create(ctx *gin.Context) { + var req v1.SiteCreateReq + if err := ctx.ShouldBind(&req); err != nil { + v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil) + return + } + + resp, err := h.siteService.BatchCreate(ctx, &req) + if err != nil { + v1.HandleError(ctx, http.StatusInternalServerError, err, nil) + return + } + + v1.HandleSuccess(ctx, resp) +} diff --git a/internal/handler/site/delete.go b/internal/handler/site/delete.go new file mode 100644 index 0000000..6cae410 --- /dev/null +++ b/internal/handler/site/delete.go @@ -0,0 +1,30 @@ +/** + * @Author: chentong + * @Date: 2024/06/28 上午12:25 + */ + +package site + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (h *Handler) Delete(ctx *gin.Context) { + var req v1.SiteDeleteReq + if err := ctx.ShouldBindUri(&req); err != nil { + v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil) + return + } + + resp, err := h.siteService.Delete(ctx, &req) + if err != nil { + v1.HandleError(ctx, http.StatusInternalServerError, err, nil) + return + } + + v1.HandleSuccess(ctx, resp) +} diff --git a/internal/handler/site/handler.go b/internal/handler/site/handler.go new file mode 100644 index 0000000..c1c3bfe --- /dev/null +++ b/internal/handler/site/handler.go @@ -0,0 +1,23 @@ +/** + * @Author: chentong + * @Date: 2024/05/26 上午12:35 + */ + +package site + +import ( + "github.com/ch3nnn/webstack-go/internal/handler" + "github.com/ch3nnn/webstack-go/internal/service/site" +) + +type Handler struct { + *handler.Handler + siteService site.Service +} + +func NewHandler(handler *handler.Handler, siteService site.Service) *Handler { + return &Handler{ + Handler: handler, + siteService: siteService, + } +} diff --git a/internal/handler/site/list.go b/internal/handler/site/list.go new file mode 100644 index 0000000..bf6c71a --- /dev/null +++ b/internal/handler/site/list.go @@ -0,0 +1,30 @@ +/** + * @Author: chentong + * @Date: 2024/05/27 下午11:48 + */ + +package site + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (h *Handler) List(ctx *gin.Context) { + var req v1.SiteListReq + if err := ctx.ShouldBind(&req); err != nil { + v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil) + return + } + + resp, err := h.siteService.List(ctx, &req) + if err != nil { + v1.HandleError(ctx, http.StatusInternalServerError, err, nil) + return + } + + v1.HandleSuccess(ctx, resp) +} diff --git a/internal/handler/site/sync.go b/internal/handler/site/sync.go new file mode 100644 index 0000000..30e3783 --- /dev/null +++ b/internal/handler/site/sync.go @@ -0,0 +1,30 @@ +/** + * @Author: chentong + * @Date: 2024/11/12 16:37 + */ + +package site + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (h *Handler) SyncSite(ctx *gin.Context) { + var req v1.SiteSyncReq + if err := ctx.ShouldBindUri(&req); err != nil { + v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil) + return + } + + resp, err := h.siteService.Sync(ctx, &req) + if err != nil { + v1.HandleError(ctx, http.StatusInternalServerError, err, nil) + return + } + + v1.HandleSuccess(ctx, resp) +} diff --git a/internal/handler/site/update.go b/internal/handler/site/update.go new file mode 100644 index 0000000..d805323 --- /dev/null +++ b/internal/handler/site/update.go @@ -0,0 +1,39 @@ +/** + * @Author: chentong + * @Date: 2024/06/30 下午10:07 + */ + +package site + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (h *Handler) Update(ctx *gin.Context) { + var req v1.SiteUpdateReq + if err := ctx.ShouldBindUri(&req); err != nil { + v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil) + return + } + + if err := ctx.ShouldBind(&req); err != nil { + v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil) + return + } + + if file, _ := ctx.FormFile("file"); file != nil { + req.File = file + } + + resp, err := h.siteService.Update(ctx, &req) + if err != nil { + v1.HandleError(ctx, http.StatusInternalServerError, err, nil) + return + } + + v1.HandleSuccess(ctx, resp) +} diff --git a/internal/handler/user/handler.go b/internal/handler/user/handler.go new file mode 100644 index 0000000..c634863 --- /dev/null +++ b/internal/handler/user/handler.go @@ -0,0 +1,23 @@ +/** + * @Author: chentong + * @Date: 2024/05/26 上午12:35 + */ + +package user + +import ( + "github.com/ch3nnn/webstack-go/internal/handler" + "github.com/ch3nnn/webstack-go/internal/service/user" +) + +type Handler struct { + *handler.Handler + userService user.Service +} + +func NewHandler(handler *handler.Handler, userService user.Service) *Handler { + return &Handler{ + Handler: handler, + userService: userService, + } +} diff --git a/internal/handler/user/info.go b/internal/handler/user/info.go new file mode 100644 index 0000000..65ae582 --- /dev/null +++ b/internal/handler/user/info.go @@ -0,0 +1,24 @@ +/** + * @Author: chentong + * @Date: 2024/05/26 下午4:00 + */ + +package user + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (h *Handler) Info(ctx *gin.Context) { + resp, err := h.userService.Info(ctx, nil) + if err != nil { + v1.HandleError(ctx, http.StatusInternalServerError, err, nil) + return + } + + v1.HandleSuccess(ctx, resp) +} diff --git a/internal/handler/user/login.go b/internal/handler/user/login.go new file mode 100644 index 0000000..af99b06 --- /dev/null +++ b/internal/handler/user/login.go @@ -0,0 +1,30 @@ +/** + * @Author: chentong + * @Date: 2024/05/26 上午12:36 + */ + +package user + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (h *Handler) Login(ctx *gin.Context) { + var req v1.LoginReq + if err := ctx.Bind(&req); err != nil { + v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil) + return + } + + resp, err := h.userService.Login(ctx, &req) + if err != nil { + v1.HandleError(ctx, http.StatusInternalServerError, err, nil) + return + } + + v1.HandleSuccess(ctx, resp) +} diff --git a/internal/handler/user/logout.go b/internal/handler/user/logout.go new file mode 100644 index 0000000..c933291 --- /dev/null +++ b/internal/handler/user/logout.go @@ -0,0 +1,16 @@ +/** + * @Author: chentong + * @Date: 2024/11/12 13:26 + */ + +package user + +import ( + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (h *Handler) Logout(ctx *gin.Context) { + v1.HandleSuccess(ctx, nil) +} diff --git a/internal/handler/user/updatepassword.go b/internal/handler/user/updatepassword.go new file mode 100644 index 0000000..8addba3 --- /dev/null +++ b/internal/handler/user/updatepassword.go @@ -0,0 +1,30 @@ +/** + * @Author: chentong + * @Date: 2024/11/11 18:38 + */ + +package user + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (h *Handler) UpdatePassword(ctx *gin.Context) { + var req v1.UpdatePasswordReq + if err := ctx.ShouldBind(&req); err != nil { + v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil) + return + } + + resp, err := h.userService.UpdatePassword(ctx, &req) + if err != nil { + v1.HandleError(ctx, http.StatusInternalServerError, err, nil) + return + } + + v1.HandleSuccess(ctx, resp) +} diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go deleted file mode 100755 index 44d1972..0000000 --- a/internal/metrics/metrics.go +++ /dev/null @@ -1,26 +0,0 @@ -package metrics - -import ( - "github.com/ch3nnn/webstack-go/internal/proposal" - - "go.uber.org/zap" -) - -// RecordHandler 指标处理 -func RecordHandler(logger *zap.Logger) func(msg *proposal.MetricsMessage) { - if logger == nil { - panic("logger required") - } - - return func(msg *proposal.MetricsMessage) { - RecordMetrics( - msg.Method, - msg.Path, - msg.IsSuccess, - msg.HTTPCode, - msg.BusinessCode, - msg.CostSeconds, - msg.TraceID, - ) - } -} diff --git a/internal/metrics/prometheus.go b/internal/metrics/prometheus.go deleted file mode 100755 index bd0e581..0000000 --- a/internal/metrics/prometheus.go +++ /dev/null @@ -1,55 +0,0 @@ -package metrics - -import ( - "github.com/prometheus/client_golang/prometheus" - "github.com/spf13/cast" -) - -const ( - namespace = "xinliangnote" - subsystem = "go_gin_api" -) - -// metricsRequestsTotal metrics for request total 计数器(Counter) -var metricsRequestsTotal = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Namespace: namespace, - Subsystem: subsystem, - Name: "requests_total", - Help: "request(ms) total", - }, - []string{"method", "path"}, -) - -// metricsRequestsCost metrics for requests cost 累积直方图(Histogram) -var metricsRequestsCost = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Namespace: namespace, - Subsystem: subsystem, - Name: "requests_cost", - Help: "request(ms) cost milliseconds", - }, - []string{"method", "path", "success", "http_code", "business_code", "cost_milliseconds", "trace_id"}, -) - -func init() { - prometheus.MustRegister(metricsRequestsTotal, metricsRequestsCost) -} - -// RecordMetrics 记录指标 -func RecordMetrics(method, path string, success bool, httpCode, businessCode int, costSeconds float64, traceId string) { - metricsRequestsTotal.With(prometheus.Labels{ - "method": method, - "path": path, - }).Inc() - - metricsRequestsCost.With(prometheus.Labels{ - "method": method, - "path": path, - "success": cast.ToString(success), - "http_code": cast.ToString(httpCode), - "business_code": cast.ToString(businessCode), - "cost_milliseconds": cast.ToString(costSeconds * 1000), - "trace_id": traceId, - }).Observe(costSeconds) -} diff --git a/internal/middleware/cors.go b/internal/middleware/cors.go new file mode 100644 index 0000000..a75c8e7 --- /dev/null +++ b/internal/middleware/cors.go @@ -0,0 +1,24 @@ +package middleware + +import ( + "net/http" + + "github.com/gin-gonic/gin" +) + +func CORSMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + method := c.Request.Method + c.Header("Access-Control-Allow-Origin", c.GetHeader("Origin")) + c.Header("Access-Control-Allow-Credentials", "true") + + if method == "OPTIONS" { + c.Header("Access-Control-Allow-Methods", c.GetHeader("Access-Control-Request-Method")) + c.Header("Access-Control-Allow-Headers", c.GetHeader("Access-Control-Request-Headers")) + c.Header("Access-Control-Max-Age", "7200") + c.AbortWithStatus(http.StatusNoContent) + return + } + c.Next() + } +} diff --git a/internal/middleware/jwt.go b/internal/middleware/jwt.go new file mode 100644 index 0000000..6a5ebb5 --- /dev/null +++ b/internal/middleware/jwt.go @@ -0,0 +1,87 @@ +package middleware + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "go.uber.org/zap" + + "github.com/ch3nnn/webstack-go/api/v1" + "github.com/ch3nnn/webstack-go/pkg/jwt" + "github.com/ch3nnn/webstack-go/pkg/log" +) + +const ( + UserID string = "uid" + Claims string = "claims" +) + +func StrictAuth(j *jwt.JWT, logger *log.Logger) gin.HandlerFunc { + return func(ctx *gin.Context) { + tokenString := ctx.Request.Header.Get("Token") + if tokenString == "" { + tokenString, _ = ctx.Cookie("_login_token_") + } + if tokenString == "" { + tokenString = ctx.Query("Token") + } + if tokenString == "" { + logger.WithContext(ctx).Warn("No token", zap.Any("data", map[string]interface{}{ + "url": ctx.Request.URL, + "params": ctx.Params, + })) + v1.HandleError(ctx, http.StatusUnauthorized, v1.ErrUnauthorized, nil) + ctx.Abort() + return + } + + claims, err := j.ParseToken(tokenString) + if err != nil { + logger.WithContext(ctx).Error("token error", zap.Any("data", map[string]interface{}{ + "url": ctx.Request.URL, + "params": ctx.Params, + }), zap.Error(err)) + v1.HandleError(ctx, http.StatusUnauthorized, v1.ErrUnauthorized, nil) + ctx.Abort() + return + } + + ctx.Set(UserID, claims.UserID) + ctx.Set(Claims, claims) + + recoveryLoggerFunc(ctx, logger) + ctx.Next() + } +} + +func NoStrictAuth(j *jwt.JWT, logger *log.Logger) gin.HandlerFunc { + return func(ctx *gin.Context) { + tokenString := ctx.Request.Header.Get("Authorization") + if tokenString == "" { + tokenString, _ = ctx.Cookie("Token") + } + if tokenString == "" { + tokenString = ctx.Query("Token") + } + if tokenString == "" { + ctx.Next() + return + } + + claims, err := j.ParseToken(tokenString) + if err != nil { + ctx.Next() + return + } + + ctx.Set("claims", claims) + recoveryLoggerFunc(ctx, logger) + ctx.Next() + } +} + +func recoveryLoggerFunc(ctx *gin.Context, logger *log.Logger) { + if userInfo, ok := ctx.MustGet("claims").(*jwt.MyCustomClaims); ok { + logger.WithValue(ctx, zap.Int("UserID", userInfo.UserID)) + } +} diff --git a/internal/middleware/log.go b/internal/middleware/log.go new file mode 100644 index 0000000..2986969 --- /dev/null +++ b/internal/middleware/log.go @@ -0,0 +1,60 @@ +package middleware + +import ( + "bytes" + "io" + "time" + + "github.com/duke-git/lancet/v2/cryptor" + "github.com/duke-git/lancet/v2/random" + "github.com/gin-gonic/gin" + "go.uber.org/zap" + + "github.com/ch3nnn/webstack-go/pkg/log" +) + +func RequestLogMiddleware(logger *log.Logger) gin.HandlerFunc { + return func(ctx *gin.Context) { + // The configuration is initialized once per request + uuid, err := random.UUIdV4() + if err != nil { + return + } + + trace := cryptor.Md5String(uuid) + logger.WithValue(ctx, zap.String("trace", trace)) + logger.WithValue(ctx, zap.String("request_method", ctx.Request.Method)) + logger.WithValue(ctx, zap.Any("request_headers", ctx.Request.Header)) + logger.WithValue(ctx, zap.String("request_url", ctx.Request.URL.String())) + + if ctx.Request.Body != nil { + bodyBytes, _ := ctx.GetRawData() + ctx.Request.Body = io.NopCloser(bytes.NewBuffer(bodyBytes)) // 关键点 + logger.WithValue(ctx, zap.String("request_params", string(bodyBytes))) + } + + logger.WithContext(ctx).Info("Request") + ctx.Next() + } +} + +func ResponseLogMiddleware(logger *log.Logger) gin.HandlerFunc { + return func(ctx *gin.Context) { + blw := &bodyLogWriter{body: bytes.NewBufferString(""), ResponseWriter: ctx.Writer} + ctx.Writer = blw + startTime := time.Now() + ctx.Next() + duration := time.Since(startTime).String() + logger.WithContext(ctx).Info("Response", zap.Any("response_body", blw.body.String()), zap.Any("time", duration)) + } +} + +type bodyLogWriter struct { + gin.ResponseWriter + body *bytes.Buffer +} + +func (w bodyLogWriter) Write(b []byte) (int, error) { + w.body.Write(b) + return w.ResponseWriter.Write(b) +} diff --git a/internal/pkg/browser/browser.go b/internal/pkg/browser/browser.go deleted file mode 100644 index 7089f7e..0000000 --- a/internal/pkg/browser/browser.go +++ /dev/null @@ -1,23 +0,0 @@ -package browser - -import ( - "fmt" - "os/exec" - "runtime" -) - -var commands = map[string]string{ - "windows": "start", - "darwin": "open", - "linux": "xdg-open", -} - -func Open(uri string) error { - run, ok := commands[runtime.GOOS] - if !ok { - return fmt.Errorf("don't know how to open things on %s platform", runtime.GOOS) - } - - cmd := exec.Command(run, uri) - return cmd.Start() -} diff --git a/internal/pkg/color/string_darwin.go b/internal/pkg/color/string_darwin.go deleted file mode 100644 index 4dacb96..0000000 --- a/internal/pkg/color/string_darwin.go +++ /dev/null @@ -1,47 +0,0 @@ -//go:build darwin -// +build darwin - -package color - -import ( - "fmt" - "math/rand" - "strconv" -) - -var _ = RandomColor() - -// RandomColor generates a random color. -func RandomColor() string { - return fmt.Sprintf("#%s", strconv.FormatInt(int64(rand.Intn(16777216)), 16)) -} - -// Yellow ... -func Yellow(msg string) string { - return fmt.Sprintf("\x1b[33m%s\x1b[0m", msg) -} - -// Red ... -func Red(msg string) string { - return fmt.Sprintf("\x1b[31m%s\x1b[0m", msg) -} - -// Redf ... -func Redf(msg string, arg interface{}) string { - return fmt.Sprintf("\x1b[31m%s\x1b[0m %+v\n", msg, arg) -} - -// Blue ... -func Blue(msg string) string { - return fmt.Sprintf("\x1b[34m%s\x1b[0m", msg) -} - -// Green ... -func Green(msg string) string { - return fmt.Sprintf("\x1b[32m%s\x1b[0m", msg) -} - -// Greenf ... -func Greenf(msg string, arg interface{}) string { - return fmt.Sprintf("\x1b[32m%s\x1b[0m %+v\n", msg, arg) -} diff --git a/internal/pkg/color/string_linux.go b/internal/pkg/color/string_linux.go deleted file mode 100644 index 48120fd..0000000 --- a/internal/pkg/color/string_linux.go +++ /dev/null @@ -1,47 +0,0 @@ -//go:build linux -// +build linux - -package color - -import ( - "fmt" - "math/rand" - "strconv" -) - -var _ = RandomColor() - -// RandomColor generates a random color. -func RandomColor() string { - return fmt.Sprintf("#%s", strconv.FormatInt(int64(rand.Intn(16777216)), 16)) -} - -// Yellow ... -func Yellow(msg string) string { - return fmt.Sprintf("\x1b[33m%s\x1b[0m", msg) -} - -// Red ... -func Red(msg string) string { - return fmt.Sprintf("\x1b[31m%s\x1b[0m", msg) -} - -// Redf ... -func Redf(msg string, arg interface{}) string { - return fmt.Sprintf("\x1b[31m%s\x1b[0m %+v\n", msg, arg) -} - -// Blue ... -func Blue(msg string) string { - return fmt.Sprintf("\x1b[34m%s\x1b[0m", msg) -} - -// Green ... -func Green(msg string) string { - return fmt.Sprintf("\x1b[32m%s\x1b[0m", msg) -} - -// Greenf ... -func Greenf(msg string, arg interface{}) string { - return fmt.Sprintf("\x1b[32m%s\x1b[0m %+v\n", msg, arg) -} diff --git a/internal/pkg/color/string_windows.go b/internal/pkg/color/string_windows.go deleted file mode 100644 index 98ad6e4..0000000 --- a/internal/pkg/color/string_windows.go +++ /dev/null @@ -1,47 +0,0 @@ -//go:build windows -// +build windows - -package color - -import ( - "fmt" - "math/rand" - "strconv" -) - -var _ = RandomColor() - -// RandomColor generates a random color. -func RandomColor() string { - return fmt.Sprintf("#%s", strconv.FormatInt(int64(rand.Intn(16777216)), 16)) -} - -// Yellow ... -func Yellow(msg string) string { - return fmt.Sprintf("%s", msg) -} - -// Red ... -func Red(msg string) string { - return fmt.Sprintf("%s", msg) -} - -// Redf ... -func Redf(msg string, arg interface{}) string { - return fmt.Sprintf("%s %+v\n", msg, arg) -} - -// Blue ... -func Blue(msg string) string { - return fmt.Sprintf("%s", msg) -} - -// Green ... -func Green(msg string) string { - return fmt.Sprintf("%s", msg) -} - -// Greenf ... -func Greenf(msg string, arg interface{}) string { - return fmt.Sprintf("%s %+v\n", msg, arg) -} diff --git a/internal/pkg/core/context.go b/internal/pkg/core/context.go deleted file mode 100755 index 4baa648..0000000 --- a/internal/pkg/core/context.go +++ /dev/null @@ -1,523 +0,0 @@ -package core - -import ( - "bytes" - stdctx "context" - "io" - "io/ioutil" - "mime/multipart" - "net/http" - "net/url" - "os" - "strings" - "sync" - - "github.com/ch3nnn/webstack-go/internal/pkg/trace" - "github.com/ch3nnn/webstack-go/internal/proposal" - - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - "go.uber.org/zap" -) - -type HandlerFunc func(c Context) - -type Trace = trace.T - -const ( - _Alias = "_alias_" - _TraceName = "_trace_" - _LoggerName = "_logger_" - _BodyName = "_body_" - _PayloadName = "_payload_" - _GraphPayloadName = "_graph_payload_" - _SessionUserInfo = "_session_user_info" - _AbortErrorName = "_abort_error_" - _IsRecordMetrics = "_is_record_metrics_" -) - -var contextPool = &sync.Pool{ - New: func() interface{} { - return new(context) - }, -} - -func newContext(ctx *gin.Context) Context { - context := contextPool.Get().(*context) - context.ctx = ctx - return context -} - -func releaseContext(ctx Context) { - c := ctx.(*context) - c.ctx = nil - contextPool.Put(c) -} - -var _ Context = (*context)(nil) - -type Context interface { - init() - - // Query returns the keyed url query value if it exists, - // otherwise it returns an empty string `("")`. - // It is shortcut for `c.Request.URL.Query().Get(key)` - // - // GET /path?id=1234&name=Manu&value= - // c.Query("id") == "1234" - // c.Query("name") == "Manu" - // c.Query("value") == "" - // c.Query("wtf") == "" - Query(key string) (value string) - - GetQuery(key string) (string, bool) - - GetQueryArray(key string) (values []string, ok bool) - - ShouldBind(obj any) error - - ShouldBindWith(obj any, b binding.Binding) error - - // ShouldBindQuery 反序列化 querystring - // tag: `form:"xxx"` (注:不要写成 query) - ShouldBindQuery(obj interface{}) error - - // ShouldBindPostForm 反序列化 postform (querystring会被忽略) - // tag: `form:"xxx"` - ShouldBindPostForm(obj interface{}) error - - // ShouldBindForm 同时反序列化 querystring 和 postform; - // 当 querystring 和 postform 存在相同字段时,postform 优先使用。 - // tag: `form:"xxx"` - ShouldBindForm(obj interface{}) error - - // ShouldBindJSON 反序列化 postjson - // tag: `json:"xxx"` - ShouldBindJSON(obj interface{}) error - - // ShouldBindURI 反序列化 path 参数(如路由路径为 /user/:name) - // tag: `uri:"xxx"` - ShouldBindURI(obj interface{}) error - - // Redirect 重定向 - Redirect(code int, location string) - - // Trace 获取 Trace 对象 - Trace() Trace - setTrace(trace Trace) - disableTrace() - - // Logger 获取 Logger 对象 - Logger() *zap.Logger - setLogger(logger *zap.Logger) - - // Payload 正确返回 - Payload(payload interface{}) - getPayload() interface{} - - // GraphPayload GraphQL返回值 与 api 返回结构不同 - GraphPayload(payload interface{}) - getGraphPayload() interface{} - - // HTML 返回界面 - HTML(name string, obj interface{}) - - // AbortWithError 错误返回 - AbortWithError(err BusinessError) - abortError() BusinessError - - // Header 获取 Header 对象 - Header() http.Header - // GetHeader 获取 Header - GetHeader(key string) string - // SetHeader 设置 Header - SetHeader(key, value string) - - // SessionUserInfo 当前用户信息 - SessionUserInfo() proposal.SessionUserInfo - setSessionUserInfo(info proposal.SessionUserInfo) - - // Alias 设置路由别名 for metrics path - Alias() string - setAlias(path string) - - // disableRecordMetrics 设置禁止记录指标 - disableRecordMetrics() - ableRecordMetrics() - isRecordMetrics() bool - - // RequestInputParams 获取所有参数 - RequestInputParams() url.Values - // RequestPostFormParams 获取 PostForm 参数 - RequestPostFormParams() url.Values - // Request 获取 Request 对象 - Request() *http.Request - // RawData 获取 Request.Body - RawData() []byte - // Method 获取 Request.Method - Method() string - // Host 获取 Request.Host - Host() string - // Path 获取 请求的路径 Request.URL.Path (不附带 querystring) - Path() string - // URI 获取 unescape 后的 Request.URL.RequestURI() - URI() string - // RequestContext 获取请求的 context (当 client 关闭后,会自动 canceled) - RequestContext() StdContext - - // ResponseWriter 获取 ResponseWriter 对象 - ResponseWriter() gin.ResponseWriter - - // FormFile returns the first file for the provided form key. - FormFile(name string) (*multipart.FileHeader, error) - - // SaveUploadedFile uploads the form file to specific dst. - SaveUploadedFile(file *multipart.FileHeader, dst string) error -} - -type context struct { - ctx *gin.Context -} - -type StdContext struct { - stdctx.Context - Trace - *zap.Logger -} - -func (c *context) init() { - body, err := c.ctx.GetRawData() - if err != nil { - panic(err) - } - - c.ctx.Set(_BodyName, body) // cache body是为了trace使用 - c.ctx.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body)) // re-construct req body -} - -// Query returns the keyed url query value if it exists, -// otherwise it returns an empty string `("")`. -// It is shortcut for `c.Request.URL.Query().Get(key)` -// -// GET /path?id=1234&name=Manu&value= -// c.Query("id") == "1234" -// c.Query("name") == "Manu" -// c.Query("value") == "" -// c.Query("wtf") == "" -func (c *context) Query(key string) (value string) { - value, _ = c.GetQuery(key) - return -} - -// GetQuery is like Query(), it returns the keyed url query value -// if it exists `(value, true)` (even when the value is an empty string), -// otherwise it returns `("", false)`. -// It is shortcut for `c.Request.URL.Query().Get(key)` -// -// GET /?name=Manu&lastname= -// ("Manu", true) == c.GetQuery("name") -// ("", false) == c.GetQuery("id") -// ("", true) == c.GetQuery("lastname") -func (c *context) GetQuery(key string) (string, bool) { - if values, ok := c.GetQueryArray(key); ok { - return values[0], ok - } - return "", false -} - -// GetQueryArray returns a slice of strings for a given query key, plus -// a boolean value whether at least one value exists for the given key. -func (c *context) GetQueryArray(key string) (values []string, ok bool) { - queryValues := c.initQueryCache() - values, ok = queryValues[key] - return -} - -func (c *context) initQueryCache() url.Values { - if c.ctx.Request != nil { - return c.ctx.Request.URL.Query() - } else { - return url.Values{} - } - -} - -func (c *context) ShouldBind(obj any) error { - b := binding.Default(c.ctx.Request.Method, c.ctx.ContentType()) - return c.ShouldBindWith(obj, b) -} - -func (c *context) ShouldBindWith(obj any, b binding.Binding) error { - return b.Bind(c.ctx.Request, obj) -} - -// ShouldBindQuery 反序列化querystring -// tag: `form:"xxx"` (注:不要写成query) -func (c *context) ShouldBindQuery(obj interface{}) error { - return c.ctx.ShouldBindWith(obj, binding.Query) -} - -// ShouldBindPostForm 反序列化 postform (querystring 会被忽略) -// tag: `form:"xxx"` -func (c *context) ShouldBindPostForm(obj interface{}) error { - return c.ctx.ShouldBindWith(obj, binding.FormPost) -} - -// ShouldBindForm 同时反序列化querystring和postform; -// 当querystring和postform存在相同字段时,postform优先使用。 -// tag: `form:"xxx"` -func (c *context) ShouldBindForm(obj interface{}) error { - return c.ctx.ShouldBindWith(obj, binding.Form) -} - -// ShouldBindJSON 反序列化postjson -// tag: `json:"xxx"` -func (c *context) ShouldBindJSON(obj interface{}) error { - return c.ctx.ShouldBindWith(obj, binding.JSON) -} - -// ShouldBindURI 反序列化path参数(如路由路径为 /user/:name) -// tag: `uri:"xxx"` -func (c *context) ShouldBindURI(obj interface{}) error { - return c.ctx.ShouldBindUri(obj) -} - -// Redirect 重定向 -func (c *context) Redirect(code int, location string) { - c.ctx.Redirect(code, location) -} - -func (c *context) Trace() Trace { - t, ok := c.ctx.Get(_TraceName) - if !ok || t == nil { - return nil - } - - return t.(Trace) -} - -func (c *context) setTrace(trace Trace) { - c.ctx.Set(_TraceName, trace) -} - -func (c *context) disableTrace() { - c.setTrace(nil) -} - -func (c *context) Logger() *zap.Logger { - logger, ok := c.ctx.Get(_LoggerName) - if !ok { - return nil - } - - return logger.(*zap.Logger) -} - -func (c *context) setLogger(logger *zap.Logger) { - c.ctx.Set(_LoggerName, logger) -} - -func (c *context) getPayload() interface{} { - if payload, ok := c.ctx.Get(_PayloadName); ok != false { - return payload - } - return nil -} - -func (c *context) Payload(payload interface{}) { - c.ctx.Set(_PayloadName, payload) -} - -func (c *context) getGraphPayload() interface{} { - if payload, ok := c.ctx.Get(_GraphPayloadName); ok != false { - return payload - } - return nil -} - -func (c *context) GraphPayload(payload interface{}) { - c.ctx.Set(_GraphPayloadName, payload) -} - -func (c *context) HTML(name string, obj interface{}) { - c.ctx.HTML(200, name+".html", obj) -} - -func (c *context) Header() http.Header { - header := c.ctx.Request.Header - - clone := make(http.Header, len(header)) - for k, v := range header { - value := make([]string, len(v)) - copy(value, v) - - clone[k] = value - } - return clone -} - -func (c *context) GetHeader(key string) string { - return c.ctx.GetHeader(key) -} - -func (c *context) SetHeader(key, value string) { - c.ctx.Header(key, value) -} - -func (c *context) SessionUserInfo() proposal.SessionUserInfo { - val, ok := c.ctx.Get(_SessionUserInfo) - if !ok { - return proposal.SessionUserInfo{} - } - - return val.(proposal.SessionUserInfo) -} - -func (c *context) setSessionUserInfo(info proposal.SessionUserInfo) { - c.ctx.Set(_SessionUserInfo, info) -} - -func (c *context) AbortWithError(err BusinessError) { - if err != nil { - httpCode := err.HTTPCode() - if httpCode == 0 { - httpCode = http.StatusInternalServerError - } - - c.ctx.AbortWithStatus(httpCode) - c.ctx.Set(_AbortErrorName, err) - } -} - -func (c *context) abortError() BusinessError { - err, _ := c.ctx.Get(_AbortErrorName) - return err.(BusinessError) -} - -func (c *context) Alias() string { - path, ok := c.ctx.Get(_Alias) - if !ok { - return "" - } - - return path.(string) -} - -func (c *context) setAlias(path string) { - if path = strings.TrimSpace(path); path != "" { - c.ctx.Set(_Alias, path) - } -} - -func (c *context) isRecordMetrics() bool { - isRecordMetrics, ok := c.ctx.Get(_IsRecordMetrics) - if !ok { - return false - } - - return isRecordMetrics.(bool) -} - -func (c *context) ableRecordMetrics() { - c.ctx.Set(_IsRecordMetrics, true) -} - -func (c *context) disableRecordMetrics() { - c.ctx.Set(_IsRecordMetrics, false) -} - -// RequestInputParams 获取所有参数 -func (c *context) RequestInputParams() url.Values { - _ = c.ctx.Request.ParseForm() - return c.ctx.Request.Form -} - -// RequestPostFormParams 获取 PostForm 参数 -func (c *context) RequestPostFormParams() url.Values { - _ = c.ctx.Request.ParseForm() - return c.ctx.Request.PostForm -} - -// Request 获取 Request -func (c *context) Request() *http.Request { - return c.ctx.Request -} - -func (c *context) RawData() []byte { - body, ok := c.ctx.Get(_BodyName) - if !ok { - return nil - } - - return body.([]byte) -} - -// Method 请求的method -func (c *context) Method() string { - return c.ctx.Request.Method -} - -// Host 请求的host -func (c *context) Host() string { - return c.ctx.Request.Host -} - -// Path 请求的路径(不附带querystring) -func (c *context) Path() string { - return c.ctx.Request.URL.Path -} - -// URI unescape后的uri -func (c *context) URI() string { - uri, _ := url.QueryUnescape(c.ctx.Request.URL.RequestURI()) - return uri -} - -// RequestContext (包装 Trace + Logger) 获取请求的 context (当client关闭后,会自动canceled) -func (c *context) RequestContext() StdContext { - return StdContext{ - //c.ctx.Request.Context(), - stdctx.Background(), - c.Trace(), - c.Logger(), - } -} - -// ResponseWriter 获取 ResponseWriter -func (c *context) ResponseWriter() gin.ResponseWriter { - return c.ctx.Writer -} - -// FormFile returns the first file for the provided form key. -func (c *context) FormFile(name string) (*multipart.FileHeader, error) { - if c.ctx.Request.MultipartForm == nil { - // 设置较低的内存限制 8 MiB - if err := c.ctx.Request.ParseMultipartForm(8 << 20); err != nil { - return nil, err - } - } - f, fh, err := c.ctx.Request.FormFile(name) - if err != nil { - return nil, err - } - f.Close() - return fh, err -} - -// SaveUploadedFile uploads the form file to specific dst. -func (c *context) SaveUploadedFile(file *multipart.FileHeader, dst string) error { - src, err := file.Open() - if err != nil { - return err - } - defer src.Close() - - out, err := os.Create(dst) - if err != nil { - return err - } - defer out.Close() - - _, err = io.Copy(out, src) - return err -} diff --git a/internal/pkg/core/core.go b/internal/pkg/core/core.go deleted file mode 100755 index b25f4f1..0000000 --- a/internal/pkg/core/core.go +++ /dev/null @@ -1,574 +0,0 @@ -package core - -import ( - "fmt" - "html/template" - "net/http" - "net/url" - "runtime/debug" - "time" - - "github.com/ch3nnn/webstack-go/assets" - "github.com/ch3nnn/webstack-go/configs" - _ "github.com/ch3nnn/webstack-go/docs" - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/browser" - "github.com/ch3nnn/webstack-go/internal/pkg/color" - "github.com/ch3nnn/webstack-go/internal/pkg/env" - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/pkg/trace" - "github.com/ch3nnn/webstack-go/internal/proposal" - - "github.com/gin-contrib/pprof" - "github.com/gin-gonic/gin" - "github.com/prometheus/client_golang/prometheus/promhttp" - cors "github.com/rs/cors/wrapper/gin" - ginSwagger "github.com/swaggo/gin-swagger" - "github.com/swaggo/gin-swagger/swaggerFiles" - "go.uber.org/multierr" - "go.uber.org/zap" - "golang.org/x/time/rate" -) - -// see https://patorjk.com/software/taag/#p=testall&f=Graffiti&t=go-gin-api -//const _UI = ` -// ██████╗ ██████╗ ██████╗ ██╗███╗ ██╗ █████╗ ██████╗ ██╗ -//██╔════╝ ██╔═══██╗ ██╔════╝ ██║████╗ ██║ ██╔══██╗██╔══██╗██║ -//██║ ███╗██║ ██║█████╗██║ ███╗██║██╔██╗ ██║█████╗███████║██████╔╝██║ -//██║ ██║██║ ██║╚════╝██║ ██║██║██║╚██╗██║╚════╝██╔══██║██╔═══╝ ██║ -//╚██████╔╝╚██████╔╝ ╚██████╔╝██║██║ ╚████║ ██║ ██║██║ ██║ -// ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝ -//` -const _UI = ` -` - -type Option func(*option) - -type option struct { - disablePProf bool - disableSwagger bool - disablePrometheus bool - enableCors bool - enableRate bool - enableOpenBrowser string - alertNotify proposal.NotifyHandler - recordHandler proposal.RecordHandler -} - -// WithDisablePProf 禁用 pprof -func WithDisablePProf() Option { - return func(opt *option) { - opt.disablePProf = true - } -} - -// WithDisableSwagger 禁用 swagger -func WithDisableSwagger() Option { - return func(opt *option) { - opt.disableSwagger = true - } -} - -// WithDisablePrometheus 禁用prometheus -func WithDisablePrometheus() Option { - return func(opt *option) { - opt.disablePrometheus = true - } -} - -// WithAlertNotify 设置告警通知 -func WithAlertNotify(notifyHandler proposal.NotifyHandler) Option { - return func(opt *option) { - opt.alertNotify = notifyHandler - } -} - -// WithRecordMetrics 设置记录接口指标 -func WithRecordMetrics(recordHandler proposal.RecordHandler) Option { - return func(opt *option) { - opt.recordHandler = recordHandler - } -} - -// WithEnableOpenBrowser 启动后在浏览器中打开 uri -func WithEnableOpenBrowser(uri string) Option { - return func(opt *option) { - opt.enableOpenBrowser = uri - } -} - -// WithEnableCors 设置支持跨域 -func WithEnableCors() Option { - return func(opt *option) { - opt.enableCors = true - } -} - -// WithEnableRate 设置支持限流 -func WithEnableRate() Option { - return func(opt *option) { - opt.enableRate = true - } -} - -// DisableTraceLog 禁止记录日志 -func DisableTraceLog(ctx Context) { - ctx.disableTrace() -} - -// DisableRecordMetrics 禁止记录指标 -func DisableRecordMetrics(ctx Context) { - ctx.disableRecordMetrics() -} - -// AliasForRecordMetrics 对请求路径起个别名,用于记录指标。 -// 如:Get /user/:username 这样的路径,因为 username 会有非常多的情况,这样记录指标非常不友好。 -func AliasForRecordMetrics(path string) HandlerFunc { - return func(ctx Context) { - ctx.setAlias(path) - } -} - -// WrapAuthHandler 用来处理 Auth 的入口 -func WrapAuthHandler(handler func(Context) (sessionUserInfo proposal.SessionUserInfo, err BusinessError)) HandlerFunc { - return func(ctx Context) { - sessionUserInfo, err := handler(ctx) - if err != nil { - ctx.AbortWithError(err) - return - } - - ctx.setSessionUserInfo(sessionUserInfo) - } -} - -// RouterGroup 包装gin的RouterGroup -type RouterGroup interface { - Group(string, ...HandlerFunc) RouterGroup - IRoutes -} - -var _ IRoutes = (*router)(nil) - -// IRoutes 包装gin的IRoutes -type IRoutes interface { - Any(string, ...HandlerFunc) - GET(string, ...HandlerFunc) - POST(string, ...HandlerFunc) - DELETE(string, ...HandlerFunc) - PATCH(string, ...HandlerFunc) - PUT(string, ...HandlerFunc) - OPTIONS(string, ...HandlerFunc) - HEAD(string, ...HandlerFunc) -} - -type router struct { - group *gin.RouterGroup -} - -func (r *router) Group(relativePath string, handlers ...HandlerFunc) RouterGroup { - group := r.group.Group(relativePath, wrapHandlers(handlers...)...) - return &router{group: group} -} - -func (r *router) Any(relativePath string, handlers ...HandlerFunc) { - r.group.Any(relativePath, wrapHandlers(handlers...)...) -} - -func (r *router) GET(relativePath string, handlers ...HandlerFunc) { - r.group.GET(relativePath, wrapHandlers(handlers...)...) -} - -func (r *router) POST(relativePath string, handlers ...HandlerFunc) { - r.group.POST(relativePath, wrapHandlers(handlers...)...) -} - -func (r *router) DELETE(relativePath string, handlers ...HandlerFunc) { - r.group.DELETE(relativePath, wrapHandlers(handlers...)...) -} - -func (r *router) PATCH(relativePath string, handlers ...HandlerFunc) { - r.group.PATCH(relativePath, wrapHandlers(handlers...)...) -} - -func (r *router) PUT(relativePath string, handlers ...HandlerFunc) { - r.group.PUT(relativePath, wrapHandlers(handlers...)...) -} - -func (r *router) OPTIONS(relativePath string, handlers ...HandlerFunc) { - r.group.OPTIONS(relativePath, wrapHandlers(handlers...)...) -} - -func (r *router) HEAD(relativePath string, handlers ...HandlerFunc) { - r.group.HEAD(relativePath, wrapHandlers(handlers...)...) -} - -func wrapHandlers(handlers ...HandlerFunc) []gin.HandlerFunc { - funcs := make([]gin.HandlerFunc, len(handlers)) - for i, handler := range handlers { - handler := handler - funcs[i] = func(c *gin.Context) { - ctx := newContext(c) - defer releaseContext(ctx) - - handler(ctx) - } - } - - return funcs -} - -var _ Mux = (*mux)(nil) - -// Mux http mux -type Mux interface { - http.Handler - Group(relativePath string, handlers ...HandlerFunc) RouterGroup -} - -type mux struct { - engine *gin.Engine -} - -func (m *mux) ServeHTTP(w http.ResponseWriter, req *http.Request) { - m.engine.ServeHTTP(w, req) -} - -func (m *mux) Group(relativePath string, handlers ...HandlerFunc) RouterGroup { - return &router{ - group: m.engine.Group(relativePath, wrapHandlers(handlers...)...), - } -} - -func New(logger *zap.Logger, options ...Option) (Mux, error) { - if logger == nil { - return nil, errors.New("logger required") - } - - gin.SetMode(gin.ReleaseMode) - mux := &mux{ - engine: gin.New(), - } - - fmt.Println(color.Blue(_UI)) - - // 配置上传静态文件 - mux.engine.Static("upload", "assets/upload") - // 配置静态文件 - mux.engine.StaticFS("assets", http.FS(assets.Bootstrap)) - // 配置模板 - mux.engine.SetHTMLTemplate(template.Must(template.New("").ParseFS(assets.Templates, "templates/**/*"))) - - // withoutTracePaths 这些请求,默认不记录日志 - withoutTracePaths := map[string]bool{ - "/metrics": true, - - "/debug/pprof/": true, - "/debug/pprof/cmdline": true, - "/debug/pprof/profile": true, - "/debug/pprof/symbol": true, - "/debug/pprof/trace": true, - "/debug/pprof/allocs": true, - "/debug/pprof/block": true, - "/debug/pprof/goroutine": true, - "/debug/pprof/heap": true, - "/debug/pprof/mutex": true, - "/debug/pprof/threadcreate": true, - - "/favicon.ico": true, - - "/system/health": true, - } - - opt := new(option) - for _, f := range options { - f(opt) - } - - if !opt.disablePProf { - if !env.Active().IsPro() { - pprof.Register(mux.engine) // register pprof to gin - } - } - - if !opt.disableSwagger { - if !env.Active().IsPro() { - mux.engine.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) // register swagger - } - } - - if !opt.disablePrometheus { - mux.engine.GET("/metrics", gin.WrapH(promhttp.Handler())) // register prometheus - } - - if opt.enableCors { - mux.engine.Use(cors.New(cors.Options{ - AllowedOrigins: []string{"*"}, - AllowedMethods: []string{ - http.MethodHead, - http.MethodGet, - http.MethodPost, - http.MethodPut, - http.MethodPatch, - http.MethodDelete, - }, - AllowedHeaders: []string{"*"}, - AllowCredentials: true, - OptionsPassthrough: true, - })) - } - - if opt.enableOpenBrowser != "" { - _ = browser.Open(opt.enableOpenBrowser) - } - - // recover两次,防止处理时发生panic,尤其是在OnPanicNotify中。 - mux.engine.Use(func(ctx *gin.Context) { - defer func() { - if err := recover(); err != nil { - logger.Error("got panic", zap.String("panic", fmt.Sprintf("%+v", err)), zap.String("stack", string(debug.Stack()))) - } - }() - - ctx.Next() - }) - - mux.engine.Use(func(ctx *gin.Context) { - - if ctx.Writer.Status() == http.StatusNotFound { - return - } - - ts := time.Now() - - context := newContext(ctx) - defer releaseContext(context) - - context.init() - context.setLogger(logger) - context.ableRecordMetrics() - - if !withoutTracePaths[ctx.Request.URL.Path] { - if traceId := context.GetHeader(trace.Header); traceId != "" { - context.setTrace(trace.New(traceId)) - } else { - context.setTrace(trace.New("")) - } - } - - defer func() { - var ( - response interface{} - businessCode int - businessCodeMsg string - abortErr error - traceId string - graphResponse interface{} - ) - - if ct := context.Trace(); ct != nil { - context.SetHeader(trace.Header, ct.ID()) - traceId = ct.ID() - } - - // region 发生 Panic 异常发送告警提醒 - if err := recover(); err != nil { - stackInfo := string(debug.Stack()) - logger.Error("got panic", zap.String("panic", fmt.Sprintf("%+v", err)), zap.String("stack", stackInfo)) - context.AbortWithError(Error( - http.StatusInternalServerError, - code.ServerError, - code.Text(code.ServerError)), - ) - - if notifyHandler := opt.alertNotify; notifyHandler != nil { - notifyHandler(&proposal.AlertMessage{ - ProjectName: configs.ProjectName, - Env: env.Active().Value(), - TraceID: traceId, - HOST: context.Host(), - URI: context.URI(), - Method: context.Method(), - ErrorMessage: err, - ErrorStack: stackInfo, - Timestamp: time.Now(), - }) - } - } - // endregion - - // region 发生错误,进行返回 - if ctx.IsAborted() { - for i := range ctx.Errors { - multierr.AppendInto(&abortErr, ctx.Errors[i]) - } - - if err := context.abortError(); err != nil { // customer err - // 判断是否需要发送告警通知 - if err.IsAlert() { - if notifyHandler := opt.alertNotify; notifyHandler != nil { - notifyHandler(&proposal.AlertMessage{ - ProjectName: configs.ProjectName, - Env: env.Active().Value(), - TraceID: traceId, - HOST: context.Host(), - URI: context.URI(), - Method: context.Method(), - ErrorMessage: err.Message(), - ErrorStack: fmt.Sprintf("%+v", err.StackError()), - Timestamp: time.Now(), - }) - } - } - - multierr.AppendInto(&abortErr, err.StackError()) - businessCode = err.BusinessCode() - businessCodeMsg = err.Message() - response = &code.Failure{ - Code: businessCode, - Message: businessCodeMsg, - } - ctx.JSON(err.HTTPCode(), response) - } - } - // endregion - - // region 正确返回 - response = context.getPayload() - if response != nil { - ctx.JSON(http.StatusOK, response) - } - // endregion - - // region 记录指标 - if opt.recordHandler != nil && context.isRecordMetrics() { - path := context.Path() - if alias := context.Alias(); alias != "" { - path = alias - } - - opt.recordHandler(&proposal.MetricsMessage{ - ProjectName: configs.ProjectName, - Env: env.Active().Value(), - TraceID: traceId, - HOST: context.Host(), - Path: path, - Method: context.Method(), - HTTPCode: ctx.Writer.Status(), - BusinessCode: businessCode, - CostSeconds: time.Since(ts).Seconds(), - IsSuccess: !ctx.IsAborted() && (ctx.Writer.Status() == http.StatusOK), - }) - } - // endregion - - // region 记录日志 - var t *trace.Trace - if x := context.Trace(); x != nil { - t = x.(*trace.Trace) - } else { - return - } - - decodedURL, _ := url.QueryUnescape(ctx.Request.URL.RequestURI()) - - // ctx.Request.Header,精简 Header 参数 - traceHeader := map[string]string{ - "Content-Type": ctx.GetHeader("Content-Type"), - configs.HeaderLoginToken: ctx.GetHeader(configs.HeaderLoginToken), - configs.HeaderSignToken: ctx.GetHeader(configs.HeaderSignToken), - configs.HeaderSignTokenDate: ctx.GetHeader(configs.HeaderSignTokenDate), - } - - t.WithRequest(&trace.Request{ - TTL: "un-limit", - Method: ctx.Request.Method, - DecodedURL: decodedURL, - Header: traceHeader, - Body: string(context.RawData()), - }) - - var responseBody interface{} - - if response != nil { - responseBody = response - } - - graphResponse = context.getGraphPayload() - if graphResponse != nil { - responseBody = graphResponse - } - - t.WithResponse(&trace.Response{ - Header: ctx.Writer.Header(), - HttpCode: ctx.Writer.Status(), - HttpCodeMsg: http.StatusText(ctx.Writer.Status()), - BusinessCode: businessCode, - BusinessCodeMsg: businessCodeMsg, - Body: responseBody, - CostSeconds: time.Since(ts).Seconds(), - }) - - t.Success = !ctx.IsAborted() && (ctx.Writer.Status() == http.StatusOK) - t.CostSeconds = time.Since(ts).Seconds() - - logger.Info("trace-log", - zap.Any("method", ctx.Request.Method), - zap.Any("path", decodedURL), - zap.Any("http_code", ctx.Writer.Status()), - zap.Any("business_code", businessCode), - zap.Any("success", t.Success), - zap.Any("cost_seconds", t.CostSeconds), - zap.Any("trace_id", t.Identifier), - zap.Any("trace_info", t), - zap.Error(abortErr), - ) - // endregion - }() - - ctx.Next() - }) - - if opt.enableRate { - limiter := rate.NewLimiter(rate.Every(time.Second*1), configs.MaxRequestsPerSecond) - mux.engine.Use(func(ctx *gin.Context) { - context := newContext(ctx) - defer releaseContext(context) - - if !limiter.Allow() { - context.AbortWithError(Error( - http.StatusTooManyRequests, - code.TooManyRequests, - code.Text(code.TooManyRequests)), - ) - return - } - - ctx.Next() - }) - } - - mux.engine.NoMethod(wrapHandlers(DisableTraceLog)...) - mux.engine.NoRoute(wrapHandlers(DisableTraceLog)...) - - system := mux.Group("/system") - { - // 健康检查 - system.GET("/health", func(ctx Context) { - resp := &struct { - Timestamp time.Time `json:"timestamp"` - Environment string `json:"environment"` - Host string `json:"host"` - Status string `json:"status"` - }{ - Timestamp: time.Now(), - Environment: env.Active().Value(), - Host: ctx.Host(), - Status: "ok", - } - ctx.Payload(resp) - }) - } - - return mux, nil -} diff --git a/internal/pkg/core/error.go b/internal/pkg/core/error.go deleted file mode 100755 index 903fda3..0000000 --- a/internal/pkg/core/error.go +++ /dev/null @@ -1,82 +0,0 @@ -package core - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/errors" -) - -var _ BusinessError = (*businessError)(nil) - -type BusinessError interface { - // i 为了避免被其他包实现 - i() - - // WithError 设置错误信息 - WithError(err error) BusinessError - - // WithAlert 设置告警通知 - WithAlert() BusinessError - - // BusinessCode 获取业务码 - BusinessCode() int - - // HTTPCode 获取 HTTP 状态码 - HTTPCode() int - - // Message 获取错误描述 - Message() string - - // StackError 获取带堆栈的错误信息 - StackError() error - - // IsAlert 是否开启告警通知 - IsAlert() bool -} - -type businessError struct { - httpCode int // HTTP 状态码 - businessCode int // 业务码 - message string // 错误描述 - stackError error // 含有堆栈信息的错误 - isAlert bool // 是否告警通知 -} - -func Error(httpCode, businessCode int, message string) BusinessError { - return &businessError{ - httpCode: httpCode, - businessCode: businessCode, - message: message, - isAlert: false, - } -} - -func (e *businessError) i() {} - -func (e *businessError) WithError(err error) BusinessError { - e.stackError = errors.WithStack(err) - return e -} - -func (e *businessError) WithAlert() BusinessError { - e.isAlert = true - return e -} - -func (e *businessError) HTTPCode() int { - return e.httpCode -} - -func (e *businessError) BusinessCode() int { - return e.businessCode -} - -func (e *businessError) Message() string { - return e.message -} - -func (e *businessError) StackError() error { - return e.stackError -} - -func (e *businessError) IsAlert() bool { - return e.isAlert -} diff --git a/internal/pkg/env/env.go b/internal/pkg/env/env.go deleted file mode 100644 index 4a2ea52..0000000 --- a/internal/pkg/env/env.go +++ /dev/null @@ -1,85 +0,0 @@ -package env - -import ( - "flag" - "fmt" - "strings" -) - -var ( - active Environment - dev Environment = &environment{value: "dev"} - fat Environment = &environment{value: "fat"} - uat Environment = &environment{value: "uat"} - pro Environment = &environment{value: "pro"} - docker Environment = &environment{value: "docker"} -) - -var _ Environment = (*environment)(nil) - -// Environment 环境配置 -type Environment interface { - Value() string - IsDev() bool - IsFat() bool - IsUat() bool - IsPro() bool - IsDocker() bool - t() -} - -type environment struct { - value string -} - -func (e *environment) Value() string { - return e.value -} - -func (e *environment) IsDev() bool { - return e.value == "dev" -} - -func (e *environment) IsFat() bool { - return e.value == "fat" -} - -func (e *environment) IsUat() bool { - return e.value == "uat" -} - -func (e *environment) IsPro() bool { - return e.value == "pro" -} - -func (e *environment) IsDocker() bool { - return e.value == "docker" -} - -func (e *environment) t() {} - -func init() { - env := flag.String("env", "", "请输入运行环境:\n dev:开发环境\n fat:测试环境\n uat:预上线环境\n pro:正式环境\n docker:容器环境\n") - flag.Parse() - - switch strings.ToLower(strings.TrimSpace(*env)) { - case "dev": - active = dev - case "fat": - active = fat - case "uat": - active = uat - case "pro": - active = pro - case "docker": - active = docker - default: - active = fat - fmt.Println("Warning: '-env' cannot be found, or it is illegal. The default 'fat' will be used.") - } -} - -// Active 当前配置的env -func Active() Environment { - return active -} diff --git a/internal/pkg/errors/err.go b/internal/pkg/errors/err.go deleted file mode 100644 index 935e367..0000000 --- a/internal/pkg/errors/err.go +++ /dev/null @@ -1,100 +0,0 @@ -package errors - -import ( - "fmt" - "io" - "runtime" - - "github.com/pkg/errors" -) - -func callers() []uintptr { - var pcs [32]uintptr - l := runtime.Callers(3, pcs[:]) - return pcs[:l] -} - -// Error a error with caller stack information -type Error interface { - error - t() -} - -var _ Error = (*item)(nil) -var _ fmt.Formatter = (*item)(nil) - -type item struct { - msg string - stack []uintptr -} - -func (i *item) Error() string { - return i.msg -} - -func (i *item) t() {} - -// Format used by go.uber.org/zap in Verbose -func (i *item) Format(s fmt.State, verb rune) { - io.WriteString(s, i.msg) - io.WriteString(s, "\n") - - for _, pc := range i.stack { - fmt.Fprintf(s, "%+v\n", errors.Frame(pc)) - } -} - -// New create a new error -func New(msg string) Error { - return &item{msg: msg, stack: callers()} -} - -// Errorf create a new error -func Errorf(format string, args ...interface{}) Error { - return &item{msg: fmt.Sprintf(format, args...), stack: callers()} -} - -// Wrap with some extra message into err -func Wrap(err error, msg string) Error { - if err == nil { - return nil - } - - e, ok := err.(*item) - if !ok { - return &item{msg: fmt.Sprintf("%s; %s", msg, err.Error()), stack: callers()} - } - - e.msg = fmt.Sprintf("%s; %s", msg, e.msg) - return e -} - -// Wrapf with some extra message into err -func Wrapf(err error, format string, args ...interface{}) Error { - if err == nil { - return nil - } - - msg := fmt.Sprintf(format, args...) - - e, ok := err.(*item) - if !ok { - return &item{msg: fmt.Sprintf("%s; %s", msg, err.Error()), stack: callers()} - } - - e.msg = fmt.Sprintf("%s; %s", msg, e.msg) - return e -} - -// WithStack add caller stack information -func WithStack(err error) Error { - if err == nil { - return nil - } - - if e, ok := err.(*item); ok { - return e - } - - return &item{msg: err.Error(), stack: callers()} -} diff --git a/internal/pkg/file/file.go b/internal/pkg/file/file.go deleted file mode 100644 index b91664e..0000000 --- a/internal/pkg/file/file.go +++ /dev/null @@ -1,189 +0,0 @@ -package file - -import ( - "bytes" - "fmt" - "io" - "os" -) - -var ( - buffSize = 1 << 20 -) - -// ReadLineFromEnd -- -type ReadLineFromEnd struct { - f *os.File - - fileSize int - bwr *bytes.Buffer - lineBuff []byte - swapBuff []byte - - isFirst bool -} - -// IsExists 文件是否存在 -func IsExists(path string) (os.FileInfo, bool) { - f, err := os.Stat(path) - return f, err == nil || os.IsExist(err) -} - -// NewReadLineFromEnd 从末尾读取文件内容 -func NewReadLineFromEnd(filename string) (rd *ReadLineFromEnd, err error) { - f, err := os.Open(filename) - if err != nil { - return nil, err - } - - info, err := f.Stat() - if err != nil { - return nil, err - } - - if info.IsDir() { - return nil, fmt.Errorf("not file") - } - - fileSize := int(info.Size()) - - rd = &ReadLineFromEnd{ - f: f, - fileSize: fileSize, - bwr: bytes.NewBuffer([]byte{}), - lineBuff: make([]byte, 0), - swapBuff: make([]byte, buffSize), - isFirst: true, - } - return rd, nil -} - -// ReadLine 结尾包含'\n' -func (c *ReadLineFromEnd) ReadLine() (line []byte, err error) { - var ok bool - for { - ok, err = c.buff() - if err != nil { - return nil, err - } - if ok { - break - } - } - line, err = c.bwr.ReadBytes('\n') - if err == io.EOF && c.fileSize > 0 { - err = nil - } - return line, err -} - -// Close -- -func (c *ReadLineFromEnd) Close() (err error) { - return c.f.Close() -} - -func (c *ReadLineFromEnd) buff() (ok bool, err error) { - if c.fileSize == 0 { - return true, nil - } - - if c.bwr.Len() >= buffSize { - return true, nil - } - - offset := 0 - if c.fileSize > buffSize { - offset = c.fileSize - buffSize - } - _, err = c.f.Seek(int64(offset), 0) - if err != nil { - return false, err - } - - n, err := c.f.Read(c.swapBuff) - if err != nil && err != io.EOF { - return false, err - } - if c.fileSize < n { - n = c.fileSize - } - if n == 0 { - return true, nil - } - - for { - m := bytes.LastIndex(c.swapBuff[:n], []byte{'\n'}) - if m == -1 { - break - } - if m < n-1 { - err = c.writeLine(c.swapBuff[m+1 : n]) - if err != nil { - return false, err - } - ok = true - } else if m == n-1 && !c.isFirst { - err = c.writeLine(nil) - if err != nil { - return false, err - } - ok = true - } - n = m - if n == 0 { - break - } - } - if n > 0 { - reverseBytes(c.swapBuff[:n]) - c.lineBuff = append(c.lineBuff, c.swapBuff[:n]...) - } - if offset == 0 { - err = c.writeLine(nil) - if err != nil { - return false, err - } - ok = true - } - c.fileSize = offset - if c.isFirst { - c.isFirst = false - } - return ok, nil -} - -func (c *ReadLineFromEnd) writeLine(b []byte) (err error) { - if len(b) > 0 { - _, err = c.bwr.Write(b) - if err != nil { - return err - } - } - if len(c.lineBuff) > 0 { - reverseBytes(c.lineBuff) - _, err = c.bwr.Write(c.lineBuff) - if err != nil { - return err - } - c.lineBuff = c.lineBuff[:0] - } - _, err = c.bwr.Write([]byte{'\n'}) - if err != nil { - return err - } - return nil -} - -func reverseBytes(b []byte) { - n := len(b) - if n <= 1 { - return - } - for i := 0; i < n; i++ { - k := n - 1 - if k != i { - b[i], b[k] = b[k], b[i] - } - n-- - } -} diff --git a/internal/pkg/hash/hash.go b/internal/pkg/hash/hash.go deleted file mode 100644 index 8072acb..0000000 --- a/internal/pkg/hash/hash.go +++ /dev/null @@ -1,27 +0,0 @@ -package hash - -var _ Hash = (*hash)(nil) - -type Hash interface { - i() - - // HashidsEncode 加密 - HashidsEncode(params []int) (string, error) - - // HashidsDecode 解密 - HashidsDecode(hash string) ([]int, error) -} - -type hash struct { - secret string - length int -} - -func New(secret string, length int) Hash { - return &hash{ - secret: secret, - length: length, - } -} - -func (h *hash) i() {} diff --git a/internal/pkg/hash/hash_hashids.go b/internal/pkg/hash/hash_hashids.go deleted file mode 100644 index 6354dc9..0000000 --- a/internal/pkg/hash/hash_hashids.go +++ /dev/null @@ -1,29 +0,0 @@ -package hash - -import "github.com/speps/go-hashids" - -func (h *hash) HashidsEncode(params []int) (string, error) { - hd := hashids.NewData() - hd.Salt = h.secret - hd.MinLength = h.length - - hashStr, err := hashids.NewWithData(hd).Encode(params) - if err != nil { - return "", err - } - - return hashStr, nil -} - -func (h *hash) HashidsDecode(hash string) ([]int, error) { - hd := hashids.NewData() - hd.Salt = h.secret - hd.MinLength = h.length - - ids, err := hashids.NewWithData(hd).DecodeWithError(hash) - if err != nil { - return nil, err - } - - return ids, nil -} diff --git a/internal/pkg/logger/logger.go b/internal/pkg/logger/logger.go deleted file mode 100644 index f411723..0000000 --- a/internal/pkg/logger/logger.go +++ /dev/null @@ -1,246 +0,0 @@ -package logger - -import ( - "gopkg.in/natefinch/lumberjack.v2" - "io" - "os" - "path/filepath" - "time" - - "go.uber.org/zap" - "go.uber.org/zap/zapcore" -) - -const ( - // DefaultLevel the default log level - DefaultLevel = zapcore.InfoLevel - - // DefaultTimeLayout the default time layout; - DefaultTimeLayout = time.RFC3339 -) - -// Option custom setup config -type Option func(*option) - -type option struct { - level zapcore.Level - fields map[string]string - file io.Writer - timeLayout string - disableConsole bool -} - -// WithDebugLevel only greater than 'level' will output -func WithDebugLevel() Option { - return func(opt *option) { - opt.level = zapcore.DebugLevel - } -} - -// WithInfoLevel only greater than 'level' will output -func WithInfoLevel() Option { - return func(opt *option) { - opt.level = zapcore.InfoLevel - } -} - -// WithWarnLevel only greater than 'level' will output -func WithWarnLevel() Option { - return func(opt *option) { - opt.level = zapcore.WarnLevel - } -} - -// WithErrorLevel only greater than 'level' will output -func WithErrorLevel() Option { - return func(opt *option) { - opt.level = zapcore.ErrorLevel - } -} - -// WithField add some field(s) to log -func WithField(key, value string) Option { - return func(opt *option) { - opt.fields[key] = value - } -} - -// WithFileP write log to some file -func WithFileP(file string) Option { - dir := filepath.Dir(file) - if err := os.MkdirAll(dir, 0766); err != nil { - panic(err) - } - - f, err := os.OpenFile(file, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0766) - if err != nil { - panic(err) - } - - return func(opt *option) { - opt.file = zapcore.Lock(f) - } -} - -// WithFileRotationP write log to some file with rotation -func WithFileRotationP(file string) Option { - dir := filepath.Dir(file) - if err := os.MkdirAll(dir, 0766); err != nil { - panic(err) - } - - return func(opt *option) { - opt.file = &lumberjack.Logger{ // concurrent-safed - Filename: file, // 文件路径 - MaxSize: 128, // 单个文件最大尺寸,默认单位 M - MaxBackups: 300, // 最多保留 300 个备份 - MaxAge: 30, // 最大时间,默认单位 day - LocalTime: true, // 使用本地时间 - Compress: true, // 是否压缩 disabled by default - } - } -} - -// WithTimeLayout custom time format -func WithTimeLayout(timeLayout string) Option { - return func(opt *option) { - opt.timeLayout = timeLayout - } -} - -// WithDisableConsole WithEnableConsole write log to os.Stdout or os.Stderr -func WithDisableConsole() Option { - return func(opt *option) { - opt.disableConsole = true - } -} - -// NewJSONLogger return a json-encoder zap logger, -func NewJSONLogger(opts ...Option) (*zap.Logger, error) { - opt := &option{level: DefaultLevel, fields: make(map[string]string)} - for _, f := range opts { - f(opt) - } - - timeLayout := DefaultTimeLayout - if opt.timeLayout != "" { - timeLayout = opt.timeLayout - } - - // similar to zap.NewProductionEncoderConfig() - encoderConfig := zapcore.EncoderConfig{ - TimeKey: "time", - LevelKey: "level", - NameKey: "logger", // used by logger.Named(key); optional; useless - CallerKey: "caller", - MessageKey: "msg", - StacktraceKey: "stacktrace", // use by zap.AddStacktrace; optional; useless - LineEnding: zapcore.DefaultLineEnding, - EncodeLevel: zapcore.LowercaseLevelEncoder, // 小写编码器 - EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) { - enc.AppendString(t.Format(timeLayout)) - }, - EncodeDuration: zapcore.MillisDurationEncoder, - EncodeCaller: zapcore.ShortCallerEncoder, // 全路径编码器 - } - - jsonEncoder := zapcore.NewJSONEncoder(encoderConfig) - - // lowPriority usd by info\debug\warn - lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { - return lvl >= opt.level && lvl < zapcore.ErrorLevel - }) - - // highPriority usd by error\panic\fatal - highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { - return lvl >= opt.level && lvl >= zapcore.ErrorLevel - }) - - stdout := zapcore.Lock(os.Stdout) // lock for concurrent safe - stderr := zapcore.Lock(os.Stderr) // lock for concurrent safe - - core := zapcore.NewTee() - - if !opt.disableConsole { - core = zapcore.NewTee( - zapcore.NewCore(jsonEncoder, - zapcore.NewMultiWriteSyncer(stdout), - lowPriority, - ), - zapcore.NewCore(jsonEncoder, - zapcore.NewMultiWriteSyncer(stderr), - highPriority, - ), - ) - } - - if opt.file != nil { - core = zapcore.NewTee(core, - zapcore.NewCore(jsonEncoder, - zapcore.AddSync(opt.file), - zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { - return lvl >= opt.level - }), - ), - ) - } - - logger := zap.New(core, - zap.AddCaller(), - zap.ErrorOutput(stderr), - ) - - for key, value := range opt.fields { - logger = logger.WithOptions(zap.Fields(zapcore.Field{Key: key, Type: zapcore.StringType, String: value})) - } - return logger, nil -} - -var _ Meta = (*meta)(nil) - -// Meta key-value -type Meta interface { - Key() string - Value() interface{} - meta() -} - -type meta struct { - key string - value interface{} -} - -func (m *meta) Key() string { - return m.key -} - -func (m *meta) Value() interface{} { - return m.value -} - -func (m *meta) meta() {} - -// NewMeta create meat -func NewMeta(key string, value interface{}) Meta { - return &meta{key: key, value: value} -} - -// WrapMeta wrap meta to zap fields -func WrapMeta(err error, metas ...Meta) (fields []zap.Field) { - capacity := len(metas) + 1 // namespace meta - if err != nil { - capacity++ - } - - fields = make([]zap.Field, 0, capacity) - if err != nil { - fields = append(fields, zap.Error(err)) - } - - fields = append(fields, zap.Namespace("meta")) - for _, meta := range metas { - fields = append(fields, zap.Any(meta.Key(), meta.Value())) - } - - return -} diff --git a/internal/pkg/mail/mail.go b/internal/pkg/mail/mail.go deleted file mode 100644 index f2e3f17..0000000 --- a/internal/pkg/mail/mail.go +++ /dev/null @@ -1,38 +0,0 @@ -package mail - -import ( - "gopkg.in/gomail.v2" - "strings" -) - -type Options struct { - MailHost string - MailPort int - MailUser string // 发件人 - MailPass string // 发件人密码 - MailTo string // 收件人 多个用,分割 - Subject string // 邮件主题 - Body string // 邮件内容 -} - -func Send(o *Options) error { - - m := gomail.NewMessage() - - //设置发件人 - m.SetHeader("From", o.MailUser) - - //设置发送给多个用户 - mailArrTo := strings.Split(o.MailTo, ",") - m.SetHeader("To", mailArrTo...) - - //设置邮件主题 - m.SetHeader("Subject", o.Subject) - - //设置邮件正文 - m.SetBody("text/html", o.Body) - - d := gomail.NewDialer(o.MailHost, o.MailPort, o.MailUser, o.MailPass) - - return d.DialAndSend(m) -} diff --git a/internal/pkg/password/password.go b/internal/pkg/password/password.go deleted file mode 100755 index b9b8b36..0000000 --- a/internal/pkg/password/password.go +++ /dev/null @@ -1,46 +0,0 @@ -package password - -import ( - "crypto/hmac" - "crypto/md5" - "crypto/sha256" - "encoding/hex" - "fmt" -) - -const ( - saltPassword = "qkhPAGA13HocW3GAEWwb" - defaultPassword = "123456" -) - -func GeneratePassword(str string) (password string) { - // md5 - m := md5.New() - m.Write([]byte(str)) - mByte := m.Sum(nil) - - // hmac - h := hmac.New(sha256.New, []byte(saltPassword)) - h.Write(mByte) - password = hex.EncodeToString(h.Sum(nil)) - - return -} - -func ResetPassword() (password string) { - m := md5.New() - m.Write([]byte(defaultPassword)) - mStr := hex.EncodeToString(m.Sum(nil)) - - password = GeneratePassword(mStr) - - return -} - -func GenerateLoginToken(id int64) (token string) { - m := md5.New() - m.Write([]byte(fmt.Sprintf("%d%s", id, saltPassword))) - token = hex.EncodeToString(m.Sum(nil)) - - return -} diff --git a/internal/pkg/shutdown/shutdown.go b/internal/pkg/shutdown/shutdown.go deleted file mode 100644 index 12c853b..0000000 --- a/internal/pkg/shutdown/shutdown.go +++ /dev/null @@ -1,50 +0,0 @@ -package shutdown - -import ( - "os" - "os/signal" - "syscall" -) - -var _ Hook = (*hook)(nil) - -// Hook a graceful shutdown hook, default with signals of SIGINT and SIGTERM -type Hook interface { - // WithSignals add more signals into hook - WithSignals(signals ...syscall.Signal) Hook - - // Close register shutdown handles - Close(funcs ...func()) -} - -type hook struct { - ctx chan os.Signal -} - -// NewHook create a Hook instance -func NewHook() Hook { - hook := &hook{ - ctx: make(chan os.Signal, 1), - } - - return hook.WithSignals(syscall.SIGINT, syscall.SIGTERM) -} - -func (h *hook) WithSignals(signals ...syscall.Signal) Hook { - for _, s := range signals { - signal.Notify(h.ctx, s) - } - - return h -} - -func (h *hook) Close(funcs ...func()) { - select { - case <-h.ctx: - } - signal.Stop(h.ctx) - - for _, f := range funcs { - f() - } -} diff --git a/internal/pkg/signature/signature.go b/internal/pkg/signature/signature.go deleted file mode 100644 index f3d5058..0000000 --- a/internal/pkg/signature/signature.go +++ /dev/null @@ -1,52 +0,0 @@ -package signature - -import ( - "net/http" - "net/url" - "time" -) - -var _ Signature = (*signature)(nil) - -const ( - delimiter = "|" -) - -// 合法的 Methods -var methods = map[string]bool{ - http.MethodGet: true, - http.MethodPost: true, - http.MethodHead: true, - http.MethodPut: true, - http.MethodPatch: true, - http.MethodDelete: true, - http.MethodConnect: true, - http.MethodOptions: true, - http.MethodTrace: true, -} - -type Signature interface { - i() - - // Generate 生成签名 - Generate(path string, method string, params url.Values) (authorization, date string, err error) - - // Verify 验证签名 - Verify(authorization, date string, path string, method string, params url.Values) (ok bool, err error) -} - -type signature struct { - key string - secret string - ttl time.Duration -} - -func New(key, secret string, ttl time.Duration) Signature { - return &signature{ - key: key, - secret: secret, - ttl: ttl, - } -} - -func (s *signature) i() {} diff --git a/internal/pkg/signature/signature_generate.go b/internal/pkg/signature/signature_generate.go deleted file mode 100644 index cfc396d..0000000 --- a/internal/pkg/signature/signature_generate.go +++ /dev/null @@ -1,62 +0,0 @@ -package signature - -import ( - "bytes" - "crypto/hmac" - "crypto/sha256" - "encoding/base64" - "fmt" - "net/url" - "strings" - - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/pkg/timeutil" -) - -// Generate -// path 请求的路径 (不附带 querystring) -func (s *signature) Generate(path string, method string, params url.Values) (authorization, date string, err error) { - if path == "" { - err = errors.New("path required") - return - } - - if method == "" { - err = errors.New("method required") - return - } - - methodName := strings.ToUpper(method) - if !methods[methodName] { - err = errors.New("method param error") - return - } - - // Date - date = timeutil.CSTLayoutString() - - // Encode() 方法中自带 sorted by key - sortParamsEncode, err := url.QueryUnescape(params.Encode()) - if err != nil { - err = errors.Errorf("url QueryUnescape error %v", err) - return - } - - // 加密字符串规则 - buffer := bytes.NewBuffer(nil) - buffer.WriteString(path) - buffer.WriteString(delimiter) - buffer.WriteString(methodName) - buffer.WriteString(delimiter) - buffer.WriteString(sortParamsEncode) - buffer.WriteString(delimiter) - buffer.WriteString(date) - - // 对数据进行 sha256 加密,并进行 base64 encode - hash := hmac.New(sha256.New, []byte(s.secret)) - hash.Write(buffer.Bytes()) - digest := base64.StdEncoding.EncodeToString(hash.Sum(nil)) - - authorization = fmt.Sprintf("%s %s", s.key, digest) - return -} diff --git a/internal/pkg/signature/signature_verify.go b/internal/pkg/signature/signature_verify.go deleted file mode 100644 index 55df950..0000000 --- a/internal/pkg/signature/signature_verify.go +++ /dev/null @@ -1,73 +0,0 @@ -package signature - -import ( - "bytes" - "crypto/hmac" - "crypto/sha256" - "encoding/base64" - "fmt" - "net/url" - "strings" - "time" - - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/pkg/timeutil" -) - -func (s *signature) Verify(authorization, date string, path string, method string, params url.Values) (ok bool, err error) { - if date == "" { - err = errors.New("date required") - return - } - - if path == "" { - err = errors.New("path required") - return - } - - if method == "" { - err = errors.New("method required") - return - } - - methodName := strings.ToUpper(method) - if !methods[methodName] { - err = errors.New("method param error") - return - } - - ts, err := timeutil.ParseCSTInLocation(date) - if err != nil { - err = errors.New("date must follow '2006-01-02 15:04:05'") - return - } - - if timeutil.SubInLocation(ts) > float64(s.ttl/time.Second) { - err = errors.Errorf("date exceeds limit %v", s.ttl) - return - } - - // Encode() 方法中自带 sorted by key - sortParamsEncode, err := url.QueryUnescape(params.Encode()) - if err != nil { - err = errors.Errorf("url QueryUnescape error %v", err) - return - } - - buffer := bytes.NewBuffer(nil) - buffer.WriteString(path) - buffer.WriteString(delimiter) - buffer.WriteString(methodName) - buffer.WriteString(delimiter) - buffer.WriteString(sortParamsEncode) - buffer.WriteString(delimiter) - buffer.WriteString(date) - - // 对数据进行 hmac 加密,并进行 base64 encode - hash := hmac.New(sha256.New, []byte(s.secret)) - hash.Write(buffer.Bytes()) - digest := base64.StdEncoding.EncodeToString(hash.Sum(nil)) - - ok = authorization == fmt.Sprintf("%s %s", s.key, digest) - return -} diff --git a/internal/pkg/timeutil/timeutil.go b/internal/pkg/timeutil/timeutil.go deleted file mode 100644 index c930a3d..0000000 --- a/internal/pkg/timeutil/timeutil.go +++ /dev/null @@ -1,73 +0,0 @@ -package timeutil - -import ( - "math" - "net/http" - "time" -) - -var ( - cst *time.Location -) - -// CSTLayout China Standard Time Layout -const CSTLayout = "2006-01-02 15:04:05" - -func init() { - var err error - if cst, err = time.LoadLocation("Asia/Shanghai"); err != nil { - panic(err) - } - - // 默认设置为中国时区 - time.Local = cst -} - -// RFC3339ToCSTLayout convert rfc3339 value to china standard time layout -// 2020-11-08T08:18:46+08:00 => 2020-11-08 08:18:46 -func RFC3339ToCSTLayout(value string) (string, error) { - ts, err := time.Parse(time.RFC3339, value) - if err != nil { - return "", err - } - - return ts.In(cst).Format(CSTLayout), nil -} - -// CSTLayoutString 格式化时间 -// 返回 "2006-01-02 15:04:05" 格式的时间 -func CSTLayoutString() string { - ts := time.Now() - return ts.In(cst).Format(CSTLayout) -} - -// ParseCSTInLocation 格式化时间 -func ParseCSTInLocation(date string) (time.Time, error) { - return time.ParseInLocation(CSTLayout, date, cst) -} - -// CSTLayoutStringToUnix 返回 unix 时间戳 -// 2020-01-24 21:11:11 => 1579871471 -func CSTLayoutStringToUnix(cstLayoutString string) (int64, error) { - stamp, err := time.ParseInLocation(CSTLayout, cstLayoutString, cst) - if err != nil { - return 0, err - } - return stamp.Unix(), nil -} - -// GMTLayoutString 格式化时间 -// 返回 "Mon, 02 Jan 2006 15:04:05 GMT" 格式的时间 -func GMTLayoutString() string { - return time.Now().In(cst).Format(http.TimeFormat) -} - -// ParseGMTInLocation 格式化时间 -func ParseGMTInLocation(date string) (time.Time, error) { - return time.ParseInLocation(http.TimeFormat, date, cst) -} - -// SubInLocation 计算时间差 -func SubInLocation(ts time.Time) float64 { - return math.Abs(time.Now().In(cst).Sub(ts).Seconds()) -} diff --git a/internal/pkg/trace/debug.go b/internal/pkg/trace/debug.go deleted file mode 100644 index c186f59..0000000 --- a/internal/pkg/trace/debug.go +++ /dev/null @@ -1,7 +0,0 @@ -package trace - -type Debug struct { - Key string `json:"key"` // 标示 - Value interface{} `json:"value"` // 值 - CostSeconds float64 `json:"cost_seconds"` // 执行时间(单位秒) -} diff --git a/internal/pkg/trace/dialog.go b/internal/pkg/trace/dialog.go deleted file mode 100644 index e5c9740..0000000 --- a/internal/pkg/trace/dialog.go +++ /dev/null @@ -1,32 +0,0 @@ -package trace - -import "sync" - -var _ D = (*Dialog)(nil) - -type D interface { - i() - AppendResponse(resp *Response) -} - -// Dialog 内部调用其它方接口的会话信息;失败时会有retry操作,所以 response 会有多次。 -type Dialog struct { - mux sync.Mutex - Request *Request `json:"request"` // 请求信息 - Responses []*Response `json:"responses"` // 返回信息 - Success bool `json:"success"` // 是否成功,true 或 false - CostSeconds float64 `json:"cost_seconds"` // 执行时长(单位秒) -} - -func (d *Dialog) i() {} - -// AppendResponse 按转的追加response信息 -func (d *Dialog) AppendResponse(resp *Response) { - if resp == nil { - return - } - - d.mux.Lock() - d.Responses = append(d.Responses, resp) - d.mux.Unlock() -} diff --git a/internal/pkg/trace/redis.go b/internal/pkg/trace/redis.go deleted file mode 100644 index 87df256..0000000 --- a/internal/pkg/trace/redis.go +++ /dev/null @@ -1,10 +0,0 @@ -package trace - -type Redis struct { - Timestamp string `json:"timestamp"` // 时间,格式:2006-01-02 15:04:05 - Handle string `json:"handle"` // 操作,SET/GET 等 - Key string `json:"key"` // Key - Value string `json:"value,omitempty"` // Value - TTL float64 `json:"ttl,omitempty"` // 超时时长(单位分) - CostSeconds float64 `json:"cost_seconds"` // 执行时间(单位秒) -} diff --git a/internal/pkg/trace/sql.go b/internal/pkg/trace/sql.go deleted file mode 100644 index d27cde3..0000000 --- a/internal/pkg/trace/sql.go +++ /dev/null @@ -1,9 +0,0 @@ -package trace - -type SQL struct { - Timestamp string `json:"timestamp"` // 时间,格式:2006-01-02 15:04:05 - Stack string `json:"stack"` // 文件地址和行号 - SQL string `json:"sql"` // SQL 语句 - Rows int64 `json:"rows_affected"` // 影响行数 - CostSeconds float64 `json:"cost_seconds"` // 执行时长(单位秒) -} diff --git a/internal/pkg/trace/trace.go b/internal/pkg/trace/trace.go deleted file mode 100644 index f1f2e63..0000000 --- a/internal/pkg/trace/trace.go +++ /dev/null @@ -1,139 +0,0 @@ -package trace - -import ( - "crypto/rand" - "encoding/hex" - "io" - "sync" -) - -const Header = "TRACE-ID" - -var _ T = (*Trace)(nil) - -type T interface { - i() - ID() string - WithRequest(req *Request) *Trace - WithResponse(resp *Response) *Trace - AppendDialog(dialog *Dialog) *Trace - AppendSQL(sql *SQL) *Trace - AppendRedis(redis *Redis) *Trace -} - -// Trace 记录的参数 -type Trace struct { - mux sync.Mutex - Identifier string `json:"trace_id"` // 链路ID - Request *Request `json:"request"` // 请求信息 - Response *Response `json:"response"` // 返回信息 - ThirdPartyRequests []*Dialog `json:"third_party_requests"` // 调用第三方接口的信息 - Debugs []*Debug `json:"debugs"` // 调试信息 - SQLs []*SQL `json:"sqls"` // 执行的 SQL 信息 - Redis []*Redis `json:"redis"` // 执行的 Redis 信息 - Success bool `json:"success"` // 请求结果 true or false - CostSeconds float64 `json:"cost_seconds"` // 执行时长(单位秒) -} - -// Request 请求信息 -type Request struct { - TTL string `json:"ttl"` // 请求超时时间 - Method string `json:"method"` // 请求方式 - DecodedURL string `json:"decoded_url"` // 请求地址 - Header interface{} `json:"header"` // 请求 Header 信息 - Body interface{} `json:"body"` // 请求 Body 信息 -} - -// Response 响应信息 -type Response struct { - Header interface{} `json:"header"` // Header 信息 - Body interface{} `json:"body"` // Body 信息 - BusinessCode int `json:"business_code,omitempty"` // 业务码 - BusinessCodeMsg string `json:"business_code_msg,omitempty"` // 提示信息 - HttpCode int `json:"http_code"` // HTTP 状态码 - HttpCodeMsg string `json:"http_code_msg"` // HTTP 状态码信息 - CostSeconds float64 `json:"cost_seconds"` // 执行时间(单位秒) -} - -func New(id string) *Trace { - if id == "" { - buf := make([]byte, 10) - io.ReadFull(rand.Reader, buf) - id = hex.EncodeToString(buf) - } - - return &Trace{ - Identifier: id, - } -} - -func (t *Trace) i() {} - -// ID 唯一标识符 -func (t *Trace) ID() string { - return t.Identifier -} - -// WithRequest 设置request -func (t *Trace) WithRequest(req *Request) *Trace { - t.Request = req - return t -} - -// WithResponse 设置response -func (t *Trace) WithResponse(resp *Response) *Trace { - t.Response = resp - return t -} - -// AppendDialog 安全的追加内部调用过程dialog -func (t *Trace) AppendDialog(dialog *Dialog) *Trace { - if dialog == nil { - return t - } - - t.mux.Lock() - defer t.mux.Unlock() - - t.ThirdPartyRequests = append(t.ThirdPartyRequests, dialog) - return t -} - -// AppendDebug 追加 debug -func (t *Trace) AppendDebug(debug *Debug) *Trace { - if debug == nil { - return t - } - - t.mux.Lock() - defer t.mux.Unlock() - - t.Debugs = append(t.Debugs, debug) - return t -} - -// AppendSQL 追加 SQL -func (t *Trace) AppendSQL(sql *SQL) *Trace { - if sql == nil { - return t - } - - t.mux.Lock() - defer t.mux.Unlock() - - t.SQLs = append(t.SQLs, sql) - return t -} - -// AppendRedis 追加 Redis -func (t *Trace) AppendRedis(redis *Redis) *Trace { - if redis == nil { - return t - } - - t.mux.Lock() - defer t.mux.Unlock() - - t.Redis = append(t.Redis, redis) - return t -} diff --git a/internal/pkg/urltable/urltable.go b/internal/pkg/urltable/urltable.go deleted file mode 100644 index bc07820..0000000 --- a/internal/pkg/urltable/urltable.go +++ /dev/null @@ -1,169 +0,0 @@ -package urltable - -import ( - "net/http" - "strings" - - "github.com/ch3nnn/webstack-go/internal/pkg/errors" -) - -const ( - empty = "" - fuzzy = "*" - omitted = "**" - delimiter = "/" - methodView = "VIEW" -) - -// parse and validate pattern -func parse(pattern string) ([]string, error) { - const format = "[get, post, put, patch, delete, view]/{a-Z}+/{*}+/{**}" - - if pattern = strings.TrimLeft(strings.TrimSpace(pattern), delimiter); pattern == "" { - return nil, errors.Errorf("pattern illegal, should in format of %s", format) - } - - paths := strings.Split(pattern, delimiter) - if len(paths) < 2 { - return nil, errors.Errorf("pattern illegal, should in format of %s", format) - } - - for i := range paths { - paths[i] = strings.TrimSpace(paths[i]) - } - - // likes get/ get/* get/** - if len(paths) == 2 && (paths[1] == empty || paths[1] == fuzzy || paths[1] == omitted) { - return nil, errors.New("illegal wildcard") - } - - switch paths[0] = strings.ToUpper(paths[0]); paths[0] { - case http.MethodGet, - http.MethodPost, - http.MethodPut, - http.MethodPatch, - http.MethodDelete, - methodView: - default: - return nil, errors.Errorf("only supports [%s %s %s %s %s %s]", - http.MethodGet, http.MethodPost, http.MethodPut, http.MethodPatch, http.MethodDelete, methodView) - } - - for k := 1; k < len(paths); k++ { - if paths[k] == empty && k+1 != len(paths) { - return nil, errors.New("pattern contains illegal empty path") - } - - if paths[k] == omitted && k+1 != len(paths) { - return nil, errors.New("pattern contains illegal omitted path") - } - } - - return paths, nil -} - -// Format pattern -func Format(pattern string) (string, error) { - paths, err := parse(pattern) - if err != nil { - return "", err - } - - return strings.Join(paths, delimiter), nil -} - -type section struct { - leaf bool - mapping map[string]*section -} - -func newSection() *section { - return §ion{mapping: make(map[string]*section)} -} - -// Table a (thread unsafe) table to store urls -type Table struct { - size int - root *section -} - -// NewTable create a table -func NewTable() *Table { - return &Table{root: newSection()} -} - -// Size contains how many urls -func (t *Table) Size() int { - return t.size -} - -// Append pattern -func (t *Table) Append(pattern string) error { - paths, err := parse(pattern) - if err != nil { - return err - } - - insert := false - root := t.root - for i, path := range paths { - if (path == fuzzy && root.mapping[omitted] != nil) || - (path == omitted && root.mapping[fuzzy] != nil) || - (path != omitted && root.mapping[omitted] != nil) { - return errors.Errorf("conflict at %s", strings.Join(paths[:i], delimiter)) - } - - next := root.mapping[path] - if next == nil { - next = newSection() - root.mapping[path] = next - insert = true - } - root = next - } - - if insert { - t.size++ - } - - root.leaf = true - return nil -} - -// Mapping url to pattern -func (t *Table) Mapping(url string) (string, error) { - paths, err := parse(url) - if err != nil { - return "", err - } - - pattern := make([]string, 0, len(paths)) - - root := t.root - for _, path := range paths { - next := root.mapping[path] - if next == nil { - nextFuzzy := root.mapping[fuzzy] - nextOmitted := root.mapping[omitted] - if nextFuzzy == nil && nextOmitted == nil { - return "", nil - } - - if nextOmitted != nil { - pattern = append(pattern, omitted) - return strings.Join(pattern, delimiter), nil - } - - next = nextFuzzy - path = fuzzy - } - - root = next - pattern = append(pattern, path) - } - - if root.leaf { - return strings.Join(pattern, delimiter), nil - } - return "", nil -} diff --git a/internal/pkg/validation/validation.go b/internal/pkg/validation/validation.go deleted file mode 100755 index 1894616..0000000 --- a/internal/pkg/validation/validation.go +++ /dev/null @@ -1,46 +0,0 @@ -package validation - -import ( - "fmt" - - "github.com/ch3nnn/webstack-go/configs" - - "github.com/gin-gonic/gin/binding" - "github.com/go-playground/locales/en" - "github.com/go-playground/locales/zh" - ut "github.com/go-playground/universal-translator" - "github.com/go-playground/validator/v10" - enTranslation "github.com/go-playground/validator/v10/translations/en" - zhTranslation "github.com/go-playground/validator/v10/translations/zh" -) - -var trans ut.Translator - -func init() { - lang := configs.Get().Language.Local - - if lang == configs.ZhCN { - trans, _ = ut.New(zh.New()).GetTranslator("zh") - if err := zhTranslation.RegisterDefaultTranslations(binding.Validator.Engine().(*validator.Validate), trans); err != nil { - fmt.Println("validator zh translation error", err) - } - } - - if lang == configs.EnUS { - trans, _ = ut.New(en.New()).GetTranslator("en") - if err := enTranslation.RegisterDefaultTranslations(binding.Validator.Engine().(*validator.Validate), trans); err != nil { - fmt.Println("validator en translation error", err) - } - } -} - -func Error(err error) (message string) { - if validationErrors, ok := err.(validator.ValidationErrors); !ok { - return err.Error() - } else { - for _, e := range validationErrors { - message += e.Translate(trans) + ";" - } - } - return message -} diff --git a/internal/proposal/alert.go b/internal/proposal/alert.go deleted file mode 100755 index e8f0669..0000000 --- a/internal/proposal/alert.go +++ /dev/null @@ -1,28 +0,0 @@ -package proposal - -import ( - "encoding/json" - "time" -) - -// AlertMessage 告警信息 -type AlertMessage struct { - ProjectName string `json:"project_name"` // 项目名,用于区分不同项目告警信息 - Env string `json:"env"` // 运行环境 - TraceID string `json:"trace_id"` // 唯一ID,用于追踪关联 - HOST string `json:"host"` // 请求 HOST - URI string `json:"uri"` // 请求 URI - Method string `json:"method"` // 请求 Method - ErrorMessage interface{} `json:"error_message"` // 错误信息 - ErrorStack string `json:"error_stack"` // 堆栈信息 - Timestamp time.Time `json:"timestamp"` // 时间戳 -} - -// Marshal 序列化到JSON -func (a *AlertMessage) Marshal() (jsonRaw []byte) { - jsonRaw, _ = json.Marshal(a) - return -} - -// NotifyHandler 告警的发送句柄 -type NotifyHandler func(msg *AlertMessage) diff --git a/internal/proposal/metrics.go b/internal/proposal/metrics.go deleted file mode 100755 index a887163..0000000 --- a/internal/proposal/metrics.go +++ /dev/null @@ -1,28 +0,0 @@ -package proposal - -import ( - "encoding/json" -) - -// MetricsMessage 指标信息 -type MetricsMessage struct { - ProjectName string `json:"project_name"` // 项目名,用于区分不同项目告警信息 - Env string `json:"env"` // 运行环境 - TraceID string `json:"trace_id"` // 唯一ID,用于追踪关联 - HOST string `json:"host"` // 请求 HOST - Path string `json:"path"` // 请求 Path - Method string `json:"method"` // 请求 Method - HTTPCode int `json:"http_code"` // HTTP 状态码 - BusinessCode int `json:"business_code"` // 业务码 - CostSeconds float64 `json:"cost_seconds"` // 耗时,单位:秒 - IsSuccess bool `json:"is_success"` // 状态,是否成功 -} - -// Marshal 序列化到JSON -func (m *MetricsMessage) Marshal() (jsonRaw []byte) { - jsonRaw, _ = json.Marshal(m) - return -} - -// RecordHandler 指标的记录句柄 -type RecordHandler func(msg *MetricsMessage) diff --git a/internal/proposal/session.go b/internal/proposal/session.go deleted file mode 100755 index 94713b3..0000000 --- a/internal/proposal/session.go +++ /dev/null @@ -1,15 +0,0 @@ -package proposal - -import "encoding/json" - -// SessionUserInfo 当前用户会话信息 -type SessionUserInfo struct { - UserID int64 `json:"user_id"` // 用户ID - UserName string `json:"user_name"` // 用户名 -} - -// Marshal 序列化到JSON -func (user *SessionUserInfo) Marshal() (jsonRaw []byte) { - jsonRaw, _ = json.Marshal(user) - return -} diff --git a/internal/proposal/tablesqls/table_admin.go b/internal/proposal/tablesqls/table_admin.go deleted file mode 100755 index 410bd14..0000000 --- a/internal/proposal/tablesqls/table_admin.go +++ /dev/null @@ -1,44 +0,0 @@ -package tablesqls - -//CREATE TABLE `admin` ( -//`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', -//`username` varchar(32) NOT NULL DEFAULT '' COMMENT '用户名', -//`password` varchar(100) NOT NULL DEFAULT '' COMMENT '密码', -//`nickname` varchar(60) NOT NULL DEFAULT '' COMMENT '昵称', -//`mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号', -//`is_used` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用 1:是 -1:否', -//`is_deleted` tinyint(1) NOT NULL DEFAULT '-1' COMMENT '是否删除 1:是 -1:否', -//`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -//`created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人', -//`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', -//`updated_user` varchar(60) NOT NULL DEFAULT '' COMMENT '更新人', -//PRIMARY KEY (`id`), -//UNIQUE KEY `unique_username` (`username`) -//) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员表'; - -func CreateAdminTableSql() (sql string) { - sql = "CREATE TABLE `admin` (" - sql += "`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键'," - sql += "`username` varchar(32) NOT NULL DEFAULT '' COMMENT '用户名'," - sql += "`password` varchar(100) NOT NULL DEFAULT '' COMMENT '密码'," - sql += "`nickname` varchar(60) NOT NULL DEFAULT '' COMMENT '昵称'," - sql += "`mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号'," - sql += "`is_used` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用 1:是 -1:否'," - sql += "`is_deleted` tinyint(1) NOT NULL DEFAULT '-1' COMMENT '是否删除 1:是 -1:否'," - sql += "`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'," - sql += "`created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人'," - sql += "`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'," - sql += "`updated_user` varchar(60) NOT NULL DEFAULT '' COMMENT '更新人'," - sql += "PRIMARY KEY (`id`)," - sql += "UNIQUE KEY `unique_username` (`username`)" - sql += ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员表';" - - return -} - -func CreateAdminTableDataSql() (sql string) { - sql = "INSERT INTO `admin` (`id`, `username`, `password`, `nickname`, `mobile`, `created_user`) VALUES" - sql += "(1, 'admin', 'f78382de80cf583cf854bbac0b6e796fbde36fe2739ca4ae072637010f179cb0', '管理员', '13888888888', 'init');" - - return -} diff --git a/internal/proposal/tablesqls/table_admin_menu.go b/internal/proposal/tablesqls/table_admin_menu.go deleted file mode 100755 index df3caf5..0000000 --- a/internal/proposal/tablesqls/table_admin_menu.go +++ /dev/null @@ -1,58 +0,0 @@ -package tablesqls - -//CREATE TABLE `admin_menu` ( -//`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', -//`admin_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '管理员ID', -//`menu_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '菜单栏ID', -//`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -//`created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人', -//PRIMARY KEY (`id`), -//KEY `idx_admin_id` (`admin_id`) -//) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理员菜单栏表'; - -func CreateAdminMenuTableSql() (sql string) { - sql = "CREATE TABLE `admin_menu` (" - sql += "`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键'," - sql += "`admin_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '管理员ID'," - sql += "`menu_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '菜单栏ID'," - sql += "`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'," - sql += "`created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人'," - sql += "PRIMARY KEY (`id`)," - sql += "KEY `idx_admin_id` (`admin_id`)" - sql += ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理员菜单栏表';" - - return -} - -func CreateAdminMenuTableDataSql() (sql string) { - sql = "INSERT INTO `admin_menu` (`id`, `admin_id`, `menu_id`, `created_user`) VALUES" - sql += "(1, 1, 16, 'init')," - sql += "(2, 1, 21, 'init')," - sql += "(3, 1, 20, 'init')," - sql += "(4, 1, 19, 'init')," - sql += "(5, 1, 18, 'init')," - sql += "(6, 1, 17, 'init')," - sql += "(7, 1, 13, 'init')," - sql += "(8, 1, 15, 'init')," - sql += "(9, 1, 14, 'init')," - sql += "(10, 1, 10, 'init')," - sql += "(11, 1, 12, 'init')," - sql += "(12, 1, 11, 'init')," - sql += "(13, 1, 7, 'init')," - sql += "(14, 1, 9, 'init')," - sql += "(15, 1, 8, 'init')," - sql += "(16, 1, 4, 'init')," - sql += "(17, 1, 6, 'init')," - sql += "(18, 1, 5, 'init')," - sql += "(19, 1, 1, 'init')," - sql += "(20, 1, 3, 'init')," - sql += "(21, 1, 2, 'init')," - sql += "(22, 1, 22, 'init')," - sql += "(23, 1, 23, 'init')," - sql += "(24, 1, 24, 'init')," - sql += "(25, 1, 25, 'init')," - sql += "(26, 1, 26, 'init')," - sql += "(27, 1, 27, 'init');" - - return -} diff --git a/internal/proposal/tablesqls/table_authorized.go b/internal/proposal/tablesqls/table_authorized.go deleted file mode 100755 index e827d2c..0000000 --- a/internal/proposal/tablesqls/table_authorized.go +++ /dev/null @@ -1,43 +0,0 @@ -package tablesqls - -//CREATE TABLE `authorized` ( -//`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', -//`business_key` varchar(32) NOT NULL DEFAULT '' COMMENT '调用方key', -//`business_secret` varchar(60) NOT NULL DEFAULT '' COMMENT '调用方secret', -//`business_developer` varchar(60) NOT NULL DEFAULT '' COMMENT '调用方对接人', -//`remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注', -//`is_used` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用 1:是 -1:否', -//`is_deleted` tinyint(1) NOT NULL DEFAULT '-1' COMMENT '是否删除 1:是 -1:否', -//`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -//`created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人', -//`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', -//`updated_user` varchar(60) NOT NULL DEFAULT '' COMMENT '更新人', -//PRIMARY KEY (`id`), -//UNIQUE KEY `unique_business_key` (`business_key`) -//) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='已授权的调用方表'; - -func CreateAuthorizedTableSql() (sql string) { - sql = "CREATE TABLE `authorized` (" - sql += "`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键'," - sql += "`business_key` varchar(32) NOT NULL DEFAULT '' COMMENT '调用方key'," - sql += "`business_secret` varchar(60) NOT NULL DEFAULT '' COMMENT '调用方secret'," - sql += "`business_developer` varchar(60) NOT NULL DEFAULT '' COMMENT '调用方对接人'," - sql += "`remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注'," - sql += "`is_used` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用 1:是 -1:否'," - sql += "`is_deleted` tinyint(1) NOT NULL DEFAULT '-1' COMMENT '是否删除 1:是 -1:否'," - sql += "`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'," - sql += "`created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人'," - sql += "`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'," - sql += "`updated_user` varchar(60) NOT NULL DEFAULT '' COMMENT '更新人'," - sql += "PRIMARY KEY (`id`)," - sql += "UNIQUE KEY `unique_business_key` (`business_key`)" - sql += ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='已授权的调用方表';" - - return -} - -func CreateAuthorizedTableDataSql() (sql string) { - sql = "INSERT INTO `authorized` (`id`, `business_key`, `business_secret`, `business_developer`, `remark`, `created_user`) VALUES (1, 'admin', '12878dd962115106db6d', '管理员', '管理面板调用', 'init');" - - return -} diff --git a/internal/proposal/tablesqls/table_authorized_api.go b/internal/proposal/tablesqls/table_authorized_api.go deleted file mode 100755 index fcd5462..0000000 --- a/internal/proposal/tablesqls/table_authorized_api.go +++ /dev/null @@ -1,42 +0,0 @@ -package tablesqls - -//CREATE TABLE `authorized_api` ( -//`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', -//`business_key` varchar(32) NOT NULL DEFAULT '' COMMENT '调用方key', -//`method` varchar(30) NOT NULL DEFAULT '' COMMENT '请求方式', -//`api` varchar(100) NOT NULL DEFAULT '' COMMENT '请求地址', -//`is_deleted` tinyint(1) NOT NULL DEFAULT '-1' COMMENT '是否删除 1:是 -1:否', -//`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -//`created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人', -//`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', -//`updated_user` varchar(60) NOT NULL DEFAULT '' COMMENT '更新人', -//PRIMARY KEY (`id`) -//) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='已授权接口地址表'; - -func CreateAuthorizedAPITableSql() (sql string) { - sql = "CREATE TABLE `authorized_api` (" - sql += "`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键'," - sql += "`business_key` varchar(32) NOT NULL DEFAULT '' COMMENT '调用方key'," - sql += "`method` varchar(30) NOT NULL DEFAULT '' COMMENT '请求方式'," - sql += "`api` varchar(100) NOT NULL DEFAULT '' COMMENT '请求地址'," - sql += "`is_deleted` tinyint(1) NOT NULL DEFAULT '-1' COMMENT '是否删除 1:是 -1:否'," - sql += "`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'," - sql += "`created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人'," - sql += "`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'," - sql += "`updated_user` varchar(60) NOT NULL DEFAULT '' COMMENT '更新人'," - sql += "PRIMARY KEY (`id`)" - sql += ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='已授权接口地址表';" - - return -} - -func CreateAuthorizedAPITableDataSql() (sql string) { - sql = "INSERT INTO `authorized_api` (`id`, `business_key`, `method`, `api`,`created_user`) VALUES" - sql += "(1, 'admin', 'GET', '/api/**', 'init')," - sql += "(2, 'admin', 'POST', '/api/**', 'init')," - sql += "(3, 'admin', 'PUT', '/api/**', 'init')," - sql += "(4, 'admin', 'DELETE', '/api/**', 'init')," - sql += "(5, 'admin', 'PATCH', '/api/**', 'init');" - - return -} diff --git a/internal/proposal/tablesqls/table_category.go b/internal/proposal/tablesqls/table_category.go deleted file mode 100644 index 57fc0bd..0000000 --- a/internal/proposal/tablesqls/table_category.go +++ /dev/null @@ -1,56 +0,0 @@ -package tablesqls - -func CreateCategoryTableSql() (sql string) { - sql = "CREATE TABLE `category` (" - sql += "`id` int(10) unsigned NOT NULL AUTO_INCREMENT," - sql += "`parent_id` int(11) NOT NULL DEFAULT '0'," - sql += "`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序'," - sql += "`title` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名称'," - sql += "`icon` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '图标'," - sql += "`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'," - sql += "`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'," - sql += "`is_used` tinyint(4) DEFAULT '-1' COMMENT '是否启用 1:是 -1:否'," - sql += "`level` tinyint(1) DEFAULT NULL COMMENT '分类等级'," - sql += "PRIMARY KEY (`id`) USING BTREE" - sql += ") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='站分类';" - return -} - -func CreateCategoryTableDataSql() (sql string) { - sql = "INSERT INTO category (parent_id,sort,title,icon,created_at,updated_at,is_used,`level`) VALUES" - sql += "(0,1,'常用推荐','briefcase-alt','2019-01-21 12:48:58','2023-03-10 17:46:19',1,1)," - sql += "(0,2,'社区资讯','envelope','2019-01-21 12:50:17','2023-03-10 17:46:31',1,1)," - sql += "(0,5,'灵感采集','radio-button','2019-01-21 13:53:10','2023-03-10 17:47:37',1,1)," - sql += "(3,4,'发现产品','fa-star-o','2019-01-21 13:53:31','2019-01-21 13:53:34',1,2)," - sql += "(3,5,'界面灵感','fa-star-o','2019-01-21 13:53:49','2019-01-21 13:55:42',1,2)," - sql += "(3,6,'网页灵感','fa-star-o','2019-01-21 13:54:00','2019-01-21 13:55:42',1,2)," - sql += "(0,7,'素材资源','radio-button','2019-01-21 13:54:42','2023-03-10 17:47:47',1,1)," - sql += "(7,8,'图标素材','fa-star-o','2019-01-21 13:54:59','2019-01-21 14:12:01',1,2)," - sql += "(7,9,'LOGO设计','fa-star-o','2019-01-21 13:55:11','2019-01-21 13:55:42',1,2)," - sql += "(7,10,'平面素材','fa-star-o','2019-01-21 13:55:25','2019-01-21 13:55:42',1,2)," - sql += "(7,11,'UI资源','fa-star-o','2019-01-21 13:55:31','2019-01-21 13:55:42',1,2)," - sql += "(7,12,'Sketch资源','fa-star-o','2019-01-22 01:00:51','2019-01-22 01:07:04',1,2)," - sql += "(7,13,'字体资源','fa-star-o','2019-01-22 01:01:02','2019-01-22 01:07:04',1,2)," - sql += "(7,14,'Mockup','fa-star-o','2019-01-22 01:01:12','2019-01-22 01:07:04',1,2)," - sql += "(7,15,'摄影图库','fa-star-o','2019-01-22 01:01:23','2019-01-22 01:07:04',1,2)," - sql += "(7,16,'PPT资源','fa-star-o','2019-01-22 01:01:33','2019-01-22 01:07:04',1,2)," - sql += "(0,17,'常用工具','radio-button','2019-01-22 01:02:04','2023-03-10 17:48:01',1,1)," - sql += "(17,18,'图形创意','fa-star-o','2019-01-22 01:02:14','2019-01-22 01:07:04',1,2)," - sql += "(17,19,'界面设计','fa-star-o','2019-01-22 01:02:24','2019-01-22 01:07:04',1,2)," - sql += "(17,20,'交互动效','fa-star-o','2019-01-22 01:02:32','2019-01-22 01:07:04',1,2)," - sql += "(17,21,'在线配色','fa-star-o','2019-01-22 01:02:40','2019-01-22 01:07:04',1,2)," - sql += "(17,22,'在线工具','fa-star-o','2019-01-22 01:02:49','2019-01-22 01:07:04',1,2)," - sql += "(17,23,'Chrome插件','fa-star-o','2019-01-22 01:02:58','2019-01-22 01:07:04',1,2)," - sql += "(0,24,'学习教程','radio-button','2019-01-22 01:03:17','2023-03-10 17:48:09',1,1)," - sql += "(24,25,'设计规范','fa-star-o','2019-01-22 01:03:29','2019-01-22 01:07:04',1,2)," - sql += "(24,26,'视频教程','fa-star-o','2019-01-22 01:03:36','2019-01-22 01:07:04',1,2)," - sql += "(24,27,'设计文章','fa-star-o','2019-01-22 01:03:44','2019-01-22 01:07:04',1,2)," - sql += "(24,28,'设计电台','fa-star-o','2019-01-22 01:03:52','2019-01-22 01:07:04',1,2)," - sql += "(0,0,'小玩意儿','bulb','2019-07-26 16:08:10','2023-03-10 17:50:15',1,1)," - sql += "(0,1,'常用搜索','sketch','2019-12-19 10:14:01','2023-03-10 17:45:59',1,1)," - sql += "(0,3,'休闲娱乐','star-half','2019-12-19 10:45:08','2023-03-10 17:46:54',1,1)," - sql += "(0,4,'IT技术','pointer-left','2019-12-19 11:14:21','2023-03-10 17:47:10',1,1)," - sql += "(17,2,'网站管理','fa-align-justify','2019-12-19 21:53:17','2019-12-19 21:53:17',1,2)," - sql += "(17,39,'常用邮箱登录入口','fa-angellist','2019-12-20 19:36:52','2019-12-20 19:36:52',1,2);" - return -} diff --git a/internal/proposal/tablesqls/table_cron_task.go b/internal/proposal/tablesqls/table_cron_task.go deleted file mode 100755 index 03fc9d0..0000000 --- a/internal/proposal/tablesqls/table_cron_task.go +++ /dev/null @@ -1,53 +0,0 @@ -package tablesqls - -//CREATE TABLE `cron_task` ( -//`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', -//`name` varchar(64) NOT NULL DEFAULT '' COMMENT '任务名称', -//`spec` varchar(64) NOT NULL DEFAULT '' COMMENT 'crontab 表达式', -//`command` varchar(255) NOT NULL DEFAULT '' COMMENT '执行命令', -//`protocol` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '执行方式 1:shell 2:http', -//`http_method` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT 'http 请求方式 1:get 2:post', -//`timeout` int(11) unsigned NOT NULL DEFAULT '60' COMMENT '超时时间(单位:秒)', -//`retry_times` tinyint(1) NOT NULL DEFAULT '3' COMMENT '重试次数', -//`retry_interval` int(11) NOT NULL DEFAULT '60' COMMENT '重试间隔(单位:秒)', -//`notify_status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知', -//`notify_type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '通知类型 1:邮件 2:webhook', -//`notify_receiver_email` varchar(255) NOT NULL DEFAULT '' COMMENT '通知者邮箱地址(多个用,分割)', -//`notify_keyword` varchar(255) NOT NULL DEFAULT '' COMMENT '通知匹配关键字(多个用,分割)', -//`remark` varchar(100) NOT NULL DEFAULT '' COMMENT '备注', -//`is_used` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用 1:是 -1:否', -//`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -//`created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人', -//`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', -//`updated_user` varchar(60) NOT NULL DEFAULT '' COMMENT '更新人', -//PRIMARY KEY (`id`), -//KEY `idx_name` (`name`) -//) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='后台任务表'; - -func CreateCronTaskTableSql() (sql string) { - sql = "CREATE TABLE `cron_task` (" - sql += "`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键'," - sql += "`name` varchar(64) NOT NULL DEFAULT '' COMMENT '任务名称'," - sql += "`spec` varchar(64) NOT NULL DEFAULT '' COMMENT 'crontab 表达式'," - sql += "`command` varchar(255) NOT NULL DEFAULT '' COMMENT '执行命令'," - sql += "`protocol` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '执行方式 1:shell 2:http'," - sql += "`http_method` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT 'http 请求方式 1:get 2:post'," - sql += "`timeout` int(11) unsigned NOT NULL DEFAULT '60' COMMENT '超时时间(单位:秒)'," - sql += "`retry_times` tinyint(1) NOT NULL DEFAULT '3' COMMENT '重试次数'," - sql += "`retry_interval` int(11) NOT NULL DEFAULT '60' COMMENT '重试间隔(单位:秒)'," - sql += "`notify_status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知'," - sql += "`notify_type` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '通知类型 1:邮件 2:webhook'," - sql += "`notify_receiver_email` varchar(255) NOT NULL DEFAULT '' COMMENT '通知者邮箱地址(多个用,分割)'," - sql += "`notify_keyword` varchar(255) NOT NULL DEFAULT '' COMMENT '通知匹配关键字(多个用,分割)'," - sql += "`remark` varchar(100) NOT NULL DEFAULT '' COMMENT '备注'," - sql += "`is_used` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用 1:是 -1:否'," - sql += "`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'," - sql += "`created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人'," - sql += "`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'," - sql += "`updated_user` varchar(60) NOT NULL DEFAULT '' COMMENT '更新人'," - sql += "PRIMARY KEY (`id`)," - sql += "KEY `idx_name` (`name`)" - sql += ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='后台任务表';" - - return -} diff --git a/internal/proposal/tablesqls/table_menu.go b/internal/proposal/tablesqls/table_menu.go deleted file mode 100755 index 446d113..0000000 --- a/internal/proposal/tablesqls/table_menu.go +++ /dev/null @@ -1,72 +0,0 @@ -package tablesqls - -//CREATE TABLE `menu` ( -//`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', -//`pid` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '父类ID', -//`name` varchar(32) NOT NULL DEFAULT '' COMMENT '菜单名称', -//`link` varchar(100) NOT NULL DEFAULT '' COMMENT '链接地址', -//`icon` varchar(60) NOT NULL DEFAULT '' COMMENT '图标', -//`level` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '菜单类型 1:一级菜单 2:二级菜单', -//`sort` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '排序', -//`is_used` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用 1:是 -1:否', -//`is_deleted` tinyint(1) NOT NULL DEFAULT '-1' COMMENT '是否删除 1:是 -1:否', -//`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -//`created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人', -//`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', -//`updated_user` varchar(60) NOT NULL DEFAULT '' COMMENT '更新人', -//PRIMARY KEY (`id`) -//) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='左侧菜单栏表'; - -func CreateMenuTableSql() (sql string) { - sql = "CREATE TABLE `menu` (" - sql += "`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键'," - sql += "`pid` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '父类ID'," - sql += "`name` varchar(32) NOT NULL DEFAULT '' COMMENT '菜单名称'," - sql += "`link` varchar(100) NOT NULL DEFAULT '' COMMENT '链接地址'," - sql += "`icon` varchar(60) NOT NULL DEFAULT '' COMMENT '图标'," - sql += "`level` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '菜单类型 1:一级菜单 2:二级菜单'," - sql += "`sort` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '排序'," - sql += "`is_used` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用 1:是 -1:否'," - sql += "`is_deleted` tinyint(1) NOT NULL DEFAULT '-1' COMMENT '是否删除 1:是 -1:否'," - sql += "`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'," - sql += "`created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人'," - sql += "`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'," - sql += "`updated_user` varchar(60) NOT NULL DEFAULT '' COMMENT '更新人'," - sql += "PRIMARY KEY (`id`)" - sql += ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='左侧菜单栏表';" - - return -} - -func CreateMenuTableDataSql() (sql string) { - sql = "INSERT INTO `menu` (`id`, `pid`, `name`, `link`, `icon`, `level`, `sort`, `created_user`) VALUES" - sql += "(1, 0, '配置信息', '', 'cog', 1, 10, 'init')," - sql += "(2, 1, '告警邮箱', '/config/email', '', 2, 101, 'init')," - sql += "(3, 1, '错误码', '/config/code', '', 2, 102, 'init')," - sql += "(4, 0, '代码生成器', '', 'code', 1, 20, 'init')," - sql += "(5, 4, '生成数据表 CURD', '/generator/gorm', '', 2, 201, 'init')," - sql += "(6, 4, '生成控制器方法', '/generator/handler', '', 2, 202, 'init')," - sql += "(7, 0, '授权调用方', '', 'hand', 1, 30, 'init')," - sql += "(8, 7, '调用方', '/authorized/list', '', 2, 301, 'init')," - sql += "(9, 7, '使用说明', '/authorized/demo', '', 2, 302, 'init')," - sql += "(10, 0, '系统管理员', '', 'users', 1, 50, 'init')," - sql += "(11, 10, '管理员', '/admin/list', '', 2, 501, 'init')," - sql += "(12, 10, '菜单管理', '/admin/menu', '', 2, 502, 'init')," - sql += "(13, 0, '查询小助手', '', 'search', 1, 60, 'init')," - sql += "(14, 13, '查询缓存', '/tool/cache', '', 2, 601, 'init')," - sql += "(15, 13, '查询数据', '/tool/data', '', 2, 602, 'init')," - sql += "(16, 0, '实用工具箱', '', 'calculator-alt', 1, 70, 'init')," - sql += "(17, 16, 'Hashids', '/tool/hashids', '', 2, 702, 'init')," - sql += "(18, 16, '调用日志', '/tool/logs', '', 2, 703, 'init')," - sql += "(19, 16, '接口文档', '/swagger/index.html', '', 2, 704, 'init')," - sql += "(20, 16, 'GraphQL', '/graphql', '', 2, 705, 'init')," - sql += "(21, 16, '接口指标', '/metrics', '', 2, 706, 'init')," - sql += "(22, 16, '服务升级', '/upgrade', '', 2, 701, 'init')," - sql += "(23, 0, '后台任务', '', 'timer', 1, 40, 'init')," - sql += "(24, 23, '任务列表', '/cron/list', '', 2, 401, 'init')," - sql += "(25, 16, 'WebSocket', '/tool/websocket', '', 2, 707, 'init')," - sql += "(26, 10, '网站分类', '/admin/category', '', 2, 502, 'init')," - sql += "(27, 10, '网站列表', '/admin/site', '', 2, 503, 'init');" - - return -} diff --git a/internal/proposal/tablesqls/table_menu_action.go b/internal/proposal/tablesqls/table_menu_action.go deleted file mode 100755 index 9b2e84c..0000000 --- a/internal/proposal/tablesqls/table_menu_action.go +++ /dev/null @@ -1,101 +0,0 @@ -package tablesqls - -//CREATE TABLE `menu_action` ( -//`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', -//`menu_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '菜单栏ID', -//`method` varchar(30) NOT NULL DEFAULT '' COMMENT '请求方式', -//`api` varchar(100) NOT NULL DEFAULT '' COMMENT '请求地址', -//`is_deleted` tinyint(1) NOT NULL DEFAULT '-1' COMMENT '是否删除 1:是 -1:否', -//`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -//`created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人', -//`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', -//`updated_user` varchar(60) NOT NULL DEFAULT '' COMMENT '更新人', -//PRIMARY KEY (`id`), -//KEY `idx_menu_id` (`menu_id`) -//) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='功能权限表'; - -func CreateMenuActionTableSql() (sql string) { - sql = "CREATE TABLE `menu_action` (" - sql += "`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键'," - sql += "`menu_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '菜单栏ID'," - sql += "`method` varchar(30) NOT NULL DEFAULT '' COMMENT '请求方式'," - sql += "`api` varchar(100) NOT NULL DEFAULT '' COMMENT '请求地址'," - sql += "`is_deleted` tinyint(1) NOT NULL DEFAULT '-1' COMMENT '是否删除 1:是 -1:否'," - sql += "`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'," - sql += "`created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人'," - sql += "`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'," - sql += "`updated_user` varchar(60) NOT NULL DEFAULT '' COMMENT '更新人'," - sql += "PRIMARY KEY (`id`)," - sql += "KEY `idx_menu_id` (`menu_id`)" - sql += ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='功能权限表';" - - return -} - -func CreateMenuActionTableDataSql() (sql string) { - sql = "INSERT INTO `menu_action` (`id`, `menu_id`, `method`, `api`, `created_user`) VALUES" - sql += "(1, 17, 'GET', '/api/tool/hashids/**', 'init')," - sql += "(2, 14, 'POST', '/api/tool/cache/search', 'init')," - sql += "(3, 14, 'PATCH', '/api/tool/cache/clear', 'init')," - sql += "(4, 15, 'GET', '/api/tool/data/dbs', 'init')," - sql += "(5, 15, 'POST', '/api/tool/data/mysql', 'init')," - sql += "(6, 15, 'POST', '/api/tool/data/tables', 'init')," - sql += "(7, 2, 'PATCH', '/api/config/email', 'init')," - sql += "(8, 5, 'POST', '/generator/gorm/execute', 'init')," - sql += "(9, 6, 'POST', '/generator/handler/execute', 'init')," - sql += "(10, 8, 'GET', '/authorized/add', 'init')," - sql += "(11, 8, 'GET', '/authorized/api/*', 'init')," - sql += "(12, 8, 'GET', '/api/authorized', 'init')," - sql += "(13, 8, 'PATCH', '/api/authorized/used', 'init')," - sql += "(14, 8, 'DELETE', '/api/authorized/*', 'init')," - sql += "(15, 8, 'POST', '/api/authorized', 'init')," - sql += "(16, 8, 'GET', '/api/authorized_api', 'init')," - sql += "(17, 8, 'POST', '/api/authorized_api', 'init')," - sql += "(18, 8, 'DELETE', '/api/authorized_api/*', 'init')," - sql += "(19, 11, 'GET', '/admin/add', 'init')," - sql += "(20, 11, 'POST', '/api/admin', 'init')," - sql += "(21, 11, 'GET', '/api/admin', 'init')," - sql += "(22, 11, 'PATCH', '/api/admin/used', 'init')," - sql += "(23, 11, 'PATCH', '/api/admin/reset_password/*', 'init')," - sql += "(24, 11, 'DELETE', '/api/admin/*', 'init')," - sql += "(25, 11, 'GET', '/admin/action/*', 'init')," - sql += "(26, 11, 'GET', '/api/admin/menu/*', 'init')," - sql += "(27, 11, 'POST', '/api/admin/menu', 'init')," - sql += "(28, 12, 'GET', '/admin/menu_action/*', 'init')," - sql += "(29, 12, 'GET', '/api/menu', 'init')," - sql += "(30, 12, 'DELETE', '/api/menu/*', 'init')," - sql += "(31, 12, 'GET', '/api/menu/*', 'init')," - sql += "(32, 12, 'PATCH', '/api/menu/used', 'init')," - sql += "(33, 12, 'POST', '/api/menu', 'init')," - sql += "(34, 12, 'GET', '/api/menu_action', 'init')," - sql += "(35, 12, 'POST', '/api/menu_action', 'init')," - sql += "(36, 12, 'DELETE', '/api/menu_action/*', 'init')," - sql += "(37, 22, 'POST', '/upgrade/execute', 'init')," - sql += "(38, 11, 'PATCH', '/api/admin/offline', 'init')," - sql += "(39, 12, 'PATCH', '/api/menu/sort', 'init')," - sql += "(40, 24, 'GET', '/cron/add', 'init')," - sql += "(41, 24, 'GET', '/cron/edit/*', 'init')," - sql += "(42, 24, 'POST', '/api/cron', 'init')," - sql += "(43, 24, 'POST', '/api/cron/*', 'init')," - sql += "(44, 24, 'GET', '/api/cron', 'init')," - sql += "(45, 24, 'GET', '/api/cron/*', 'init')," - sql += "(46, 24, 'PATCH', '/api/cron/used', 'init')," - sql += "(47, 24, 'PATCH', '/api/cron/exec/*', 'init')," - sql += "(48, 25, 'POST', '/api/tool/send_message', 'init')," - - sql += "(49, 26, 'GET', '/api/category', 'init')," - sql += "(50, 26, 'GET', '/api/category/*', 'init')," - sql += "(51, 26, 'POST', '/api/category', 'init')," - sql += "(52, 26, 'DELETE', '/api/category/*', 'init')," - sql += "(53, 26, 'PATCH', '/api/category/used', 'init')," - sql += "(54, 26, 'PATCH', '/api/category/sort', 'init')," - - sql += "(55, 27, 'GET', '/api/site', 'init')," - sql += "(56, 27, 'PATCH', '/api/site/used', 'init')," - sql += "(57, 27, 'DELETE', '/api/site/*', 'init')," - sql += "(58, 27, 'POST', '/api/site', 'init')," - sql += "(59, 27, 'GET', '/api/site/*', 'init')," - sql += "(60, 27, 'PUT', '/api/site', 'init');" - - return -} diff --git a/internal/proposal/tablesqls/table_site.go b/internal/proposal/tablesqls/table_site.go deleted file mode 100644 index 475d521..0000000 --- a/internal/proposal/tablesqls/table_site.go +++ /dev/null @@ -1,263 +0,0 @@ -package tablesqls - -func CreateSiteTableSql() (sql string) { - - sql = "CREATE TABLE `site` (" - sql += "`id` int(10) unsigned NOT NULL AUTO_INCREMENT," - sql += "`category_id` int(11) DEFAULT NULL COMMENT '分类id'," - sql += "`title` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '网站标题'," - sql += "`thumb` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '网站logo'," - sql += "`description` varchar(300) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '网站描述'," - sql += "`url` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '网站地址'," - sql += "`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'," - sql += "`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'," - sql += "`is_used` int(1) DEFAULT '-1' COMMENT '是否使用'," - sql += "PRIMARY KEY (`id`) USING BTREE" - sql += ") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='网站信息';" - - return -} - -func CreateSiteTableDateSql() (sql string) { - - sql = "INSERT INTO `site` (category_id,title,thumb,description,url,created_at,updated_at,is_used) VALUES" - sql += "(1,'Dribbble','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','全球UI设计师作品分享平台。','https://dribbble.com/','2019-01-21 15:23:29','2019-03-12 02:13:08',1)," - sql += "(1,'Behance','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Adobe旗下的设计师交流平台,来自世界各地的设计师在这里分享自己的作品。','https://behance.net/','2019-01-22 01:11:24','2019-01-22 01:11:24',1)," - sql += "(1,'UI中国','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','图形交互与界面设计交流、作品展示、学习平台。','http://www.ui.cn/','2019-01-22 01:13:10','2019-01-22 01:13:10',1)," - sql += "(1,'站酷','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','中国人气设计师互动平台。','http://www.zcool.com.cn/','2019-01-22 01:14:04','2019-01-22 01:14:04',1)," - sql += "(1,'Pinterest','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','全球美图收藏采集站。','https://www.pinterest.com/','2019-01-22 01:14:51','2019-01-22 01:14:51',1)," - sql += "(1,'花瓣','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','收集灵感,保存有用的素材。','http://huaban.com/','2019-01-22 01:15:35','2019-01-22 01:15:35',1)," - sql += "(1,'Medium','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','高质量设计文章。','https://medium.com/','2019-01-22 01:16:14','2019-01-22 01:16:14',1)," - sql += "(1,'优设','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','设计师交流学习平台。','http://www.uisdc.com/','2019-01-22 01:17:07','2019-01-22 01:17:07',1)," - sql += "(1,'Producthunt','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','发现新鲜有趣的产品。','https://www.producthunt.com/','2019-01-22 01:17:50','2019-01-22 01:17:50',1)," - sql += "(1,'Youtube','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','全球最大的学习分享平台。','https://www.youtube.com/','2019-01-22 01:18:31','2019-01-22 01:18:31',1)," - sql += "(36,'Google','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','全球最大的搜索平台。','https://www.google.com/','2019-01-22 01:19:35','2019-12-19 11:02:46',1)," - sql += "(2,'雷锋网','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','人工智能和智能硬件领域的互联网科技媒体。','https://www.leiphone.com/','2019-01-22 01:21:05','2019-01-22 01:21:05',1)," - sql += "(2,'36kr','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','创业资讯、科技新闻。','http://36kr.com/','2019-01-22 01:21:52','2019-01-22 01:21:52',1)," - sql += "(2,'数英网','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','数字媒体及职业招聘网站。','https://www.digitaling.com/','2019-01-22 01:23:15','2019-01-22 01:23:15',1)," - sql += "(2,'猎云网','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','互联网创业项目推荐和创业创新资讯。','http://www.lieyunwang.com/','2019-01-22 01:24:21','2019-01-22 01:24:21',1)," - sql += "(2,'人人都是产品经理','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','产品经理、产品爱好者学习交流平台。','http://www.woshipm.com/','2019-01-22 01:25:07','2019-01-22 01:25:07',1)," - sql += "(2,'互联网早读课','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','互联网行业深度阅读与学习平台。','https://www.zaodula.com/','2019-01-22 01:25:41','2019-01-22 01:25:41',1)," - sql += "(2,'产品壹佰','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','为产品经理爱好者提供最优质的产品资讯、原创内容和相关视频课程。','http://www.chanpin100.com/','2019-01-22 01:26:27','2019-01-22 01:26:27',1)," - sql += "(2,'PMCAFF','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','中国第一产品经理人气组织,专注于研究互联网产品。','http://www.pmcaff.com/','2019-01-22 01:27:08','2019-01-22 01:27:08',1)," - sql += "(2,'爱运营','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','网站运营人员学习交流,专注于网站产品运营管理、淘宝运营。','http://www.iyunying.org/','2019-01-22 01:28:09','2019-01-22 01:28:09',1)," - sql += "(2,'鸟哥笔记','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','移动互联网第一干货平台。','http://www.niaogebiji.com/','2019-01-22 01:29:56','2019-01-22 01:29:56',1)," - sql += "(2,'古田路9号','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','国内专业品牌创意平台。','http://www.gtn9.com/','2019-01-22 01:30:29','2019-01-22 01:30:29',1)," - sql += "(2,'优阁网','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','UI设计师学习交流社区。','http://www.uigreat.com/','2019-01-22 01:32:17','2019-01-22 01:32:17',1)," - sql += "(4,'Producthunt','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','发现新鲜有趣的产品。','https://www.producthunt.com/','2019-01-22 01:33:37','2019-01-22 01:33:37',1)," - sql += "(4,'NEXT','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','不错过任何一个新产品。','http://next.36kr.com/posts','2019-01-22 01:34:41','2019-01-22 01:34:41',1)," - sql += "(4,'少数派','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','高品质数字消费指南。','https://sspai.com/','2019-01-22 01:36:08','2019-01-22 01:36:08',1)," - sql += "(4,'利器','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','创造者和他们的工具。','http://liqi.io/','2019-01-22 01:36:53','2019-01-22 01:36:53',1)," - sql += "(4,'Today','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','为身边的新产品喝彩。','http://today.itjuzi.com/','2019-01-22 01:37:37','2019-01-22 01:37:37',1)," - sql += "(4,'小众软件','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','在这里发现更多有趣的应用。','https://faxian.appinn.com','2019-01-22 01:38:04','2019-01-22 01:38:04',1)," - sql += "(5,'Pttrns','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Check out the finest collection of design patterns, resources, mobile apps and inspiration','https://www.pttrns.com/','2019-01-22 01:39:09','2019-01-22 01:39:09',1)," - sql += "(5,'Collect UI','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Daily inspiration collected from daily ui archive and beyond.','http://collectui.com/','2019-01-22 01:39:58','2019-01-22 01:39:58',1)," - sql += "(5,'UI uigreat','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','APP界面截图参考。','http://ui.uigreat.com/','2019-01-22 01:40:40','2019-01-22 01:40:40',1)," - sql += "(5,'Android Niceties','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','A collection of screenshots encompassing some of the most beautiful looking Android apps.','http://androidniceties.tumblr.com/','2019-01-22 01:41:21','2019-01-22 01:41:21',1)," - sql += "(6,'Awwwards','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','aaa','https://www.awwwards.com/','2019-01-22 01:44:09','2019-01-22 01:51:33',1)," - sql += "(6,'CSS Design Awards','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Website Awards & Inspiration - CSS Gallery','https://www.cssdesignawards.com/','2019-01-22 01:44:45','2019-01-22 01:51:41',1)," - sql += "(6,'The FWA','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','FWA - showcasing innovation every day since 2000','https://thefwa.com/','2019-01-22 01:45:19','2019-01-22 01:51:48',1)," - sql += "(6,'Ecommercefolio','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Only the Best Ecommerce Design Inspiration.','http://www.ecommercefolio.com/','2019-01-22 01:50:41','2019-01-22 01:50:41',1)," - sql += "(6,'Lapa','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','The best landing page design inspiration from around the web.','http://www.lapa.ninja/','2019-01-22 01:51:15','2019-01-22 01:51:15',1)," - sql += "(6,'Reeoo','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','web design inspiration and website gallery.','http://reeoo.com/','2019-01-22 01:52:43','2019-01-22 01:52:43',1)," - sql += "(6,'Designmunk','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Best Homepage Design Inspiration.','https://designmunk.com/','2019-01-22 01:53:28','2019-01-22 01:53:28',1)," - sql += "(6,'Best Websites Gallery','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Website Showcase Inspiration | Best Websites Gallery.','https://bestwebsite.gallery/','2019-01-22 01:57:32','2019-01-22 01:57:32',1)," - sql += "(6,'Pages','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Curated directory of the best Pages.','http://www.pages.xyz/','2019-01-22 01:58:07','2019-01-22 01:58:07',1)," - sql += "(6,'SiteSee','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','SiteSee is a curated gallery of beautiful, modern websites collections.','https://sitesee.co/','2019-01-22 01:58:42','2019-01-22 01:58:42',1)," - sql += "(6,'Site Inspire','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','A CSS gallery and showcase of the best web design inspiration.','https://www.siteinspire.com/','2019-01-22 01:59:13','2019-01-22 01:59:13',1)," - sql += "(6,'WebInspiration','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','网页设计欣赏,全球顶级网页设计。','http://web.uedna.com/','2019-01-22 01:59:54','2019-01-22 01:59:54',1)," - sql += "(6,'navnav','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','A ton of CSS, jQuery, and JavaScript responsive navigation examples, demos, and tutorials from all over the web.','http://navnav.co/','2019-01-22 02:00:24','2019-01-22 02:00:24',1)," - sql += "(6,'Really Good UX','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','A library of screenshots and examples of really good UX. Brought to you by .','https://www.reallygoodux.io/','2019-01-22 02:01:05','2019-01-22 02:01:05',1)," - sql += "(8,'Iconfinder','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','2,100,000+ free and premium vector icons.','https://www.iconfinder.com','2019-01-22 03:01:41','2019-01-22 03:01:41',1)," - sql += "(8,'iconfont','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','阿里巴巴矢量图标库。','http://www.iconfont.cn/','2019-01-22 03:02:16','2019-01-22 03:02:16',1)," - sql += "(8,'iconmonstr','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free simple icons for your next project.','https://iconmonstr.com/','2019-01-22 03:02:46','2019-01-22 03:02:46',1)," - sql += "(8,'FindIcons','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Search through 300,000 free icons.','https://findicons.com/','2019-01-22 03:03:24','2019-01-22 03:03:24',1)," - sql += "(8,'Icon Archive','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Search 590,912 free icons.','http://www.iconarchive.com/','2019-01-22 03:04:28','2019-01-22 03:04:28',1)," - sql += "(8,'IcoMoonApp','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Icon Font, SVG, PDF & PNG Generator.','https://icomoon.io/app/','2019-01-22 03:05:49','2019-01-22 03:05:49',1)," - sql += "(8,'easyicon','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','PNG、ICO、ICNS格式图标搜索、图标下载服务。','http://www.easyicon.net/','2019-01-22 03:06:47','2019-01-22 03:06:47',1)," - sql += "(8,'flaticon','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','634,000+ Free vector icons in SVG, PSD, PNG, EPS format or as ICON FONT.','https://www.flaticon.com/','2019-01-22 03:07:28','2019-01-22 03:07:28',1)," - sql += "(8,'UICloud','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','The largest user interface design database in the world.','http://ui-cloud.com/','2019-01-22 03:08:10','2019-01-22 03:08:10',1)," - sql += "(8,'Material icons','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Access over 900 material system icons, available in a variety of sizes and densities, and as a web font.','https://material.io/icons/','2019-01-22 03:09:00','2019-01-22 03:09:00',1)," - sql += "(8,'Font Awesome Icon','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','The complete set of 675 icons in Font Awesome.','https://fontawesome.com/','2019-01-22 03:09:59','2019-01-22 03:09:59',1)," - sql += "(8,'ion icons','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','The premium icon font for Ionic Framework.','http://ionicons.com/','2019-01-22 03:10:37','2019-01-22 03:10:37',1)," - sql += "(8,'Simpleline Icons','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Simple line Icons pack.','http://simplelineicons.com/','2019-01-22 03:11:11','2019-01-22 03:11:11',1)," - sql += "(9,'Iconsfeed','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','iOS icons gallery.','http://www.iconsfeed.com/','2019-01-22 03:12:11','2019-01-22 03:12:11',1)," - sql += "(9,'iOS Icon Gallery','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Showcasing beautiful icon designs from the iOS App Store.','http://iosicongallery.com/','2019-01-22 03:12:59','2019-01-22 03:12:59',1)," - sql += "(9,'World Vector Logo','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Brand logos free to download.','https://worldvectorlogo.com/','2019-01-22 03:14:10','2019-01-22 03:14:10',1)," - sql += "(9,'Instant Logo Search','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Search & download thousands of logos instantly.','http://instantlogosearch.com/','2019-01-22 03:14:50','2019-01-22 03:14:50',1)," - sql += "(10,'freepik','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','More than a million free vectors, PSD, photos and free icons.','https://www.freepik.com/','2019-01-22 03:17:22','2019-01-22 03:17:22',1)," - sql += "(10,'wallhalla','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Find awesome high quality wallpapers for desktop and mobile in one place.','https://wallhalla.com/','2019-01-22 03:17:55','2019-01-22 03:17:55',1)," - sql += "(10,'365PSD','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free PSD & Graphics, Illustrations.','https://365psd.com/','2019-01-22 03:18:22','2019-01-22 03:18:22',1)," - sql += "(10,'Medialoot','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free & Premium Design Resources — Medialoot.','https://medialoot.com/','2019-01-22 03:18:52','2019-01-22 03:18:52',1)," - sql += "(10,'千图网','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','专注免费设计素材下载的网站。','http://www.58pic.com/','2019-01-22 03:19:35','2019-01-22 03:19:35',1)," - sql += "(10,'千库网','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','免费png图片背景素材下载。','http://588ku.com/','2019-01-22 03:20:14','2019-01-22 03:20:14',1)," - sql += "(10,'我图网','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','我图网,提供图片素材及模板下载,专注正版设计作品交易。','http://www.ooopic.com/','2019-01-22 03:20:54','2019-01-22 03:20:54',1)," - sql += "(10,'90设计','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','电商设计(淘宝美工)千图免费淘宝素材库。','http://90sheji.com/','2019-01-22 03:21:29','2019-01-22 03:21:29',1)," - sql += "(10,'昵图网','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','原创素材共享平台。','http://www.nipic.com/','2019-01-22 03:22:11','2019-01-22 03:22:11',1)," - sql += "(10,'懒人图库','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','懒人图库专注于提供网页素材下载。','http://www.lanrentuku.com/','2019-01-22 03:23:20','2019-01-22 03:23:20',1)," - sql += "(10,'素材搜索','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','设计素材搜索聚合。','http://so.ui001.com/','2019-01-22 03:24:03','2019-01-22 03:24:03',1)," - sql += "(10,'PS饭团网','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','不一样的设计素材库!让自己的设计与众不同!','http://psefan.com/','2019-01-22 03:24:44','2019-01-22 03:24:44',1)," - sql += "(10,'素材中国','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','免费素材共享平台。','http://www.sccnn.com/','2019-01-22 03:25:22','2019-01-22 03:25:22',1)," - sql += "(11,'Freebiesbug','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Hand-picked resources for web designer and developers, constantly updated.','https://freebiesbug.com/','2019-01-22 03:26:32','2019-01-22 03:26:32',1)," - sql += "(11,'Freebie Supply','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free Resources For Designers.','https://freebiesupply.com/','2019-01-22 03:27:09','2019-01-22 03:27:09',1)," - sql += "(11,'云瑞','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','优秀设计资源的分享网站。','https://www.yrucd.com/','2019-01-22 04:20:59','2019-01-22 04:20:59',1)," - sql += "(11,'Designmodo','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Web Design Blog and Shop.','https://designmodo.com/','2019-01-22 04:21:38','2019-01-22 04:21:38',1)," - sql += "(11,'稀土区','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','优质设计开发资源分享。','https://xituqu.com/','2019-01-22 04:22:15','2019-01-22 04:22:15',1)," - sql += "(11,'ui8','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','UI Kits, Wireframe Kits, Templates, Icons and More.','https://ui8.net/','2019-01-22 04:22:57','2019-01-22 04:22:57',1)," - sql += "(11,'uplabs','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Daily resources for product designers & developers.','https://www.uplabs.com/','2019-01-22 04:23:39','2019-01-22 04:23:39',1)," - sql += "(11,'UIkit.me','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','最便捷新鲜的uikit资源下载网站。','http://www.uikit.me/','2019-01-22 04:24:19','2019-01-22 04:24:19',1)," - sql += "(11,'Fribbble','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free PSD files and other free design resources by Dribbblers.','http://www.fribbble.com/','2019-01-22 04:24:54','2019-01-22 04:24:54',1)," - sql += "(11,'PrincipleRepo','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free, High Quality Principle Resources.','http://principlerepo.com/','2019-01-22 04:25:30','2019-01-22 04:25:30',1)," - sql += "(12,'Sketch','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','The digital design toolkit.','https://sketchapp.com/','2019-01-22 04:26:17','2019-01-22 04:26:17',1)," - sql += "(12,'Sketch Measure','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Friendly user interface offers you a more intuitive way of making marks.','http://utom.design/measure/','2019-01-22 04:26:55','2019-01-22 04:26:55',1)," - sql += "(12,'Sketch App Sources','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free design resources and plugins - Icons, UI Kits, Wireframes, iOS, Android Templates for Sketch','https://www.sketchappsources.com/','2019-01-22 04:27:43','2019-01-22 04:27:43',1)," - sql += "(12,'Sketch.im','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Sketch 相关资源汇聚。','http://www.sketch.im/','2019-01-22 04:28:20','2019-01-22 04:28:20',1)," - sql += "(12,'Sketch Hunt','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Sketch Hunt is an independent blog sharing gems in learning, plugins & design tools for fans of Sketch app.','http://sketchhunt.com/','2019-01-22 04:29:44','2019-01-22 04:29:44',1)," - sql += "(12,'Sketch中文网','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','分享最新的Sketch中文手册。','http://www.sketchcn.com/','2019-01-22 04:30:21','2019-01-22 04:30:21',1)," - sql += "(12,'Awesome Sketch Plugins','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','A collection of really useful Sketch plugins.','https://awesome-sket.ch/','2019-01-22 04:31:24','2019-01-22 04:31:24',1)," - sql += "(12,'Sketchcasts','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Learn Sketch Train your design skills with a weekly video tutorial','https://www.sketchcasts.net/','2019-01-22 04:32:00','2019-01-22 04:32:00',1)," - sql += "(13,'Google Font','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Making the web more beautiful, fast, and open through great typography.','https://fonts.google.com/','2019-01-22 04:32:42','2019-01-22 04:32:42',1)," - sql += "(13,'Typekit','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Quality fonts from the world’s best foundries.','https://typekit.com/','2019-01-22 04:33:14','2019-01-22 04:33:14',1)," - sql += "(13,'方正字库','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','方正字库官方网站。','http://www.foundertype.com/','2019-01-22 04:37:57','2019-01-22 04:37:57',1)," - sql += "(13,'字体传奇网','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','中国首个字体品牌设计师交流网。','http://ziticq.com/','2019-01-22 04:38:51','2019-01-22 04:38:51',1)," - sql += "(13,'私藏字体','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','优质字体免费下载站。','http://sicangziti.com/','2019-01-22 04:40:03','2019-01-22 04:40:03',1)," - sql += "(13,'Fontsquirrel','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','FREE fonts for graphic designers.','https://www.fontsquirrel.com/','2019-01-22 04:40:43','2019-01-22 04:40:43',1)," - sql += "(13,'Urban Fonts','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Download Free Fonts and Free Dingbats.','https://www.urbanfonts.com/','2019-01-22 04:41:23','2019-01-22 04:41:23',1)," - sql += "(13,'Lost Type','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Lost Type is a Collaborative Digital Type Foundry.','http://www.losttype.com/','2019-01-22 04:41:56','2019-01-22 04:41:56',1)," - sql += "(13,'FONTS2U','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Download free fonts for Windows and Macintosh.','https://fonts2u.com/','2019-01-22 04:42:46','2019-01-22 04:42:46',1)," - sql += "(13,'Fontex','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free Fonts to Download + Premium Typefaces.','http://www.fontex.org/','2019-01-22 04:43:17','2019-01-22 04:43:17',1)," - sql += "(13,'FontM','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free Fonts.','http://fontm.com/','2019-01-22 04:43:49','2019-01-22 04:43:49',1)," - sql += "(13,'My Fonts','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Fonts for Print, Products & Screens.','http://www.myfonts.com/','2019-01-22 04:45:27','2019-01-22 04:45:27',1)," - sql += "(13,'Da Font','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Archive of freely downloadable fonts.','https://www.dafont.com/','2019-01-22 04:46:04','2019-01-22 04:46:04',1)," - sql += "(13,'OnlineWebFonts','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','WEB Free Fonts for Windows and Mac / Font free Download.','https://www.onlinewebfonts.com/','2019-01-22 04:46:36','2019-01-22 04:46:36',1)," - sql += "(13,'Abstract Fonts','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Abstract Fonts (13,866 free fonts).','http://www.abstractfonts.com/','2019-01-22 04:47:08','2019-01-22 04:47:08',1)," - sql += "(14,'MockupZone','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Mockup Zone is an online store where you can find free and premium PSD mockup files to show your designs in a professional way.','https://mockup.zone/','2019-01-22 05:07:01','2019-01-22 05:07:01',1)," - sql += "(14,'Dunnnk','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Generate Product Mockups For Free.','http://dunnnk.com/','2019-01-22 05:08:13','2019-01-22 05:08:13',1)," - sql += "(14,'Graphberry','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free design resources, Mockups, PSD web templates, Icons.','http://www.graphberry.com/','2019-01-22 05:08:51','2019-01-22 05:08:51',1)," - sql += "(14,'Threed','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Generate 3D Mockups right in your Browser','http://threed.io/','2019-01-22 05:09:22','2019-01-22 05:09:22',1)," - sql += "(14,'Mockup World','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','The best free Mockups from the Web','https://free.lstore.graphics/','2019-01-22 05:09:54','2019-01-22 05:09:54',1)," - sql += "(14,'Lstore','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Exclusive mindblowing freebies for designers and developers.','https://free.lstore.graphics/','2019-01-22 05:11:00','2019-01-22 05:11:00',1)," - sql += "(14,'pixeden','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','free web resources and graphic design templates.','https://www.pixeden.com/','2019-01-22 05:11:36','2019-01-22 05:11:36',1)," - sql += "(14,'For Graphic TM','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','High Quality PSD Mockups for Graphic Designers.','http://forgraphictm.com/','2019-01-22 05:12:28','2019-01-22 05:12:28',1)," - sql += "(15,'Unsplash','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Beautiful, free photos.','https://unsplash.com/','2019-01-22 05:16:19','2019-01-22 05:16:19',1)," - sql += "(15,'visualhunt','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','100% Free High Quality Photos.','https://visualhunt.com/','2019-01-22 05:16:55','2019-01-22 05:16:55',1)," - sql += "(15,'librestock','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','65,084 high quality do-what-ever-you-want stock photos.','https://librestock.com/','2019-01-22 05:17:27','2019-01-22 05:17:34',1)," - sql += "(15,'pixabay','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','可在任何地方使用的免费图片和视频。','https://pixabay.com/','2019-01-22 05:18:10','2019-01-22 05:18:10',1)," - sql += "(15,'SplitShire','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free Stock Photos and Videos for commercial use.','https://www.splitshire.com/','2019-01-22 05:19:07','2019-01-22 05:19:07',1)," - sql += "(15,'StockSnap','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Beautiful free stock photos.','https://stocksnap.io/','2019-01-22 05:19:40','2019-01-22 05:19:40',1)," - sql += "(15,'albumarium','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','The best place to find & share beautiful images.','http://albumarium.com/','2019-01-22 05:20:11','2019-01-22 05:20:11',1)," - sql += "(15,'myphotopack','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','A free photo pack just for you. Every month.','https://myphotopack.com/','2019-01-22 05:20:44','2019-01-22 05:20:44',1)," - sql += "(15,'Notaselfie','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Photos that happen along the way. You can use the images anyway you like. Have fun!','http://notaselfie.com/','2019-01-22 05:21:31','2019-01-22 05:21:31',1)," - sql += "(15,'papers','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Wallpapers Every Hour!Hand collected :)','http://papers.co/','2019-01-22 05:22:06','2019-01-22 05:22:06',1)," - sql += "(15,'stokpic','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free Stock Photos For Commercial Use.','http://stokpic.com/','2019-01-22 05:22:55','2019-01-22 05:22:55',1)," - sql += "(15,'55mm','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Use our FREE photos to tell your story!','https://55mm.co/visuals','2019-01-22 05:23:27','2019-01-22 05:23:27',1)," - sql += "(15,'thestocks','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Use our FREE photos to tell your story!','http://thestocks.im/','2019-01-22 05:24:11','2019-01-22 05:24:11',1)," - sql += "(15,'freenaturestock','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Exclusive mindblowing freebies for designers and developers.','http://freenaturestock.com/','2019-01-22 05:27:20','2019-01-22 05:27:20',1)," - sql += "(15,'negativespace','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Beautiful, High-Resolution Free Stock Photos.','https://negativespace.co/','2019-01-22 05:28:11','2019-01-22 05:28:11',1)," - sql += "(15,'gratisography','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free high-resolution pictures you can use on your personal and commercial projects, free of copyright restrictions.','https://gratisography.com/','2019-01-22 05:28:53','2019-01-22 05:28:53',1)," - sql += "(15,'imcreator','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','A curated collection of free web design resources, all for commercial use.','http://imcreator.com/free','2019-03-12 02:21:55','2019-03-12 02:21:55',1)," - sql += "(15,'lifeofpix','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free high resolution photography','http://www.lifeofpix.com/','2019-03-12 02:22:49','2019-03-12 02:22:49',1)," - sql += "(15,'skitterphoto','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free Stock Photos for Creative Professionals','https://skitterphoto.com/','2019-03-12 02:23:32','2019-03-12 02:23:32',1)," - sql += "(15,'mmtstock','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Free photos for commercial use','https://mmtstock.com/','2019-03-12 02:24:19','2019-03-12 02:24:19',1)," - sql += "(15,'magdeleine','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','HAND-PICKED FREE PHOTOS FOR YOUR INSPIRATION','https://magdeleine.co/browse/','2019-03-12 02:25:17','2019-03-12 02:25:17',1)," - sql += "(15,'jeshoots','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','New Free Photos & Mockups in to your Inbox!','http://jeshoots.com/','2019-03-12 02:25:49','2019-03-12 02:25:49',1)," - sql += "(15,'hdwallpapers','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','High Definition Wallpapers & Desktop Backgrounds','https://www.hdwallpapers.net','2019-03-12 02:26:19','2019-03-12 02:26:19',1)," - sql += "(15,'publicdomainarchive','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','New 100% Free Stock Photos. Every. Single. Week.','http://publicdomainarchive.com/','2019-03-12 02:26:49','2019-03-12 02:26:49',1)," - sql += "(16,'OfficePLUS','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','OfficePLUS,微软Office官方在线模板网站!','http://www.officeplus.cn/Template/Home.shtml','2019-03-12 02:27:23','2019-03-12 02:27:23',1)," - sql += "(16,'优品PPT','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','高质量的模版,而且还有PPT图表,PPT背景图等资源','http://www.ypppt.com/','2019-03-12 02:27:52','2019-03-12 02:27:52',1)," - sql += "(16,'PPT+','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','PPT加直播、录制和分享—PPT+语音内容分享平台','http://www.pptplus.cn/','2019-03-12 02:28:22','2019-03-12 02:28:22',1)," - sql += "(16,'PPTMind','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','分享高端ppt模板与keynote模板的数字作品交易平台','http://www.pptmind.com/','2019-03-12 02:28:53','2019-03-12 02:28:53',1)," - sql += "(16,'tretars','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','The best free Mockups from the Web','http://www.tretars.com/ppt-templates','2019-03-12 02:29:21','2019-03-12 02:29:21',1)," - sql += "(16,'5百丁','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','中国领先的PPT模板共享平台','http://ppt.500d.me/','2019-03-12 02:29:51','2019-03-12 02:29:51',1)," - sql += "(18,'photoshop','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Photoshop不需要解释','https://www.adobe.com/cn/products/photoshop.html','2019-03-12 02:30:54','2019-03-12 02:30:54',1)," - sql += "(18,'Affinity Designer','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','专业创意软件','https://affinity.serif.com/','2019-03-12 02:32:06','2019-03-12 02:32:06',1)," - sql += "(18,'Illustrator','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','矢量图形和插图。','https://www.adobe.com/cn/products/illustrator/','2019-03-12 02:32:51','2019-03-12 02:32:51',1)," - sql += "(18,'indesign','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','页面设计、布局和出版。','http://www.adobe.com/cn/products/indesign.html','2019-03-12 02:33:19','2019-03-12 02:33:19',1)," - sql += "(18,'cinema-4d','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Cinema 4D is the perfect package for all 3D artists who want to achieve breathtaking results fast and hassle-free.','https://www.maxon.net/en/products/cinema-4d/overview/','2019-03-12 02:34:04','2019-03-12 02:34:04',1)," - sql += "(18,'3ds-max','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','3D modeling, animation, and rendering software','https://www.autodesk.com/products/3ds-max/overview','2019-03-12 02:34:39','2019-03-12 02:34:39',1)," - sql += "(18,'Blender','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Blender is the free and open source 3D creation suite.','https://www.blender.org/','2019-03-12 02:35:09','2019-03-12 02:35:09',1)," - sql += "(19,'Sketch','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','The digital design toolkit','https://sketchapp.com/','2019-03-12 02:35:55','2019-03-12 02:35:55',1)," - sql += "(19,'Adobe XD','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Introducing Adobe XD. Design. Prototype. Experience.','http://www.adobe.com/products/xd.html','2019-03-12 02:36:39','2019-03-12 02:36:39',1)," - sql += "(19,'invisionapp','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Powerful design prototyping tools','https://www.invisionapp.com/','2019-03-12 02:37:36','2019-03-12 02:37:36',1)," - sql += "(19,'marvelapp','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Simple design, prototyping and collaboration','https://marvelapp.com/','2019-03-12 02:38:14','2019-03-12 02:38:14',1)," - sql += "(19,'Muse CC','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','无需利用编码即可进行网站设计。','https://creative.adobe.com/zh-cn/products/download/muse','2019-03-12 02:38:53','2019-03-12 02:38:53',1)," - sql += "(19,'figma','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Design, prototype, and gather feedback all in one place with Figma.','https://www.figma.com/','2019-03-12 02:39:20','2019-03-12 02:39:20',1)," - sql += "(20,'Adobe After Effects CC','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','电影般的视觉效果和动态图形。','https://www.adobe.com/cn/products/aftereffects/','2019-03-12 02:40:17','2019-03-12 02:40:17',1)," - sql += "(20,'principle','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Animate Your Ideas, Design Better Apps','http://principleformac.com/','2019-03-12 02:40:48','2019-03-12 02:40:48',1)," - sql += "(20,'flinto','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Flinto is a Mac app used by top designers around the world to create interactive and animated prototypes of their app designs.','https://www.flinto.com/','2019-03-12 02:41:26','2019-03-12 02:41:26',1)," - sql += "(20,'framer','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Design everything from detailed icons to high-fidelity interactions—all in one place.','https://framer.com/','2019-03-12 02:42:05','2019-03-12 02:42:05',1)," - sql += "(20,'ProtoPie','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','高保真交互原型设计','http://www.protopie.cn/','2019-03-12 02:42:41','2019-03-12 02:42:41',1)," - sql += "(21,'khroma','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Khroma is the fastest way to discover, search, and save color combos you''ll want to use.','http://khroma.co/generator/','2019-03-12 02:45:06','2019-03-12 02:45:06',1)," - sql += "(21,'uigradients','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Beautiful colored gradients','https://uigradients.com','2019-03-12 02:45:49','2019-03-12 02:45:49',1)," - sql += "(21,'gradients','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Curated gradients for designers and developers','http://gradients.io/','2019-03-12 02:46:19','2019-03-12 02:46:19',1)," - sql += "(21,'Coolest','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Coolest handpicked Gradient Hues for your next super ⚡ amazing stuff','https://webkul.github.io/coolhue/','2019-03-12 02:46:47','2019-03-12 02:46:47',1)," - sql += "(21,'webgradients','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','WebGradients is a free collection of 180 linear gradients that you can use as content backdrops in any part of your website.','https://webgradients.com/','2019-03-12 02:47:17','2019-03-12 02:47:17',1)," - sql += "(21,'grabient','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','2017 Grabient by unfold','https://www.grabient.com/','2019-03-12 02:48:04','2019-03-12 02:48:04',1)," - sql += "(21,'thedayscolor','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','The daily color digest','http://www.thedayscolor.com/','2019-03-12 02:48:34','2019-03-12 02:48:34',1)," - sql += "(21,'flatuicolors','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Copy Paste Color Pallette from Flat UI Theme','http://flatuicolors.com/','2019-03-12 02:49:25','2019-03-12 02:49:25',1)," - sql += "(21,'coolors','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','The super fast color schemes generator!','https://coolors.co/','2019-03-12 02:50:11','2019-03-12 02:50:11',1)," - sql += "(0,'colorhunt','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Beautiful Color Palettes','http://www.colorhunt.co/','2019-03-12 02:50:35','2019-03-12 02:50:35',1)," - sql += "(21,'Adobe Color CC','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Create color schemes with the color wheel or browse thousands of color combinations from the Color community.','https://color.adobe.com/zh/create/color-wheel','2019-03-12 02:51:03','2019-03-12 02:51:03',1)," - sql += "(21,'flatuicolorpicker','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Best Flat Colors For UI Design','http://www.flatuicolorpicker.com/','2019-03-12 02:51:35','2019-03-12 02:51:35',1)," - sql += "(21,'trianglify','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Trianglify Generator','http://qrohlf.com/trianglify-generator/','2019-03-12 02:52:12','2019-03-12 02:52:12',1)," - sql += "(21,'klart','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Beautiful colors and designs to your inbox every week','https://klart.co/colors/','2019-03-12 02:52:40','2019-03-12 02:52:40',1)," - sql += "(21,'vanschneider','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Color Claim was created in 2012 by Tobias van Schneider with the goal to collect & combine unique colors for my future projects.','http://www.vanschneider.com/colors','2019-03-12 02:53:23','2019-03-12 02:53:23',1)," - sql += "(22,'tinypng','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Optimize your images with a perfect balance in quality and file size.','https://tinypng.com/','2019-03-12 02:54:39','2019-03-12 02:54:39',1)," - sql += "(0,'goqr','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','create QR codes for free (Logo, T-Shirt, vCard, EPS)','http://goqr.me/','2019-03-12 02:55:04','2019-03-12 02:55:04',1)," - sql += "(22,'Android 9 patch','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Android 9-patch shadow generator fully customizable shadows','http://inloop.github.io/shadow4android/','2019-03-12 02:55:38','2019-03-12 02:55:38',1)," - sql += "(22,'screen sizes','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Viewport Sizes and Pixel Densities for Popular Devices','http://screensiz.es/','2019-03-12 02:56:06','2019-03-12 02:56:06',1)," - sql += "(22,'svgomg','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','SVG在线压缩平台','https://jakearchibald.github.io/svgomg/','2019-03-12 02:56:37','2019-03-12 02:56:37',1)," - sql += "(22,'稿定抠图','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','免费在线抠图软件,图片快速换背景-抠白底图','https://www.gaoding.com','2019-03-12 02:56:59','2019-03-12 02:56:59',1)," - sql += "(23,'wappalyzer','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Identify technology on websites','https://www.wappalyzer.com/','2019-03-12 02:58:27','2019-03-12 02:58:27',1)," - sql += "(23,'Panda','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','A smart news reader built for productivity.','http://usepanda.com/','2019-03-12 02:58:50','2019-03-12 02:58:50',1)," - sql += "(23,'sizzy','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','A tool for developing responsive websites crazy-fast','https://sizzy.co/','2019-03-12 02:59:17','2019-03-12 02:59:17',1)," - sql += "(23,'csspeeper','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Smart CSS viewer tailored for Designers.','https://csspeeper.com/','2019-03-12 02:59:48','2019-03-12 02:59:48',1)," - sql += "(23,'insight','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','IDE-like code search and navigation, on the cloud','http://insight.io/','2019-03-12 03:00:22','2019-03-12 03:00:22',1)," - sql += "(23,'mustsee','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Discover the world''s most beautiful places at every opened tab.','http://mustsee.earth/','2019-03-12 03:00:50','2019-03-12 03:00:50',1)," - sql += "(25,'Design Guidelines','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Design Guidelines — The way products are built.','http://designguidelines.co/','2019-03-12 03:01:29','2019-03-12 03:01:29',1)," - sql += "(25,'Awesome design systems','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','A collection of awesome design systems','https://github.com/alexpate/awesome-design-systems','2019-03-12 03:01:55','2019-03-12 03:01:55',1)," - sql += "(25,'Material Design','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Introduction - Material Design','https://material.io/guidelines/','2019-03-12 03:02:28','2019-03-12 03:02:28',1)," - sql += "(25,'Human Interface Guidelines','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Human Interface Guidelines iOS','https://developer.apple.com/ios/human-interface-guidelines','2019-03-12 03:02:57','2019-03-12 03:02:57',1)," - sql += "(25,'Photoshop Etiquette','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','PS礼仪-WEB设计指南','http://viggoz.com/photoshopetiquette/','2019-03-12 03:03:33','2019-03-12 03:03:33',1)," - sql += "(26,'Photoshop Lady','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Your Favourite Photoshop Tutorials in One Place','http://www.photoshoplady.com/','2019-03-12 03:04:09','2019-03-12 03:04:09',1)," - sql += "(26,'doyoudo','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','创意设计软件学习平台','http://doyoudo.com/','2019-03-12 03:04:38','2019-03-12 03:04:38',1)," - sql += "(26,'没位道','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','WEB UI免费视频公开课','http://www.c945.com/web-ui-tutorial/','2019-03-12 03:05:04','2019-03-12 03:05:04',1)," - sql += "(26,'慕课网','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','程序员的梦工厂(有UI课程)','https://www.imooc.com/','2019-03-12 03:05:29','2019-03-12 03:05:29',1)," - sql += "(27,'优设网','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','设计师交流学习平台','http://www.uisdc.com/','2019-03-12 03:06:02','2019-03-12 03:06:02',1)," - sql += "(27,'Web Design Ledger','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Web Design Blog','https://webdesignledger.com','2019-03-12 03:06:28','2019-03-12 03:06:28',1)," - sql += "(27,'Medium','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Read, write and share stories that matter','https://medium.com/','2019-03-12 03:06:57','2019-03-12 03:06:57',1)," - sql += "(28,'UX Coffee','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','《UX Coffee 设计咖》是一档关于用户体验的播客节目。我们邀请来自硅谷和国内的学者和职人来聊聊「产品设计」、「用户体验」和「个人成长」。','http://uxcoffee.co/','2019-03-12 03:08:40','2019-03-12 03:08:40',1)," - sql += "(28,'Anyway.FM','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','设计杂谈 • UI 设计师 JJ 和 Leon 主播的设计播客','https://anyway.fm/','2019-03-12 03:09:19','2019-03-12 03:09:19',1)," - sql += "(28,'异能电台','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','将全宇宙设计师的故事讲给你听。','https://www.yineng.fm','2019-03-12 03:09:52','2019-03-12 03:09:52',1)," - sql += "(35,'小毛驴在线音乐','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','在线播放音乐,集成各大主流音乐播放器资源!','http://music.zywhs.club/','2019-12-18 11:58:22','2019-12-18 11:59:49',1)," - sql += "(35,'小毛驴在线视频','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','在线视频,直播播放,集成各大主流视频播放器资源!(庆余年有全集!速度简直太快啦)','http://video.zywhs.club/','2019-12-18 12:01:29','2019-12-21 17:32:53',1)," - sql += "(36,'Bing','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','微软Bing搜索是国际领先的搜索引擎,为中国用户提供网页、图片、视频、学术、词典、翻译、地图等全球信息搜索服务。','https://www.bing.com','2019-12-19 10:15:52','2019-12-19 10:17:36',1)," - sql += "(36,'DuckDuckGo','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','DuckDuckGo是一个互联网搜寻引擎,其总部位于美国宾州Valley Forge市。','http://www.duckduckgoog.com/','2019-12-19 10:19:27','2019-12-19 10:19:27',1)," - sql += "(36,'Wikipedia','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','维基百科(Wikipedia),是一个基于维基技术的多语言百科全书协作计划,用多种语言编写的网络百科全书。','https://en.wikipedia.org/wiki/Main_Page','2019-12-19 10:20:54','2019-12-19 10:22:24',1)," - sql += "(2,'Twitter','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Twitter(通称推特)是一家美国社交网络及微博客服务的网站,是全球互联网上访问量最大的十个网站之一。','https://twitter.com/','2019-12-19 10:24:06','2019-12-19 10:25:56',1)," - sql += "(2,'Facebook','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Facebook(中文译为脸书或者脸谱网)是美国的一个社交网络服务网站 ,创立于2004年2月4日,总部位于美国加利福尼亚州门洛帕克。 ','https://www.facebook.com','2019-12-19 10:43:52','2019-12-19 11:04:14',1)," - sql += "(37,'Steam','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','蒸汽,蒸汽,欧里给!','https://store.steampowered.com/','2019-12-19 10:46:58','2019-12-19 11:03:24',1)," - sql += "(2,'Reddit','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Reddit是个社交新闻站点,口号:提前于新闻发声,来自互联网的声音。其拥有者是Condé Nast Digital公司(Advance Magazine Publishers Inc的子公司)。','https://www.reddit.com/','2019-12-19 10:49:04','2019-12-19 11:04:55',1)," - sql += "(2,'Tumblr','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Tumblr(/ˈtʌmblər/,中文名:汤博乐)成立于2007年,是目前全球最大的轻博客网站,也是轻博客网站的始祖。','https://www.tumblr.com/','2019-12-19 10:50:54','2019-12-19 11:05:15',1)," - sql += "(2,'Instagram','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','Instagram(照片墙)是一款运行在移动端上的社交应用,以一种快速、美妙和有趣的方式将你随时抓拍下的图片彼此分享。','https://www.instagram.com/','2019-12-19 10:51:51','2019-12-19 11:03:59',1)," - sql += "(1,'中国知网','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','中国知网知识发现网络平台—面向海内外读者提供中国学术文献、外文文献、学位论文、报纸、会议、年鉴、工具书等各类资源统一检索、统一导航、在线阅读和下载服务。','https://www.cnki.net/','2019-12-19 11:02:02','2019-12-19 11:02:02',1)," - sql += "(38,'掘金','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','掘金是一个帮助开发者成长的社区,是给开发者用的 Hacker News,给设计师用的 Designer News,和给产品经理用的 Medium。','https://juejin.im/','2019-12-19 11:16:44','2019-12-19 11:16:44',1)," - sql += "(38,'CSDN','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','CSDN是全球知名中文IT技术交流平台,创建于1999年,包含原创博客、精品问答、职业培训、技术论坛、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区','https://www.csdn.net/','2019-12-19 11:17:51','2019-12-19 11:17:51',1)," - sql += "(38,'博客园','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','博客园是一个面向开发者的知识分享社区。自创建以来,博客园一直致力并专注于为开发者打造一个纯净的技术交流社区,推动并帮助开发者通过互联网分享知识','https://www.cnblogs.com/','2019-12-19 11:22:28','2019-12-19 11:22:28',1)," - sql += "(1,'蚂蚁加速器','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','很好用的免费加速器','https://d.antss049.xyz/aff/7Nc5','2019-12-19 14:32:19','2019-12-19 14:32:19',1)," - sql += "(1,'小青豆影视','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','电影在线播放,电影在线观看,小青豆影视(庆余年全集!)','http://www.bbc334.com/index.php/user/visit.html?uid=2','2019-12-19 16:39:22','2019-12-20 10:00:11',1)," - sql += "(38,'GitHub','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名GitHub。','https://github.com/','2019-12-19 21:21:27','2019-12-19 21:21:27',1)," - sql += "(39,'友盟','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','友盟+,国内领先的第三方全域数据智能服务商。专注为互联网企业提供一站式数据分析运营服务近10年。','https://www.umeng.com/','2019-12-19 21:55:09','2019-12-19 21:55:09',1)," - sql += "(39,'百度统计','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','百度移动统计是一款专业免费的移动应用统计分析工具,支持android,ios平台。','https://tongji.baidu.com/web/welcome/basic','2019-12-19 21:57:19','2019-12-19 23:21:10',1)," - sql += "(35,'站长的个人博客','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','这是站长的个人博客。来玩哦','http://blogs.zywhs.club/','2019-12-20 15:51:09','2019-12-20 15:51:09',1)," - sql += "(38,'码云','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','码云& #40,gitee.com& #41,是 OSCHINA.NET 推出的代码托管平台,支持 Git 和 SVN,提供免费的私有仓库托管。','https://gitee.com/','2019-12-20 17:06:05','2019-12-20 17:09:45',1)," - sql += "(1,'windows系统','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','正版win10下载地址','https://www.microsoft.com/zh-cn/software-download/windows10','2019-12-20 18:08:29','2019-12-20 18:08:29',1)," - sql += "(40,'QQ邮箱','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','QQ邮箱登录入口','https://mail.qq.com/','2019-12-20 19:38:56','2019-12-20 19:38:56',1)," - sql += "(40,'网易邮箱','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','网易邮箱163登录入口','https://mail.163.com/','2019-12-20 19:40:55','2019-12-20 19:53:07',1)," - sql += "(40,'网易邮箱','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','网易邮箱126登录入口','https://mail.126.com/','2019-12-20 19:51:31','2019-12-20 19:51:31',1)," - sql += "(40,'中国移动139邮箱','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','中国移动139邮箱登录入口','http://html5.mail.10086.cn/pad/pad_login.html','2019-12-20 19:55:52','2019-12-20 19:55:52',1)," - sql += "(40,'outlook邮箱','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','outlook邮箱登录及注册入口','https://outlook.live.com/owa/','2019-12-20 19:59:57','2019-12-20 19:59:57',1)," - sql += "(36,'磁力搜索','http://127.0.0.1:9999/assets/bootstrap/static/index/images/favicon.png','磁力搜索','http://cilisou8.com/','2019-12-22 14:01:00','2019-12-22 14:01:00',1);" - - return -} diff --git a/internal/render/admin/admin.go b/internal/render/admin/admin.go deleted file mode 100755 index d7a4ec8..0000000 --- a/internal/render/admin/admin.go +++ /dev/null @@ -1,134 +0,0 @@ -package admin - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "go.uber.org/zap" -) - -type handler struct { - db mysql.Repo - logger *zap.Logger - cache redis.Repo -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) *handler { - return &handler{ - logger: logger, - cache: cache, - db: db, - } -} - -func (h *handler) Login() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("admin_login", nil) - } -} - -func (h *handler) Add() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("admin_add", nil) - } -} - -func (h *handler) List() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("admin_list", nil) - } -} - -func (h *handler) Category() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("category_view", nil) - } -} - -func (h *handler) Site() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("site_list", nil) - } -} - -func (h *handler) AddSite() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("site_add", nil) - } -} - -func (h *handler) Menu() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("menu_view", nil) - } -} - -func (h *handler) AdminMenu() core.HandlerFunc { - type adminMenuRequest struct { - Id string `uri:"id"` // 主键ID - } - - type adminMenuResponse struct { - HashID string `json:"hash_id"` // hashID - } - - return func(ctx core.Context) { - req := new(adminMenuRequest) - if err := ctx.ShouldBindURI(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - obj := new(adminMenuResponse) - obj.HashID = req.Id - - ctx.HTML("admin_menu", obj) - } -} - -func (h *handler) MenuAction() core.HandlerFunc { - type menuActionRequest struct { - Id string `uri:"id"` // 主键ID - } - - type menuActionResponse struct { - HashID string `json:"hash_id"` // hashID - } - - return func(ctx core.Context) { - req := new(menuActionRequest) - if err := ctx.ShouldBindURI(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - obj := new(menuActionResponse) - obj.HashID = req.Id - - ctx.HTML("menu_action", obj) - } -} - -func (h *handler) ModifyInfo() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("admin_modify_info", nil) - } -} - -func (h *handler) ModifyPassword() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("admin_modify_password", nil) - } -} diff --git a/internal/render/authorized/authorized.go b/internal/render/authorized/authorized.go deleted file mode 100755 index f16584b..0000000 --- a/internal/render/authorized/authorized.go +++ /dev/null @@ -1,71 +0,0 @@ -package authorized - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "go.uber.org/zap" -) - -type handler struct { - db mysql.Repo - logger *zap.Logger - cache redis.Repo -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) *handler { - return &handler{ - logger: logger, - cache: cache, - db: db, - } -} - -func (h *handler) Add() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("authorized_add", nil) - } -} - -func (h *handler) Demo() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("authorized_demo", nil) - } -} - -func (h *handler) List() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("authorized_list", nil) - } -} - -func (h *handler) Api() core.HandlerFunc { - type apiRequest struct { - Id string `uri:"id"` // 主键ID - } - - type apiResponse struct { - HashID string `json:"hash_id"` // hashID - } - - return func(ctx core.Context) { - req := new(apiRequest) - if err := ctx.ShouldBindURI(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - obj := new(apiResponse) - obj.HashID = req.Id - - ctx.HTML("authorized_api", obj) - } -} diff --git a/internal/render/config/config.go b/internal/render/config/config.go deleted file mode 100755 index e940f4c..0000000 --- a/internal/render/config/config.go +++ /dev/null @@ -1,99 +0,0 @@ -package config - -import ( - "go/token" - "log" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "github.com/dave/dst" - "github.com/dave/dst/decorator" - "github.com/spf13/cast" - "go.uber.org/zap" -) - -const minBusinessCode = 20000 - -type handler struct { - logger *zap.Logger - cache redis.Repo -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) *handler { - return &handler{ - logger: logger, - cache: cache, - } -} - -func (h *handler) Email() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("config_email", configs.Get()) - } -} - -func (h *handler) Code() core.HandlerFunc { - type codes struct { - Code int `json:"code"` // 错误码 - Message string `json:"message"` // 错误码信息 - } - - type codeViewResponse struct { - SystemCodes []codes - BusinessCodes []codes - } - - parsedFile, err := decorator.Parse(code.ByteCodeFile) - if err != nil { - log.Fatalf("parsing code.go: %s: %s\n", "ByteCodeFile", err) - } - - var ( - systemCodes []codes - businessCodes []codes - ) - - dst.Inspect(parsedFile, func(n dst.Node) bool { - // GenDecl 代表除函数以外的所有声明,即 import、const、var 和 type - decl, ok := n.(*dst.GenDecl) - if !ok || decl.Tok != token.CONST { - return true - } - - for _, spec := range decl.Specs { - valueSpec, _ok := spec.(*dst.ValueSpec) - if !_ok { - continue - } - - codeInt := cast.ToInt(valueSpec.Values[0].(*dst.BasicLit).Value) - - if codeInt < minBusinessCode { - systemCodes = append(systemCodes, codes{ - Code: codeInt, - Message: code.Text(codeInt), - }) - } else { - businessCodes = append(businessCodes, codes{ - Code: codeInt, - Message: code.Text(codeInt), - }) - } - - } - - return true - }) - - return func(ctx core.Context) { - obj := new(codeViewResponse) - obj.BusinessCodes = businessCodes - obj.SystemCodes = systemCodes - - ctx.HTML("config_code", obj) - } -} diff --git a/internal/render/cron/cron.go b/internal/render/cron/cron.go deleted file mode 100755 index 07f9559..0000000 --- a/internal/render/cron/cron.go +++ /dev/null @@ -1,64 +0,0 @@ -package cron - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "go.uber.org/zap" -) - -type handler struct { - logger *zap.Logger - cache redis.Repo - db mysql.Repo -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) *handler { - return &handler{ - logger: logger, - cache: cache, - db: db, - } -} - -func (h *handler) Add() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("cron_task_add", nil) - } -} - -func (h *handler) Edit() core.HandlerFunc { - type editRequest struct { - Id string `uri:"id"` // 主键ID - } - - type editResponse struct { - HashID string `json:"hash_id"` // hashID - } - - return func(ctx core.Context) { - req := new(editRequest) - if err := ctx.ShouldBindURI(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - obj := new(editResponse) - obj.HashID = req.Id - ctx.HTML("cron_task_edit", obj) - } -} - -func (h *handler) List() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("cron_task_list", nil) - } -} diff --git a/internal/render/dashboard/dashboard.go b/internal/render/dashboard/dashboard.go deleted file mode 100755 index 9e9c9f7..0000000 --- a/internal/render/dashboard/dashboard.go +++ /dev/null @@ -1,133 +0,0 @@ -package dashboard - -import ( - "fmt" - "os" - "runtime" - "strconv" - "strings" - "time" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/env" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "github.com/shirou/gopsutil/cpu" - "github.com/shirou/gopsutil/disk" - "github.com/shirou/gopsutil/host" - "github.com/shirou/gopsutil/mem" - "go.uber.org/zap" -) - -type handler struct { - logger *zap.Logger - cache redis.Repo - db mysql.Repo -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) *handler { - return &handler{ - logger: logger, - cache: cache, - db: db, - } -} - -const ( - B = 1 - KB = 1024 * B - MB = 1024 * KB - GB = 1024 * MB -) - -func (h *handler) View() core.HandlerFunc { - type mysqlVersion struct { - Ver string - } - - mysqlVer := new(mysqlVersion) - if h.db != nil { - h.db.GetDbR().Raw("SELECT version() as ver").Scan(mysqlVer) - } - - redisVer := "" - if h.cache != nil { - redisVer = h.cache.Version() - } - - type viewResponse struct { - MemTotal string - MemUsed string - MemUsedPercent float64 - - DiskTotal string - DiskUsed string - DiskUsedPercent float64 - - HostOS string - HostName string - - CpuName string - CpuCores int32 - CpuUsedPercent float64 - - GoPath string - GoVersion string - Goroutine int - ProjectPath string - Env string - Host string - GoOS string - GoArch string - - ProjectVersion string - MySQLVersion string - RedisVersion string - } - - return func(ctx core.Context) { - memInfo, _ := mem.VirtualMemory() - diskInfo, _ := disk.Usage("/") - hostInfo, _ := host.Info() - cpuInfo, _ := cpu.Info() - cpuPercent, _ := cpu.Percent(time.Second, false) - - obj := new(viewResponse) - obj.MemTotal = fmt.Sprintf("%d GB", memInfo.Total/GB) - obj.MemUsed = fmt.Sprintf("%d GB", memInfo.Used/GB) - obj.MemUsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", memInfo.UsedPercent), 64) - - obj.DiskTotal = fmt.Sprintf("%d GB", diskInfo.Total/GB) - obj.DiskUsed = fmt.Sprintf("%d GB", diskInfo.Used/GB) - obj.DiskUsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", diskInfo.UsedPercent), 64) - - obj.HostOS = fmt.Sprintf("%s(%s) %s", hostInfo.Platform, hostInfo.PlatformFamily, hostInfo.PlatformVersion) - obj.HostName = hostInfo.Hostname - - if len(cpuInfo) > 0 { - obj.CpuName = cpuInfo[0].ModelName - obj.CpuCores = cpuInfo[0].Cores - } - - if len(cpuPercent) > 0 { - obj.CpuUsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", cpuPercent[0]), 64) - } - - obj.GoPath = runtime.GOROOT() - obj.GoVersion = runtime.Version() - obj.Goroutine = runtime.NumGoroutine() - dir, _ := os.Getwd() - obj.ProjectPath = strings.Replace(dir, "\\", "/", -1) - obj.Host = ctx.Host() - obj.Env = env.Active().Value() - obj.GoOS = runtime.GOOS - obj.GoArch = runtime.GOARCH - obj.ProjectVersion = configs.ProjectVersion - obj.MySQLVersion = mysqlVer.Ver - obj.RedisVersion = redisVer - - ctx.HTML("dashboard", obj) - } -} diff --git a/internal/render/generator/generator.go b/internal/render/generator/generator.go deleted file mode 100755 index bb3d282..0000000 --- a/internal/render/generator/generator.go +++ /dev/null @@ -1,22 +0,0 @@ -package generator_handler - -import ( - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "go.uber.org/zap" -) - -type handler struct { - db mysql.Repo - logger *zap.Logger - cache redis.Repo -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) *handler { - return &handler{ - logger: logger, - cache: cache, - db: db, - } -} diff --git a/internal/render/generator/gorm_execute.go b/internal/render/generator/gorm_execute.go deleted file mode 100755 index b572427..0000000 --- a/internal/render/generator/gorm_execute.go +++ /dev/null @@ -1,30 +0,0 @@ -package generator_handler - -import ( - "fmt" - "github.com/ch3nnn/webstack-go/cmd/gormgen" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "strings" -) - -type gormExecuteRequest struct { - Tables string `form:"tables"` -} - -func (h *handler) GormExecute() core.HandlerFunc { - - return func(c core.Context) { - defer func() { - if err := recover(); err != nil { - c.Payload(fmt.Sprintf("创建失败! %s", err)) - } - }() - req := new(gormExecuteRequest) - if err := c.ShouldBindPostForm(req); err != nil { - c.Payload("参数传递有误") - return - } - gormgen.GenerateTable(strings.Split(req.Tables, ",")) - c.Payload("创建成功!") - } -} diff --git a/internal/render/generator/gorm_view.go b/internal/render/generator/gorm_view.go deleted file mode 100755 index ed99102..0000000 --- a/internal/render/generator/gorm_view.go +++ /dev/null @@ -1,55 +0,0 @@ -package generator_handler - -import ( - "fmt" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - - "go.uber.org/zap" -) - -func (h *handler) GormView() core.HandlerFunc { - return func(c core.Context) { - - type tableInfo struct { - Name string `db:"table_name"` // name - Comment string `db:"table_comment"` // comment - } - - var tableCollect []tableInfo - - mysqlConf := configs.Get().MySQL.Read - sqlTables := fmt.Sprintf("SELECT `table_name`,`table_comment` FROM `information_schema`.`tables` WHERE `table_schema`= '%s'", mysqlConf.Name) - rows, err := h.db.GetDbR().Raw(sqlTables).Rows() - if err != nil { - h.logger.Error("rows err", zap.Error(err)) - - c.HTML("generator_gorm", tableCollect) - return - } - - err = rows.Err() - if err != nil { - h.logger.Error("rows err", zap.Error(err)) - - c.HTML("generator_gorm", tableCollect) - return - } - - defer rows.Close() - - for rows.Next() { - var info tableInfo - err = rows.Scan(&info.Name, &info.Comment) - if err != nil { - fmt.Printf("execute query tables action error,had ignored, detail is [%v]\n", err.Error()) - continue - } - - tableCollect = append(tableCollect, info) - } - - c.HTML("generator_gorm", tableCollect) - } -} diff --git a/internal/render/generator/handler_execute.go b/internal/render/generator/handler_execute.go deleted file mode 100755 index db291c9..0000000 --- a/internal/render/generator/handler_execute.go +++ /dev/null @@ -1,26 +0,0 @@ -package generator_handler - -import ( - "github.com/ch3nnn/webstack-go/cmd/handlergen" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type handlerExecuteRequest struct { - Name string `form:"name"` -} - -func (h *handler) HandlerExecute() core.HandlerFunc { - - return func(c core.Context) { - req := new(handlerExecuteRequest) - if err := c.ShouldBindPostForm(req); err != nil { - c.Payload("参数传递有误") - return - } - if err := handlergen.GenerateHandler(req.Name); err != nil { - c.Payload(err.Error()) - return - } - c.Payload("创建成功!") - } -} diff --git a/internal/render/generator/handler_view.go b/internal/render/generator/handler_view.go deleted file mode 100755 index 8322f61..0000000 --- a/internal/render/generator/handler_view.go +++ /dev/null @@ -1,11 +0,0 @@ -package generator_handler - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -func (h *handler) HandlerView() core.HandlerFunc { - return func(c core.Context) { - c.HTML("generator_handler", nil) - } -} diff --git a/internal/render/index/index.go b/internal/render/index/index.go deleted file mode 100755 index 33a783d..0000000 --- a/internal/render/index/index.go +++ /dev/null @@ -1,29 +0,0 @@ -package index - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "go.uber.org/zap" -) - -type handler struct { - logger *zap.Logger - cache redis.Repo - db mysql.Repo -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) *handler { - return &handler{ - logger: logger, - cache: cache, - db: db, - } -} - -func (h *handler) Index() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("admin_index", nil) - } -} diff --git a/internal/render/install/execute.go b/internal/render/install/execute.go deleted file mode 100755 index e8efa35..0000000 --- a/internal/render/install/execute.go +++ /dev/null @@ -1,239 +0,0 @@ -package install - -import ( - "fmt" - "net/http" - "os" - "path" - "runtime" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/proposal/tablesqls" - - "github.com/go-redis/redis/v7" - "github.com/spf13/cast" - "github.com/spf13/viper" - "gorm.io/driver/mysql" - "gorm.io/gorm" - "gorm.io/gorm/schema" -) - -type initExecuteRequest struct { - Language string `form:"language" ` // 语言包 - RedisAddr string `form:"redis_addr"` // 连接地址,例如:127.0.0.1:6379 - RedisPass string `form:"redis_pass"` // 连接密码 - RedisDb string `form:"redis_db"` // 连接 db - - MySQLAddr string `form:"mysql_addr"` - MySQLUser string `form:"mysql_user"` - MySQLPass string `form:"mysql_pass"` - MySQLName string `form:"mysql_name"` -} - -func (h *Handler) Execute() core.HandlerFunc { - - installTableList := map[string]map[string]string{ - "authorized": { - "table_sql": tablesqls.CreateAuthorizedTableSql(), - "table_data_sql": tablesqls.CreateAuthorizedTableDataSql(), - }, - "authorized_api": { - "table_sql": tablesqls.CreateAuthorizedAPITableSql(), - "table_data_sql": tablesqls.CreateAuthorizedAPITableDataSql(), - }, - "admin": { - "table_sql": tablesqls.CreateAdminTableSql(), - "table_data_sql": tablesqls.CreateAdminTableDataSql(), - }, - "admin_menu": { - "table_sql": tablesqls.CreateAdminMenuTableSql(), - "table_data_sql": tablesqls.CreateAdminMenuTableDataSql(), - }, - "menu": { - "table_sql": tablesqls.CreateMenuTableSql(), - "table_data_sql": tablesqls.CreateMenuTableDataSql(), - }, - "menu_action": { - "table_sql": tablesqls.CreateMenuActionTableSql(), - "table_data_sql": tablesqls.CreateMenuActionTableDataSql(), - }, - "cron_task": { - "table_sql": tablesqls.CreateCronTaskTableSql(), - "table_data_sql": "", - }, - "site": { - "table_sql": tablesqls.CreateSiteTableSql(), - "table_data_sql": tablesqls.CreateSiteTableDateSql(), - }, - "category": { - "table_sql": tablesqls.CreateCategoryTableSql(), - "table_data_sql": tablesqls.CreateCategoryTableDataSql(), - }, - } - - return func(ctx core.Context) { - req := new(initExecuteRequest) - if err := ctx.ShouldBindForm(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - // region 验证 version - versionStr := runtime.Version() - version := cast.ToFloat32(versionStr[2:6]) - if version < configs.MinGoVersion { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.GoVersionError, - code.Text(code.GoVersionError)), - ) - return - } - // endregion - - // region 验证 Redis 配置 - cfg := configs.Get() - redisClient := redis.NewClient(&redis.Options{ - Addr: req.RedisAddr, - Password: req.RedisPass, - DB: cast.ToInt(req.RedisDb), - MaxRetries: cfg.Redis.MaxRetries, - PoolSize: cfg.Redis.PoolSize, - MinIdleConns: cfg.Redis.MinIdleConns, - }) - - if err := redisClient.Ping().Err(); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.RedisConnectError, - code.Text(code.RedisConnectError)).WithError(err), - ) - return - } - - defer redisClient.Close() - - outPutString := "已检测 Redis 配置可用。\n" - // endregion - - // region 验证 MySQL 配置 - dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=%t&loc=%s", - req.MySQLUser, - req.MySQLPass, - req.MySQLAddr, - req.MySQLName, - true, - "Local") - - db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ - NamingStrategy: schema.NamingStrategy{ - SingularTable: true, - }, - // Logger: logger.Default.LogMode(logger.Info), // 日志配置 - }) - - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.MySQLConnectError, - code.Text(code.MySQLConnectError)).WithError(err), - ) - return - } - - db.Set("gorm:table_options", "CHARSET=utf8mb4") - - dbClient, _ := db.DB() - defer dbClient.Close() - - outPutString += "已检测 MySQL 配置可用。\n" - // endregion - - // region 写入配置文件 - viper.Set("language.local", req.Language) - - viper.Set("redis.addr", req.RedisAddr) - viper.Set("redis.pass", req.RedisPass) - viper.Set("redis.db", req.RedisDb) - - viper.Set("mysql.read.addr", req.MySQLAddr) - viper.Set("mysql.read.user", req.MySQLUser) - viper.Set("mysql.read.pass", req.MySQLPass) - viper.Set("mysql.read.name", req.MySQLName) - - viper.Set("mysql.write.addr", req.MySQLAddr) - viper.Set("mysql.write.user", req.MySQLUser) - viper.Set("mysql.write.pass", req.MySQLPass) - viper.Set("mysql.write.name", req.MySQLName) - - if viper.WriteConfig() != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.WriteConfigError, - code.Text(code.WriteConfigError)).WithError(err), - ) - return - } - - outPutString += "语言包 " + req.Language + " 配置成功。\n" - outPutString += "配置项 Redis、MySQL 配置成功。\n" - // endregion - - // region 初始化表结构 + 默认数据 - for k, v := range installTableList { - if v["table_sql"] != "" { - // region 初始化表结构 - if err = db.Exec(v["table_sql"]).Error; err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.MySQLExecError, - code.Text(code.MySQLExecError)+" "+err.Error()).WithError(err), - ) - return - } - - outPutString += "初始化 MySQL 数据表:" + k + " 成功。\n" - // endregion - - // region 初始化默认数据 - if v["table_data_sql"] != "" { - if err = db.Exec(v["table_data_sql"]).Error; err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.MySQLExecError, - code.Text(code.MySQLExecError)+" "+err.Error()).WithError(err), - ) - return - } - - outPutString += "初始化 MySQL 数据表:" + k + " 默认数据成功。\n" - } - // endregion - } - } - // endregion - - // region 生成 install 完成标识 - dir, file := path.Split(configs.ProjectInstallMark) - _ = os.Mkdir(dir, os.ModePerm) - f, err := os.Create(path.Join(dir, file)) - if err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.MySQLExecError, - code.Text(code.MySQLExecError)+" "+err.Error()).WithError(err), - ) - return - } - defer f.Close() - // endregion - - ctx.Payload(outPutString) - } -} diff --git a/internal/render/install/install.go b/internal/render/install/install.go deleted file mode 100755 index a2491a9..0000000 --- a/internal/render/install/install.go +++ /dev/null @@ -1,42 +0,0 @@ -package install - -import ( - "net/http" - "runtime" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/file" - - "go.uber.org/zap" -) - -type Handler struct { - logger *zap.Logger -} - -func New(logger *zap.Logger) *Handler { - return &Handler{ - logger: logger, - } -} - -func (h *Handler) View() core.HandlerFunc { - type viewResponse struct { - Config configs.Config - MinGoVersion float64 - GoVersion string - } - - return func(ctx core.Context) { - if _, ok := file.IsExists(configs.ProjectInstallMark); ok { - ctx.Redirect(http.StatusTemporaryRedirect, "/") - } - - obj := new(viewResponse) - obj.Config = configs.Get() - obj.MinGoVersion = configs.MinGoVersion - obj.GoVersion = runtime.Version() - ctx.HTML("install_view", obj) - } -} diff --git a/internal/render/tool/tool.go b/internal/render/tool/tool.go deleted file mode 100755 index 167447c..0000000 --- a/internal/render/tool/tool.go +++ /dev/null @@ -1,120 +0,0 @@ -package tool - -import ( - "encoding/json" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/file" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "go.uber.org/zap" -) - -type handler struct { - logger *zap.Logger - cache redis.Repo -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) *handler { - return &handler{ - logger: logger, - cache: cache, - } -} - -func (h *handler) Cache() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("tool_cache", nil) - } -} - -func (h *handler) Data() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("tool_data", nil) - } -} - -func (h *handler) HashIds() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("tool_hashids", configs.Get()) - } -} - -func (h *handler) Websocket() core.HandlerFunc { - return func(ctx core.Context) { - ctx.HTML("tool_websocket", nil) - } -} - -func (h *handler) Log() core.HandlerFunc { - type logData struct { - Level string `json:"level"` - Time string `json:"time"` - Path string `json:"path"` - HTTPCode int `json:"http_code"` - Method string `json:"method"` - Msg string `json:"msg"` - TraceID string `json:"trace_id"` - Content string `json:"content"` - CostSeconds float64 `json:"cost_seconds"` - } - - type logsViewResponse struct { - Logs []logData `json:"logs"` - } - - type logParseData struct { - Level string `json:"level"` - Time string `json:"time"` - Caller string `json:"caller"` - Msg string `json:"msg"` - Domain string `json:"domain"` - Method string `json:"method"` - Path string `json:"path"` - HTTPCode int `json:"http_code"` - BusinessCode int `json:"business_code"` - Success bool `json:"success"` - CostSeconds float64 `json:"cost_seconds"` - TraceID string `json:"trace_id"` - } - - return func(ctx core.Context) { - readLineFromEnd, err := file.NewReadLineFromEnd(configs.ProjectAccessLogFile) - if err != nil { - h.logger.Error("NewReadLineFromEnd err", zap.Error(err)) - } - - logSize := 100 - - obj := new(logsViewResponse) - obj.Logs = make([]logData, logSize) - - for i := 0; i < logSize; i++ { - content, _ := readLineFromEnd.ReadLine() - if string(content) != "" { - var logParse logParseData - err = json.Unmarshal(content, &logParse) - if err != nil { - h.logger.Error("NewReadLineFromEnd json Unmarshal err", zap.Error(err)) - } - - data := logData{ - Content: string(content), - Level: logParse.Level, - Time: logParse.Time, - Path: logParse.Path, - Method: logParse.Method, - Msg: logParse.Msg, - HTTPCode: logParse.HTTPCode, - TraceID: logParse.TraceID, - CostSeconds: logParse.CostSeconds, - } - - obj.Logs[i] = data - } - } - ctx.HTML("tool_logs", obj) - } -} diff --git a/internal/render/upgrade/execute.go b/internal/render/upgrade/execute.go deleted file mode 100755 index 8504649..0000000 --- a/internal/render/upgrade/execute.go +++ /dev/null @@ -1,113 +0,0 @@ -package upgrade - -import ( - "net/http" - - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/proposal/tablesqls" -) - -type upgradeExecuteRequest struct { - TableName string `form:"table_name"` // 数据表 - Op string `form:"op"` // 操作类型 -} - -func (h *handler) UpgradeExecute() core.HandlerFunc { - - upgradeTableList := map[string]map[string]string{ - "authorized": { - "table_sql": tablesqls.CreateAuthorizedTableSql(), - "table_data_sql": tablesqls.CreateAuthorizedTableDataSql(), - }, - "authorized_api": { - "table_sql": tablesqls.CreateAuthorizedAPITableSql(), - "table_data_sql": tablesqls.CreateAuthorizedAPITableDataSql(), - }, - "admin": { - "table_sql": tablesqls.CreateAdminTableSql(), - "table_data_sql": tablesqls.CreateAdminTableDataSql(), - }, - "admin_menu": { - "table_sql": tablesqls.CreateAdminMenuTableSql(), - "table_data_sql": tablesqls.CreateAdminMenuTableDataSql(), - }, - "menu": { - "table_sql": tablesqls.CreateMenuTableSql(), - "table_data_sql": tablesqls.CreateMenuTableDataSql(), - }, - "menu_action": { - "table_sql": tablesqls.CreateMenuActionTableSql(), - "table_data_sql": tablesqls.CreateMenuActionTableDataSql(), - }, - "cron_task": { - "table_sql": tablesqls.CreateCronTaskTableSql(), - "table_data_sql": "", - }, - } - - upgradeTableOp := map[string]bool{ - "table": true, - "table_data": true, - } - - return func(ctx core.Context) { - req := new(upgradeExecuteRequest) - if err := ctx.ShouldBindForm(req); err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.ParamBindError, - code.Text(code.ParamBindError)).WithError(err), - ) - return - } - - outPutString := "" - db := h.db.GetDbW() - - if upgradeTableList[req.TableName] == nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.MySQLExecError, - code.Text(code.MySQLExecError)).WithError(errors.New("数据表不存在")), - ) - return - } - - if !upgradeTableOp[req.Op] { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.MySQLExecError, - code.Text(code.MySQLExecError)).WithError(errors.New("非法操作")), - ) - return - } - - if req.Op == "table" { - if err := db.Exec(upgradeTableList[req.TableName]["table_sql"]).Error; err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.MySQLExecError, - code.Text(code.MySQLExecError)+" "+err.Error()).WithError(err), - ) - return - } - - outPutString = "初始化 MySQL 数据表:" + req.TableName + " 成功。" - } else if req.Op == "table_data" { - if err := db.Exec(upgradeTableList[req.TableName]["table_data_sql"]).Error; err != nil { - ctx.AbortWithError(core.Error( - http.StatusBadRequest, - code.MySQLExecError, - code.Text(code.MySQLExecError)+" "+err.Error()).WithError(err), - ) - return - } - - outPutString = "初始化 MySQL 数据表:" + req.TableName + " 默认数据成功。" - } - - ctx.Payload(outPutString) - } -} diff --git a/internal/render/upgrade/upgrade.go b/internal/render/upgrade/upgrade.go deleted file mode 100755 index 5eadaae..0000000 --- a/internal/render/upgrade/upgrade.go +++ /dev/null @@ -1,22 +0,0 @@ -package upgrade - -import ( - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "go.uber.org/zap" -) - -type handler struct { - db mysql.Repo - logger *zap.Logger - cache redis.Repo -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) *handler { - return &handler{ - logger: logger, - cache: cache, - db: db, - } -} diff --git a/internal/render/upgrade/view.go b/internal/render/upgrade/view.go deleted file mode 100755 index b74ad37..0000000 --- a/internal/render/upgrade/view.go +++ /dev/null @@ -1,75 +0,0 @@ -package upgrade - -import ( - "fmt" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -type upgradeViewResponse struct { - LockFile string `json:"lock_file"` - List []upgradeViewData `json:"list"` -} - -type upgradeViewData struct { - TableName string `json:"table_name"` // 表名称 - IsHave int32 `json:"is_have"` // 是否已存在 1=存在 -1=不存在 -} - -var tableList = []string{"authorized", "authorized_api", "admin", "menu", "menu_action", "admin_menu", "cron_task"} - -func (h *handler) UpgradeView() core.HandlerFunc { - return func(c core.Context) { - - type tableInfo struct { - Name string // name - Comment string // comment - } - - var tableCollect []tableInfo - - mysqlConf := configs.Get().MySQL.Read - sqlTables := fmt.Sprintf("SELECT `table_name`,`table_comment` FROM `information_schema`.`tables` WHERE `table_schema`= '%s'", mysqlConf.Name) - rows, err := h.db.GetDbR().Raw(sqlTables).Rows() - if err != nil { - c.HTML("upgrade_view", tableCollect) - return - } - defer rows.Close() - - for rows.Next() { - var info tableInfo - err = rows.Scan(&info.Name, &info.Comment) - if err != nil { - fmt.Printf("execute query tables action error,had ignored, detail is [%v]\n", err.Error()) - continue - } - - tableCollect = append(tableCollect, info) - } - - tableData := make([]upgradeViewData, len(tableList)) - for k, v := range tableList { - data := upgradeViewData{ - TableName: v, - IsHave: -1, - } - - tableData[k] = data - } - - for k, v := range tableData { - for _, haveV := range tableCollect { - if haveV.Name == v.TableName { - tableData[k].IsHave = 1 - } - } - } - - obj := new(upgradeViewResponse) - obj.List = tableData - obj.LockFile = configs.ProjectInstallMark - c.HTML("upgrade_view", obj) - } -} diff --git a/internal/repository/cron/cron.go b/internal/repository/cron/cron.go deleted file mode 100755 index 9552bcf..0000000 --- a/internal/repository/cron/cron.go +++ /dev/null @@ -1,95 +0,0 @@ -package cron - -import ( - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "sync" - - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "github.com/jakecoffman/cron" - "go.uber.org/zap" -) - -var _ Server = (*server)(nil) - -type taskCount struct { - wg sync.WaitGroup - exit chan struct{} -} - -func (tc *taskCount) i() {} - -func (tc *taskCount) Add() { - tc.wg.Add(1) -} - -func (tc *taskCount) Done() { - tc.wg.Done() -} - -func (tc *taskCount) Exit() { - tc.wg.Done() - <-tc.exit -} - -func (tc *taskCount) Wait() { - tc.Add() - tc.wg.Wait() - close(tc.exit) -} - -type server struct { - logger *zap.Logger - db mysql.Repo - cache redis.Repo - cron *cron.Cron - taskCount *taskCount -} - -type Server interface { - i() - - // Start 启动 cron 服务 - Start() - - // Stop 停止 cron 服务 - Stop() - - // AddTask 增加定时任务 - AddTask(task *model.CronTask) - - // RemoveTask 删除定时任务 - RemoveTask(taskId int64) - - // AddJob 增加定时任务执行的工作内容 - AddJob(task *model.CronTask) cron.FuncJob -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) (Server, error) { - if logger == nil { - return nil, errors.New("logger required") - } - - if db == nil { - return nil, errors.New("db required") - } - - if cache == nil { - return nil, errors.New("cache required") - } - - return &server{ - logger: logger, - db: db, - cache: cache, - cron: cron.New(), - taskCount: &taskCount{ - wg: sync.WaitGroup{}, - exit: make(chan struct{}), - }, - }, nil -} - -func (s *server) i() {} diff --git a/internal/repository/cron/cron_add_job.go b/internal/repository/cron/cron_add_job.go deleted file mode 100755 index 1ba613a..0000000 --- a/internal/repository/cron/cron_add_job.go +++ /dev/null @@ -1,21 +0,0 @@ -package cron - -import ( - "fmt" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - - "github.com/jakecoffman/cron" -) - -func (s *server) AddJob(task *model.CronTask) cron.FuncJob { - return func() { - s.taskCount.Add() - defer s.taskCount.Done() - - // 将 task 信息写入到 Kafka Topic 中,任务执行器订阅 Topic 如果为符合条件的任务并进行执行,反之不执行 - // 为了便于演示,不写入到 Kafka 中,仅记录日志 - - msg := fmt.Sprintf("执行任务:(%d)%s [%s]", task.ID, task.Name, task.Spec) - s.logger.Info(msg) - } -} diff --git a/internal/repository/cron/cron_add_task.go b/internal/repository/cron/cron_add_task.go deleted file mode 100755 index bda61f7..0000000 --- a/internal/repository/cron/cron_add_task.go +++ /dev/null @@ -1,15 +0,0 @@ -package cron - -import ( - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "strings" - - "github.com/spf13/cast" -) - -func (s *server) AddTask(task *model.CronTask) { - spec := "0 " + strings.TrimSpace(task.Spec) - name := cast.ToString(task.ID) - - s.cron.AddFunc(spec, s.AddJob(task), name) -} diff --git a/internal/repository/cron/cron_remove_task.go b/internal/repository/cron/cron_remove_task.go deleted file mode 100755 index 20c4f4c..0000000 --- a/internal/repository/cron/cron_remove_task.go +++ /dev/null @@ -1,8 +0,0 @@ -package cron - -import "github.com/spf13/cast" - -func (s *server) RemoveTask(taskId int64) { - name := cast.ToString(taskId) - s.cron.RemoveJob(name) -} diff --git a/internal/repository/cron/cron_start.go b/internal/repository/cron/cron_start.go deleted file mode 100755 index d0b9e49..0000000 --- a/internal/repository/cron/cron_start.go +++ /dev/null @@ -1,44 +0,0 @@ -package cron - -import ( - "fmt" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "math" - - "go.uber.org/zap" -) - -func (s *server) Start() { - s.cron.Start() - go s.taskCount.Wait() - - totalNum, err := query.CronTask.Where(query.CronTask.IsUsed.Eq(1)).Count() - if err != nil { - s.logger.Fatal("cron initialize tasks count err", zap.Error(err)) - } - - pageSize := 50 - maxPage := int(math.Ceil(float64(totalNum) / float64(pageSize))) - - taskNum := 0 - s.logger.Info("开始初始化后台任务") - - for page := 1; page <= maxPage; page++ { - cronTasks, err := query.CronTask.Where(query.CronTask.IsUsed.Eq(1)). - Limit(pageSize). - Offset((page - 1) * pageSize). - Order(query.CronTask.ID). - Find() - - if err != nil { - s.logger.Fatal("cron initialize tasks list err", zap.Error(err)) - } - - for _, cronTask := range cronTasks { - s.AddTask(cronTask) - taskNum++ - } - } - - s.logger.Info(fmt.Sprintf("后台任务初始化完成,总数量:%d", taskNum)) -} diff --git a/internal/repository/cron/cron_stop.go b/internal/repository/cron/cron_stop.go deleted file mode 100755 index b818524..0000000 --- a/internal/repository/cron/cron_stop.go +++ /dev/null @@ -1,6 +0,0 @@ -package cron - -func (s *server) Stop() { - s.cron.Stop() - s.taskCount.Exit() -} diff --git a/internal/repository/mysql/constant/cron.go b/internal/repository/mysql/constant/cron.go deleted file mode 100644 index b0d2771..0000000 --- a/internal/repository/mysql/constant/cron.go +++ /dev/null @@ -1,47 +0,0 @@ -package constant - -const ( - ProtocolShell = 1 - ProtocolHTTP = 2 - - HttpMethodGet = 1 - HttpMethodPost = 2 - - NotifyStatusNo = 1 - NotifyStatusFailed = 2 - NotifyStatusStopped = 3 - NotifyStatusKeyword = 4 - - NotifyTypeEmail = 1 - NotifyTypeWebhook = 2 - - IsUsedYES = 1 - IsUsedNo = -1 -) - -var ProtocolText = map[int64]string{ - ProtocolShell: "SHELL", - ProtocolHTTP: "HTTP", -} - -var HttpMethodText = map[int64]string{ - HttpMethodGet: "GET", - HttpMethodPost: "POST", -} - -var NotifyStatusText = map[int64]string{ - NotifyStatusNo: "不通知", - NotifyStatusFailed: "失败通知", - NotifyStatusStopped: "结束通知", - NotifyStatusKeyword: "结果关键字匹配通知", -} - -var NotifyTypeText = map[int64]string{ - NotifyTypeEmail: "邮件", - NotifyTypeWebhook: "Webhook", -} - -var IsUsedText = map[int64]string{ - IsUsedYES: "启用", - IsUsedNo: "禁用", -} diff --git a/internal/repository/mysql/model/admin.gen.go b/internal/repository/mysql/model/admin.gen.go deleted file mode 100644 index 8322ae9..0000000 --- a/internal/repository/mysql/model/admin.gen.go +++ /dev/null @@ -1,31 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package model - -import ( - "time" -) - -const TableNameAdmin = "admin" - -// Admin mapped from table -type Admin struct { - ID int64 `gorm:"column:id;primaryKey;autoIncrement:true;comment:主键" json:"id"` - Username string `gorm:"column:username;not null;comment:用户名" json:"username"` - Password string `gorm:"column:password;not null;comment:密码" json:"password"` - Nickname string `gorm:"column:nickname;not null;comment:昵称" json:"nickname"` - Mobile string `gorm:"column:mobile;not null;comment:手机号" json:"mobile"` - IsUsed int64 `gorm:"column:is_used;not null;default:1;comment:是否启用 1:是 -1:否" json:"is_used"` - IsDeleted int64 `gorm:"column:is_deleted;not null;default:-1;comment:是否删除 1:是 -1:否" json:"is_deleted"` - CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` - CreatedUser string `gorm:"column:created_user;not null;comment:创建人" json:"created_user"` - UpdatedAt time.Time `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` - UpdatedUser string `gorm:"column:updated_user;not null;comment:更新人" json:"updated_user"` -} - -// TableName Admin's table name -func (*Admin) TableName() string { - return TableNameAdmin -} diff --git a/internal/repository/mysql/model/admin_menu.gen.go b/internal/repository/mysql/model/admin_menu.gen.go deleted file mode 100644 index 786c2ed..0000000 --- a/internal/repository/mysql/model/admin_menu.gen.go +++ /dev/null @@ -1,25 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package model - -import ( - "time" -) - -const TableNameAdminMenu = "admin_menu" - -// AdminMenu mapped from table -type AdminMenu struct { - ID int64 `gorm:"column:id;primaryKey;autoIncrement:true;comment:主键" json:"id"` - AdminID int64 `gorm:"column:admin_id;not null;comment:管理员ID" json:"admin_id"` - MenuID int64 `gorm:"column:menu_id;not null;comment:菜单栏ID" json:"menu_id"` - CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` - CreatedUser string `gorm:"column:created_user;not null;comment:创建人" json:"created_user"` -} - -// TableName AdminMenu's table name -func (*AdminMenu) TableName() string { - return TableNameAdminMenu -} diff --git a/internal/repository/mysql/model/authorized.gen.go b/internal/repository/mysql/model/authorized.gen.go deleted file mode 100644 index 9006876..0000000 --- a/internal/repository/mysql/model/authorized.gen.go +++ /dev/null @@ -1,31 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package model - -import ( - "time" -) - -const TableNameAuthorized = "authorized" - -// Authorized mapped from table -type Authorized struct { - ID int64 `gorm:"column:id;primaryKey;autoIncrement:true;comment:主键" json:"id"` - BusinessKey string `gorm:"column:business_key;not null;comment:调用方key" json:"business_key"` - BusinessSecret string `gorm:"column:business_secret;not null;comment:调用方secret" json:"business_secret"` - BusinessDeveloper string `gorm:"column:business_developer;not null;comment:调用方对接人" json:"business_developer"` - Remark string `gorm:"column:remark;not null;comment:备注" json:"remark"` - IsUsed int64 `gorm:"column:is_used;not null;default:1;comment:是否启用 1:是 -1:否" json:"is_used"` - IsDeleted int64 `gorm:"column:is_deleted;not null;default:-1;comment:是否删除 1:是 -1:否" json:"is_deleted"` - CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` - CreatedUser string `gorm:"column:created_user;not null;comment:创建人" json:"created_user"` - UpdatedAt time.Time `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` - UpdatedUser string `gorm:"column:updated_user;not null;comment:更新人" json:"updated_user"` -} - -// TableName Authorized's table name -func (*Authorized) TableName() string { - return TableNameAuthorized -} diff --git a/internal/repository/mysql/model/authorized_api.gen.go b/internal/repository/mysql/model/authorized_api.gen.go deleted file mode 100644 index afa5f8c..0000000 --- a/internal/repository/mysql/model/authorized_api.gen.go +++ /dev/null @@ -1,29 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package model - -import ( - "time" -) - -const TableNameAuthorizedAPI = "authorized_api" - -// AuthorizedAPI mapped from table -type AuthorizedAPI struct { - ID int64 `gorm:"column:id;primaryKey;autoIncrement:true;comment:主键" json:"id"` - BusinessKey string `gorm:"column:business_key;not null;comment:调用方key" json:"business_key"` - Method string `gorm:"column:method;not null;comment:请求方式" json:"method"` - API string `gorm:"column:api;not null;comment:请求地址" json:"api"` - IsDeleted int64 `gorm:"column:is_deleted;not null;default:-1;comment:是否删除 1:是 -1:否" json:"is_deleted"` - CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` - CreatedUser string `gorm:"column:created_user;not null;comment:创建人" json:"created_user"` - UpdatedAt time.Time `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` - UpdatedUser string `gorm:"column:updated_user;not null;comment:更新人" json:"updated_user"` -} - -// TableName AuthorizedAPI's table name -func (*AuthorizedAPI) TableName() string { - return TableNameAuthorizedAPI -} diff --git a/internal/repository/mysql/model/category.gen.go b/internal/repository/mysql/model/category.gen.go deleted file mode 100644 index eb49af7..0000000 --- a/internal/repository/mysql/model/category.gen.go +++ /dev/null @@ -1,29 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package model - -import ( - "time" -) - -const TableNameCategory = "category" - -// Category mapped from table -type Category struct { - ID int64 `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"` - ParentID int64 `gorm:"column:parent_id;not null" json:"parent_id"` - Sort int64 `gorm:"column:sort;not null;comment:排序" json:"sort"` - Title string `gorm:"column:title;not null;comment:名称" json:"title"` - Icon string `gorm:"column:icon;not null;comment:图标" json:"icon"` - CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` - UpdatedAt time.Time `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` - IsUsed int64 `gorm:"column:is_used;default:-1;comment:是否启用 1:是 -1:否" json:"is_used"` - Level int64 `gorm:"column:level;comment:分类等级" json:"level"` -} - -// TableName Category's table name -func (*Category) TableName() string { - return TableNameCategory -} diff --git a/internal/repository/mysql/model/cron_task.gen.go b/internal/repository/mysql/model/cron_task.gen.go deleted file mode 100644 index eb7e81c..0000000 --- a/internal/repository/mysql/model/cron_task.gen.go +++ /dev/null @@ -1,39 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package model - -import ( - "time" -) - -const TableNameCronTask = "cron_task" - -// CronTask mapped from table -type CronTask struct { - ID int64 `gorm:"column:id;primaryKey;autoIncrement:true;comment:主键" json:"id"` - Name string `gorm:"column:name;not null;comment:任务名称" json:"name"` - Spec string `gorm:"column:spec;not null;comment:crontab 表达式" json:"spec"` - Command string `gorm:"column:command;not null;comment:执行命令" json:"command"` - Protocol int64 `gorm:"column:protocol;not null;default:1;comment:执行方式 1:shell 2:http" json:"protocol"` - HTTPMethod int64 `gorm:"column:http_method;not null;default:1;comment:http 请求方式 1:get 2:post" json:"http_method"` - Timeout int64 `gorm:"column:timeout;not null;default:60;comment:超时时间(单位:秒)" json:"timeout"` - RetryTimes int64 `gorm:"column:retry_times;not null;default:3;comment:重试次数" json:"retry_times"` - RetryInterval int64 `gorm:"column:retry_interval;not null;default:60;comment:重试间隔(单位:秒)" json:"retry_interval"` - NotifyStatus int64 `gorm:"column:notify_status;not null;comment:执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知" json:"notify_status"` - NotifyType int64 `gorm:"column:notify_type;not null;default:1;comment:通知类型 1:邮件 2:webhook" json:"notify_type"` - NotifyReceiverEmail string `gorm:"column:notify_receiver_email;not null;comment:通知者邮箱地址(多个用,分割)" json:"notify_receiver_email"` - NotifyKeyword string `gorm:"column:notify_keyword;not null;comment:通知匹配关键字(多个用,分割)" json:"notify_keyword"` - Remark string `gorm:"column:remark;not null;comment:备注" json:"remark"` - IsUsed int64 `gorm:"column:is_used;not null;default:1;comment:是否启用 1:是 -1:否" json:"is_used"` - CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` - CreatedUser string `gorm:"column:created_user;not null;comment:创建人" json:"created_user"` - UpdatedAt time.Time `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` - UpdatedUser string `gorm:"column:updated_user;not null;comment:更新人" json:"updated_user"` -} - -// TableName CronTask's table name -func (*CronTask) TableName() string { - return TableNameCronTask -} diff --git a/internal/repository/mysql/model/menu.gen.go b/internal/repository/mysql/model/menu.gen.go deleted file mode 100644 index 890fe6e..0000000 --- a/internal/repository/mysql/model/menu.gen.go +++ /dev/null @@ -1,33 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package model - -import ( - "time" -) - -const TableNameMenu = "menu" - -// Menu mapped from table -type Menu struct { - ID int64 `gorm:"column:id;primaryKey;autoIncrement:true;comment:主键" json:"id"` - Pid int64 `gorm:"column:pid;not null;comment:父类ID" json:"pid"` - Name string `gorm:"column:name;not null;comment:菜单名称" json:"name"` - Link string `gorm:"column:link;not null;comment:链接地址" json:"link"` - Icon string `gorm:"column:icon;not null;comment:图标" json:"icon"` - Level int64 `gorm:"column:level;not null;default:1;comment:菜单类型 1:一级菜单 2:二级菜单" json:"level"` - Sort int64 `gorm:"column:sort;not null;comment:排序" json:"sort"` - IsUsed int64 `gorm:"column:is_used;not null;default:1;comment:是否启用 1:是 -1:否" json:"is_used"` - IsDeleted int64 `gorm:"column:is_deleted;not null;default:-1;comment:是否删除 1:是 -1:否" json:"is_deleted"` - CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` - CreatedUser string `gorm:"column:created_user;not null;comment:创建人" json:"created_user"` - UpdatedAt time.Time `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` - UpdatedUser string `gorm:"column:updated_user;not null;comment:更新人" json:"updated_user"` -} - -// TableName Menu's table name -func (*Menu) TableName() string { - return TableNameMenu -} diff --git a/internal/repository/mysql/model/menu_action.gen.go b/internal/repository/mysql/model/menu_action.gen.go deleted file mode 100644 index 5bcbbca..0000000 --- a/internal/repository/mysql/model/menu_action.gen.go +++ /dev/null @@ -1,29 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package model - -import ( - "time" -) - -const TableNameMenuAction = "menu_action" - -// MenuAction mapped from table -type MenuAction struct { - ID int64 `gorm:"column:id;primaryKey;autoIncrement:true;comment:主键" json:"id"` - MenuID int64 `gorm:"column:menu_id;not null;comment:菜单栏ID" json:"menu_id"` - Method string `gorm:"column:method;not null;comment:请求方式" json:"method"` - API string `gorm:"column:api;not null;comment:请求地址" json:"api"` - IsDeleted int64 `gorm:"column:is_deleted;not null;default:-1;comment:是否删除 1:是 -1:否" json:"is_deleted"` - CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` - CreatedUser string `gorm:"column:created_user;not null;comment:创建人" json:"created_user"` - UpdatedAt time.Time `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` - UpdatedUser string `gorm:"column:updated_user;not null;comment:更新人" json:"updated_user"` -} - -// TableName MenuAction's table name -func (*MenuAction) TableName() string { - return TableNameMenuAction -} diff --git a/internal/repository/mysql/model/site.gen.go b/internal/repository/mysql/model/site.gen.go deleted file mode 100644 index 599e2b0..0000000 --- a/internal/repository/mysql/model/site.gen.go +++ /dev/null @@ -1,30 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package model - -import ( - "time" -) - -const TableNameSite = "site" - -// Site mapped from table -type Site struct { - ID int64 `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"` - CategoryID int64 `gorm:"column:category_id;comment:分类id" json:"category_id"` - Title string `gorm:"column:title;comment:网站标题" json:"title"` - Thumb string `gorm:"column:thumb;comment:网站logo" json:"thumb"` - Description string `gorm:"column:description;comment:网站描述" json:"description"` - URL string `gorm:"column:url;comment:网站地址" json:"url"` - CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` - UpdatedAt time.Time `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` - IsUsed int64 `gorm:"column:is_used;default:-1;comment:是否使用" json:"is_used"` - Category Category `gorm:"foreignKey:CategoryID" json:"category"` -} - -// TableName Site's table name -func (*Site) TableName() string { - return TableNameSite -} diff --git a/internal/repository/mysql/mysql.go b/internal/repository/mysql/mysql.go deleted file mode 100755 index 7d3e3ef..0000000 --- a/internal/repository/mysql/mysql.go +++ /dev/null @@ -1,131 +0,0 @@ -package mysql - -import ( - "fmt" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "time" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - - "gorm.io/driver/mysql" - "gorm.io/gorm" - "gorm.io/gorm/schema" -) - -// Predicate is a string that acts as a condition in the where clause -type Predicate string - -var ( - EqualPredicate = Predicate("=") - NotEqualPredicate = Predicate("<>") - GreaterThanPredicate = Predicate(">") - GreaterThanOrEqualPredicate = Predicate(">=") - SmallerThanPredicate = Predicate("<") - SmallerThanOrEqualPredicate = Predicate("<=") - LikePredicate = Predicate("LIKE") -) - -var _ Repo = (*dbRepo)(nil) - -type Repo interface { - i() - GetDbR() *gorm.DB - GetDbW() *gorm.DB - DbRClose() error - DbWClose() error -} - -type dbRepo struct { - DbR *gorm.DB - DbW *gorm.DB -} - -func New() (Repo, error) { - cfg := configs.Get().MySQL - dbr, err := dbConnect(cfg.Read.User, cfg.Read.Pass, cfg.Read.Addr, cfg.Read.Name) - if err != nil { - return nil, err - } - - dbw, err := dbConnect(cfg.Write.User, cfg.Write.Pass, cfg.Write.Addr, cfg.Write.Name) - if err != nil { - return nil, err - } - - query.SetDefault(dbr) - return &dbRepo{ - DbR: dbr, - DbW: dbw, - }, nil -} - -func (d *dbRepo) i() {} - -func (d *dbRepo) GetDbR() *gorm.DB { - return d.DbR -} - -func (d *dbRepo) GetDbW() *gorm.DB { - return d.DbW -} - -func (d *dbRepo) DbRClose() error { - sqlDB, err := d.DbR.DB() - if err != nil { - return err - } - return sqlDB.Close() -} - -func (d *dbRepo) DbWClose() error { - sqlDB, err := d.DbW.DB() - if err != nil { - return err - } - return sqlDB.Close() -} - -func dbConnect(user, pass, addr, dbName string) (*gorm.DB, error) { - dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=%t&loc=%s", - user, - pass, - addr, - dbName, - true, - "Local") - - db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ - NamingStrategy: schema.NamingStrategy{ - SingularTable: true, - }, - //Logger: logger.Default.LogMode(logger.Info), // 日志配置 - }) - - if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf("[db connection failed] Database name: %s", dbName)) - } - - db.Set("gorm:table_options", "CHARSET=utf8mb4") - - cfg := configs.Get().MySQL.Base - - sqlDB, err := db.DB() - if err != nil { - return nil, err - } - - // 设置连接池 用于设置最大打开的连接数,默认值为0表示不限制.设置最大的连接数,可以避免并发太高导致连接mysql出现too many connections的错误。 - sqlDB.SetMaxOpenConns(cfg.MaxOpenConn) - - // 设置最大连接数 用于设置闲置的连接数.设置闲置的连接数则当开启的一个连接使用完成后可以放在池里等候下一次使用。 - sqlDB.SetMaxIdleConns(cfg.MaxIdleConn) - - // 设置最大连接超时 - sqlDB.SetConnMaxLifetime(time.Minute * cfg.ConnMaxLifeTime) - - // 使用插件 - db.Use(&TracePlugin{}) - - return db, nil -} diff --git a/internal/repository/mysql/plugin.go b/internal/repository/mysql/plugin.go deleted file mode 100755 index e2e10f2..0000000 --- a/internal/repository/mysql/plugin.go +++ /dev/null @@ -1,83 +0,0 @@ -package mysql - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/timeutil" - "time" - - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/trace" - - "gorm.io/gorm" - "gorm.io/gorm/utils" -) - -const ( - callBackBeforeName = "core:before" - callBackAfterName = "core:after" - startTime = "_start_time" -) - -type TracePlugin struct{} - -func (op *TracePlugin) Name() string { - return "tracePlugin" -} - -func (op *TracePlugin) Initialize(db *gorm.DB) (err error) { - // 开始前 - _ = db.Callback().Create().Before("gorm:before_create").Register(callBackBeforeName, before) - _ = db.Callback().Query().Before("gorm:query").Register(callBackBeforeName, before) - _ = db.Callback().Delete().Before("gorm:before_delete").Register(callBackBeforeName, before) - _ = db.Callback().Update().Before("gorm:setup_reflect_value").Register(callBackBeforeName, before) - _ = db.Callback().Row().Before("gorm:row").Register(callBackBeforeName, before) - _ = db.Callback().Raw().Before("gorm:raw").Register(callBackBeforeName, before) - - // 结束后 - _ = db.Callback().Create().After("gorm:after_create").Register(callBackAfterName, after) - _ = db.Callback().Query().After("gorm:after_query").Register(callBackAfterName, after) - _ = db.Callback().Delete().After("gorm:after_delete").Register(callBackAfterName, after) - _ = db.Callback().Update().After("gorm:after_update").Register(callBackAfterName, after) - _ = db.Callback().Row().After("gorm:row").Register(callBackAfterName, after) - _ = db.Callback().Raw().After("gorm:raw").Register(callBackAfterName, after) - return -} - -var _ gorm.Plugin = &TracePlugin{} - -func before(db *gorm.DB) { - db.InstanceSet(startTime, time.Now()) - return -} - -func after(db *gorm.DB) { - _ctx := db.Statement.Context - ctx, ok := _ctx.(core.StdContext) - if !ok { - return - } - - _ts, isExist := db.InstanceGet(startTime) - if !isExist { - return - } - - ts, ok := _ts.(time.Time) - if !ok { - return - } - - sql := db.Dialector.Explain(db.Statement.SQL.String(), db.Statement.Vars...) - - sqlInfo := new(trace.SQL) - sqlInfo.Timestamp = timeutil.CSTLayoutString() - sqlInfo.SQL = sql - sqlInfo.Stack = utils.FileWithLineNum() - sqlInfo.Rows = db.Statement.RowsAffected - sqlInfo.CostSeconds = time.Since(ts).Seconds() - - if ctx.Trace != nil { - ctx.Trace.AppendSQL(sqlInfo) - } - - return -} diff --git a/internal/repository/mysql/query/admin.gen.go b/internal/repository/mysql/query/admin.gen.go deleted file mode 100644 index c107c50..0000000 --- a/internal/repository/mysql/query/admin.gen.go +++ /dev/null @@ -1,424 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package query - -import ( - "context" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/schema" - - "gorm.io/gen" - "gorm.io/gen/field" - - "gorm.io/plugin/dbresolver" - - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" -) - -func newAdmin(db *gorm.DB, opts ...gen.DOOption) admin { - _admin := admin{} - - _admin.adminDo.UseDB(db, opts...) - _admin.adminDo.UseModel(&model.Admin{}) - - tableName := _admin.adminDo.TableName() - _admin.ALL = field.NewAsterisk(tableName) - _admin.ID = field.NewInt64(tableName, "id") - _admin.Username = field.NewString(tableName, "username") - _admin.Password = field.NewString(tableName, "password") - _admin.Nickname = field.NewString(tableName, "nickname") - _admin.Mobile = field.NewString(tableName, "mobile") - _admin.IsUsed = field.NewInt64(tableName, "is_used") - _admin.IsDeleted = field.NewInt64(tableName, "is_deleted") - _admin.CreatedAt = field.NewTime(tableName, "created_at") - _admin.CreatedUser = field.NewString(tableName, "created_user") - _admin.UpdatedAt = field.NewTime(tableName, "updated_at") - _admin.UpdatedUser = field.NewString(tableName, "updated_user") - - _admin.fillFieldMap() - - return _admin -} - -type admin struct { - adminDo - - ALL field.Asterisk - ID field.Int64 // 主键 - Username field.String // 用户名 - Password field.String // 密码 - Nickname field.String // 昵称 - Mobile field.String // 手机号 - IsUsed field.Int64 // 是否启用 1:是 -1:否 - IsDeleted field.Int64 // 是否删除 1:是 -1:否 - CreatedAt field.Time // 创建时间 - CreatedUser field.String // 创建人 - UpdatedAt field.Time // 更新时间 - UpdatedUser field.String // 更新人 - - fieldMap map[string]field.Expr -} - -func (a admin) Table(newTableName string) *admin { - a.adminDo.UseTable(newTableName) - return a.updateTableName(newTableName) -} - -func (a admin) As(alias string) *admin { - a.adminDo.DO = *(a.adminDo.As(alias).(*gen.DO)) - return a.updateTableName(alias) -} - -func (a *admin) updateTableName(table string) *admin { - a.ALL = field.NewAsterisk(table) - a.ID = field.NewInt64(table, "id") - a.Username = field.NewString(table, "username") - a.Password = field.NewString(table, "password") - a.Nickname = field.NewString(table, "nickname") - a.Mobile = field.NewString(table, "mobile") - a.IsUsed = field.NewInt64(table, "is_used") - a.IsDeleted = field.NewInt64(table, "is_deleted") - a.CreatedAt = field.NewTime(table, "created_at") - a.CreatedUser = field.NewString(table, "created_user") - a.UpdatedAt = field.NewTime(table, "updated_at") - a.UpdatedUser = field.NewString(table, "updated_user") - - a.fillFieldMap() - - return a -} - -func (a *admin) GetFieldByName(fieldName string) (field.OrderExpr, bool) { - _f, ok := a.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - _oe, ok := _f.(field.OrderExpr) - return _oe, ok -} - -func (a *admin) fillFieldMap() { - a.fieldMap = make(map[string]field.Expr, 11) - a.fieldMap["id"] = a.ID - a.fieldMap["username"] = a.Username - a.fieldMap["password"] = a.Password - a.fieldMap["nickname"] = a.Nickname - a.fieldMap["mobile"] = a.Mobile - a.fieldMap["is_used"] = a.IsUsed - a.fieldMap["is_deleted"] = a.IsDeleted - a.fieldMap["created_at"] = a.CreatedAt - a.fieldMap["created_user"] = a.CreatedUser - a.fieldMap["updated_at"] = a.UpdatedAt - a.fieldMap["updated_user"] = a.UpdatedUser -} - -func (a admin) clone(db *gorm.DB) admin { - a.adminDo.ReplaceConnPool(db.Statement.ConnPool) - return a -} - -func (a admin) replaceDB(db *gorm.DB) admin { - a.adminDo.ReplaceDB(db) - return a -} - -type adminDo struct{ gen.DO } - -type IAdminDo interface { - gen.SubQuery - Debug() IAdminDo - WithContext(ctx context.Context) IAdminDo - WithResult(fc func(tx gen.Dao)) gen.ResultInfo - ReplaceDB(db *gorm.DB) - ReadDB() IAdminDo - WriteDB() IAdminDo - As(alias string) gen.Dao - Session(config *gorm.Session) IAdminDo - Columns(cols ...field.Expr) gen.Columns - Clauses(conds ...clause.Expression) IAdminDo - Not(conds ...gen.Condition) IAdminDo - Or(conds ...gen.Condition) IAdminDo - Select(conds ...field.Expr) IAdminDo - Where(conds ...gen.Condition) IAdminDo - Order(conds ...field.Expr) IAdminDo - Distinct(cols ...field.Expr) IAdminDo - Omit(cols ...field.Expr) IAdminDo - Join(table schema.Tabler, on ...field.Expr) IAdminDo - LeftJoin(table schema.Tabler, on ...field.Expr) IAdminDo - RightJoin(table schema.Tabler, on ...field.Expr) IAdminDo - Group(cols ...field.Expr) IAdminDo - Having(conds ...gen.Condition) IAdminDo - Limit(limit int) IAdminDo - Offset(offset int) IAdminDo - Count() (count int64, err error) - Scopes(funcs ...func(gen.Dao) gen.Dao) IAdminDo - Unscoped() IAdminDo - Create(values ...*model.Admin) error - CreateInBatches(values []*model.Admin, batchSize int) error - Save(values ...*model.Admin) error - First() (*model.Admin, error) - Take() (*model.Admin, error) - Last() (*model.Admin, error) - Find() ([]*model.Admin, error) - FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Admin, err error) - FindInBatches(result *[]*model.Admin, batchSize int, fc func(tx gen.Dao, batch int) error) error - Pluck(column field.Expr, dest interface{}) error - Delete(...*model.Admin) (info gen.ResultInfo, err error) - Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - Updates(value interface{}) (info gen.ResultInfo, err error) - UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - UpdateColumns(value interface{}) (info gen.ResultInfo, err error) - UpdateFrom(q gen.SubQuery) gen.Dao - Attrs(attrs ...field.AssignExpr) IAdminDo - Assign(attrs ...field.AssignExpr) IAdminDo - Joins(fields ...field.RelationField) IAdminDo - Preload(fields ...field.RelationField) IAdminDo - FirstOrInit() (*model.Admin, error) - FirstOrCreate() (*model.Admin, error) - FindByPage(offset int, limit int) (result []*model.Admin, count int64, err error) - ScanByPage(result interface{}, offset int, limit int) (count int64, err error) - Scan(result interface{}) (err error) - Returning(value interface{}, columns ...string) IAdminDo - UnderlyingDB() *gorm.DB - schema.Tabler -} - -func (a adminDo) Debug() IAdminDo { - return a.withDO(a.DO.Debug()) -} - -func (a adminDo) WithContext(ctx context.Context) IAdminDo { - return a.withDO(a.DO.WithContext(ctx)) -} - -func (a adminDo) ReadDB() IAdminDo { - return a.Clauses(dbresolver.Read) -} - -func (a adminDo) WriteDB() IAdminDo { - return a.Clauses(dbresolver.Write) -} - -func (a adminDo) Session(config *gorm.Session) IAdminDo { - return a.withDO(a.DO.Session(config)) -} - -func (a adminDo) Clauses(conds ...clause.Expression) IAdminDo { - return a.withDO(a.DO.Clauses(conds...)) -} - -func (a adminDo) Returning(value interface{}, columns ...string) IAdminDo { - return a.withDO(a.DO.Returning(value, columns...)) -} - -func (a adminDo) Not(conds ...gen.Condition) IAdminDo { - return a.withDO(a.DO.Not(conds...)) -} - -func (a adminDo) Or(conds ...gen.Condition) IAdminDo { - return a.withDO(a.DO.Or(conds...)) -} - -func (a adminDo) Select(conds ...field.Expr) IAdminDo { - return a.withDO(a.DO.Select(conds...)) -} - -func (a adminDo) Where(conds ...gen.Condition) IAdminDo { - return a.withDO(a.DO.Where(conds...)) -} - -func (a adminDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) IAdminDo { - return a.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB())) -} - -func (a adminDo) Order(conds ...field.Expr) IAdminDo { - return a.withDO(a.DO.Order(conds...)) -} - -func (a adminDo) Distinct(cols ...field.Expr) IAdminDo { - return a.withDO(a.DO.Distinct(cols...)) -} - -func (a adminDo) Omit(cols ...field.Expr) IAdminDo { - return a.withDO(a.DO.Omit(cols...)) -} - -func (a adminDo) Join(table schema.Tabler, on ...field.Expr) IAdminDo { - return a.withDO(a.DO.Join(table, on...)) -} - -func (a adminDo) LeftJoin(table schema.Tabler, on ...field.Expr) IAdminDo { - return a.withDO(a.DO.LeftJoin(table, on...)) -} - -func (a adminDo) RightJoin(table schema.Tabler, on ...field.Expr) IAdminDo { - return a.withDO(a.DO.RightJoin(table, on...)) -} - -func (a adminDo) Group(cols ...field.Expr) IAdminDo { - return a.withDO(a.DO.Group(cols...)) -} - -func (a adminDo) Having(conds ...gen.Condition) IAdminDo { - return a.withDO(a.DO.Having(conds...)) -} - -func (a adminDo) Limit(limit int) IAdminDo { - return a.withDO(a.DO.Limit(limit)) -} - -func (a adminDo) Offset(offset int) IAdminDo { - return a.withDO(a.DO.Offset(offset)) -} - -func (a adminDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IAdminDo { - return a.withDO(a.DO.Scopes(funcs...)) -} - -func (a adminDo) Unscoped() IAdminDo { - return a.withDO(a.DO.Unscoped()) -} - -func (a adminDo) Create(values ...*model.Admin) error { - if len(values) == 0 { - return nil - } - return a.DO.Create(values) -} - -func (a adminDo) CreateInBatches(values []*model.Admin, batchSize int) error { - return a.DO.CreateInBatches(values, batchSize) -} - -// Save : !!! underlying implementation is different with GORM -// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) -func (a adminDo) Save(values ...*model.Admin) error { - if len(values) == 0 { - return nil - } - return a.DO.Save(values) -} - -func (a adminDo) First() (*model.Admin, error) { - if result, err := a.DO.First(); err != nil { - return nil, err - } else { - return result.(*model.Admin), nil - } -} - -func (a adminDo) Take() (*model.Admin, error) { - if result, err := a.DO.Take(); err != nil { - return nil, err - } else { - return result.(*model.Admin), nil - } -} - -func (a adminDo) Last() (*model.Admin, error) { - if result, err := a.DO.Last(); err != nil { - return nil, err - } else { - return result.(*model.Admin), nil - } -} - -func (a adminDo) Find() ([]*model.Admin, error) { - result, err := a.DO.Find() - return result.([]*model.Admin), err -} - -func (a adminDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Admin, err error) { - buf := make([]*model.Admin, 0, batchSize) - err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { - defer func() { results = append(results, buf...) }() - return fc(tx, batch) - }) - return results, err -} - -func (a adminDo) FindInBatches(result *[]*model.Admin, batchSize int, fc func(tx gen.Dao, batch int) error) error { - return a.DO.FindInBatches(result, batchSize, fc) -} - -func (a adminDo) Attrs(attrs ...field.AssignExpr) IAdminDo { - return a.withDO(a.DO.Attrs(attrs...)) -} - -func (a adminDo) Assign(attrs ...field.AssignExpr) IAdminDo { - return a.withDO(a.DO.Assign(attrs...)) -} - -func (a adminDo) Joins(fields ...field.RelationField) IAdminDo { - for _, _f := range fields { - a = *a.withDO(a.DO.Joins(_f)) - } - return &a -} - -func (a adminDo) Preload(fields ...field.RelationField) IAdminDo { - for _, _f := range fields { - a = *a.withDO(a.DO.Preload(_f)) - } - return &a -} - -func (a adminDo) FirstOrInit() (*model.Admin, error) { - if result, err := a.DO.FirstOrInit(); err != nil { - return nil, err - } else { - return result.(*model.Admin), nil - } -} - -func (a adminDo) FirstOrCreate() (*model.Admin, error) { - if result, err := a.DO.FirstOrCreate(); err != nil { - return nil, err - } else { - return result.(*model.Admin), nil - } -} - -func (a adminDo) FindByPage(offset int, limit int) (result []*model.Admin, count int64, err error) { - result, err = a.Offset(offset).Limit(limit).Find() - if err != nil { - return - } - - if size := len(result); 0 < limit && 0 < size && size < limit { - count = int64(size + offset) - return - } - - count, err = a.Offset(-1).Limit(-1).Count() - return -} - -func (a adminDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { - count, err = a.Count() - if err != nil { - return - } - - err = a.Offset(offset).Limit(limit).Scan(result) - return -} - -func (a adminDo) Scan(result interface{}) (err error) { - return a.DO.Scan(result) -} - -func (a adminDo) Delete(models ...*model.Admin) (result gen.ResultInfo, err error) { - return a.DO.Delete(models) -} - -func (a *adminDo) withDO(do gen.Dao) *adminDo { - a.DO = *do.(*gen.DO) - return a -} diff --git a/internal/repository/mysql/query/admin_menu.gen.go b/internal/repository/mysql/query/admin_menu.gen.go deleted file mode 100644 index 85d3c94..0000000 --- a/internal/repository/mysql/query/admin_menu.gen.go +++ /dev/null @@ -1,400 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package query - -import ( - "context" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/schema" - - "gorm.io/gen" - "gorm.io/gen/field" - - "gorm.io/plugin/dbresolver" - - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" -) - -func newAdminMenu(db *gorm.DB, opts ...gen.DOOption) adminMenu { - _adminMenu := adminMenu{} - - _adminMenu.adminMenuDo.UseDB(db, opts...) - _adminMenu.adminMenuDo.UseModel(&model.AdminMenu{}) - - tableName := _adminMenu.adminMenuDo.TableName() - _adminMenu.ALL = field.NewAsterisk(tableName) - _adminMenu.ID = field.NewInt64(tableName, "id") - _adminMenu.AdminID = field.NewInt64(tableName, "admin_id") - _adminMenu.MenuID = field.NewInt64(tableName, "menu_id") - _adminMenu.CreatedAt = field.NewTime(tableName, "created_at") - _adminMenu.CreatedUser = field.NewString(tableName, "created_user") - - _adminMenu.fillFieldMap() - - return _adminMenu -} - -type adminMenu struct { - adminMenuDo - - ALL field.Asterisk - ID field.Int64 // 主键 - AdminID field.Int64 // 管理员ID - MenuID field.Int64 // 菜单栏ID - CreatedAt field.Time // 创建时间 - CreatedUser field.String // 创建人 - - fieldMap map[string]field.Expr -} - -func (a adminMenu) Table(newTableName string) *adminMenu { - a.adminMenuDo.UseTable(newTableName) - return a.updateTableName(newTableName) -} - -func (a adminMenu) As(alias string) *adminMenu { - a.adminMenuDo.DO = *(a.adminMenuDo.As(alias).(*gen.DO)) - return a.updateTableName(alias) -} - -func (a *adminMenu) updateTableName(table string) *adminMenu { - a.ALL = field.NewAsterisk(table) - a.ID = field.NewInt64(table, "id") - a.AdminID = field.NewInt64(table, "admin_id") - a.MenuID = field.NewInt64(table, "menu_id") - a.CreatedAt = field.NewTime(table, "created_at") - a.CreatedUser = field.NewString(table, "created_user") - - a.fillFieldMap() - - return a -} - -func (a *adminMenu) GetFieldByName(fieldName string) (field.OrderExpr, bool) { - _f, ok := a.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - _oe, ok := _f.(field.OrderExpr) - return _oe, ok -} - -func (a *adminMenu) fillFieldMap() { - a.fieldMap = make(map[string]field.Expr, 5) - a.fieldMap["id"] = a.ID - a.fieldMap["admin_id"] = a.AdminID - a.fieldMap["menu_id"] = a.MenuID - a.fieldMap["created_at"] = a.CreatedAt - a.fieldMap["created_user"] = a.CreatedUser -} - -func (a adminMenu) clone(db *gorm.DB) adminMenu { - a.adminMenuDo.ReplaceConnPool(db.Statement.ConnPool) - return a -} - -func (a adminMenu) replaceDB(db *gorm.DB) adminMenu { - a.adminMenuDo.ReplaceDB(db) - return a -} - -type adminMenuDo struct{ gen.DO } - -type IAdminMenuDo interface { - gen.SubQuery - Debug() IAdminMenuDo - WithContext(ctx context.Context) IAdminMenuDo - WithResult(fc func(tx gen.Dao)) gen.ResultInfo - ReplaceDB(db *gorm.DB) - ReadDB() IAdminMenuDo - WriteDB() IAdminMenuDo - As(alias string) gen.Dao - Session(config *gorm.Session) IAdminMenuDo - Columns(cols ...field.Expr) gen.Columns - Clauses(conds ...clause.Expression) IAdminMenuDo - Not(conds ...gen.Condition) IAdminMenuDo - Or(conds ...gen.Condition) IAdminMenuDo - Select(conds ...field.Expr) IAdminMenuDo - Where(conds ...gen.Condition) IAdminMenuDo - Order(conds ...field.Expr) IAdminMenuDo - Distinct(cols ...field.Expr) IAdminMenuDo - Omit(cols ...field.Expr) IAdminMenuDo - Join(table schema.Tabler, on ...field.Expr) IAdminMenuDo - LeftJoin(table schema.Tabler, on ...field.Expr) IAdminMenuDo - RightJoin(table schema.Tabler, on ...field.Expr) IAdminMenuDo - Group(cols ...field.Expr) IAdminMenuDo - Having(conds ...gen.Condition) IAdminMenuDo - Limit(limit int) IAdminMenuDo - Offset(offset int) IAdminMenuDo - Count() (count int64, err error) - Scopes(funcs ...func(gen.Dao) gen.Dao) IAdminMenuDo - Unscoped() IAdminMenuDo - Create(values ...*model.AdminMenu) error - CreateInBatches(values []*model.AdminMenu, batchSize int) error - Save(values ...*model.AdminMenu) error - First() (*model.AdminMenu, error) - Take() (*model.AdminMenu, error) - Last() (*model.AdminMenu, error) - Find() ([]*model.AdminMenu, error) - FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AdminMenu, err error) - FindInBatches(result *[]*model.AdminMenu, batchSize int, fc func(tx gen.Dao, batch int) error) error - Pluck(column field.Expr, dest interface{}) error - Delete(...*model.AdminMenu) (info gen.ResultInfo, err error) - Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - Updates(value interface{}) (info gen.ResultInfo, err error) - UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - UpdateColumns(value interface{}) (info gen.ResultInfo, err error) - UpdateFrom(q gen.SubQuery) gen.Dao - Attrs(attrs ...field.AssignExpr) IAdminMenuDo - Assign(attrs ...field.AssignExpr) IAdminMenuDo - Joins(fields ...field.RelationField) IAdminMenuDo - Preload(fields ...field.RelationField) IAdminMenuDo - FirstOrInit() (*model.AdminMenu, error) - FirstOrCreate() (*model.AdminMenu, error) - FindByPage(offset int, limit int) (result []*model.AdminMenu, count int64, err error) - ScanByPage(result interface{}, offset int, limit int) (count int64, err error) - Scan(result interface{}) (err error) - Returning(value interface{}, columns ...string) IAdminMenuDo - UnderlyingDB() *gorm.DB - schema.Tabler -} - -func (a adminMenuDo) Debug() IAdminMenuDo { - return a.withDO(a.DO.Debug()) -} - -func (a adminMenuDo) WithContext(ctx context.Context) IAdminMenuDo { - return a.withDO(a.DO.WithContext(ctx)) -} - -func (a adminMenuDo) ReadDB() IAdminMenuDo { - return a.Clauses(dbresolver.Read) -} - -func (a adminMenuDo) WriteDB() IAdminMenuDo { - return a.Clauses(dbresolver.Write) -} - -func (a adminMenuDo) Session(config *gorm.Session) IAdminMenuDo { - return a.withDO(a.DO.Session(config)) -} - -func (a adminMenuDo) Clauses(conds ...clause.Expression) IAdminMenuDo { - return a.withDO(a.DO.Clauses(conds...)) -} - -func (a adminMenuDo) Returning(value interface{}, columns ...string) IAdminMenuDo { - return a.withDO(a.DO.Returning(value, columns...)) -} - -func (a adminMenuDo) Not(conds ...gen.Condition) IAdminMenuDo { - return a.withDO(a.DO.Not(conds...)) -} - -func (a adminMenuDo) Or(conds ...gen.Condition) IAdminMenuDo { - return a.withDO(a.DO.Or(conds...)) -} - -func (a adminMenuDo) Select(conds ...field.Expr) IAdminMenuDo { - return a.withDO(a.DO.Select(conds...)) -} - -func (a adminMenuDo) Where(conds ...gen.Condition) IAdminMenuDo { - return a.withDO(a.DO.Where(conds...)) -} - -func (a adminMenuDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) IAdminMenuDo { - return a.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB())) -} - -func (a adminMenuDo) Order(conds ...field.Expr) IAdminMenuDo { - return a.withDO(a.DO.Order(conds...)) -} - -func (a adminMenuDo) Distinct(cols ...field.Expr) IAdminMenuDo { - return a.withDO(a.DO.Distinct(cols...)) -} - -func (a adminMenuDo) Omit(cols ...field.Expr) IAdminMenuDo { - return a.withDO(a.DO.Omit(cols...)) -} - -func (a adminMenuDo) Join(table schema.Tabler, on ...field.Expr) IAdminMenuDo { - return a.withDO(a.DO.Join(table, on...)) -} - -func (a adminMenuDo) LeftJoin(table schema.Tabler, on ...field.Expr) IAdminMenuDo { - return a.withDO(a.DO.LeftJoin(table, on...)) -} - -func (a adminMenuDo) RightJoin(table schema.Tabler, on ...field.Expr) IAdminMenuDo { - return a.withDO(a.DO.RightJoin(table, on...)) -} - -func (a adminMenuDo) Group(cols ...field.Expr) IAdminMenuDo { - return a.withDO(a.DO.Group(cols...)) -} - -func (a adminMenuDo) Having(conds ...gen.Condition) IAdminMenuDo { - return a.withDO(a.DO.Having(conds...)) -} - -func (a adminMenuDo) Limit(limit int) IAdminMenuDo { - return a.withDO(a.DO.Limit(limit)) -} - -func (a adminMenuDo) Offset(offset int) IAdminMenuDo { - return a.withDO(a.DO.Offset(offset)) -} - -func (a adminMenuDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IAdminMenuDo { - return a.withDO(a.DO.Scopes(funcs...)) -} - -func (a adminMenuDo) Unscoped() IAdminMenuDo { - return a.withDO(a.DO.Unscoped()) -} - -func (a adminMenuDo) Create(values ...*model.AdminMenu) error { - if len(values) == 0 { - return nil - } - return a.DO.Create(values) -} - -func (a adminMenuDo) CreateInBatches(values []*model.AdminMenu, batchSize int) error { - return a.DO.CreateInBatches(values, batchSize) -} - -// Save : !!! underlying implementation is different with GORM -// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) -func (a adminMenuDo) Save(values ...*model.AdminMenu) error { - if len(values) == 0 { - return nil - } - return a.DO.Save(values) -} - -func (a adminMenuDo) First() (*model.AdminMenu, error) { - if result, err := a.DO.First(); err != nil { - return nil, err - } else { - return result.(*model.AdminMenu), nil - } -} - -func (a adminMenuDo) Take() (*model.AdminMenu, error) { - if result, err := a.DO.Take(); err != nil { - return nil, err - } else { - return result.(*model.AdminMenu), nil - } -} - -func (a adminMenuDo) Last() (*model.AdminMenu, error) { - if result, err := a.DO.Last(); err != nil { - return nil, err - } else { - return result.(*model.AdminMenu), nil - } -} - -func (a adminMenuDo) Find() ([]*model.AdminMenu, error) { - result, err := a.DO.Find() - return result.([]*model.AdminMenu), err -} - -func (a adminMenuDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AdminMenu, err error) { - buf := make([]*model.AdminMenu, 0, batchSize) - err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { - defer func() { results = append(results, buf...) }() - return fc(tx, batch) - }) - return results, err -} - -func (a adminMenuDo) FindInBatches(result *[]*model.AdminMenu, batchSize int, fc func(tx gen.Dao, batch int) error) error { - return a.DO.FindInBatches(result, batchSize, fc) -} - -func (a adminMenuDo) Attrs(attrs ...field.AssignExpr) IAdminMenuDo { - return a.withDO(a.DO.Attrs(attrs...)) -} - -func (a adminMenuDo) Assign(attrs ...field.AssignExpr) IAdminMenuDo { - return a.withDO(a.DO.Assign(attrs...)) -} - -func (a adminMenuDo) Joins(fields ...field.RelationField) IAdminMenuDo { - for _, _f := range fields { - a = *a.withDO(a.DO.Joins(_f)) - } - return &a -} - -func (a adminMenuDo) Preload(fields ...field.RelationField) IAdminMenuDo { - for _, _f := range fields { - a = *a.withDO(a.DO.Preload(_f)) - } - return &a -} - -func (a adminMenuDo) FirstOrInit() (*model.AdminMenu, error) { - if result, err := a.DO.FirstOrInit(); err != nil { - return nil, err - } else { - return result.(*model.AdminMenu), nil - } -} - -func (a adminMenuDo) FirstOrCreate() (*model.AdminMenu, error) { - if result, err := a.DO.FirstOrCreate(); err != nil { - return nil, err - } else { - return result.(*model.AdminMenu), nil - } -} - -func (a adminMenuDo) FindByPage(offset int, limit int) (result []*model.AdminMenu, count int64, err error) { - result, err = a.Offset(offset).Limit(limit).Find() - if err != nil { - return - } - - if size := len(result); 0 < limit && 0 < size && size < limit { - count = int64(size + offset) - return - } - - count, err = a.Offset(-1).Limit(-1).Count() - return -} - -func (a adminMenuDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { - count, err = a.Count() - if err != nil { - return - } - - err = a.Offset(offset).Limit(limit).Scan(result) - return -} - -func (a adminMenuDo) Scan(result interface{}) (err error) { - return a.DO.Scan(result) -} - -func (a adminMenuDo) Delete(models ...*model.AdminMenu) (result gen.ResultInfo, err error) { - return a.DO.Delete(models) -} - -func (a *adminMenuDo) withDO(do gen.Dao) *adminMenuDo { - a.DO = *do.(*gen.DO) - return a -} diff --git a/internal/repository/mysql/query/authorized.gen.go b/internal/repository/mysql/query/authorized.gen.go deleted file mode 100644 index 63efc57..0000000 --- a/internal/repository/mysql/query/authorized.gen.go +++ /dev/null @@ -1,424 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package query - -import ( - "context" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/schema" - - "gorm.io/gen" - "gorm.io/gen/field" - - "gorm.io/plugin/dbresolver" - - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" -) - -func newAuthorized(db *gorm.DB, opts ...gen.DOOption) authorized { - _authorized := authorized{} - - _authorized.authorizedDo.UseDB(db, opts...) - _authorized.authorizedDo.UseModel(&model.Authorized{}) - - tableName := _authorized.authorizedDo.TableName() - _authorized.ALL = field.NewAsterisk(tableName) - _authorized.ID = field.NewInt64(tableName, "id") - _authorized.BusinessKey = field.NewString(tableName, "business_key") - _authorized.BusinessSecret = field.NewString(tableName, "business_secret") - _authorized.BusinessDeveloper = field.NewString(tableName, "business_developer") - _authorized.Remark = field.NewString(tableName, "remark") - _authorized.IsUsed = field.NewInt64(tableName, "is_used") - _authorized.IsDeleted = field.NewInt64(tableName, "is_deleted") - _authorized.CreatedAt = field.NewTime(tableName, "created_at") - _authorized.CreatedUser = field.NewString(tableName, "created_user") - _authorized.UpdatedAt = field.NewTime(tableName, "updated_at") - _authorized.UpdatedUser = field.NewString(tableName, "updated_user") - - _authorized.fillFieldMap() - - return _authorized -} - -type authorized struct { - authorizedDo - - ALL field.Asterisk - ID field.Int64 // 主键 - BusinessKey field.String // 调用方key - BusinessSecret field.String // 调用方secret - BusinessDeveloper field.String // 调用方对接人 - Remark field.String // 备注 - IsUsed field.Int64 // 是否启用 1:是 -1:否 - IsDeleted field.Int64 // 是否删除 1:是 -1:否 - CreatedAt field.Time // 创建时间 - CreatedUser field.String // 创建人 - UpdatedAt field.Time // 更新时间 - UpdatedUser field.String // 更新人 - - fieldMap map[string]field.Expr -} - -func (a authorized) Table(newTableName string) *authorized { - a.authorizedDo.UseTable(newTableName) - return a.updateTableName(newTableName) -} - -func (a authorized) As(alias string) *authorized { - a.authorizedDo.DO = *(a.authorizedDo.As(alias).(*gen.DO)) - return a.updateTableName(alias) -} - -func (a *authorized) updateTableName(table string) *authorized { - a.ALL = field.NewAsterisk(table) - a.ID = field.NewInt64(table, "id") - a.BusinessKey = field.NewString(table, "business_key") - a.BusinessSecret = field.NewString(table, "business_secret") - a.BusinessDeveloper = field.NewString(table, "business_developer") - a.Remark = field.NewString(table, "remark") - a.IsUsed = field.NewInt64(table, "is_used") - a.IsDeleted = field.NewInt64(table, "is_deleted") - a.CreatedAt = field.NewTime(table, "created_at") - a.CreatedUser = field.NewString(table, "created_user") - a.UpdatedAt = field.NewTime(table, "updated_at") - a.UpdatedUser = field.NewString(table, "updated_user") - - a.fillFieldMap() - - return a -} - -func (a *authorized) GetFieldByName(fieldName string) (field.OrderExpr, bool) { - _f, ok := a.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - _oe, ok := _f.(field.OrderExpr) - return _oe, ok -} - -func (a *authorized) fillFieldMap() { - a.fieldMap = make(map[string]field.Expr, 11) - a.fieldMap["id"] = a.ID - a.fieldMap["business_key"] = a.BusinessKey - a.fieldMap["business_secret"] = a.BusinessSecret - a.fieldMap["business_developer"] = a.BusinessDeveloper - a.fieldMap["remark"] = a.Remark - a.fieldMap["is_used"] = a.IsUsed - a.fieldMap["is_deleted"] = a.IsDeleted - a.fieldMap["created_at"] = a.CreatedAt - a.fieldMap["created_user"] = a.CreatedUser - a.fieldMap["updated_at"] = a.UpdatedAt - a.fieldMap["updated_user"] = a.UpdatedUser -} - -func (a authorized) clone(db *gorm.DB) authorized { - a.authorizedDo.ReplaceConnPool(db.Statement.ConnPool) - return a -} - -func (a authorized) replaceDB(db *gorm.DB) authorized { - a.authorizedDo.ReplaceDB(db) - return a -} - -type authorizedDo struct{ gen.DO } - -type IAuthorizedDo interface { - gen.SubQuery - Debug() IAuthorizedDo - WithContext(ctx context.Context) IAuthorizedDo - WithResult(fc func(tx gen.Dao)) gen.ResultInfo - ReplaceDB(db *gorm.DB) - ReadDB() IAuthorizedDo - WriteDB() IAuthorizedDo - As(alias string) gen.Dao - Session(config *gorm.Session) IAuthorizedDo - Columns(cols ...field.Expr) gen.Columns - Clauses(conds ...clause.Expression) IAuthorizedDo - Not(conds ...gen.Condition) IAuthorizedDo - Or(conds ...gen.Condition) IAuthorizedDo - Select(conds ...field.Expr) IAuthorizedDo - Where(conds ...gen.Condition) IAuthorizedDo - Order(conds ...field.Expr) IAuthorizedDo - Distinct(cols ...field.Expr) IAuthorizedDo - Omit(cols ...field.Expr) IAuthorizedDo - Join(table schema.Tabler, on ...field.Expr) IAuthorizedDo - LeftJoin(table schema.Tabler, on ...field.Expr) IAuthorizedDo - RightJoin(table schema.Tabler, on ...field.Expr) IAuthorizedDo - Group(cols ...field.Expr) IAuthorizedDo - Having(conds ...gen.Condition) IAuthorizedDo - Limit(limit int) IAuthorizedDo - Offset(offset int) IAuthorizedDo - Count() (count int64, err error) - Scopes(funcs ...func(gen.Dao) gen.Dao) IAuthorizedDo - Unscoped() IAuthorizedDo - Create(values ...*model.Authorized) error - CreateInBatches(values []*model.Authorized, batchSize int) error - Save(values ...*model.Authorized) error - First() (*model.Authorized, error) - Take() (*model.Authorized, error) - Last() (*model.Authorized, error) - Find() ([]*model.Authorized, error) - FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Authorized, err error) - FindInBatches(result *[]*model.Authorized, batchSize int, fc func(tx gen.Dao, batch int) error) error - Pluck(column field.Expr, dest interface{}) error - Delete(...*model.Authorized) (info gen.ResultInfo, err error) - Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - Updates(value interface{}) (info gen.ResultInfo, err error) - UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - UpdateColumns(value interface{}) (info gen.ResultInfo, err error) - UpdateFrom(q gen.SubQuery) gen.Dao - Attrs(attrs ...field.AssignExpr) IAuthorizedDo - Assign(attrs ...field.AssignExpr) IAuthorizedDo - Joins(fields ...field.RelationField) IAuthorizedDo - Preload(fields ...field.RelationField) IAuthorizedDo - FirstOrInit() (*model.Authorized, error) - FirstOrCreate() (*model.Authorized, error) - FindByPage(offset int, limit int) (result []*model.Authorized, count int64, err error) - ScanByPage(result interface{}, offset int, limit int) (count int64, err error) - Scan(result interface{}) (err error) - Returning(value interface{}, columns ...string) IAuthorizedDo - UnderlyingDB() *gorm.DB - schema.Tabler -} - -func (a authorizedDo) Debug() IAuthorizedDo { - return a.withDO(a.DO.Debug()) -} - -func (a authorizedDo) WithContext(ctx context.Context) IAuthorizedDo { - return a.withDO(a.DO.WithContext(ctx)) -} - -func (a authorizedDo) ReadDB() IAuthorizedDo { - return a.Clauses(dbresolver.Read) -} - -func (a authorizedDo) WriteDB() IAuthorizedDo { - return a.Clauses(dbresolver.Write) -} - -func (a authorizedDo) Session(config *gorm.Session) IAuthorizedDo { - return a.withDO(a.DO.Session(config)) -} - -func (a authorizedDo) Clauses(conds ...clause.Expression) IAuthorizedDo { - return a.withDO(a.DO.Clauses(conds...)) -} - -func (a authorizedDo) Returning(value interface{}, columns ...string) IAuthorizedDo { - return a.withDO(a.DO.Returning(value, columns...)) -} - -func (a authorizedDo) Not(conds ...gen.Condition) IAuthorizedDo { - return a.withDO(a.DO.Not(conds...)) -} - -func (a authorizedDo) Or(conds ...gen.Condition) IAuthorizedDo { - return a.withDO(a.DO.Or(conds...)) -} - -func (a authorizedDo) Select(conds ...field.Expr) IAuthorizedDo { - return a.withDO(a.DO.Select(conds...)) -} - -func (a authorizedDo) Where(conds ...gen.Condition) IAuthorizedDo { - return a.withDO(a.DO.Where(conds...)) -} - -func (a authorizedDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) IAuthorizedDo { - return a.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB())) -} - -func (a authorizedDo) Order(conds ...field.Expr) IAuthorizedDo { - return a.withDO(a.DO.Order(conds...)) -} - -func (a authorizedDo) Distinct(cols ...field.Expr) IAuthorizedDo { - return a.withDO(a.DO.Distinct(cols...)) -} - -func (a authorizedDo) Omit(cols ...field.Expr) IAuthorizedDo { - return a.withDO(a.DO.Omit(cols...)) -} - -func (a authorizedDo) Join(table schema.Tabler, on ...field.Expr) IAuthorizedDo { - return a.withDO(a.DO.Join(table, on...)) -} - -func (a authorizedDo) LeftJoin(table schema.Tabler, on ...field.Expr) IAuthorizedDo { - return a.withDO(a.DO.LeftJoin(table, on...)) -} - -func (a authorizedDo) RightJoin(table schema.Tabler, on ...field.Expr) IAuthorizedDo { - return a.withDO(a.DO.RightJoin(table, on...)) -} - -func (a authorizedDo) Group(cols ...field.Expr) IAuthorizedDo { - return a.withDO(a.DO.Group(cols...)) -} - -func (a authorizedDo) Having(conds ...gen.Condition) IAuthorizedDo { - return a.withDO(a.DO.Having(conds...)) -} - -func (a authorizedDo) Limit(limit int) IAuthorizedDo { - return a.withDO(a.DO.Limit(limit)) -} - -func (a authorizedDo) Offset(offset int) IAuthorizedDo { - return a.withDO(a.DO.Offset(offset)) -} - -func (a authorizedDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IAuthorizedDo { - return a.withDO(a.DO.Scopes(funcs...)) -} - -func (a authorizedDo) Unscoped() IAuthorizedDo { - return a.withDO(a.DO.Unscoped()) -} - -func (a authorizedDo) Create(values ...*model.Authorized) error { - if len(values) == 0 { - return nil - } - return a.DO.Create(values) -} - -func (a authorizedDo) CreateInBatches(values []*model.Authorized, batchSize int) error { - return a.DO.CreateInBatches(values, batchSize) -} - -// Save : !!! underlying implementation is different with GORM -// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) -func (a authorizedDo) Save(values ...*model.Authorized) error { - if len(values) == 0 { - return nil - } - return a.DO.Save(values) -} - -func (a authorizedDo) First() (*model.Authorized, error) { - if result, err := a.DO.First(); err != nil { - return nil, err - } else { - return result.(*model.Authorized), nil - } -} - -func (a authorizedDo) Take() (*model.Authorized, error) { - if result, err := a.DO.Take(); err != nil { - return nil, err - } else { - return result.(*model.Authorized), nil - } -} - -func (a authorizedDo) Last() (*model.Authorized, error) { - if result, err := a.DO.Last(); err != nil { - return nil, err - } else { - return result.(*model.Authorized), nil - } -} - -func (a authorizedDo) Find() ([]*model.Authorized, error) { - result, err := a.DO.Find() - return result.([]*model.Authorized), err -} - -func (a authorizedDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Authorized, err error) { - buf := make([]*model.Authorized, 0, batchSize) - err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { - defer func() { results = append(results, buf...) }() - return fc(tx, batch) - }) - return results, err -} - -func (a authorizedDo) FindInBatches(result *[]*model.Authorized, batchSize int, fc func(tx gen.Dao, batch int) error) error { - return a.DO.FindInBatches(result, batchSize, fc) -} - -func (a authorizedDo) Attrs(attrs ...field.AssignExpr) IAuthorizedDo { - return a.withDO(a.DO.Attrs(attrs...)) -} - -func (a authorizedDo) Assign(attrs ...field.AssignExpr) IAuthorizedDo { - return a.withDO(a.DO.Assign(attrs...)) -} - -func (a authorizedDo) Joins(fields ...field.RelationField) IAuthorizedDo { - for _, _f := range fields { - a = *a.withDO(a.DO.Joins(_f)) - } - return &a -} - -func (a authorizedDo) Preload(fields ...field.RelationField) IAuthorizedDo { - for _, _f := range fields { - a = *a.withDO(a.DO.Preload(_f)) - } - return &a -} - -func (a authorizedDo) FirstOrInit() (*model.Authorized, error) { - if result, err := a.DO.FirstOrInit(); err != nil { - return nil, err - } else { - return result.(*model.Authorized), nil - } -} - -func (a authorizedDo) FirstOrCreate() (*model.Authorized, error) { - if result, err := a.DO.FirstOrCreate(); err != nil { - return nil, err - } else { - return result.(*model.Authorized), nil - } -} - -func (a authorizedDo) FindByPage(offset int, limit int) (result []*model.Authorized, count int64, err error) { - result, err = a.Offset(offset).Limit(limit).Find() - if err != nil { - return - } - - if size := len(result); 0 < limit && 0 < size && size < limit { - count = int64(size + offset) - return - } - - count, err = a.Offset(-1).Limit(-1).Count() - return -} - -func (a authorizedDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { - count, err = a.Count() - if err != nil { - return - } - - err = a.Offset(offset).Limit(limit).Scan(result) - return -} - -func (a authorizedDo) Scan(result interface{}) (err error) { - return a.DO.Scan(result) -} - -func (a authorizedDo) Delete(models ...*model.Authorized) (result gen.ResultInfo, err error) { - return a.DO.Delete(models) -} - -func (a *authorizedDo) withDO(do gen.Dao) *authorizedDo { - a.DO = *do.(*gen.DO) - return a -} diff --git a/internal/repository/mysql/query/authorized_api.gen.go b/internal/repository/mysql/query/authorized_api.gen.go deleted file mode 100644 index 998cfd1..0000000 --- a/internal/repository/mysql/query/authorized_api.gen.go +++ /dev/null @@ -1,416 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package query - -import ( - "context" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/schema" - - "gorm.io/gen" - "gorm.io/gen/field" - - "gorm.io/plugin/dbresolver" - - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" -) - -func newAuthorizedAPI(db *gorm.DB, opts ...gen.DOOption) authorizedAPI { - _authorizedAPI := authorizedAPI{} - - _authorizedAPI.authorizedAPIDo.UseDB(db, opts...) - _authorizedAPI.authorizedAPIDo.UseModel(&model.AuthorizedAPI{}) - - tableName := _authorizedAPI.authorizedAPIDo.TableName() - _authorizedAPI.ALL = field.NewAsterisk(tableName) - _authorizedAPI.ID = field.NewInt64(tableName, "id") - _authorizedAPI.BusinessKey = field.NewString(tableName, "business_key") - _authorizedAPI.Method = field.NewString(tableName, "method") - _authorizedAPI.API = field.NewString(tableName, "api") - _authorizedAPI.IsDeleted = field.NewInt64(tableName, "is_deleted") - _authorizedAPI.CreatedAt = field.NewTime(tableName, "created_at") - _authorizedAPI.CreatedUser = field.NewString(tableName, "created_user") - _authorizedAPI.UpdatedAt = field.NewTime(tableName, "updated_at") - _authorizedAPI.UpdatedUser = field.NewString(tableName, "updated_user") - - _authorizedAPI.fillFieldMap() - - return _authorizedAPI -} - -type authorizedAPI struct { - authorizedAPIDo - - ALL field.Asterisk - ID field.Int64 // 主键 - BusinessKey field.String // 调用方key - Method field.String // 请求方式 - API field.String // 请求地址 - IsDeleted field.Int64 // 是否删除 1:是 -1:否 - CreatedAt field.Time // 创建时间 - CreatedUser field.String // 创建人 - UpdatedAt field.Time // 更新时间 - UpdatedUser field.String // 更新人 - - fieldMap map[string]field.Expr -} - -func (a authorizedAPI) Table(newTableName string) *authorizedAPI { - a.authorizedAPIDo.UseTable(newTableName) - return a.updateTableName(newTableName) -} - -func (a authorizedAPI) As(alias string) *authorizedAPI { - a.authorizedAPIDo.DO = *(a.authorizedAPIDo.As(alias).(*gen.DO)) - return a.updateTableName(alias) -} - -func (a *authorizedAPI) updateTableName(table string) *authorizedAPI { - a.ALL = field.NewAsterisk(table) - a.ID = field.NewInt64(table, "id") - a.BusinessKey = field.NewString(table, "business_key") - a.Method = field.NewString(table, "method") - a.API = field.NewString(table, "api") - a.IsDeleted = field.NewInt64(table, "is_deleted") - a.CreatedAt = field.NewTime(table, "created_at") - a.CreatedUser = field.NewString(table, "created_user") - a.UpdatedAt = field.NewTime(table, "updated_at") - a.UpdatedUser = field.NewString(table, "updated_user") - - a.fillFieldMap() - - return a -} - -func (a *authorizedAPI) GetFieldByName(fieldName string) (field.OrderExpr, bool) { - _f, ok := a.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - _oe, ok := _f.(field.OrderExpr) - return _oe, ok -} - -func (a *authorizedAPI) fillFieldMap() { - a.fieldMap = make(map[string]field.Expr, 9) - a.fieldMap["id"] = a.ID - a.fieldMap["business_key"] = a.BusinessKey - a.fieldMap["method"] = a.Method - a.fieldMap["api"] = a.API - a.fieldMap["is_deleted"] = a.IsDeleted - a.fieldMap["created_at"] = a.CreatedAt - a.fieldMap["created_user"] = a.CreatedUser - a.fieldMap["updated_at"] = a.UpdatedAt - a.fieldMap["updated_user"] = a.UpdatedUser -} - -func (a authorizedAPI) clone(db *gorm.DB) authorizedAPI { - a.authorizedAPIDo.ReplaceConnPool(db.Statement.ConnPool) - return a -} - -func (a authorizedAPI) replaceDB(db *gorm.DB) authorizedAPI { - a.authorizedAPIDo.ReplaceDB(db) - return a -} - -type authorizedAPIDo struct{ gen.DO } - -type IAuthorizedAPIDo interface { - gen.SubQuery - Debug() IAuthorizedAPIDo - WithContext(ctx context.Context) IAuthorizedAPIDo - WithResult(fc func(tx gen.Dao)) gen.ResultInfo - ReplaceDB(db *gorm.DB) - ReadDB() IAuthorizedAPIDo - WriteDB() IAuthorizedAPIDo - As(alias string) gen.Dao - Session(config *gorm.Session) IAuthorizedAPIDo - Columns(cols ...field.Expr) gen.Columns - Clauses(conds ...clause.Expression) IAuthorizedAPIDo - Not(conds ...gen.Condition) IAuthorizedAPIDo - Or(conds ...gen.Condition) IAuthorizedAPIDo - Select(conds ...field.Expr) IAuthorizedAPIDo - Where(conds ...gen.Condition) IAuthorizedAPIDo - Order(conds ...field.Expr) IAuthorizedAPIDo - Distinct(cols ...field.Expr) IAuthorizedAPIDo - Omit(cols ...field.Expr) IAuthorizedAPIDo - Join(table schema.Tabler, on ...field.Expr) IAuthorizedAPIDo - LeftJoin(table schema.Tabler, on ...field.Expr) IAuthorizedAPIDo - RightJoin(table schema.Tabler, on ...field.Expr) IAuthorizedAPIDo - Group(cols ...field.Expr) IAuthorizedAPIDo - Having(conds ...gen.Condition) IAuthorizedAPIDo - Limit(limit int) IAuthorizedAPIDo - Offset(offset int) IAuthorizedAPIDo - Count() (count int64, err error) - Scopes(funcs ...func(gen.Dao) gen.Dao) IAuthorizedAPIDo - Unscoped() IAuthorizedAPIDo - Create(values ...*model.AuthorizedAPI) error - CreateInBatches(values []*model.AuthorizedAPI, batchSize int) error - Save(values ...*model.AuthorizedAPI) error - First() (*model.AuthorizedAPI, error) - Take() (*model.AuthorizedAPI, error) - Last() (*model.AuthorizedAPI, error) - Find() ([]*model.AuthorizedAPI, error) - FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AuthorizedAPI, err error) - FindInBatches(result *[]*model.AuthorizedAPI, batchSize int, fc func(tx gen.Dao, batch int) error) error - Pluck(column field.Expr, dest interface{}) error - Delete(...*model.AuthorizedAPI) (info gen.ResultInfo, err error) - Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - Updates(value interface{}) (info gen.ResultInfo, err error) - UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - UpdateColumns(value interface{}) (info gen.ResultInfo, err error) - UpdateFrom(q gen.SubQuery) gen.Dao - Attrs(attrs ...field.AssignExpr) IAuthorizedAPIDo - Assign(attrs ...field.AssignExpr) IAuthorizedAPIDo - Joins(fields ...field.RelationField) IAuthorizedAPIDo - Preload(fields ...field.RelationField) IAuthorizedAPIDo - FirstOrInit() (*model.AuthorizedAPI, error) - FirstOrCreate() (*model.AuthorizedAPI, error) - FindByPage(offset int, limit int) (result []*model.AuthorizedAPI, count int64, err error) - ScanByPage(result interface{}, offset int, limit int) (count int64, err error) - Scan(result interface{}) (err error) - Returning(value interface{}, columns ...string) IAuthorizedAPIDo - UnderlyingDB() *gorm.DB - schema.Tabler -} - -func (a authorizedAPIDo) Debug() IAuthorizedAPIDo { - return a.withDO(a.DO.Debug()) -} - -func (a authorizedAPIDo) WithContext(ctx context.Context) IAuthorizedAPIDo { - return a.withDO(a.DO.WithContext(ctx)) -} - -func (a authorizedAPIDo) ReadDB() IAuthorizedAPIDo { - return a.Clauses(dbresolver.Read) -} - -func (a authorizedAPIDo) WriteDB() IAuthorizedAPIDo { - return a.Clauses(dbresolver.Write) -} - -func (a authorizedAPIDo) Session(config *gorm.Session) IAuthorizedAPIDo { - return a.withDO(a.DO.Session(config)) -} - -func (a authorizedAPIDo) Clauses(conds ...clause.Expression) IAuthorizedAPIDo { - return a.withDO(a.DO.Clauses(conds...)) -} - -func (a authorizedAPIDo) Returning(value interface{}, columns ...string) IAuthorizedAPIDo { - return a.withDO(a.DO.Returning(value, columns...)) -} - -func (a authorizedAPIDo) Not(conds ...gen.Condition) IAuthorizedAPIDo { - return a.withDO(a.DO.Not(conds...)) -} - -func (a authorizedAPIDo) Or(conds ...gen.Condition) IAuthorizedAPIDo { - return a.withDO(a.DO.Or(conds...)) -} - -func (a authorizedAPIDo) Select(conds ...field.Expr) IAuthorizedAPIDo { - return a.withDO(a.DO.Select(conds...)) -} - -func (a authorizedAPIDo) Where(conds ...gen.Condition) IAuthorizedAPIDo { - return a.withDO(a.DO.Where(conds...)) -} - -func (a authorizedAPIDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) IAuthorizedAPIDo { - return a.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB())) -} - -func (a authorizedAPIDo) Order(conds ...field.Expr) IAuthorizedAPIDo { - return a.withDO(a.DO.Order(conds...)) -} - -func (a authorizedAPIDo) Distinct(cols ...field.Expr) IAuthorizedAPIDo { - return a.withDO(a.DO.Distinct(cols...)) -} - -func (a authorizedAPIDo) Omit(cols ...field.Expr) IAuthorizedAPIDo { - return a.withDO(a.DO.Omit(cols...)) -} - -func (a authorizedAPIDo) Join(table schema.Tabler, on ...field.Expr) IAuthorizedAPIDo { - return a.withDO(a.DO.Join(table, on...)) -} - -func (a authorizedAPIDo) LeftJoin(table schema.Tabler, on ...field.Expr) IAuthorizedAPIDo { - return a.withDO(a.DO.LeftJoin(table, on...)) -} - -func (a authorizedAPIDo) RightJoin(table schema.Tabler, on ...field.Expr) IAuthorizedAPIDo { - return a.withDO(a.DO.RightJoin(table, on...)) -} - -func (a authorizedAPIDo) Group(cols ...field.Expr) IAuthorizedAPIDo { - return a.withDO(a.DO.Group(cols...)) -} - -func (a authorizedAPIDo) Having(conds ...gen.Condition) IAuthorizedAPIDo { - return a.withDO(a.DO.Having(conds...)) -} - -func (a authorizedAPIDo) Limit(limit int) IAuthorizedAPIDo { - return a.withDO(a.DO.Limit(limit)) -} - -func (a authorizedAPIDo) Offset(offset int) IAuthorizedAPIDo { - return a.withDO(a.DO.Offset(offset)) -} - -func (a authorizedAPIDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IAuthorizedAPIDo { - return a.withDO(a.DO.Scopes(funcs...)) -} - -func (a authorizedAPIDo) Unscoped() IAuthorizedAPIDo { - return a.withDO(a.DO.Unscoped()) -} - -func (a authorizedAPIDo) Create(values ...*model.AuthorizedAPI) error { - if len(values) == 0 { - return nil - } - return a.DO.Create(values) -} - -func (a authorizedAPIDo) CreateInBatches(values []*model.AuthorizedAPI, batchSize int) error { - return a.DO.CreateInBatches(values, batchSize) -} - -// Save : !!! underlying implementation is different with GORM -// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) -func (a authorizedAPIDo) Save(values ...*model.AuthorizedAPI) error { - if len(values) == 0 { - return nil - } - return a.DO.Save(values) -} - -func (a authorizedAPIDo) First() (*model.AuthorizedAPI, error) { - if result, err := a.DO.First(); err != nil { - return nil, err - } else { - return result.(*model.AuthorizedAPI), nil - } -} - -func (a authorizedAPIDo) Take() (*model.AuthorizedAPI, error) { - if result, err := a.DO.Take(); err != nil { - return nil, err - } else { - return result.(*model.AuthorizedAPI), nil - } -} - -func (a authorizedAPIDo) Last() (*model.AuthorizedAPI, error) { - if result, err := a.DO.Last(); err != nil { - return nil, err - } else { - return result.(*model.AuthorizedAPI), nil - } -} - -func (a authorizedAPIDo) Find() ([]*model.AuthorizedAPI, error) { - result, err := a.DO.Find() - return result.([]*model.AuthorizedAPI), err -} - -func (a authorizedAPIDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AuthorizedAPI, err error) { - buf := make([]*model.AuthorizedAPI, 0, batchSize) - err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { - defer func() { results = append(results, buf...) }() - return fc(tx, batch) - }) - return results, err -} - -func (a authorizedAPIDo) FindInBatches(result *[]*model.AuthorizedAPI, batchSize int, fc func(tx gen.Dao, batch int) error) error { - return a.DO.FindInBatches(result, batchSize, fc) -} - -func (a authorizedAPIDo) Attrs(attrs ...field.AssignExpr) IAuthorizedAPIDo { - return a.withDO(a.DO.Attrs(attrs...)) -} - -func (a authorizedAPIDo) Assign(attrs ...field.AssignExpr) IAuthorizedAPIDo { - return a.withDO(a.DO.Assign(attrs...)) -} - -func (a authorizedAPIDo) Joins(fields ...field.RelationField) IAuthorizedAPIDo { - for _, _f := range fields { - a = *a.withDO(a.DO.Joins(_f)) - } - return &a -} - -func (a authorizedAPIDo) Preload(fields ...field.RelationField) IAuthorizedAPIDo { - for _, _f := range fields { - a = *a.withDO(a.DO.Preload(_f)) - } - return &a -} - -func (a authorizedAPIDo) FirstOrInit() (*model.AuthorizedAPI, error) { - if result, err := a.DO.FirstOrInit(); err != nil { - return nil, err - } else { - return result.(*model.AuthorizedAPI), nil - } -} - -func (a authorizedAPIDo) FirstOrCreate() (*model.AuthorizedAPI, error) { - if result, err := a.DO.FirstOrCreate(); err != nil { - return nil, err - } else { - return result.(*model.AuthorizedAPI), nil - } -} - -func (a authorizedAPIDo) FindByPage(offset int, limit int) (result []*model.AuthorizedAPI, count int64, err error) { - result, err = a.Offset(offset).Limit(limit).Find() - if err != nil { - return - } - - if size := len(result); 0 < limit && 0 < size && size < limit { - count = int64(size + offset) - return - } - - count, err = a.Offset(-1).Limit(-1).Count() - return -} - -func (a authorizedAPIDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { - count, err = a.Count() - if err != nil { - return - } - - err = a.Offset(offset).Limit(limit).Scan(result) - return -} - -func (a authorizedAPIDo) Scan(result interface{}) (err error) { - return a.DO.Scan(result) -} - -func (a authorizedAPIDo) Delete(models ...*model.AuthorizedAPI) (result gen.ResultInfo, err error) { - return a.DO.Delete(models) -} - -func (a *authorizedAPIDo) withDO(do gen.Dao) *authorizedAPIDo { - a.DO = *do.(*gen.DO) - return a -} diff --git a/internal/repository/mysql/query/category.gen.go b/internal/repository/mysql/query/category.gen.go deleted file mode 100644 index 618ad58..0000000 --- a/internal/repository/mysql/query/category.gen.go +++ /dev/null @@ -1,433 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package query - -import ( - "context" - "strings" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/schema" - - "gorm.io/gen" - "gorm.io/gen/field" - - "gorm.io/plugin/dbresolver" - - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" -) - -func newCategory(db *gorm.DB, opts ...gen.DOOption) category { - _category := category{} - - _category.categoryDo.UseDB(db, opts...) - _category.categoryDo.UseModel(&model.Category{}) - - tableName := _category.categoryDo.TableName() - _category.ALL = field.NewAsterisk(tableName) - _category.ID = field.NewInt64(tableName, "id") - _category.ParentID = field.NewInt64(tableName, "parent_id") - _category.Sort = field.NewInt64(tableName, "sort") - _category.Title = field.NewString(tableName, "title") - _category.Icon = field.NewString(tableName, "icon") - _category.CreatedAt = field.NewTime(tableName, "created_at") - _category.UpdatedAt = field.NewTime(tableName, "updated_at") - _category.IsUsed = field.NewInt64(tableName, "is_used") - _category.Level = field.NewInt64(tableName, "level") - - _category.fillFieldMap() - - return _category -} - -type category struct { - categoryDo - - ALL field.Asterisk - ID field.Int64 - ParentID field.Int64 - Sort field.Int64 - Title field.String - Icon field.String - CreatedAt field.Time - UpdatedAt field.Time - IsUsed field.Int64 - Level field.Int64 - - fieldMap map[string]field.Expr -} - -func (c category) Table(newTableName string) *category { - c.categoryDo.UseTable(newTableName) - return c.updateTableName(newTableName) -} - -func (c category) As(alias string) *category { - c.categoryDo.DO = *(c.categoryDo.As(alias).(*gen.DO)) - return c.updateTableName(alias) -} - -func (c *category) updateTableName(table string) *category { - c.ALL = field.NewAsterisk(table) - c.ID = field.NewInt64(table, "id") - c.ParentID = field.NewInt64(table, "parent_id") - c.Sort = field.NewInt64(table, "sort") - c.Title = field.NewString(table, "title") - c.Icon = field.NewString(table, "icon") - c.CreatedAt = field.NewTime(table, "created_at") - c.UpdatedAt = field.NewTime(table, "updated_at") - c.IsUsed = field.NewInt64(table, "is_used") - c.Level = field.NewInt64(table, "level") - - c.fillFieldMap() - - return c -} - -func (c *category) GetFieldByName(fieldName string) (field.OrderExpr, bool) { - _f, ok := c.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - _oe, ok := _f.(field.OrderExpr) - return _oe, ok -} - -func (c *category) fillFieldMap() { - c.fieldMap = make(map[string]field.Expr, 9) - c.fieldMap["id"] = c.ID - c.fieldMap["parent_id"] = c.ParentID - c.fieldMap["sort"] = c.Sort - c.fieldMap["title"] = c.Title - c.fieldMap["icon"] = c.Icon - c.fieldMap["created_at"] = c.CreatedAt - c.fieldMap["updated_at"] = c.UpdatedAt - c.fieldMap["is_used"] = c.IsUsed - c.fieldMap["level"] = c.Level -} - -func (c category) clone(db *gorm.DB) category { - c.categoryDo.ReplaceConnPool(db.Statement.ConnPool) - return c -} - -func (c category) replaceDB(db *gorm.DB) category { - c.categoryDo.ReplaceDB(db) - return c -} - -type categoryDo struct{ gen.DO } - -type ICategoryDo interface { - gen.SubQuery - Debug() ICategoryDo - WithContext(ctx context.Context) ICategoryDo - WithResult(fc func(tx gen.Dao)) gen.ResultInfo - ReplaceDB(db *gorm.DB) - ReadDB() ICategoryDo - WriteDB() ICategoryDo - As(alias string) gen.Dao - Session(config *gorm.Session) ICategoryDo - Columns(cols ...field.Expr) gen.Columns - Clauses(conds ...clause.Expression) ICategoryDo - Not(conds ...gen.Condition) ICategoryDo - Or(conds ...gen.Condition) ICategoryDo - Select(conds ...field.Expr) ICategoryDo - Where(conds ...gen.Condition) ICategoryDo - Order(conds ...field.Expr) ICategoryDo - Distinct(cols ...field.Expr) ICategoryDo - Omit(cols ...field.Expr) ICategoryDo - Join(table schema.Tabler, on ...field.Expr) ICategoryDo - LeftJoin(table schema.Tabler, on ...field.Expr) ICategoryDo - RightJoin(table schema.Tabler, on ...field.Expr) ICategoryDo - Group(cols ...field.Expr) ICategoryDo - Having(conds ...gen.Condition) ICategoryDo - Limit(limit int) ICategoryDo - Offset(offset int) ICategoryDo - Count() (count int64, err error) - Scopes(funcs ...func(gen.Dao) gen.Dao) ICategoryDo - Unscoped() ICategoryDo - Create(values ...*model.Category) error - CreateInBatches(values []*model.Category, batchSize int) error - Save(values ...*model.Category) error - First() (*model.Category, error) - Take() (*model.Category, error) - Last() (*model.Category, error) - Find() ([]*model.Category, error) - FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Category, err error) - FindInBatches(result *[]*model.Category, batchSize int, fc func(tx gen.Dao, batch int) error) error - Pluck(column field.Expr, dest interface{}) error - Delete(...*model.Category) (info gen.ResultInfo, err error) - Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - Updates(value interface{}) (info gen.ResultInfo, err error) - UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - UpdateColumns(value interface{}) (info gen.ResultInfo, err error) - UpdateFrom(q gen.SubQuery) gen.Dao - Attrs(attrs ...field.AssignExpr) ICategoryDo - Assign(attrs ...field.AssignExpr) ICategoryDo - Joins(fields ...field.RelationField) ICategoryDo - Preload(fields ...field.RelationField) ICategoryDo - FirstOrInit() (*model.Category, error) - FirstOrCreate() (*model.Category, error) - FindByPage(offset int, limit int) (result []*model.Category, count int64, err error) - ScanByPage(result interface{}, offset int, limit int) (count int64, err error) - Scan(result interface{}) (err error) - Returning(value interface{}, columns ...string) ICategoryDo - UnderlyingDB() *gorm.DB - schema.Tabler - - GetParentIdsByGroupParentId() (result map[string]interface{}, err error) -} - -// GetParentIdsByGroupParentId -// SELECT GROUP_CONCAT(a.parent_id) AS parent_ids from (SELECT parent_id FROM category GROUP BY parent_id) as a -func (c categoryDo) GetParentIdsByGroupParentId() (result map[string]interface{}, err error) { - var generateSQL strings.Builder - generateSQL.WriteString("SELECT GROUP_CONCAT(a.parent_id) AS parent_ids from (SELECT parent_id FROM category GROUP BY parent_id) as a ") - - result = make(map[string]interface{}) - var executeSQL *gorm.DB - executeSQL = c.UnderlyingDB().Raw(generateSQL.String()).Take(result) // ignore_security_alert - err = executeSQL.Error - - return -} - -func (c categoryDo) Debug() ICategoryDo { - return c.withDO(c.DO.Debug()) -} - -func (c categoryDo) WithContext(ctx context.Context) ICategoryDo { - return c.withDO(c.DO.WithContext(ctx)) -} - -func (c categoryDo) ReadDB() ICategoryDo { - return c.Clauses(dbresolver.Read) -} - -func (c categoryDo) WriteDB() ICategoryDo { - return c.Clauses(dbresolver.Write) -} - -func (c categoryDo) Session(config *gorm.Session) ICategoryDo { - return c.withDO(c.DO.Session(config)) -} - -func (c categoryDo) Clauses(conds ...clause.Expression) ICategoryDo { - return c.withDO(c.DO.Clauses(conds...)) -} - -func (c categoryDo) Returning(value interface{}, columns ...string) ICategoryDo { - return c.withDO(c.DO.Returning(value, columns...)) -} - -func (c categoryDo) Not(conds ...gen.Condition) ICategoryDo { - return c.withDO(c.DO.Not(conds...)) -} - -func (c categoryDo) Or(conds ...gen.Condition) ICategoryDo { - return c.withDO(c.DO.Or(conds...)) -} - -func (c categoryDo) Select(conds ...field.Expr) ICategoryDo { - return c.withDO(c.DO.Select(conds...)) -} - -func (c categoryDo) Where(conds ...gen.Condition) ICategoryDo { - return c.withDO(c.DO.Where(conds...)) -} - -func (c categoryDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) ICategoryDo { - return c.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB())) -} - -func (c categoryDo) Order(conds ...field.Expr) ICategoryDo { - return c.withDO(c.DO.Order(conds...)) -} - -func (c categoryDo) Distinct(cols ...field.Expr) ICategoryDo { - return c.withDO(c.DO.Distinct(cols...)) -} - -func (c categoryDo) Omit(cols ...field.Expr) ICategoryDo { - return c.withDO(c.DO.Omit(cols...)) -} - -func (c categoryDo) Join(table schema.Tabler, on ...field.Expr) ICategoryDo { - return c.withDO(c.DO.Join(table, on...)) -} - -func (c categoryDo) LeftJoin(table schema.Tabler, on ...field.Expr) ICategoryDo { - return c.withDO(c.DO.LeftJoin(table, on...)) -} - -func (c categoryDo) RightJoin(table schema.Tabler, on ...field.Expr) ICategoryDo { - return c.withDO(c.DO.RightJoin(table, on...)) -} - -func (c categoryDo) Group(cols ...field.Expr) ICategoryDo { - return c.withDO(c.DO.Group(cols...)) -} - -func (c categoryDo) Having(conds ...gen.Condition) ICategoryDo { - return c.withDO(c.DO.Having(conds...)) -} - -func (c categoryDo) Limit(limit int) ICategoryDo { - return c.withDO(c.DO.Limit(limit)) -} - -func (c categoryDo) Offset(offset int) ICategoryDo { - return c.withDO(c.DO.Offset(offset)) -} - -func (c categoryDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ICategoryDo { - return c.withDO(c.DO.Scopes(funcs...)) -} - -func (c categoryDo) Unscoped() ICategoryDo { - return c.withDO(c.DO.Unscoped()) -} - -func (c categoryDo) Create(values ...*model.Category) error { - if len(values) == 0 { - return nil - } - return c.DO.Create(values) -} - -func (c categoryDo) CreateInBatches(values []*model.Category, batchSize int) error { - return c.DO.CreateInBatches(values, batchSize) -} - -// Save : !!! underlying implementation is different with GORM -// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) -func (c categoryDo) Save(values ...*model.Category) error { - if len(values) == 0 { - return nil - } - return c.DO.Save(values) -} - -func (c categoryDo) First() (*model.Category, error) { - if result, err := c.DO.First(); err != nil { - return nil, err - } else { - return result.(*model.Category), nil - } -} - -func (c categoryDo) Take() (*model.Category, error) { - if result, err := c.DO.Take(); err != nil { - return nil, err - } else { - return result.(*model.Category), nil - } -} - -func (c categoryDo) Last() (*model.Category, error) { - if result, err := c.DO.Last(); err != nil { - return nil, err - } else { - return result.(*model.Category), nil - } -} - -func (c categoryDo) Find() ([]*model.Category, error) { - result, err := c.DO.Find() - return result.([]*model.Category), err -} - -func (c categoryDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Category, err error) { - buf := make([]*model.Category, 0, batchSize) - err = c.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { - defer func() { results = append(results, buf...) }() - return fc(tx, batch) - }) - return results, err -} - -func (c categoryDo) FindInBatches(result *[]*model.Category, batchSize int, fc func(tx gen.Dao, batch int) error) error { - return c.DO.FindInBatches(result, batchSize, fc) -} - -func (c categoryDo) Attrs(attrs ...field.AssignExpr) ICategoryDo { - return c.withDO(c.DO.Attrs(attrs...)) -} - -func (c categoryDo) Assign(attrs ...field.AssignExpr) ICategoryDo { - return c.withDO(c.DO.Assign(attrs...)) -} - -func (c categoryDo) Joins(fields ...field.RelationField) ICategoryDo { - for _, _f := range fields { - c = *c.withDO(c.DO.Joins(_f)) - } - return &c -} - -func (c categoryDo) Preload(fields ...field.RelationField) ICategoryDo { - for _, _f := range fields { - c = *c.withDO(c.DO.Preload(_f)) - } - return &c -} - -func (c categoryDo) FirstOrInit() (*model.Category, error) { - if result, err := c.DO.FirstOrInit(); err != nil { - return nil, err - } else { - return result.(*model.Category), nil - } -} - -func (c categoryDo) FirstOrCreate() (*model.Category, error) { - if result, err := c.DO.FirstOrCreate(); err != nil { - return nil, err - } else { - return result.(*model.Category), nil - } -} - -func (c categoryDo) FindByPage(offset int, limit int) (result []*model.Category, count int64, err error) { - result, err = c.Offset(offset).Limit(limit).Find() - if err != nil { - return - } - - if size := len(result); 0 < limit && 0 < size && size < limit { - count = int64(size + offset) - return - } - - count, err = c.Offset(-1).Limit(-1).Count() - return -} - -func (c categoryDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { - count, err = c.Count() - if err != nil { - return - } - - err = c.Offset(offset).Limit(limit).Scan(result) - return -} - -func (c categoryDo) Scan(result interface{}) (err error) { - return c.DO.Scan(result) -} - -func (c categoryDo) Delete(models ...*model.Category) (result gen.ResultInfo, err error) { - return c.DO.Delete(models) -} - -func (c *categoryDo) withDO(do gen.Dao) *categoryDo { - c.DO = *do.(*gen.DO) - return c -} diff --git a/internal/repository/mysql/query/cron_task.gen.go b/internal/repository/mysql/query/cron_task.gen.go deleted file mode 100644 index 7bf6993..0000000 --- a/internal/repository/mysql/query/cron_task.gen.go +++ /dev/null @@ -1,456 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package query - -import ( - "context" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/schema" - - "gorm.io/gen" - "gorm.io/gen/field" - - "gorm.io/plugin/dbresolver" - - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" -) - -func newCronTask(db *gorm.DB, opts ...gen.DOOption) cronTask { - _cronTask := cronTask{} - - _cronTask.cronTaskDo.UseDB(db, opts...) - _cronTask.cronTaskDo.UseModel(&model.CronTask{}) - - tableName := _cronTask.cronTaskDo.TableName() - _cronTask.ALL = field.NewAsterisk(tableName) - _cronTask.ID = field.NewInt64(tableName, "id") - _cronTask.Name = field.NewString(tableName, "name") - _cronTask.Spec = field.NewString(tableName, "spec") - _cronTask.Command = field.NewString(tableName, "command") - _cronTask.Protocol = field.NewInt64(tableName, "protocol") - _cronTask.HTTPMethod = field.NewInt64(tableName, "http_method") - _cronTask.Timeout = field.NewInt64(tableName, "timeout") - _cronTask.RetryTimes = field.NewInt64(tableName, "retry_times") - _cronTask.RetryInterval = field.NewInt64(tableName, "retry_interval") - _cronTask.NotifyStatus = field.NewInt64(tableName, "notify_status") - _cronTask.NotifyType = field.NewInt64(tableName, "notify_type") - _cronTask.NotifyReceiverEmail = field.NewString(tableName, "notify_receiver_email") - _cronTask.NotifyKeyword = field.NewString(tableName, "notify_keyword") - _cronTask.Remark = field.NewString(tableName, "remark") - _cronTask.IsUsed = field.NewInt64(tableName, "is_used") - _cronTask.CreatedAt = field.NewTime(tableName, "created_at") - _cronTask.CreatedUser = field.NewString(tableName, "created_user") - _cronTask.UpdatedAt = field.NewTime(tableName, "updated_at") - _cronTask.UpdatedUser = field.NewString(tableName, "updated_user") - - _cronTask.fillFieldMap() - - return _cronTask -} - -type cronTask struct { - cronTaskDo - - ALL field.Asterisk - ID field.Int64 // 主键 - Name field.String // 任务名称 - Spec field.String // crontab 表达式 - Command field.String // 执行命令 - Protocol field.Int64 // 执行方式 1:shell 2:http - HTTPMethod field.Int64 // http 请求方式 1:get 2:post - Timeout field.Int64 // 超时时间(单位:秒) - RetryTimes field.Int64 // 重试次数 - RetryInterval field.Int64 // 重试间隔(单位:秒) - NotifyStatus field.Int64 // 执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知 - NotifyType field.Int64 // 通知类型 1:邮件 2:webhook - NotifyReceiverEmail field.String // 通知者邮箱地址(多个用,分割) - NotifyKeyword field.String // 通知匹配关键字(多个用,分割) - Remark field.String // 备注 - IsUsed field.Int64 // 是否启用 1:是 -1:否 - CreatedAt field.Time // 创建时间 - CreatedUser field.String // 创建人 - UpdatedAt field.Time // 更新时间 - UpdatedUser field.String // 更新人 - - fieldMap map[string]field.Expr -} - -func (c cronTask) Table(newTableName string) *cronTask { - c.cronTaskDo.UseTable(newTableName) - return c.updateTableName(newTableName) -} - -func (c cronTask) As(alias string) *cronTask { - c.cronTaskDo.DO = *(c.cronTaskDo.As(alias).(*gen.DO)) - return c.updateTableName(alias) -} - -func (c *cronTask) updateTableName(table string) *cronTask { - c.ALL = field.NewAsterisk(table) - c.ID = field.NewInt64(table, "id") - c.Name = field.NewString(table, "name") - c.Spec = field.NewString(table, "spec") - c.Command = field.NewString(table, "command") - c.Protocol = field.NewInt64(table, "protocol") - c.HTTPMethod = field.NewInt64(table, "http_method") - c.Timeout = field.NewInt64(table, "timeout") - c.RetryTimes = field.NewInt64(table, "retry_times") - c.RetryInterval = field.NewInt64(table, "retry_interval") - c.NotifyStatus = field.NewInt64(table, "notify_status") - c.NotifyType = field.NewInt64(table, "notify_type") - c.NotifyReceiverEmail = field.NewString(table, "notify_receiver_email") - c.NotifyKeyword = field.NewString(table, "notify_keyword") - c.Remark = field.NewString(table, "remark") - c.IsUsed = field.NewInt64(table, "is_used") - c.CreatedAt = field.NewTime(table, "created_at") - c.CreatedUser = field.NewString(table, "created_user") - c.UpdatedAt = field.NewTime(table, "updated_at") - c.UpdatedUser = field.NewString(table, "updated_user") - - c.fillFieldMap() - - return c -} - -func (c *cronTask) GetFieldByName(fieldName string) (field.OrderExpr, bool) { - _f, ok := c.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - _oe, ok := _f.(field.OrderExpr) - return _oe, ok -} - -func (c *cronTask) fillFieldMap() { - c.fieldMap = make(map[string]field.Expr, 19) - c.fieldMap["id"] = c.ID - c.fieldMap["name"] = c.Name - c.fieldMap["spec"] = c.Spec - c.fieldMap["command"] = c.Command - c.fieldMap["protocol"] = c.Protocol - c.fieldMap["http_method"] = c.HTTPMethod - c.fieldMap["timeout"] = c.Timeout - c.fieldMap["retry_times"] = c.RetryTimes - c.fieldMap["retry_interval"] = c.RetryInterval - c.fieldMap["notify_status"] = c.NotifyStatus - c.fieldMap["notify_type"] = c.NotifyType - c.fieldMap["notify_receiver_email"] = c.NotifyReceiverEmail - c.fieldMap["notify_keyword"] = c.NotifyKeyword - c.fieldMap["remark"] = c.Remark - c.fieldMap["is_used"] = c.IsUsed - c.fieldMap["created_at"] = c.CreatedAt - c.fieldMap["created_user"] = c.CreatedUser - c.fieldMap["updated_at"] = c.UpdatedAt - c.fieldMap["updated_user"] = c.UpdatedUser -} - -func (c cronTask) clone(db *gorm.DB) cronTask { - c.cronTaskDo.ReplaceConnPool(db.Statement.ConnPool) - return c -} - -func (c cronTask) replaceDB(db *gorm.DB) cronTask { - c.cronTaskDo.ReplaceDB(db) - return c -} - -type cronTaskDo struct{ gen.DO } - -type ICronTaskDo interface { - gen.SubQuery - Debug() ICronTaskDo - WithContext(ctx context.Context) ICronTaskDo - WithResult(fc func(tx gen.Dao)) gen.ResultInfo - ReplaceDB(db *gorm.DB) - ReadDB() ICronTaskDo - WriteDB() ICronTaskDo - As(alias string) gen.Dao - Session(config *gorm.Session) ICronTaskDo - Columns(cols ...field.Expr) gen.Columns - Clauses(conds ...clause.Expression) ICronTaskDo - Not(conds ...gen.Condition) ICronTaskDo - Or(conds ...gen.Condition) ICronTaskDo - Select(conds ...field.Expr) ICronTaskDo - Where(conds ...gen.Condition) ICronTaskDo - Order(conds ...field.Expr) ICronTaskDo - Distinct(cols ...field.Expr) ICronTaskDo - Omit(cols ...field.Expr) ICronTaskDo - Join(table schema.Tabler, on ...field.Expr) ICronTaskDo - LeftJoin(table schema.Tabler, on ...field.Expr) ICronTaskDo - RightJoin(table schema.Tabler, on ...field.Expr) ICronTaskDo - Group(cols ...field.Expr) ICronTaskDo - Having(conds ...gen.Condition) ICronTaskDo - Limit(limit int) ICronTaskDo - Offset(offset int) ICronTaskDo - Count() (count int64, err error) - Scopes(funcs ...func(gen.Dao) gen.Dao) ICronTaskDo - Unscoped() ICronTaskDo - Create(values ...*model.CronTask) error - CreateInBatches(values []*model.CronTask, batchSize int) error - Save(values ...*model.CronTask) error - First() (*model.CronTask, error) - Take() (*model.CronTask, error) - Last() (*model.CronTask, error) - Find() ([]*model.CronTask, error) - FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.CronTask, err error) - FindInBatches(result *[]*model.CronTask, batchSize int, fc func(tx gen.Dao, batch int) error) error - Pluck(column field.Expr, dest interface{}) error - Delete(...*model.CronTask) (info gen.ResultInfo, err error) - Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - Updates(value interface{}) (info gen.ResultInfo, err error) - UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - UpdateColumns(value interface{}) (info gen.ResultInfo, err error) - UpdateFrom(q gen.SubQuery) gen.Dao - Attrs(attrs ...field.AssignExpr) ICronTaskDo - Assign(attrs ...field.AssignExpr) ICronTaskDo - Joins(fields ...field.RelationField) ICronTaskDo - Preload(fields ...field.RelationField) ICronTaskDo - FirstOrInit() (*model.CronTask, error) - FirstOrCreate() (*model.CronTask, error) - FindByPage(offset int, limit int) (result []*model.CronTask, count int64, err error) - ScanByPage(result interface{}, offset int, limit int) (count int64, err error) - Scan(result interface{}) (err error) - Returning(value interface{}, columns ...string) ICronTaskDo - UnderlyingDB() *gorm.DB - schema.Tabler -} - -func (c cronTaskDo) Debug() ICronTaskDo { - return c.withDO(c.DO.Debug()) -} - -func (c cronTaskDo) WithContext(ctx context.Context) ICronTaskDo { - return c.withDO(c.DO.WithContext(ctx)) -} - -func (c cronTaskDo) ReadDB() ICronTaskDo { - return c.Clauses(dbresolver.Read) -} - -func (c cronTaskDo) WriteDB() ICronTaskDo { - return c.Clauses(dbresolver.Write) -} - -func (c cronTaskDo) Session(config *gorm.Session) ICronTaskDo { - return c.withDO(c.DO.Session(config)) -} - -func (c cronTaskDo) Clauses(conds ...clause.Expression) ICronTaskDo { - return c.withDO(c.DO.Clauses(conds...)) -} - -func (c cronTaskDo) Returning(value interface{}, columns ...string) ICronTaskDo { - return c.withDO(c.DO.Returning(value, columns...)) -} - -func (c cronTaskDo) Not(conds ...gen.Condition) ICronTaskDo { - return c.withDO(c.DO.Not(conds...)) -} - -func (c cronTaskDo) Or(conds ...gen.Condition) ICronTaskDo { - return c.withDO(c.DO.Or(conds...)) -} - -func (c cronTaskDo) Select(conds ...field.Expr) ICronTaskDo { - return c.withDO(c.DO.Select(conds...)) -} - -func (c cronTaskDo) Where(conds ...gen.Condition) ICronTaskDo { - return c.withDO(c.DO.Where(conds...)) -} - -func (c cronTaskDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) ICronTaskDo { - return c.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB())) -} - -func (c cronTaskDo) Order(conds ...field.Expr) ICronTaskDo { - return c.withDO(c.DO.Order(conds...)) -} - -func (c cronTaskDo) Distinct(cols ...field.Expr) ICronTaskDo { - return c.withDO(c.DO.Distinct(cols...)) -} - -func (c cronTaskDo) Omit(cols ...field.Expr) ICronTaskDo { - return c.withDO(c.DO.Omit(cols...)) -} - -func (c cronTaskDo) Join(table schema.Tabler, on ...field.Expr) ICronTaskDo { - return c.withDO(c.DO.Join(table, on...)) -} - -func (c cronTaskDo) LeftJoin(table schema.Tabler, on ...field.Expr) ICronTaskDo { - return c.withDO(c.DO.LeftJoin(table, on...)) -} - -func (c cronTaskDo) RightJoin(table schema.Tabler, on ...field.Expr) ICronTaskDo { - return c.withDO(c.DO.RightJoin(table, on...)) -} - -func (c cronTaskDo) Group(cols ...field.Expr) ICronTaskDo { - return c.withDO(c.DO.Group(cols...)) -} - -func (c cronTaskDo) Having(conds ...gen.Condition) ICronTaskDo { - return c.withDO(c.DO.Having(conds...)) -} - -func (c cronTaskDo) Limit(limit int) ICronTaskDo { - return c.withDO(c.DO.Limit(limit)) -} - -func (c cronTaskDo) Offset(offset int) ICronTaskDo { - return c.withDO(c.DO.Offset(offset)) -} - -func (c cronTaskDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ICronTaskDo { - return c.withDO(c.DO.Scopes(funcs...)) -} - -func (c cronTaskDo) Unscoped() ICronTaskDo { - return c.withDO(c.DO.Unscoped()) -} - -func (c cronTaskDo) Create(values ...*model.CronTask) error { - if len(values) == 0 { - return nil - } - return c.DO.Create(values) -} - -func (c cronTaskDo) CreateInBatches(values []*model.CronTask, batchSize int) error { - return c.DO.CreateInBatches(values, batchSize) -} - -// Save : !!! underlying implementation is different with GORM -// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) -func (c cronTaskDo) Save(values ...*model.CronTask) error { - if len(values) == 0 { - return nil - } - return c.DO.Save(values) -} - -func (c cronTaskDo) First() (*model.CronTask, error) { - if result, err := c.DO.First(); err != nil { - return nil, err - } else { - return result.(*model.CronTask), nil - } -} - -func (c cronTaskDo) Take() (*model.CronTask, error) { - if result, err := c.DO.Take(); err != nil { - return nil, err - } else { - return result.(*model.CronTask), nil - } -} - -func (c cronTaskDo) Last() (*model.CronTask, error) { - if result, err := c.DO.Last(); err != nil { - return nil, err - } else { - return result.(*model.CronTask), nil - } -} - -func (c cronTaskDo) Find() ([]*model.CronTask, error) { - result, err := c.DO.Find() - return result.([]*model.CronTask), err -} - -func (c cronTaskDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.CronTask, err error) { - buf := make([]*model.CronTask, 0, batchSize) - err = c.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { - defer func() { results = append(results, buf...) }() - return fc(tx, batch) - }) - return results, err -} - -func (c cronTaskDo) FindInBatches(result *[]*model.CronTask, batchSize int, fc func(tx gen.Dao, batch int) error) error { - return c.DO.FindInBatches(result, batchSize, fc) -} - -func (c cronTaskDo) Attrs(attrs ...field.AssignExpr) ICronTaskDo { - return c.withDO(c.DO.Attrs(attrs...)) -} - -func (c cronTaskDo) Assign(attrs ...field.AssignExpr) ICronTaskDo { - return c.withDO(c.DO.Assign(attrs...)) -} - -func (c cronTaskDo) Joins(fields ...field.RelationField) ICronTaskDo { - for _, _f := range fields { - c = *c.withDO(c.DO.Joins(_f)) - } - return &c -} - -func (c cronTaskDo) Preload(fields ...field.RelationField) ICronTaskDo { - for _, _f := range fields { - c = *c.withDO(c.DO.Preload(_f)) - } - return &c -} - -func (c cronTaskDo) FirstOrInit() (*model.CronTask, error) { - if result, err := c.DO.FirstOrInit(); err != nil { - return nil, err - } else { - return result.(*model.CronTask), nil - } -} - -func (c cronTaskDo) FirstOrCreate() (*model.CronTask, error) { - if result, err := c.DO.FirstOrCreate(); err != nil { - return nil, err - } else { - return result.(*model.CronTask), nil - } -} - -func (c cronTaskDo) FindByPage(offset int, limit int) (result []*model.CronTask, count int64, err error) { - result, err = c.Offset(offset).Limit(limit).Find() - if err != nil { - return - } - - if size := len(result); 0 < limit && 0 < size && size < limit { - count = int64(size + offset) - return - } - - count, err = c.Offset(-1).Limit(-1).Count() - return -} - -func (c cronTaskDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { - count, err = c.Count() - if err != nil { - return - } - - err = c.Offset(offset).Limit(limit).Scan(result) - return -} - -func (c cronTaskDo) Scan(result interface{}) (err error) { - return c.DO.Scan(result) -} - -func (c cronTaskDo) Delete(models ...*model.CronTask) (result gen.ResultInfo, err error) { - return c.DO.Delete(models) -} - -func (c *cronTaskDo) withDO(do gen.Dao) *cronTaskDo { - c.DO = *do.(*gen.DO) - return c -} diff --git a/internal/repository/mysql/query/gen.go b/internal/repository/mysql/query/gen.go deleted file mode 100644 index ed65254..0000000 --- a/internal/repository/mysql/query/gen.go +++ /dev/null @@ -1,167 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package query - -import ( - "context" - "database/sql" - - "gorm.io/gorm" - - "gorm.io/gen" - - "gorm.io/plugin/dbresolver" -) - -var ( - Q = new(Query) - Admin *admin - AdminMenu *adminMenu - Authorized *authorized - AuthorizedAPI *authorizedAPI - Category *category - CronTask *cronTask - Menu *menu - MenuAction *menuAction - Site *site -) - -func SetDefault(db *gorm.DB, opts ...gen.DOOption) { - *Q = *Use(db, opts...) - Admin = &Q.Admin - AdminMenu = &Q.AdminMenu - Authorized = &Q.Authorized - AuthorizedAPI = &Q.AuthorizedAPI - Category = &Q.Category - CronTask = &Q.CronTask - Menu = &Q.Menu - MenuAction = &Q.MenuAction - Site = &Q.Site -} - -func Use(db *gorm.DB, opts ...gen.DOOption) *Query { - return &Query{ - db: db, - Admin: newAdmin(db, opts...), - AdminMenu: newAdminMenu(db, opts...), - Authorized: newAuthorized(db, opts...), - AuthorizedAPI: newAuthorizedAPI(db, opts...), - Category: newCategory(db, opts...), - CronTask: newCronTask(db, opts...), - Menu: newMenu(db, opts...), - MenuAction: newMenuAction(db, opts...), - Site: newSite(db, opts...), - } -} - -type Query struct { - db *gorm.DB - - Admin admin - AdminMenu adminMenu - Authorized authorized - AuthorizedAPI authorizedAPI - Category category - CronTask cronTask - Menu menu - MenuAction menuAction - Site site -} - -func (q *Query) Available() bool { return q.db != nil } - -func (q *Query) clone(db *gorm.DB) *Query { - return &Query{ - db: db, - Admin: q.Admin.clone(db), - AdminMenu: q.AdminMenu.clone(db), - Authorized: q.Authorized.clone(db), - AuthorizedAPI: q.AuthorizedAPI.clone(db), - Category: q.Category.clone(db), - CronTask: q.CronTask.clone(db), - Menu: q.Menu.clone(db), - MenuAction: q.MenuAction.clone(db), - Site: q.Site.clone(db), - } -} - -func (q *Query) ReadDB() *Query { - return q.ReplaceDB(q.db.Clauses(dbresolver.Read)) -} - -func (q *Query) WriteDB() *Query { - return q.ReplaceDB(q.db.Clauses(dbresolver.Write)) -} - -func (q *Query) ReplaceDB(db *gorm.DB) *Query { - return &Query{ - db: db, - Admin: q.Admin.replaceDB(db), - AdminMenu: q.AdminMenu.replaceDB(db), - Authorized: q.Authorized.replaceDB(db), - AuthorizedAPI: q.AuthorizedAPI.replaceDB(db), - Category: q.Category.replaceDB(db), - CronTask: q.CronTask.replaceDB(db), - Menu: q.Menu.replaceDB(db), - MenuAction: q.MenuAction.replaceDB(db), - Site: q.Site.replaceDB(db), - } -} - -type queryCtx struct { - Admin IAdminDo - AdminMenu IAdminMenuDo - Authorized IAuthorizedDo - AuthorizedAPI IAuthorizedAPIDo - Category ICategoryDo - CronTask ICronTaskDo - Menu IMenuDo - MenuAction IMenuActionDo - Site ISiteDo -} - -func (q *Query) WithContext(ctx context.Context) *queryCtx { - return &queryCtx{ - Admin: q.Admin.WithContext(ctx), - AdminMenu: q.AdminMenu.WithContext(ctx), - Authorized: q.Authorized.WithContext(ctx), - AuthorizedAPI: q.AuthorizedAPI.WithContext(ctx), - Category: q.Category.WithContext(ctx), - CronTask: q.CronTask.WithContext(ctx), - Menu: q.Menu.WithContext(ctx), - MenuAction: q.MenuAction.WithContext(ctx), - Site: q.Site.WithContext(ctx), - } -} - -func (q *Query) Transaction(fc func(tx *Query) error, opts ...*sql.TxOptions) error { - return q.db.Transaction(func(tx *gorm.DB) error { return fc(q.clone(tx)) }, opts...) -} - -func (q *Query) Begin(opts ...*sql.TxOptions) *QueryTx { - tx := q.db.Begin(opts...) - return &QueryTx{Query: q.clone(tx), Error: tx.Error} -} - -type QueryTx struct { - *Query - Error error -} - -func (q *QueryTx) Commit() error { - return q.db.Commit().Error -} - -func (q *QueryTx) Rollback() error { - return q.db.Rollback().Error -} - -func (q *QueryTx) SavePoint(name string) error { - return q.db.SavePoint(name).Error -} - -func (q *QueryTx) RollbackTo(name string) error { - return q.db.RollbackTo(name).Error -} diff --git a/internal/repository/mysql/query/menu.gen.go b/internal/repository/mysql/query/menu.gen.go deleted file mode 100644 index bc90b31..0000000 --- a/internal/repository/mysql/query/menu.gen.go +++ /dev/null @@ -1,432 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package query - -import ( - "context" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/schema" - - "gorm.io/gen" - "gorm.io/gen/field" - - "gorm.io/plugin/dbresolver" - - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" -) - -func newMenu(db *gorm.DB, opts ...gen.DOOption) menu { - _menu := menu{} - - _menu.menuDo.UseDB(db, opts...) - _menu.menuDo.UseModel(&model.Menu{}) - - tableName := _menu.menuDo.TableName() - _menu.ALL = field.NewAsterisk(tableName) - _menu.ID = field.NewInt64(tableName, "id") - _menu.Pid = field.NewInt64(tableName, "pid") - _menu.Name = field.NewString(tableName, "name") - _menu.Link = field.NewString(tableName, "link") - _menu.Icon = field.NewString(tableName, "icon") - _menu.Level = field.NewInt64(tableName, "level") - _menu.Sort = field.NewInt64(tableName, "sort") - _menu.IsUsed = field.NewInt64(tableName, "is_used") - _menu.IsDeleted = field.NewInt64(tableName, "is_deleted") - _menu.CreatedAt = field.NewTime(tableName, "created_at") - _menu.CreatedUser = field.NewString(tableName, "created_user") - _menu.UpdatedAt = field.NewTime(tableName, "updated_at") - _menu.UpdatedUser = field.NewString(tableName, "updated_user") - - _menu.fillFieldMap() - - return _menu -} - -type menu struct { - menuDo - - ALL field.Asterisk - ID field.Int64 // 主键 - Pid field.Int64 // 父类ID - Name field.String // 菜单名称 - Link field.String // 链接地址 - Icon field.String // 图标 - Level field.Int64 // 菜单类型 1:一级菜单 2:二级菜单 - Sort field.Int64 // 排序 - IsUsed field.Int64 // 是否启用 1:是 -1:否 - IsDeleted field.Int64 // 是否删除 1:是 -1:否 - CreatedAt field.Time // 创建时间 - CreatedUser field.String // 创建人 - UpdatedAt field.Time // 更新时间 - UpdatedUser field.String // 更新人 - - fieldMap map[string]field.Expr -} - -func (m menu) Table(newTableName string) *menu { - m.menuDo.UseTable(newTableName) - return m.updateTableName(newTableName) -} - -func (m menu) As(alias string) *menu { - m.menuDo.DO = *(m.menuDo.As(alias).(*gen.DO)) - return m.updateTableName(alias) -} - -func (m *menu) updateTableName(table string) *menu { - m.ALL = field.NewAsterisk(table) - m.ID = field.NewInt64(table, "id") - m.Pid = field.NewInt64(table, "pid") - m.Name = field.NewString(table, "name") - m.Link = field.NewString(table, "link") - m.Icon = field.NewString(table, "icon") - m.Level = field.NewInt64(table, "level") - m.Sort = field.NewInt64(table, "sort") - m.IsUsed = field.NewInt64(table, "is_used") - m.IsDeleted = field.NewInt64(table, "is_deleted") - m.CreatedAt = field.NewTime(table, "created_at") - m.CreatedUser = field.NewString(table, "created_user") - m.UpdatedAt = field.NewTime(table, "updated_at") - m.UpdatedUser = field.NewString(table, "updated_user") - - m.fillFieldMap() - - return m -} - -func (m *menu) GetFieldByName(fieldName string) (field.OrderExpr, bool) { - _f, ok := m.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - _oe, ok := _f.(field.OrderExpr) - return _oe, ok -} - -func (m *menu) fillFieldMap() { - m.fieldMap = make(map[string]field.Expr, 13) - m.fieldMap["id"] = m.ID - m.fieldMap["pid"] = m.Pid - m.fieldMap["name"] = m.Name - m.fieldMap["link"] = m.Link - m.fieldMap["icon"] = m.Icon - m.fieldMap["level"] = m.Level - m.fieldMap["sort"] = m.Sort - m.fieldMap["is_used"] = m.IsUsed - m.fieldMap["is_deleted"] = m.IsDeleted - m.fieldMap["created_at"] = m.CreatedAt - m.fieldMap["created_user"] = m.CreatedUser - m.fieldMap["updated_at"] = m.UpdatedAt - m.fieldMap["updated_user"] = m.UpdatedUser -} - -func (m menu) clone(db *gorm.DB) menu { - m.menuDo.ReplaceConnPool(db.Statement.ConnPool) - return m -} - -func (m menu) replaceDB(db *gorm.DB) menu { - m.menuDo.ReplaceDB(db) - return m -} - -type menuDo struct{ gen.DO } - -type IMenuDo interface { - gen.SubQuery - Debug() IMenuDo - WithContext(ctx context.Context) IMenuDo - WithResult(fc func(tx gen.Dao)) gen.ResultInfo - ReplaceDB(db *gorm.DB) - ReadDB() IMenuDo - WriteDB() IMenuDo - As(alias string) gen.Dao - Session(config *gorm.Session) IMenuDo - Columns(cols ...field.Expr) gen.Columns - Clauses(conds ...clause.Expression) IMenuDo - Not(conds ...gen.Condition) IMenuDo - Or(conds ...gen.Condition) IMenuDo - Select(conds ...field.Expr) IMenuDo - Where(conds ...gen.Condition) IMenuDo - Order(conds ...field.Expr) IMenuDo - Distinct(cols ...field.Expr) IMenuDo - Omit(cols ...field.Expr) IMenuDo - Join(table schema.Tabler, on ...field.Expr) IMenuDo - LeftJoin(table schema.Tabler, on ...field.Expr) IMenuDo - RightJoin(table schema.Tabler, on ...field.Expr) IMenuDo - Group(cols ...field.Expr) IMenuDo - Having(conds ...gen.Condition) IMenuDo - Limit(limit int) IMenuDo - Offset(offset int) IMenuDo - Count() (count int64, err error) - Scopes(funcs ...func(gen.Dao) gen.Dao) IMenuDo - Unscoped() IMenuDo - Create(values ...*model.Menu) error - CreateInBatches(values []*model.Menu, batchSize int) error - Save(values ...*model.Menu) error - First() (*model.Menu, error) - Take() (*model.Menu, error) - Last() (*model.Menu, error) - Find() ([]*model.Menu, error) - FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Menu, err error) - FindInBatches(result *[]*model.Menu, batchSize int, fc func(tx gen.Dao, batch int) error) error - Pluck(column field.Expr, dest interface{}) error - Delete(...*model.Menu) (info gen.ResultInfo, err error) - Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - Updates(value interface{}) (info gen.ResultInfo, err error) - UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - UpdateColumns(value interface{}) (info gen.ResultInfo, err error) - UpdateFrom(q gen.SubQuery) gen.Dao - Attrs(attrs ...field.AssignExpr) IMenuDo - Assign(attrs ...field.AssignExpr) IMenuDo - Joins(fields ...field.RelationField) IMenuDo - Preload(fields ...field.RelationField) IMenuDo - FirstOrInit() (*model.Menu, error) - FirstOrCreate() (*model.Menu, error) - FindByPage(offset int, limit int) (result []*model.Menu, count int64, err error) - ScanByPage(result interface{}, offset int, limit int) (count int64, err error) - Scan(result interface{}) (err error) - Returning(value interface{}, columns ...string) IMenuDo - UnderlyingDB() *gorm.DB - schema.Tabler -} - -func (m menuDo) Debug() IMenuDo { - return m.withDO(m.DO.Debug()) -} - -func (m menuDo) WithContext(ctx context.Context) IMenuDo { - return m.withDO(m.DO.WithContext(ctx)) -} - -func (m menuDo) ReadDB() IMenuDo { - return m.Clauses(dbresolver.Read) -} - -func (m menuDo) WriteDB() IMenuDo { - return m.Clauses(dbresolver.Write) -} - -func (m menuDo) Session(config *gorm.Session) IMenuDo { - return m.withDO(m.DO.Session(config)) -} - -func (m menuDo) Clauses(conds ...clause.Expression) IMenuDo { - return m.withDO(m.DO.Clauses(conds...)) -} - -func (m menuDo) Returning(value interface{}, columns ...string) IMenuDo { - return m.withDO(m.DO.Returning(value, columns...)) -} - -func (m menuDo) Not(conds ...gen.Condition) IMenuDo { - return m.withDO(m.DO.Not(conds...)) -} - -func (m menuDo) Or(conds ...gen.Condition) IMenuDo { - return m.withDO(m.DO.Or(conds...)) -} - -func (m menuDo) Select(conds ...field.Expr) IMenuDo { - return m.withDO(m.DO.Select(conds...)) -} - -func (m menuDo) Where(conds ...gen.Condition) IMenuDo { - return m.withDO(m.DO.Where(conds...)) -} - -func (m menuDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) IMenuDo { - return m.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB())) -} - -func (m menuDo) Order(conds ...field.Expr) IMenuDo { - return m.withDO(m.DO.Order(conds...)) -} - -func (m menuDo) Distinct(cols ...field.Expr) IMenuDo { - return m.withDO(m.DO.Distinct(cols...)) -} - -func (m menuDo) Omit(cols ...field.Expr) IMenuDo { - return m.withDO(m.DO.Omit(cols...)) -} - -func (m menuDo) Join(table schema.Tabler, on ...field.Expr) IMenuDo { - return m.withDO(m.DO.Join(table, on...)) -} - -func (m menuDo) LeftJoin(table schema.Tabler, on ...field.Expr) IMenuDo { - return m.withDO(m.DO.LeftJoin(table, on...)) -} - -func (m menuDo) RightJoin(table schema.Tabler, on ...field.Expr) IMenuDo { - return m.withDO(m.DO.RightJoin(table, on...)) -} - -func (m menuDo) Group(cols ...field.Expr) IMenuDo { - return m.withDO(m.DO.Group(cols...)) -} - -func (m menuDo) Having(conds ...gen.Condition) IMenuDo { - return m.withDO(m.DO.Having(conds...)) -} - -func (m menuDo) Limit(limit int) IMenuDo { - return m.withDO(m.DO.Limit(limit)) -} - -func (m menuDo) Offset(offset int) IMenuDo { - return m.withDO(m.DO.Offset(offset)) -} - -func (m menuDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IMenuDo { - return m.withDO(m.DO.Scopes(funcs...)) -} - -func (m menuDo) Unscoped() IMenuDo { - return m.withDO(m.DO.Unscoped()) -} - -func (m menuDo) Create(values ...*model.Menu) error { - if len(values) == 0 { - return nil - } - return m.DO.Create(values) -} - -func (m menuDo) CreateInBatches(values []*model.Menu, batchSize int) error { - return m.DO.CreateInBatches(values, batchSize) -} - -// Save : !!! underlying implementation is different with GORM -// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) -func (m menuDo) Save(values ...*model.Menu) error { - if len(values) == 0 { - return nil - } - return m.DO.Save(values) -} - -func (m menuDo) First() (*model.Menu, error) { - if result, err := m.DO.First(); err != nil { - return nil, err - } else { - return result.(*model.Menu), nil - } -} - -func (m menuDo) Take() (*model.Menu, error) { - if result, err := m.DO.Take(); err != nil { - return nil, err - } else { - return result.(*model.Menu), nil - } -} - -func (m menuDo) Last() (*model.Menu, error) { - if result, err := m.DO.Last(); err != nil { - return nil, err - } else { - return result.(*model.Menu), nil - } -} - -func (m menuDo) Find() ([]*model.Menu, error) { - result, err := m.DO.Find() - return result.([]*model.Menu), err -} - -func (m menuDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Menu, err error) { - buf := make([]*model.Menu, 0, batchSize) - err = m.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { - defer func() { results = append(results, buf...) }() - return fc(tx, batch) - }) - return results, err -} - -func (m menuDo) FindInBatches(result *[]*model.Menu, batchSize int, fc func(tx gen.Dao, batch int) error) error { - return m.DO.FindInBatches(result, batchSize, fc) -} - -func (m menuDo) Attrs(attrs ...field.AssignExpr) IMenuDo { - return m.withDO(m.DO.Attrs(attrs...)) -} - -func (m menuDo) Assign(attrs ...field.AssignExpr) IMenuDo { - return m.withDO(m.DO.Assign(attrs...)) -} - -func (m menuDo) Joins(fields ...field.RelationField) IMenuDo { - for _, _f := range fields { - m = *m.withDO(m.DO.Joins(_f)) - } - return &m -} - -func (m menuDo) Preload(fields ...field.RelationField) IMenuDo { - for _, _f := range fields { - m = *m.withDO(m.DO.Preload(_f)) - } - return &m -} - -func (m menuDo) FirstOrInit() (*model.Menu, error) { - if result, err := m.DO.FirstOrInit(); err != nil { - return nil, err - } else { - return result.(*model.Menu), nil - } -} - -func (m menuDo) FirstOrCreate() (*model.Menu, error) { - if result, err := m.DO.FirstOrCreate(); err != nil { - return nil, err - } else { - return result.(*model.Menu), nil - } -} - -func (m menuDo) FindByPage(offset int, limit int) (result []*model.Menu, count int64, err error) { - result, err = m.Offset(offset).Limit(limit).Find() - if err != nil { - return - } - - if size := len(result); 0 < limit && 0 < size && size < limit { - count = int64(size + offset) - return - } - - count, err = m.Offset(-1).Limit(-1).Count() - return -} - -func (m menuDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { - count, err = m.Count() - if err != nil { - return - } - - err = m.Offset(offset).Limit(limit).Scan(result) - return -} - -func (m menuDo) Scan(result interface{}) (err error) { - return m.DO.Scan(result) -} - -func (m menuDo) Delete(models ...*model.Menu) (result gen.ResultInfo, err error) { - return m.DO.Delete(models) -} - -func (m *menuDo) withDO(do gen.Dao) *menuDo { - m.DO = *do.(*gen.DO) - return m -} diff --git a/internal/repository/mysql/query/menu_action.gen.go b/internal/repository/mysql/query/menu_action.gen.go deleted file mode 100644 index 78627f4..0000000 --- a/internal/repository/mysql/query/menu_action.gen.go +++ /dev/null @@ -1,416 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package query - -import ( - "context" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/schema" - - "gorm.io/gen" - "gorm.io/gen/field" - - "gorm.io/plugin/dbresolver" - - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" -) - -func newMenuAction(db *gorm.DB, opts ...gen.DOOption) menuAction { - _menuAction := menuAction{} - - _menuAction.menuActionDo.UseDB(db, opts...) - _menuAction.menuActionDo.UseModel(&model.MenuAction{}) - - tableName := _menuAction.menuActionDo.TableName() - _menuAction.ALL = field.NewAsterisk(tableName) - _menuAction.ID = field.NewInt64(tableName, "id") - _menuAction.MenuID = field.NewInt64(tableName, "menu_id") - _menuAction.Method = field.NewString(tableName, "method") - _menuAction.API = field.NewString(tableName, "api") - _menuAction.IsDeleted = field.NewInt64(tableName, "is_deleted") - _menuAction.CreatedAt = field.NewTime(tableName, "created_at") - _menuAction.CreatedUser = field.NewString(tableName, "created_user") - _menuAction.UpdatedAt = field.NewTime(tableName, "updated_at") - _menuAction.UpdatedUser = field.NewString(tableName, "updated_user") - - _menuAction.fillFieldMap() - - return _menuAction -} - -type menuAction struct { - menuActionDo - - ALL field.Asterisk - ID field.Int64 // 主键 - MenuID field.Int64 // 菜单栏ID - Method field.String // 请求方式 - API field.String // 请求地址 - IsDeleted field.Int64 // 是否删除 1:是 -1:否 - CreatedAt field.Time // 创建时间 - CreatedUser field.String // 创建人 - UpdatedAt field.Time // 更新时间 - UpdatedUser field.String // 更新人 - - fieldMap map[string]field.Expr -} - -func (m menuAction) Table(newTableName string) *menuAction { - m.menuActionDo.UseTable(newTableName) - return m.updateTableName(newTableName) -} - -func (m menuAction) As(alias string) *menuAction { - m.menuActionDo.DO = *(m.menuActionDo.As(alias).(*gen.DO)) - return m.updateTableName(alias) -} - -func (m *menuAction) updateTableName(table string) *menuAction { - m.ALL = field.NewAsterisk(table) - m.ID = field.NewInt64(table, "id") - m.MenuID = field.NewInt64(table, "menu_id") - m.Method = field.NewString(table, "method") - m.API = field.NewString(table, "api") - m.IsDeleted = field.NewInt64(table, "is_deleted") - m.CreatedAt = field.NewTime(table, "created_at") - m.CreatedUser = field.NewString(table, "created_user") - m.UpdatedAt = field.NewTime(table, "updated_at") - m.UpdatedUser = field.NewString(table, "updated_user") - - m.fillFieldMap() - - return m -} - -func (m *menuAction) GetFieldByName(fieldName string) (field.OrderExpr, bool) { - _f, ok := m.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - _oe, ok := _f.(field.OrderExpr) - return _oe, ok -} - -func (m *menuAction) fillFieldMap() { - m.fieldMap = make(map[string]field.Expr, 9) - m.fieldMap["id"] = m.ID - m.fieldMap["menu_id"] = m.MenuID - m.fieldMap["method"] = m.Method - m.fieldMap["api"] = m.API - m.fieldMap["is_deleted"] = m.IsDeleted - m.fieldMap["created_at"] = m.CreatedAt - m.fieldMap["created_user"] = m.CreatedUser - m.fieldMap["updated_at"] = m.UpdatedAt - m.fieldMap["updated_user"] = m.UpdatedUser -} - -func (m menuAction) clone(db *gorm.DB) menuAction { - m.menuActionDo.ReplaceConnPool(db.Statement.ConnPool) - return m -} - -func (m menuAction) replaceDB(db *gorm.DB) menuAction { - m.menuActionDo.ReplaceDB(db) - return m -} - -type menuActionDo struct{ gen.DO } - -type IMenuActionDo interface { - gen.SubQuery - Debug() IMenuActionDo - WithContext(ctx context.Context) IMenuActionDo - WithResult(fc func(tx gen.Dao)) gen.ResultInfo - ReplaceDB(db *gorm.DB) - ReadDB() IMenuActionDo - WriteDB() IMenuActionDo - As(alias string) gen.Dao - Session(config *gorm.Session) IMenuActionDo - Columns(cols ...field.Expr) gen.Columns - Clauses(conds ...clause.Expression) IMenuActionDo - Not(conds ...gen.Condition) IMenuActionDo - Or(conds ...gen.Condition) IMenuActionDo - Select(conds ...field.Expr) IMenuActionDo - Where(conds ...gen.Condition) IMenuActionDo - Order(conds ...field.Expr) IMenuActionDo - Distinct(cols ...field.Expr) IMenuActionDo - Omit(cols ...field.Expr) IMenuActionDo - Join(table schema.Tabler, on ...field.Expr) IMenuActionDo - LeftJoin(table schema.Tabler, on ...field.Expr) IMenuActionDo - RightJoin(table schema.Tabler, on ...field.Expr) IMenuActionDo - Group(cols ...field.Expr) IMenuActionDo - Having(conds ...gen.Condition) IMenuActionDo - Limit(limit int) IMenuActionDo - Offset(offset int) IMenuActionDo - Count() (count int64, err error) - Scopes(funcs ...func(gen.Dao) gen.Dao) IMenuActionDo - Unscoped() IMenuActionDo - Create(values ...*model.MenuAction) error - CreateInBatches(values []*model.MenuAction, batchSize int) error - Save(values ...*model.MenuAction) error - First() (*model.MenuAction, error) - Take() (*model.MenuAction, error) - Last() (*model.MenuAction, error) - Find() ([]*model.MenuAction, error) - FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.MenuAction, err error) - FindInBatches(result *[]*model.MenuAction, batchSize int, fc func(tx gen.Dao, batch int) error) error - Pluck(column field.Expr, dest interface{}) error - Delete(...*model.MenuAction) (info gen.ResultInfo, err error) - Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - Updates(value interface{}) (info gen.ResultInfo, err error) - UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - UpdateColumns(value interface{}) (info gen.ResultInfo, err error) - UpdateFrom(q gen.SubQuery) gen.Dao - Attrs(attrs ...field.AssignExpr) IMenuActionDo - Assign(attrs ...field.AssignExpr) IMenuActionDo - Joins(fields ...field.RelationField) IMenuActionDo - Preload(fields ...field.RelationField) IMenuActionDo - FirstOrInit() (*model.MenuAction, error) - FirstOrCreate() (*model.MenuAction, error) - FindByPage(offset int, limit int) (result []*model.MenuAction, count int64, err error) - ScanByPage(result interface{}, offset int, limit int) (count int64, err error) - Scan(result interface{}) (err error) - Returning(value interface{}, columns ...string) IMenuActionDo - UnderlyingDB() *gorm.DB - schema.Tabler -} - -func (m menuActionDo) Debug() IMenuActionDo { - return m.withDO(m.DO.Debug()) -} - -func (m menuActionDo) WithContext(ctx context.Context) IMenuActionDo { - return m.withDO(m.DO.WithContext(ctx)) -} - -func (m menuActionDo) ReadDB() IMenuActionDo { - return m.Clauses(dbresolver.Read) -} - -func (m menuActionDo) WriteDB() IMenuActionDo { - return m.Clauses(dbresolver.Write) -} - -func (m menuActionDo) Session(config *gorm.Session) IMenuActionDo { - return m.withDO(m.DO.Session(config)) -} - -func (m menuActionDo) Clauses(conds ...clause.Expression) IMenuActionDo { - return m.withDO(m.DO.Clauses(conds...)) -} - -func (m menuActionDo) Returning(value interface{}, columns ...string) IMenuActionDo { - return m.withDO(m.DO.Returning(value, columns...)) -} - -func (m menuActionDo) Not(conds ...gen.Condition) IMenuActionDo { - return m.withDO(m.DO.Not(conds...)) -} - -func (m menuActionDo) Or(conds ...gen.Condition) IMenuActionDo { - return m.withDO(m.DO.Or(conds...)) -} - -func (m menuActionDo) Select(conds ...field.Expr) IMenuActionDo { - return m.withDO(m.DO.Select(conds...)) -} - -func (m menuActionDo) Where(conds ...gen.Condition) IMenuActionDo { - return m.withDO(m.DO.Where(conds...)) -} - -func (m menuActionDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) IMenuActionDo { - return m.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB())) -} - -func (m menuActionDo) Order(conds ...field.Expr) IMenuActionDo { - return m.withDO(m.DO.Order(conds...)) -} - -func (m menuActionDo) Distinct(cols ...field.Expr) IMenuActionDo { - return m.withDO(m.DO.Distinct(cols...)) -} - -func (m menuActionDo) Omit(cols ...field.Expr) IMenuActionDo { - return m.withDO(m.DO.Omit(cols...)) -} - -func (m menuActionDo) Join(table schema.Tabler, on ...field.Expr) IMenuActionDo { - return m.withDO(m.DO.Join(table, on...)) -} - -func (m menuActionDo) LeftJoin(table schema.Tabler, on ...field.Expr) IMenuActionDo { - return m.withDO(m.DO.LeftJoin(table, on...)) -} - -func (m menuActionDo) RightJoin(table schema.Tabler, on ...field.Expr) IMenuActionDo { - return m.withDO(m.DO.RightJoin(table, on...)) -} - -func (m menuActionDo) Group(cols ...field.Expr) IMenuActionDo { - return m.withDO(m.DO.Group(cols...)) -} - -func (m menuActionDo) Having(conds ...gen.Condition) IMenuActionDo { - return m.withDO(m.DO.Having(conds...)) -} - -func (m menuActionDo) Limit(limit int) IMenuActionDo { - return m.withDO(m.DO.Limit(limit)) -} - -func (m menuActionDo) Offset(offset int) IMenuActionDo { - return m.withDO(m.DO.Offset(offset)) -} - -func (m menuActionDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IMenuActionDo { - return m.withDO(m.DO.Scopes(funcs...)) -} - -func (m menuActionDo) Unscoped() IMenuActionDo { - return m.withDO(m.DO.Unscoped()) -} - -func (m menuActionDo) Create(values ...*model.MenuAction) error { - if len(values) == 0 { - return nil - } - return m.DO.Create(values) -} - -func (m menuActionDo) CreateInBatches(values []*model.MenuAction, batchSize int) error { - return m.DO.CreateInBatches(values, batchSize) -} - -// Save : !!! underlying implementation is different with GORM -// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) -func (m menuActionDo) Save(values ...*model.MenuAction) error { - if len(values) == 0 { - return nil - } - return m.DO.Save(values) -} - -func (m menuActionDo) First() (*model.MenuAction, error) { - if result, err := m.DO.First(); err != nil { - return nil, err - } else { - return result.(*model.MenuAction), nil - } -} - -func (m menuActionDo) Take() (*model.MenuAction, error) { - if result, err := m.DO.Take(); err != nil { - return nil, err - } else { - return result.(*model.MenuAction), nil - } -} - -func (m menuActionDo) Last() (*model.MenuAction, error) { - if result, err := m.DO.Last(); err != nil { - return nil, err - } else { - return result.(*model.MenuAction), nil - } -} - -func (m menuActionDo) Find() ([]*model.MenuAction, error) { - result, err := m.DO.Find() - return result.([]*model.MenuAction), err -} - -func (m menuActionDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.MenuAction, err error) { - buf := make([]*model.MenuAction, 0, batchSize) - err = m.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { - defer func() { results = append(results, buf...) }() - return fc(tx, batch) - }) - return results, err -} - -func (m menuActionDo) FindInBatches(result *[]*model.MenuAction, batchSize int, fc func(tx gen.Dao, batch int) error) error { - return m.DO.FindInBatches(result, batchSize, fc) -} - -func (m menuActionDo) Attrs(attrs ...field.AssignExpr) IMenuActionDo { - return m.withDO(m.DO.Attrs(attrs...)) -} - -func (m menuActionDo) Assign(attrs ...field.AssignExpr) IMenuActionDo { - return m.withDO(m.DO.Assign(attrs...)) -} - -func (m menuActionDo) Joins(fields ...field.RelationField) IMenuActionDo { - for _, _f := range fields { - m = *m.withDO(m.DO.Joins(_f)) - } - return &m -} - -func (m menuActionDo) Preload(fields ...field.RelationField) IMenuActionDo { - for _, _f := range fields { - m = *m.withDO(m.DO.Preload(_f)) - } - return &m -} - -func (m menuActionDo) FirstOrInit() (*model.MenuAction, error) { - if result, err := m.DO.FirstOrInit(); err != nil { - return nil, err - } else { - return result.(*model.MenuAction), nil - } -} - -func (m menuActionDo) FirstOrCreate() (*model.MenuAction, error) { - if result, err := m.DO.FirstOrCreate(); err != nil { - return nil, err - } else { - return result.(*model.MenuAction), nil - } -} - -func (m menuActionDo) FindByPage(offset int, limit int) (result []*model.MenuAction, count int64, err error) { - result, err = m.Offset(offset).Limit(limit).Find() - if err != nil { - return - } - - if size := len(result); 0 < limit && 0 < size && size < limit { - count = int64(size + offset) - return - } - - count, err = m.Offset(-1).Limit(-1).Count() - return -} - -func (m menuActionDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { - count, err = m.Count() - if err != nil { - return - } - - err = m.Offset(offset).Limit(limit).Scan(result) - return -} - -func (m menuActionDo) Scan(result interface{}) (err error) { - return m.DO.Scan(result) -} - -func (m menuActionDo) Delete(models ...*model.MenuAction) (result gen.ResultInfo, err error) { - return m.DO.Delete(models) -} - -func (m *menuActionDo) withDO(do gen.Dao) *menuActionDo { - m.DO = *do.(*gen.DO) - return m -} diff --git a/internal/repository/mysql/query/site.gen.go b/internal/repository/mysql/query/site.gen.go deleted file mode 100644 index 25dc234..0000000 --- a/internal/repository/mysql/query/site.gen.go +++ /dev/null @@ -1,494 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package query - -import ( - "context" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/schema" - - "gorm.io/gen" - "gorm.io/gen/field" - - "gorm.io/plugin/dbresolver" - - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" -) - -func newSite(db *gorm.DB, opts ...gen.DOOption) site { - _site := site{} - - _site.siteDo.UseDB(db, opts...) - _site.siteDo.UseModel(&model.Site{}) - - tableName := _site.siteDo.TableName() - _site.ALL = field.NewAsterisk(tableName) - _site.ID = field.NewInt64(tableName, "id") - _site.CategoryID = field.NewInt64(tableName, "category_id") - _site.Title = field.NewString(tableName, "title") - _site.Thumb = field.NewString(tableName, "thumb") - _site.Description = field.NewString(tableName, "description") - _site.URL = field.NewString(tableName, "url") - _site.CreatedAt = field.NewTime(tableName, "created_at") - _site.UpdatedAt = field.NewTime(tableName, "updated_at") - _site.IsUsed = field.NewInt64(tableName, "is_used") - _site.Category = siteBelongsToCategory{ - db: db.Session(&gorm.Session{}), - - RelationField: field.NewRelation("Category", "model.Category"), - } - - _site.fillFieldMap() - - return _site -} - -type site struct { - siteDo - - ALL field.Asterisk - ID field.Int64 - CategoryID field.Int64 // 分类id - Title field.String // 网站标题 - Thumb field.String // 网站logo - Description field.String // 网站描述 - URL field.String // 网站地址 - CreatedAt field.Time // 创建时间 - UpdatedAt field.Time // 更新时间 - IsUsed field.Int64 // 是否使用 - Category siteBelongsToCategory - - fieldMap map[string]field.Expr -} - -func (s site) Table(newTableName string) *site { - s.siteDo.UseTable(newTableName) - return s.updateTableName(newTableName) -} - -func (s site) As(alias string) *site { - s.siteDo.DO = *(s.siteDo.As(alias).(*gen.DO)) - return s.updateTableName(alias) -} - -func (s *site) updateTableName(table string) *site { - s.ALL = field.NewAsterisk(table) - s.ID = field.NewInt64(table, "id") - s.CategoryID = field.NewInt64(table, "category_id") - s.Title = field.NewString(table, "title") - s.Thumb = field.NewString(table, "thumb") - s.Description = field.NewString(table, "description") - s.URL = field.NewString(table, "url") - s.CreatedAt = field.NewTime(table, "created_at") - s.UpdatedAt = field.NewTime(table, "updated_at") - s.IsUsed = field.NewInt64(table, "is_used") - - s.fillFieldMap() - - return s -} - -func (s *site) GetFieldByName(fieldName string) (field.OrderExpr, bool) { - _f, ok := s.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - _oe, ok := _f.(field.OrderExpr) - return _oe, ok -} - -func (s *site) fillFieldMap() { - s.fieldMap = make(map[string]field.Expr, 10) - s.fieldMap["id"] = s.ID - s.fieldMap["category_id"] = s.CategoryID - s.fieldMap["title"] = s.Title - s.fieldMap["thumb"] = s.Thumb - s.fieldMap["description"] = s.Description - s.fieldMap["url"] = s.URL - s.fieldMap["created_at"] = s.CreatedAt - s.fieldMap["updated_at"] = s.UpdatedAt - s.fieldMap["is_used"] = s.IsUsed - -} - -func (s site) clone(db *gorm.DB) site { - s.siteDo.ReplaceConnPool(db.Statement.ConnPool) - return s -} - -func (s site) replaceDB(db *gorm.DB) site { - s.siteDo.ReplaceDB(db) - return s -} - -type siteBelongsToCategory struct { - db *gorm.DB - - field.RelationField -} - -func (a siteBelongsToCategory) Where(conds ...field.Expr) *siteBelongsToCategory { - if len(conds) == 0 { - return &a - } - - exprs := make([]clause.Expression, 0, len(conds)) - for _, cond := range conds { - exprs = append(exprs, cond.BeCond().(clause.Expression)) - } - a.db = a.db.Clauses(clause.Where{Exprs: exprs}) - return &a -} - -func (a siteBelongsToCategory) WithContext(ctx context.Context) *siteBelongsToCategory { - a.db = a.db.WithContext(ctx) - return &a -} - -func (a siteBelongsToCategory) Session(session *gorm.Session) *siteBelongsToCategory { - a.db = a.db.Session(session) - return &a -} - -func (a siteBelongsToCategory) Model(m *model.Site) *siteBelongsToCategoryTx { - return &siteBelongsToCategoryTx{a.db.Model(m).Association(a.Name())} -} - -type siteBelongsToCategoryTx struct{ tx *gorm.Association } - -func (a siteBelongsToCategoryTx) Find() (result *model.Category, err error) { - return result, a.tx.Find(&result) -} - -func (a siteBelongsToCategoryTx) Append(values ...*model.Category) (err error) { - targetValues := make([]interface{}, len(values)) - for i, v := range values { - targetValues[i] = v - } - return a.tx.Append(targetValues...) -} - -func (a siteBelongsToCategoryTx) Replace(values ...*model.Category) (err error) { - targetValues := make([]interface{}, len(values)) - for i, v := range values { - targetValues[i] = v - } - return a.tx.Replace(targetValues...) -} - -func (a siteBelongsToCategoryTx) Delete(values ...*model.Category) (err error) { - targetValues := make([]interface{}, len(values)) - for i, v := range values { - targetValues[i] = v - } - return a.tx.Delete(targetValues...) -} - -func (a siteBelongsToCategoryTx) Clear() error { - return a.tx.Clear() -} - -func (a siteBelongsToCategoryTx) Count() int64 { - return a.tx.Count() -} - -type siteDo struct{ gen.DO } - -type ISiteDo interface { - gen.SubQuery - Debug() ISiteDo - WithContext(ctx context.Context) ISiteDo - WithResult(fc func(tx gen.Dao)) gen.ResultInfo - ReplaceDB(db *gorm.DB) - ReadDB() ISiteDo - WriteDB() ISiteDo - As(alias string) gen.Dao - Session(config *gorm.Session) ISiteDo - Columns(cols ...field.Expr) gen.Columns - Clauses(conds ...clause.Expression) ISiteDo - Not(conds ...gen.Condition) ISiteDo - Or(conds ...gen.Condition) ISiteDo - Select(conds ...field.Expr) ISiteDo - Where(conds ...gen.Condition) ISiteDo - Order(conds ...field.Expr) ISiteDo - Distinct(cols ...field.Expr) ISiteDo - Omit(cols ...field.Expr) ISiteDo - Join(table schema.Tabler, on ...field.Expr) ISiteDo - LeftJoin(table schema.Tabler, on ...field.Expr) ISiteDo - RightJoin(table schema.Tabler, on ...field.Expr) ISiteDo - Group(cols ...field.Expr) ISiteDo - Having(conds ...gen.Condition) ISiteDo - Limit(limit int) ISiteDo - Offset(offset int) ISiteDo - Count() (count int64, err error) - Scopes(funcs ...func(gen.Dao) gen.Dao) ISiteDo - Unscoped() ISiteDo - Create(values ...*model.Site) error - CreateInBatches(values []*model.Site, batchSize int) error - Save(values ...*model.Site) error - First() (*model.Site, error) - Take() (*model.Site, error) - Last() (*model.Site, error) - Find() ([]*model.Site, error) - FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Site, err error) - FindInBatches(result *[]*model.Site, batchSize int, fc func(tx gen.Dao, batch int) error) error - Pluck(column field.Expr, dest interface{}) error - Delete(...*model.Site) (info gen.ResultInfo, err error) - Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - Updates(value interface{}) (info gen.ResultInfo, err error) - UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) - UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) - UpdateColumns(value interface{}) (info gen.ResultInfo, err error) - UpdateFrom(q gen.SubQuery) gen.Dao - Attrs(attrs ...field.AssignExpr) ISiteDo - Assign(attrs ...field.AssignExpr) ISiteDo - Joins(fields ...field.RelationField) ISiteDo - Preload(fields ...field.RelationField) ISiteDo - FirstOrInit() (*model.Site, error) - FirstOrCreate() (*model.Site, error) - FindByPage(offset int, limit int) (result []*model.Site, count int64, err error) - ScanByPage(result interface{}, offset int, limit int) (count int64, err error) - Scan(result interface{}) (err error) - Returning(value interface{}, columns ...string) ISiteDo - UnderlyingDB() *gorm.DB - schema.Tabler -} - -func (s siteDo) Debug() ISiteDo { - return s.withDO(s.DO.Debug()) -} - -func (s siteDo) WithContext(ctx context.Context) ISiteDo { - return s.withDO(s.DO.WithContext(ctx)) -} - -func (s siteDo) ReadDB() ISiteDo { - return s.Clauses(dbresolver.Read) -} - -func (s siteDo) WriteDB() ISiteDo { - return s.Clauses(dbresolver.Write) -} - -func (s siteDo) Session(config *gorm.Session) ISiteDo { - return s.withDO(s.DO.Session(config)) -} - -func (s siteDo) Clauses(conds ...clause.Expression) ISiteDo { - return s.withDO(s.DO.Clauses(conds...)) -} - -func (s siteDo) Returning(value interface{}, columns ...string) ISiteDo { - return s.withDO(s.DO.Returning(value, columns...)) -} - -func (s siteDo) Not(conds ...gen.Condition) ISiteDo { - return s.withDO(s.DO.Not(conds...)) -} - -func (s siteDo) Or(conds ...gen.Condition) ISiteDo { - return s.withDO(s.DO.Or(conds...)) -} - -func (s siteDo) Select(conds ...field.Expr) ISiteDo { - return s.withDO(s.DO.Select(conds...)) -} - -func (s siteDo) Where(conds ...gen.Condition) ISiteDo { - return s.withDO(s.DO.Where(conds...)) -} - -func (s siteDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) ISiteDo { - return s.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB())) -} - -func (s siteDo) Order(conds ...field.Expr) ISiteDo { - return s.withDO(s.DO.Order(conds...)) -} - -func (s siteDo) Distinct(cols ...field.Expr) ISiteDo { - return s.withDO(s.DO.Distinct(cols...)) -} - -func (s siteDo) Omit(cols ...field.Expr) ISiteDo { - return s.withDO(s.DO.Omit(cols...)) -} - -func (s siteDo) Join(table schema.Tabler, on ...field.Expr) ISiteDo { - return s.withDO(s.DO.Join(table, on...)) -} - -func (s siteDo) LeftJoin(table schema.Tabler, on ...field.Expr) ISiteDo { - return s.withDO(s.DO.LeftJoin(table, on...)) -} - -func (s siteDo) RightJoin(table schema.Tabler, on ...field.Expr) ISiteDo { - return s.withDO(s.DO.RightJoin(table, on...)) -} - -func (s siteDo) Group(cols ...field.Expr) ISiteDo { - return s.withDO(s.DO.Group(cols...)) -} - -func (s siteDo) Having(conds ...gen.Condition) ISiteDo { - return s.withDO(s.DO.Having(conds...)) -} - -func (s siteDo) Limit(limit int) ISiteDo { - return s.withDO(s.DO.Limit(limit)) -} - -func (s siteDo) Offset(offset int) ISiteDo { - return s.withDO(s.DO.Offset(offset)) -} - -func (s siteDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ISiteDo { - return s.withDO(s.DO.Scopes(funcs...)) -} - -func (s siteDo) Unscoped() ISiteDo { - return s.withDO(s.DO.Unscoped()) -} - -func (s siteDo) Create(values ...*model.Site) error { - if len(values) == 0 { - return nil - } - return s.DO.Create(values) -} - -func (s siteDo) CreateInBatches(values []*model.Site, batchSize int) error { - return s.DO.CreateInBatches(values, batchSize) -} - -// Save : !!! underlying implementation is different with GORM -// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) -func (s siteDo) Save(values ...*model.Site) error { - if len(values) == 0 { - return nil - } - return s.DO.Save(values) -} - -func (s siteDo) First() (*model.Site, error) { - if result, err := s.DO.First(); err != nil { - return nil, err - } else { - return result.(*model.Site), nil - } -} - -func (s siteDo) Take() (*model.Site, error) { - if result, err := s.DO.Take(); err != nil { - return nil, err - } else { - return result.(*model.Site), nil - } -} - -func (s siteDo) Last() (*model.Site, error) { - if result, err := s.DO.Last(); err != nil { - return nil, err - } else { - return result.(*model.Site), nil - } -} - -func (s siteDo) Find() ([]*model.Site, error) { - result, err := s.DO.Find() - return result.([]*model.Site), err -} - -func (s siteDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Site, err error) { - buf := make([]*model.Site, 0, batchSize) - err = s.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { - defer func() { results = append(results, buf...) }() - return fc(tx, batch) - }) - return results, err -} - -func (s siteDo) FindInBatches(result *[]*model.Site, batchSize int, fc func(tx gen.Dao, batch int) error) error { - return s.DO.FindInBatches(result, batchSize, fc) -} - -func (s siteDo) Attrs(attrs ...field.AssignExpr) ISiteDo { - return s.withDO(s.DO.Attrs(attrs...)) -} - -func (s siteDo) Assign(attrs ...field.AssignExpr) ISiteDo { - return s.withDO(s.DO.Assign(attrs...)) -} - -func (s siteDo) Joins(fields ...field.RelationField) ISiteDo { - for _, _f := range fields { - s = *s.withDO(s.DO.Joins(_f)) - } - return &s -} - -func (s siteDo) Preload(fields ...field.RelationField) ISiteDo { - for _, _f := range fields { - s = *s.withDO(s.DO.Preload(_f)) - } - return &s -} - -func (s siteDo) FirstOrInit() (*model.Site, error) { - if result, err := s.DO.FirstOrInit(); err != nil { - return nil, err - } else { - return result.(*model.Site), nil - } -} - -func (s siteDo) FirstOrCreate() (*model.Site, error) { - if result, err := s.DO.FirstOrCreate(); err != nil { - return nil, err - } else { - return result.(*model.Site), nil - } -} - -func (s siteDo) FindByPage(offset int, limit int) (result []*model.Site, count int64, err error) { - result, err = s.Offset(offset).Limit(limit).Find() - if err != nil { - return - } - - if size := len(result); 0 < limit && 0 < size && size < limit { - count = int64(size + offset) - return - } - - count, err = s.Offset(-1).Limit(-1).Count() - return -} - -func (s siteDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { - count, err = s.Count() - if err != nil { - return - } - - err = s.Offset(offset).Limit(limit).Scan(result) - return -} - -func (s siteDo) Scan(result interface{}) (err error) { - return s.DO.Scan(result) -} - -func (s siteDo) Delete(models ...*model.Site) (result gen.ResultInfo, err error) { - return s.DO.Delete(models) -} - -func (s *siteDo) withDO(do gen.Dao) *siteDo { - s.DO = *do.(*gen.DO) - return s -} diff --git a/internal/repository/redis/redis.go b/internal/repository/redis/redis.go deleted file mode 100755 index cff20ab..0000000 --- a/internal/repository/redis/redis.go +++ /dev/null @@ -1,228 +0,0 @@ -package redis - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/timeutil" - "github.com/go-redis/redis/v7" - "strings" - "time" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/pkg/trace" -) - -type Option func(*option) - -type Trace = trace.T - -type option struct { - Trace *trace.Trace - Redis *trace.Redis -} - -func newOption() *option { - return &option{} -} - -var _ Repo = (*cacheRepo)(nil) - -type Repo interface { - i() - Set(key, value string, ttl time.Duration, options ...Option) error - Get(key string, options ...Option) (string, error) - TTL(key string) (time.Duration, error) - Expire(key string, ttl time.Duration) bool - ExpireAt(key string, ttl time.Time) bool - Del(key string, options ...Option) bool - Exists(keys ...string) bool - Incr(key string, options ...Option) int64 - Close() error - Version() string -} - -type cacheRepo struct { - client *redis.Client -} - -func New() (Repo, error) { - client, err := redisConnect() - if err != nil { - return nil, err - } - - return &cacheRepo{ - client: client, - }, nil -} - -func (c *cacheRepo) i() {} - -func redisConnect() (*redis.Client, error) { - cfg := configs.Get().Redis - client := redis.NewClient(&redis.Options{ - Addr: cfg.Addr, - Password: cfg.Pass, - DB: cfg.Db, - MaxRetries: cfg.MaxRetries, - PoolSize: cfg.PoolSize, - MinIdleConns: cfg.MinIdleConns, - }) - - if err := client.Ping().Err(); err != nil { - return nil, errors.Wrap(err, "ping redis err") - } - - return client, nil -} - -// Set set some into redis -func (c *cacheRepo) Set(key, value string, ttl time.Duration, options ...Option) error { - ts := time.Now() - opt := newOption() - defer func() { - if opt.Trace != nil { - opt.Redis.Timestamp = timeutil.CSTLayoutString() - opt.Redis.Handle = "set" - opt.Redis.Key = key - opt.Redis.Value = value - opt.Redis.TTL = ttl.Minutes() - opt.Redis.CostSeconds = time.Since(ts).Seconds() - opt.Trace.AppendRedis(opt.Redis) - } - }() - - for _, f := range options { - f(opt) - } - - if err := c.client.Set(key, value, ttl).Err(); err != nil { - return errors.Wrapf(err, "redis set key: %s err", key) - } - - return nil -} - -// Get get some key from redis -func (c *cacheRepo) Get(key string, options ...Option) (string, error) { - ts := time.Now() - opt := newOption() - defer func() { - if opt.Trace != nil { - opt.Redis.Timestamp = timeutil.CSTLayoutString() - opt.Redis.Handle = "get" - opt.Redis.Key = key - opt.Redis.CostSeconds = time.Since(ts).Seconds() - opt.Trace.AppendRedis(opt.Redis) - } - }() - - for _, f := range options { - f(opt) - } - - value, err := c.client.Get(key).Result() - if err != nil { - return "", errors.Wrapf(err, "redis get key: %s err", key) - } - - return value, nil -} - -// TTL get some key from redis -func (c *cacheRepo) TTL(key string) (time.Duration, error) { - ttl, err := c.client.TTL(key).Result() - if err != nil { - return -1, errors.Wrapf(err, "redis get key: %s err", key) - } - - return ttl, nil -} - -// Expire expire some key -func (c *cacheRepo) Expire(key string, ttl time.Duration) bool { - ok, _ := c.client.Expire(key, ttl).Result() - return ok -} - -// ExpireAt expire some key at some time -func (c *cacheRepo) ExpireAt(key string, ttl time.Time) bool { - ok, _ := c.client.ExpireAt(key, ttl).Result() - return ok -} - -func (c *cacheRepo) Exists(keys ...string) bool { - if len(keys) == 0 { - return true - } - value, _ := c.client.Exists(keys...).Result() - return value > 0 -} - -func (c *cacheRepo) Del(key string, options ...Option) bool { - ts := time.Now() - opt := newOption() - defer func() { - if opt.Trace != nil { - opt.Redis.Timestamp = timeutil.CSTLayoutString() - opt.Redis.Handle = "del" - opt.Redis.Key = key - opt.Redis.CostSeconds = time.Since(ts).Seconds() - opt.Trace.AppendRedis(opt.Redis) - } - }() - - for _, f := range options { - f(opt) - } - - if key == "" { - return true - } - - value, _ := c.client.Del(key).Result() - return value > 0 -} - -func (c *cacheRepo) Incr(key string, options ...Option) int64 { - ts := time.Now() - opt := newOption() - defer func() { - if opt.Trace != nil { - opt.Redis.Timestamp = timeutil.CSTLayoutString() - opt.Redis.Handle = "incr" - opt.Redis.Key = key - opt.Redis.CostSeconds = time.Since(ts).Seconds() - opt.Trace.AppendRedis(opt.Redis) - } - }() - - for _, f := range options { - f(opt) - } - value, _ := c.client.Incr(key).Result() - return value -} - -// Close close redis client -func (c *cacheRepo) Close() error { - return c.client.Close() -} - -// WithTrace 设置trace信息 -func WithTrace(t Trace) Option { - return func(opt *option) { - if t != nil { - opt.Trace = t.(*trace.Trace) - opt.Redis = new(trace.Redis) - } - } -} - -// Version redis server version -func (c *cacheRepo) Version() string { - server := c.client.Info("server").Val() - spl1 := strings.Split(server, "# Server") - spl2 := strings.Split(spl1[1], "redis_version:") - spl3 := strings.Split(spl2[1], "redis_git_sha1:") - return spl3[0] -} diff --git a/internal/repository/socket/socket.go b/internal/repository/socket/socket.go deleted file mode 100755 index 54e9b27..0000000 --- a/internal/repository/socket/socket.go +++ /dev/null @@ -1,70 +0,0 @@ -package socket - -import ( - "net/http" - "time" - - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "github.com/gorilla/websocket" - "go.uber.org/zap" -) - -var _ Server = (*server)(nil) - -type server struct { - logger *zap.Logger - db mysql.Repo - cache redis.Repo - socket *websocket.Conn -} - -type Server interface { - i() - - // OnMessage 接收消息 - OnMessage() - - // OnSend 发送消息 - OnSend(message []byte) error - - // OnClose 关闭 - OnClose() -} - -var upGrader = websocket.Upgrader{ - HandshakeTimeout: 5 * time.Second, - CheckOrigin: func(r *http.Request) bool { - return true - }, -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo, w http.ResponseWriter, r *http.Request, responseHeader http.Header) (Server, error) { - if logger == nil { - return nil, errors.New("logger required") - } - - if db == nil { - return nil, errors.New("db required") - } - - if cache == nil { - return nil, errors.New("cache required") - } - - ws, err := upGrader.Upgrade(w, r, responseHeader) - if err != nil { - return nil, errors.Wrap(err, "ws error") - } - - return &server{ - logger: logger, - db: db, - cache: cache, - socket: ws, - }, nil -} - -func (s *server) i() {} diff --git a/internal/repository/socket/socket_on_close.go b/internal/repository/socket/socket_on_close.go deleted file mode 100755 index 79290f3..0000000 --- a/internal/repository/socket/socket_on_close.go +++ /dev/null @@ -1,10 +0,0 @@ -package socket - -import "go.uber.org/zap" - -func (s *server) OnClose() { - err := s.socket.Close() - if err != nil { - s.logger.Error("socket on closed error", zap.Error(err)) - } -} diff --git a/internal/repository/socket/socket_on_message.go b/internal/repository/socket/socket_on_message.go deleted file mode 100755 index e060786..0000000 --- a/internal/repository/socket/socket_on_message.go +++ /dev/null @@ -1,21 +0,0 @@ -package socket - -import "go.uber.org/zap" - -func (s *server) OnMessage() { - defer func() { - s.OnClose() - }() - - for { - //接收消息 - _, message, err := s.socket.ReadMessage() - if err != nil { - s.logger.Error("socket on message error", zap.Error(err)) - break - } - - // 为了便于演示,仅输出到日志文件 - s.logger.Info("receive message: " + string(message)) - } -} diff --git a/internal/repository/socket/socket_on_send.go b/internal/repository/socket/socket_on_send.go deleted file mode 100755 index b27037e..0000000 --- a/internal/repository/socket/socket_on_send.go +++ /dev/null @@ -1,15 +0,0 @@ -package socket - -import ( - "github.com/gorilla/websocket" - "go.uber.org/zap" -) - -func (s *server) OnSend(message []byte) error { - err := s.socket.WriteMessage(websocket.TextMessage, message) - if err != nil { - s.OnClose() - s.logger.Error("socket on send error", zap.Error(err)) - } - return err -} diff --git a/internal/router/interceptor/check_login.go b/internal/router/interceptor/check_login.go deleted file mode 100755 index abe327b..0000000 --- a/internal/router/interceptor/check_login.go +++ /dev/null @@ -1,56 +0,0 @@ -package interceptor - -import ( - "encoding/json" - "net/http" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/proposal" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -func (i *interceptor) CheckLogin(ctx core.Context) (sessionUserInfo proposal.SessionUserInfo, err core.BusinessError) { - token := ctx.GetHeader(configs.HeaderLoginToken) - if token == "" { - err = core.Error( - http.StatusUnauthorized, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(errors.New("Header 中缺少 Token 参数")) - - return - } - - if !i.cache.Exists(configs.RedisKeyPrefixLoginUser + token) { - err = core.Error( - http.StatusUnauthorized, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(errors.New("请先登录")) - - return - } - - cacheData, cacheErr := i.cache.Get(configs.RedisKeyPrefixLoginUser+token, redis.WithTrace(ctx.Trace())) - if cacheErr != nil { - err = core.Error( - http.StatusUnauthorized, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(cacheErr) - - return - } - - jsonErr := json.Unmarshal([]byte(cacheData), &sessionUserInfo) - if jsonErr != nil { - core.Error( - http.StatusUnauthorized, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(jsonErr) - - return - } - - return -} diff --git a/internal/router/interceptor/check_rbac.go b/internal/router/interceptor/check_rbac.go deleted file mode 100755 index 4c89773..0000000 --- a/internal/router/interceptor/check_rbac.go +++ /dev/null @@ -1,84 +0,0 @@ -package interceptor - -import ( - "encoding/json" - "net/http" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/pkg/urltable" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - "github.com/ch3nnn/webstack-go/internal/services/admin" -) - -func (i *interceptor) CheckRBAC() core.HandlerFunc { - return func(c core.Context) { - token := c.GetHeader("Token") - if token == "" { - c.AbortWithError(core.Error( - http.StatusUnauthorized, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(errors.New("Header 中缺少 Token 参数")), - ) - return - } - - if !i.cache.Exists(configs.RedisKeyPrefixLoginUser + token) { - c.AbortWithError(core.Error( - http.StatusUnauthorized, - code.CacheGetError, - code.Text(code.CacheGetError)).WithError(errors.New("请先登录")), - ) - return - } - - if !i.cache.Exists(configs.RedisKeyPrefixLoginUser + token + ":action") { - c.AbortWithError(core.Error( - http.StatusUnauthorized, - code.CacheGetError, - code.Text(code.CacheGetError)).WithError(errors.New("当前账号未配置 RBAC 权限")), - ) - return - } - - actionData, err := i.cache.Get(configs.RedisKeyPrefixLoginUser+token+":action", redis.WithTrace(c.Trace())) - if err != nil { - c.AbortWithError(core.Error( - http.StatusUnauthorized, - code.CacheGetError, - code.Text(code.CacheGetError)).WithError(err), - ) - return - } - - var actions []admin.MyActionData - err = json.Unmarshal([]byte(actionData), &actions) - if err != nil { - c.AbortWithError(core.Error( - http.StatusUnauthorized, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(err), - ) - return - } - - if len(actions) > 0 { - table := urltable.NewTable() - for _, v := range actions { - _ = table.Append(v.Method + v.Api) - } - - if pattern, _ := table.Mapping(c.Method() + c.Path()); pattern == "" { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.RBACError, - code.Text(code.RBACError)).WithError(errors.New(c.Method() + c.Path() + " 未进行 RBAC 授权")), - ) - return - } - } - - } -} diff --git a/internal/router/interceptor/check_signature.go b/internal/router/interceptor/check_signature.go deleted file mode 100755 index b83a612..0000000 --- a/internal/router/interceptor/check_signature.go +++ /dev/null @@ -1,126 +0,0 @@ -package interceptor - -import ( - "github.com/ch3nnn/webstack-go/internal/repository/mysql/constant" - "net/http" - "strings" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/code" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/env" - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/pkg/signature" - "github.com/ch3nnn/webstack-go/internal/pkg/urltable" -) - -var whiteListPath = map[string]bool{ - "/login/web": true, -} - -func (i *interceptor) CheckSignature() core.HandlerFunc { - return func(c core.Context) { - if !env.Active().IsPro() { - return - } - - // 签名信息 - authorization := c.GetHeader(configs.HeaderSignToken) - if authorization == "" { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(errors.New("Header 中缺少 Authorization 参数")), - ) - return - } - - // 时间信息 - date := c.GetHeader(configs.HeaderSignTokenDate) - if date == "" { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(errors.New("Header 中缺少 Date 参数")), - ) - return - } - - // 通过签名信息获取 key - authorizationSplit := strings.Split(authorization, " ") - if len(authorizationSplit) < 2 { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(errors.New("Header 中 Authorization 格式错误")), - ) - return - } - - key := authorizationSplit[0] - - data, err := i.authorizedService.DetailByKey(c, key) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(err), - ) - return - } - - if data.IsUsed == constant.IsUsedNo { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(errors.New(key + " 已被禁止调用")), - ) - return - } - - if len(data.Apis) < 1 { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(errors.New(key + " 未进行接口授权")), - ) - return - } - - if !whiteListPath[c.Path()] { - // 验证 c.Method() + c.Path() 是否授权 - table := urltable.NewTable() - for _, v := range data.Apis { - _ = table.Append(v.Method + v.Api) - } - - if pattern, _ := table.Mapping(c.Method() + c.Path()); pattern == "" { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(errors.New(c.Method() + c.Path() + " 未进行接口授权")), - ) - return - } - } - - ok, err := signature.New(key, data.Secret, configs.HeaderSignTokenTimeout).Verify(authorization, date, c.Path(), c.Method(), c.RequestInputParams()) - if err != nil { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(err), - ) - return - } - - if !ok { - c.AbortWithError(core.Error( - http.StatusBadRequest, - code.AuthorizationError, - code.Text(code.AuthorizationError)).WithError(errors.New("Header 中 Authorization 信息错误")), - ) - return - } - } -} diff --git a/internal/router/interceptor/interceptor.go b/internal/router/interceptor/interceptor.go deleted file mode 100755 index e39fafb..0000000 --- a/internal/router/interceptor/interceptor.go +++ /dev/null @@ -1,48 +0,0 @@ -package interceptor - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/proposal" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - "github.com/ch3nnn/webstack-go/internal/services/admin" - "github.com/ch3nnn/webstack-go/internal/services/authorized" - - "go.uber.org/zap" -) - -var _ Interceptor = (*interceptor)(nil) - -type Interceptor interface { - // CheckLogin 验证是否登录 - CheckLogin(ctx core.Context) (info proposal.SessionUserInfo, err core.BusinessError) - - // CheckRBAC 验证 RBAC 权限是否合法 - CheckRBAC() core.HandlerFunc - - // CheckSignature 验证签名是否合法,对用签名算法 pkg/signature - CheckSignature() core.HandlerFunc - - // i 为了避免被其他包实现 - i() -} - -type interceptor struct { - logger *zap.Logger - cache redis.Repo - db mysql.Repo - authorizedService authorized.Service - adminService admin.Service -} - -func New(logger *zap.Logger, cache redis.Repo, db mysql.Repo) Interceptor { - return &interceptor{ - logger: logger, - cache: cache, - db: db, - authorizedService: authorized.New(db, cache), - adminService: admin.New(db, cache), - } -} - -func (i *interceptor) i() {} diff --git a/internal/router/router.go b/internal/router/router.go deleted file mode 100755 index 3bfd200..0000000 --- a/internal/router/router.go +++ /dev/null @@ -1,106 +0,0 @@ -package router - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/alert" - "github.com/ch3nnn/webstack-go/internal/metrics" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/pkg/file" - "github.com/ch3nnn/webstack-go/internal/repository/cron" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - "github.com/ch3nnn/webstack-go/internal/router/interceptor" - - "go.uber.org/zap" -) - -type resource struct { - mux core.Mux - logger *zap.Logger - db mysql.Repo - cache redis.Repo - interceptors interceptor.Interceptor - cronServer cron.Server -} - -type Server struct { - Mux core.Mux - Db mysql.Repo - Cache redis.Repo - CronServer cron.Server -} - -func NewHTTPServer(logger *zap.Logger, cronLogger *zap.Logger) (*Server, error) { - if logger == nil { - return nil, errors.New("logger required") - } - - r := new(resource) - r.logger = logger - - openBrowserUri := configs.ProjectDomain + configs.ProjectPort - - _, ok := file.IsExists(configs.ProjectInstallMark) - if !ok { // 未安装 - openBrowserUri += "/install" - } else { // 已安装 - - // 初始化 DB - dbRepo, err := mysql.New() - if err != nil { - logger.Fatal("new db err", zap.Error(err)) - } - r.db = dbRepo - - // 初始化 Cache - cacheRepo, err := redis.New() - if err != nil { - logger.Fatal("new cache err", zap.Error(err)) - } - r.cache = cacheRepo - - // 初始化 CRON Server - cronServer, err := cron.New(cronLogger, dbRepo, cacheRepo) - if err != nil { - logger.Fatal("new cron err", zap.Error(err)) - } - cronServer.Start() - r.cronServer = cronServer - } - - mux, err := core.New(logger, - core.WithEnableOpenBrowser(openBrowserUri), - core.WithEnableCors(), - core.WithEnableRate(), - core.WithAlertNotify(alert.NotifyHandler(logger)), - core.WithRecordMetrics(metrics.RecordHandler(logger)), - ) - - if err != nil { - panic(err) - } - - r.mux = mux - r.interceptors = interceptor.New(logger, r.cache, r.db) - - // 设置 Render 路由 - setRenderRouter(r) - - // 设置 API 路由 - setApiRouter(r) - - // 设置 GraphQL 路由 - setGraphQLRouter(r) - - // 设置 Socket 路由 - setSocketRouter(r) - - s := new(Server) - s.Mux = mux - s.Db = r.db - s.Cache = r.cache - s.CronServer = r.cronServer - - return s, nil -} diff --git a/internal/router/router_api.go b/internal/router/router_api.go deleted file mode 100755 index 27f1993..0000000 --- a/internal/router/router_api.go +++ /dev/null @@ -1,125 +0,0 @@ -package router - -import ( - "github.com/ch3nnn/webstack-go/internal/api/admin" - "github.com/ch3nnn/webstack-go/internal/api/authorized" - "github.com/ch3nnn/webstack-go/internal/api/category" - "github.com/ch3nnn/webstack-go/internal/api/config" - "github.com/ch3nnn/webstack-go/internal/api/cron" - "github.com/ch3nnn/webstack-go/internal/api/helper" - "github.com/ch3nnn/webstack-go/internal/api/menu" - "github.com/ch3nnn/webstack-go/internal/api/site" - "github.com/ch3nnn/webstack-go/internal/api/tool" - "github.com/ch3nnn/webstack-go/internal/pkg/core" -) - -func setApiRouter(r *resource) { - // helper - helperHandler := helper.New(r.logger, r.db, r.cache) - - helpers := r.mux.Group("/helper") - { - helpers.GET("/md5/:str", helperHandler.Md5()) - helpers.POST("/sign", helperHandler.Sign()) - } - - // admin - adminHandler := admin.New(r.logger, r.db, r.cache) - - // 需要签名验证,无需登录验证,无需 RBAC 权限验证 - login := r.mux.Group("/api", r.interceptors.CheckSignature()) - { - login.POST("/login", adminHandler.Login()) - } - - // 需要签名验证、登录验证,无需 RBAC 权限验证 - notRBAC := r.mux.Group("/api", core.WrapAuthHandler(r.interceptors.CheckLogin), r.interceptors.CheckSignature()) - { - notRBAC.POST("/admin/logout", adminHandler.Logout()) - notRBAC.PATCH("/admin/modify_password", adminHandler.ModifyPassword()) - notRBAC.GET("/admin/info", adminHandler.Detail()) - notRBAC.PATCH("/admin/modify_personal_info", adminHandler.ModifyPersonalInfo()) - } - - // 需要签名验证、登录验证、RBAC 权限验证 TODO - //api := r.mux.Group("/api", core.WrapAuthHandler(r.interceptors.CheckLogin), r.interceptors.CheckSignature(), r.interceptors.CheckRBAC()) - api := r.mux.Group("/api") - { - // authorized - authorizedHandler := authorized.New(r.logger, r.db, r.cache) - api.POST("/authorized", authorizedHandler.Create()) - api.GET("/authorized", authorizedHandler.List()) - api.PATCH("/authorized/used", authorizedHandler.UpdateUsed()) - api.DELETE("/authorized/:id", core.AliasForRecordMetrics("/api/authorized/info"), authorizedHandler.Delete()) - - api.POST("/authorized_api", authorizedHandler.CreateAPI()) - api.GET("/authorized_api", authorizedHandler.ListAPI()) - api.DELETE("/authorized_api/:id", core.AliasForRecordMetrics("/api/authorized_api/info"), authorizedHandler.DeleteAPI()) - - api.POST("/admin", adminHandler.Create()) - api.GET("/admin", adminHandler.List()) - api.PATCH("/admin/used", adminHandler.UpdateUsed()) - api.PATCH("/admin/offline", adminHandler.Offline()) - api.PATCH("/admin/reset_password/:id", core.AliasForRecordMetrics("/api/admin/reset_password"), adminHandler.ResetPassword()) - api.DELETE("/admin/:id", core.AliasForRecordMetrics("/api/admin"), adminHandler.Delete()) - - api.POST("/admin/menu", adminHandler.CreateAdminMenu()) - api.GET("/admin/menu/:id", core.AliasForRecordMetrics("/api/admin/menu"), adminHandler.ListAdminMenu()) - - // menu - menuHandler := menu.New(r.logger, r.db, r.cache) - api.POST("/menu", menuHandler.Create()) - api.GET("/menu", menuHandler.List()) - api.GET("/menu/:id", core.AliasForRecordMetrics("/api/menu"), menuHandler.Detail()) - api.PATCH("/menu/used", menuHandler.UpdateUsed()) - api.PATCH("/menu/sort", menuHandler.UpdateSort()) - api.DELETE("/menu/:id", core.AliasForRecordMetrics("/api/menu"), menuHandler.Delete()) - api.POST("/menu_action", menuHandler.CreateAction()) - api.GET("/menu_action", menuHandler.ListAction()) - api.DELETE("/menu_action/:id", core.AliasForRecordMetrics("/api/menu_action"), menuHandler.DeleteAction()) - - // category - categoryHandler := category.New(r.logger, r.db, r.cache) - api.GET("/category", categoryHandler.List()) - api.GET("/category/:id", categoryHandler.Detail()) - api.POST("/category", categoryHandler.Create()) - api.DELETE("/category/:id", categoryHandler.Delete()) - api.PATCH("/category/used", categoryHandler.UpdateUsed()) - api.PATCH("/category/sort", categoryHandler.UpdateSort()) - - // site - siteHandler := site.New(r.logger, r.db, r.cache) - api.GET("/site", siteHandler.List()) - api.PATCH("/site/used", siteHandler.UpdateUsed()) - api.DELETE("/site/:id", siteHandler.Delete()) - api.POST("/site", siteHandler.Create()) - api.PUT("/site", siteHandler.UpdateSite()) - api.GET("/site/category", siteHandler.CategoryList()) - api.GET("/site/sync/:id", siteHandler.SyncSite()) - - // tool - toolHandler := tool.New(r.logger, r.db, r.cache) - api.GET("/tool/hashids/encode/:id", core.AliasForRecordMetrics("/api/tool/hashids/encode"), toolHandler.HashIdsEncode()) - api.GET("/tool/hashids/decode/:id", core.AliasForRecordMetrics("/api/tool/hashids/decode"), toolHandler.HashIdsDecode()) - api.POST("/tool/cache/search", toolHandler.SearchCache()) - api.PATCH("/tool/cache/clear", toolHandler.ClearCache()) - api.GET("/tool/data/dbs", toolHandler.Dbs()) - api.POST("/tool/data/tables", toolHandler.Tables()) - api.POST("/tool/data/mysql", toolHandler.SearchMySQL()) - api.POST("/tool/send_message", toolHandler.SendMessage()) - - // config - configHandler := config.New(r.logger, r.db, r.cache) - api.PATCH("/config/email", configHandler.Email()) - - // cron - cronHandler := cron.New(r.logger, r.db, r.cache, r.cronServer) - api.POST("/cron", cronHandler.Create()) - api.GET("/cron", cronHandler.List()) - api.GET("/cron/:id", core.AliasForRecordMetrics("/api/cron/detail"), cronHandler.Detail()) - api.POST("/cron/:id", core.AliasForRecordMetrics("/api/cron/modify"), cronHandler.Modify()) - api.PATCH("/cron/used", cronHandler.UpdateUsed()) - api.PATCH("/cron/exec/:id", core.AliasForRecordMetrics("/api/cron/exec"), cronHandler.Execute()) - - } -} diff --git a/internal/router/router_graphql.go b/internal/router/router_graphql.go deleted file mode 100755 index bc1cd0d..0000000 --- a/internal/router/router_graphql.go +++ /dev/null @@ -1,14 +0,0 @@ -package router - -import "github.com/ch3nnn/webstack-go/internal/graph/handler" - -func setGraphQLRouter(r *resource) { - // graphQL 控制器 - gqlHandler := handler.New(r.logger, r.db, r.cache) - - gql := r.mux.Group("/graphql") - { - gql.GET("", gqlHandler.Playground()) - gql.POST("/query", gqlHandler.Query()) - } -} diff --git a/internal/router/router_render.go b/internal/router/router_render.go deleted file mode 100755 index e0dacaa..0000000 --- a/internal/router/router_render.go +++ /dev/null @@ -1,101 +0,0 @@ -package router - -import ( - "github.com/ch3nnn/webstack-go/internal/api/index" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/render/admin" - "github.com/ch3nnn/webstack-go/internal/render/authorized" - "github.com/ch3nnn/webstack-go/internal/render/config" - "github.com/ch3nnn/webstack-go/internal/render/cron" - "github.com/ch3nnn/webstack-go/internal/render/dashboard" - "github.com/ch3nnn/webstack-go/internal/render/generator" - adminIdex "github.com/ch3nnn/webstack-go/internal/render/index" - "github.com/ch3nnn/webstack-go/internal/render/install" - "github.com/ch3nnn/webstack-go/internal/render/tool" - "github.com/ch3nnn/webstack-go/internal/render/upgrade" -) - -func setRenderRouter(r *resource) { - - renderInstall := install.New(r.logger) - renderIndex := index.New(r.logger, r.db, r.cache) - renderAdminIndex := adminIdex.New(r.logger, r.db, r.cache) - renderDashboard := dashboard.New(r.logger, r.db, r.cache) - renderGenerator := generator_handler.New(r.logger, r.db, r.cache) - renderConfig := config.New(r.logger, r.db, r.cache) - renderAuthorized := authorized.New(r.logger, r.db, r.cache) - renderTool := tool.New(r.logger, r.db, r.cache) - renderAdmin := admin.New(r.logger, r.db, r.cache) - renderUpgrade := upgrade.New(r.logger, r.db, r.cache) - renderCron := cron.New(r.logger, r.db, r.cache) - - // 无需记录日志,无需 RBAC 权限验证 - notRBAC := r.mux.Group("", core.DisableTraceLog, core.DisableRecordMetrics) - { - // 首页 - notRBAC.GET("", renderIndex.Index()) - notRBAC.GET("/about", renderIndex.About()) - - // admin 首页 - notRBAC.GET("/admin", renderAdminIndex.Index()) - - // 仪表盘 - notRBAC.GET("/dashboard", renderDashboard.View()) - - // 安装 - notRBAC.GET("/install", renderInstall.View()) - notRBAC.POST("/install/execute", renderInstall.Execute()) - - // 管理员 - notRBAC.GET("/login", renderAdmin.Login()) - notRBAC.GET("/admin/modify_password", renderAdmin.ModifyPassword()) - notRBAC.GET("/admin/modify_info", renderAdmin.ModifyInfo()) - } - - // 无需记录日志,需要 RBAC 权限验证 - render := r.mux.Group("", core.DisableTraceLog, core.DisableRecordMetrics) - { - // 配置信息 - render.GET("/config/email", renderConfig.Email()) - render.GET("/config/code", renderConfig.Code()) - - // 代码生成器 - render.GET("/generator/gorm", renderGenerator.GormView()) - render.POST("/generator/gorm/execute", renderGenerator.GormExecute()) - - render.GET("/generator/handler", renderGenerator.HandlerView()) - render.POST("/generator/handler/execute", renderGenerator.HandlerExecute()) - - // 调用方 - render.GET("/authorized/list", renderAuthorized.List()) - render.GET("/authorized/add", renderAuthorized.Add()) - render.GET("/authorized/api/:id", renderAuthorized.Api()) - render.GET("/authorized/demo", renderAuthorized.Demo()) - - // 管理员 - render.GET("/admin/list", renderAdmin.List()) - render.GET("/admin/add", renderAdmin.Add()) - render.GET("/admin/site", renderAdmin.Site()) - render.GET("/admin/site/add", renderAdmin.AddSite()) - render.GET("/admin/category", renderAdmin.Category()) - render.GET("/admin/menu", renderAdmin.Menu()) - render.GET("/admin/menu_action/:id", renderAdmin.MenuAction()) - render.GET("/admin/action/:id", renderAdmin.AdminMenu()) - - // 升级 - render.GET("/upgrade", renderUpgrade.UpgradeView()) - render.POST("/upgrade/execute", renderUpgrade.UpgradeExecute()) - - // 工具箱 - render.GET("/tool/hashids", renderTool.HashIds()) - render.GET("/tool/logs", renderTool.Log()) - render.GET("/tool/cache", renderTool.Cache()) - render.GET("/tool/data", renderTool.Data()) - render.GET("/tool/websocket", renderTool.Websocket()) - - // 后台任务 - render.GET("/cron/list", renderCron.List()) - render.GET("/cron/add", renderCron.Add()) - render.GET("/cron/edit/:id", renderCron.Edit()) - } -} diff --git a/internal/router/router_socket.go b/internal/router/router_socket.go deleted file mode 100755 index d6ae888..0000000 --- a/internal/router/router_socket.go +++ /dev/null @@ -1,17 +0,0 @@ -package router - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/websocket/sysmessage" -) - -func setSocketRouter(r *resource) { - systemMessage := sysmessage.New(r.logger, r.db, r.cache) - - // 无需记录日志 - socket := r.mux.Group("/socket", core.DisableTraceLog, core.DisableRecordMetrics) - { - // 系统消息 - socket.GET("/system/message", systemMessage.Connect()) - } -} diff --git a/internal/server/http.go b/internal/server/http.go new file mode 100644 index 0000000..2492ae6 --- /dev/null +++ b/internal/server/http.go @@ -0,0 +1,140 @@ +package server + +import ( + "fmt" + "html/template" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/spf13/viper" + swaggerfiles "github.com/swaggo/files" + ginSwagger "github.com/swaggo/gin-swagger" + + v1 "github.com/ch3nnn/webstack-go/api/v1" + "github.com/ch3nnn/webstack-go/docs" + categoryHandler "github.com/ch3nnn/webstack-go/internal/handler/category" + dashboardHandler "github.com/ch3nnn/webstack-go/internal/handler/dashboard" + indexHandler "github.com/ch3nnn/webstack-go/internal/handler/index" + siteHandler "github.com/ch3nnn/webstack-go/internal/handler/site" + userHandler "github.com/ch3nnn/webstack-go/internal/handler/user" + "github.com/ch3nnn/webstack-go/internal/middleware" + "github.com/ch3nnn/webstack-go/pkg/jwt" + "github.com/ch3nnn/webstack-go/pkg/log" + httpx "github.com/ch3nnn/webstack-go/pkg/server/http" + assets "github.com/ch3nnn/webstack-go/web" +) + +//const UploadDirName = "upload" +// +//func init() { +// if !fileutil.IsExist(UploadDirName) { +// if err := fileutil.CreateDir(UploadDirName); err != nil { +// panic(err) +// } +// } +//} + +func NewHTTPServer( + engine *gin.Engine, + logger *log.Logger, + conf *viper.Viper, + jwt *jwt.JWT, + dashboardHandler *dashboardHandler.Handler, + indexHandler *indexHandler.Handler, + userHandler *userHandler.Handler, + siteHandler *siteHandler.Handler, + categoryHandler *categoryHandler.Handler, +) *httpx.Server { + gin.SetMode(gin.DebugMode) + s := httpx.NewServer( + engine, + logger, + httpx.WithServerHost(conf.GetString("http.host")), + httpx.WithServerPort(conf.GetInt("http.port")), + ) + + s.Static("/upload", "web/upload") + s.StaticFS("/assets", http.FS(assets.Static)) + s.SetHTMLTemplate(template.Must(template.New("").ParseFS(assets.Templates, "templates/**/*"))) + + // Swagger Doc + docs.SwaggerInfo.BasePath = "/v1" + s.GET("/swagger/*any", ginSwagger.WrapHandler( + swaggerfiles.Handler, + ginSwagger.URL(fmt.Sprintf("http://localhost:%d/swagger/doc.json", conf.GetInt("app.http.port"))), + ginSwagger.DefaultModelsExpandDepth(-1), + ginSwagger.PersistAuthorization(true), + )) + + // Middleware + s.Use( + middleware.CORSMiddleware(), + middleware.RequestLogMiddleware(logger), + middleware.ResponseLogMiddleware(logger), + ) + // 404 + s.NoRoute(v1.ErrHandler404) + // Index HTML + s.GET("/", indexHandler.Index) + // About HTML + s.GET("/about", func(ctx *gin.Context) { + ctx.HTML(http.StatusOK, "about.html", nil) + }) + // Login HTML + s.GET("login", func(ctx *gin.Context) { + ctx.HTML(http.StatusOK, "admin_login.html", nil) + }) + // Render HTML + render := s.Group("/admin").Use(middleware.StrictAuth(jwt, logger)) + { + render.GET("", func(ctx *gin.Context) { + ctx.HTML(http.StatusOK, "admin_index.html", nil) + }) + + render.GET("dashboard", dashboardHandler.Dashboard) + + render.GET("modify_password", func(ctx *gin.Context) { + ctx.HTML(http.StatusOK, "admin_modify_password.html", nil) + }) + render.GET("category", func(ctx *gin.Context) { + ctx.HTML(http.StatusOK, "category_view.html", nil) + }) + render.GET("site", func(ctx *gin.Context) { + ctx.HTML(http.StatusOK, "site_list.html", nil) + }) + render.GET("site/add", func(ctx *gin.Context) { + ctx.HTML(http.StatusOK, "site_add.html", nil) + }) + } + + v1 := s.Group("/api") + { + // No route group has permission + noAuthRouter := v1.Group("") + { + noAuthRouter.POST("/login", userHandler.Login) + } + // Strict permission routing group + strictAuthRouter := v1.Group("/admin").Use(middleware.StrictAuth(jwt, logger)) + { + // User + strictAuthRouter.GET("/info", userHandler.Info) + strictAuthRouter.POST("/logout", userHandler.Logout) + strictAuthRouter.PATCH("/modify_password", userHandler.UpdatePassword) + // Category + strictAuthRouter.GET("/category", categoryHandler.List) + strictAuthRouter.POST("/category", categoryHandler.Create) + strictAuthRouter.PUT("/category/update", categoryHandler.Update) + strictAuthRouter.GET("/category/:id", categoryHandler.Detail) + strictAuthRouter.DELETE("/category/:id", categoryHandler.Delete) + // Site + strictAuthRouter.GET("/site", siteHandler.List) + strictAuthRouter.GET("/site/sync/:id", siteHandler.SyncSite) + strictAuthRouter.POST("/site", siteHandler.Create) + strictAuthRouter.DELETE("/site/:id", siteHandler.Delete) + strictAuthRouter.PUT("/site/:id", siteHandler.Update) + } + } + + return s +} diff --git a/internal/service/category/create.go b/internal/service/category/create.go new file mode 100644 index 0000000..bf76984 --- /dev/null +++ b/internal/service/category/create.go @@ -0,0 +1,39 @@ +/** + * @Author: chentong + * @Date: 2024/05/27 上午11:14 + */ + +package category + +import ( + "context" + + v1 "github.com/ch3nnn/webstack-go/api/v1" + "github.com/ch3nnn/webstack-go/internal/dal/model" +) + +func (s *service) Create(ctx context.Context, req *v1.CategoryCreateReq) (*v1.CategoryCreateResp, error) { + category, err := s.categoryRepo.WithContext(ctx). + Create(&model.StCategory{ + ParentID: req.ParentID, + Title: req.Name, + Icon: req.Icon, + Level: req.Level, + IsUsed: false, + }) + if err != nil { + return nil, err + } + + return &v1.CategoryCreateResp{Category: v1.Category{ + ID: category.ID, + ParentID: category.ParentID, + Sort: category.Sort, + Title: category.Title, + Icon: category.Icon, + CreatedAt: category.CreatedAt, + UpdatedAt: category.UpdatedAt, + IsUsed: category.IsUsed, + Level: category.Level, + }}, nil +} diff --git a/internal/service/category/delete.go b/internal/service/category/delete.go new file mode 100644 index 0000000..d30b229 --- /dev/null +++ b/internal/service/category/delete.go @@ -0,0 +1,16 @@ +/** + * @Author: chentong + * @Date: 2024/05/27 下午5:48 + */ + +package category + +import ( + "context" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (s *service) Delete(ctx context.Context, req *v1.CategoryDeleteReq) (*v1.CategoryDeleteResp, error) { + return nil, s.categoryRepo.WithContext(ctx).Delete(s.categoryRepo.WhereByID(req.ID)) +} diff --git a/internal/service/category/detail.go b/internal/service/category/detail.go new file mode 100644 index 0000000..54a7471 --- /dev/null +++ b/internal/service/category/detail.go @@ -0,0 +1,26 @@ +/** + * @Author: chentong + * @Date: 2024/05/27 上午11:03 + */ + +package category + +import ( + "context" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (s *service) Detail(ctx context.Context, req *v1.CategoryDetailReq) (*v1.CategoryDetailResp, error) { + category, err := s.categoryRepo.WithContext(ctx).FindOne(s.categoryRepo.WhereByID(req.ID)) + if err != nil { + return nil, err + } + + return &v1.CategoryDetailResp{ + Id: category.ID, + Pid: category.ParentID, + Name: category.Title, + Icon: category.Icon, + }, err +} diff --git a/internal/service/category/list.go b/internal/service/category/list.go new file mode 100644 index 0000000..05bb7db --- /dev/null +++ b/internal/service/category/list.go @@ -0,0 +1,35 @@ +/** + * @Author: chentong + * @Date: 2024/05/27 上午10:23 + */ + +package category + +import ( + "context" + + v1 "github.com/ch3nnn/webstack-go/api/v1" + "github.com/ch3nnn/webstack-go/internal/dal/query" +) + +func (s *service) List(ctx context.Context, _ *v1.CategoryListReq) (*v1.CategoryListResp, error) { + categories, err := s.categoryRepo.WithContext(ctx).FindAllOrderBySort(query.StCategory.Sort.Abs()) + if err != nil { + return nil, err + } + + categoryList := make([]v1.CategoryList, len(categories)) + for i, category := range categories { + categoryList[i] = v1.CategoryList{ + Id: category.ID, + Pid: category.ParentID, + Name: category.Title, + Icon: category.Icon, + IsUsed: category.IsUsed, + Sort: category.Sort, + Level: category.Level, + } + } + + return &v1.CategoryListResp{List: categoryList}, err +} diff --git a/internal/service/category/service.go b/internal/service/category/service.go new file mode 100644 index 0000000..5613541 --- /dev/null +++ b/internal/service/category/service.go @@ -0,0 +1,40 @@ +/** + * @Author: chentong + * @Date: 2024/05/27 上午10:23 + */ + +package category + +import ( + "context" + + v1 "github.com/ch3nnn/webstack-go/api/v1" + "github.com/ch3nnn/webstack-go/internal/dal/repository" + s "github.com/ch3nnn/webstack-go/internal/service" +) + +var _ Service = (*service)(nil) + +type Service interface { + i() + + Update(ctx context.Context, req *v1.CategoryUpdateReq) (resp *v1.CategoryUpdateResp, err error) + Detail(ctx context.Context, req *v1.CategoryDetailReq) (resp *v1.CategoryDetailResp, err error) + List(ctx context.Context, req *v1.CategoryListReq) (resp *v1.CategoryListResp, err error) + Create(ctx context.Context, req *v1.CategoryCreateReq) (resp *v1.CategoryCreateResp, err error) + Delete(ctx context.Context, req *v1.CategoryDeleteReq) (resp *v1.CategoryDeleteResp, err error) +} + +type service struct { + *s.Service + categoryRepo repository.IStCategoryDao +} + +func NewService(s *s.Service) Service { + return &service{ + Service: s, + categoryRepo: repository.NewStCategoryDao(), + } +} + +func (s *service) i() {} diff --git a/internal/service/category/update.go b/internal/service/category/update.go new file mode 100644 index 0000000..e5d576f --- /dev/null +++ b/internal/service/category/update.go @@ -0,0 +1,59 @@ +/** + * @Author: chentong + * @Date: 2024/06/13 下午11:17 + */ + +package category + +import ( + "context" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (s *service) Update(ctx context.Context, req *v1.CategoryUpdateReq) (*v1.CategoryUpdateResp, error) { + update := make(map[string]any) + + if req.Pid != nil { + update["parent_id"] = req.Pid + } + if req.Icon != nil { + update["icon"] = req.Icon + } + if req.Name != nil { + update["title"] = req.Name + } + if req.Icon != nil { + update["icon"] = req.Icon + } + if req.Sort != nil { + update["sort"] = req.Sort + } + if req.IsUsed != nil { + update["is_used"] = req.IsUsed + } + + _, err := s.categoryRepo.WithContext(ctx).Update(update, s.categoryRepo.WhereByID(req.ID)) + if err != nil { + return nil, err + } + + category, err := s.categoryRepo.WithContext(ctx).FindOne(s.categoryRepo.WhereByID(req.ID)) + if err != nil { + return nil, err + } + + return &v1.CategoryUpdateResp{ + Category: v1.Category{ + ID: category.ID, + ParentID: category.ParentID, + Sort: category.Sort, + Title: category.Title, + Icon: category.Icon, + CreatedAt: category.CreatedAt, + UpdatedAt: category.UpdatedAt, + IsUsed: category.IsUsed, + Level: category.Level, + }, + }, nil +} diff --git a/internal/service/index/Index.go b/internal/service/index/Index.go new file mode 100644 index 0000000..ac4874d --- /dev/null +++ b/internal/service/index/Index.go @@ -0,0 +1,85 @@ +/** + * @Author: chentong + * @Date: 2024/05/26 上午1:52 + */ + +package index + +import ( + "context" + + "golang.org/x/sync/errgroup" + + v1 "github.com/ch3nnn/webstack-go/api/v1" + "github.com/ch3nnn/webstack-go/internal/dal/model" + "github.com/ch3nnn/webstack-go/internal/dal/query" +) + +func buildTree(nodes []*v1.TreeNode, pid int) (treeNodes []*v1.TreeNode) { + for _, node := range nodes { + if node.Pid == pid { + node.Child = buildTree(nodes, node.Id) + treeNodes = append(treeNodes, node) + } + } + return treeNodes +} + +func (s *service) Index(ctx context.Context) (*v1.IndexResponseData, error) { + var ( + g errgroup.Group + sites []*model.StSite + categories []*model.StCategory + ) + + g.Go(func() (err error) { + categories, err = s.categoryRepo.WithContext(ctx).FindAllOrderBySort(query.StCategory.Sort.Abs(), s.categoryRepo.WhereByIsUsed(true)) + if err != nil { + return err + } + return nil + }) + + g.Go(func() (err error) { + sites, err = s.siteRepo.WithContext(ctx).FindAll(s.siteRepo.WhereByIsUsed(true)) + if err != nil { + return err + } + + return nil + }) + + if err := g.Wait(); err != nil { + return nil, err + } + + nodes := make([]*v1.TreeNode, len(categories)) + for i, category := range categories { + nodes[i] = &v1.TreeNode{ + Id: category.ID, + Pid: category.ParentID, + Name: category.Title, + Icon: category.Icon, + Child: nil, + } + } + + categorySites := make([]*v1.CategorySite, len(categories)) + for i, category := range categories { + var siteList []model.StSite + for _, st := range sites { + if category.ID == st.CategoryID { + siteList = append(siteList, *st) + } + } + categorySites[i] = &v1.CategorySite{ + Category: category.Title, + SiteList: siteList, + } + } + + return &v1.IndexResponseData{ + CategoryTree: buildTree(nodes, 0), + CategorySites: categorySites, + }, nil +} diff --git a/internal/service/index/service.go b/internal/service/index/service.go new file mode 100644 index 0000000..faf1737 --- /dev/null +++ b/internal/service/index/service.go @@ -0,0 +1,37 @@ +/** + * @Author: chentong + * @Date: 2024/05/26 上午1:48 + */ + +package index + +import ( + "context" + + v1 "github.com/ch3nnn/webstack-go/api/v1" + "github.com/ch3nnn/webstack-go/internal/dal/repository" + s "github.com/ch3nnn/webstack-go/internal/service" +) + +var _ Service = (*service)(nil) + +type Service interface { + i() + Index(ctx context.Context) (*v1.IndexResponseData, error) +} + +type service struct { + siteRepo repository.IStSiteDao + categoryRepo repository.IStCategoryDao + *s.Service +} + +func NewService(s *s.Service) Service { + return &service{ + Service: s, + siteRepo: repository.NewStSiteDao(), + categoryRepo: repository.NewStCategoryDao(), + } +} + +func (s *service) i() {} diff --git a/internal/service/service.go b/internal/service/service.go new file mode 100644 index 0000000..b1eaca8 --- /dev/null +++ b/internal/service/service.go @@ -0,0 +1,30 @@ +package service + +import ( + "github.com/gin-gonic/gin" + + "github.com/ch3nnn/webstack-go/internal/dal/repository" + "github.com/ch3nnn/webstack-go/pkg/jwt" + "github.com/ch3nnn/webstack-go/pkg/log" +) + +type Service struct { + Logger *log.Logger + Jwt *jwt.JWT + SvcCtx *gin.Engine + Repository *repository.Repository +} + +func NewService( + svcCtx *gin.Engine, + logger *log.Logger, + jwt *jwt.JWT, + repository *repository.Repository, +) *Service { + return &Service{ + Logger: logger, + Jwt: jwt, + SvcCtx: svcCtx, + Repository: repository, + } +} diff --git a/internal/service/site/batchcreate.go b/internal/service/site/batchcreate.go new file mode 100644 index 0000000..eed3ec7 --- /dev/null +++ b/internal/service/site/batchcreate.go @@ -0,0 +1,72 @@ +/** + * @Author: chentong + * @Date: 2024/06/04 下午4:33 + */ + +package site + +import ( + "context" + "strings" + + "golang.org/x/sync/errgroup" + + v1 "github.com/ch3nnn/webstack-go/api/v1" + "github.com/ch3nnn/webstack-go/internal/dal/model" +) + +func (s *service) parseURL(url string) (urls []string) { + for _, u := range strings.Split(url, "\n") { + urls = append(urls, u) + } + + return +} + +func (s *service) BatchCreate(ctx context.Context, req *v1.SiteCreateReq) (*v1.SiteCreateResp, error) { + var failCnt, successCnt int + for _, url := range s.parseURL(req.Url) { + var ( + g errgroup.Group + title, icon, desc string + ) + + url = strings.TrimSpace(url) + + g.Go(func() error { + title = getWebTitle(url) + return nil + }) + g.Go(func() error { + icon = getWebLogoIconByURL(url) + return nil + }) + g.Go(func() error { + desc = getWebDescription(url) + return nil + }) + + if err := g.Wait(); err != nil { + return nil, err + } + + _, err := s.siteRepository.WithContext(ctx).Create(&model.StSite{ + Title: title, + Icon: icon, + Description: desc, + URL: url, + CategoryID: req.CategoryID, + }) + if err != nil { + failCnt++ + continue + } + + successCnt++ + } + + return &v1.SiteCreateResp{ + FailCount: failCnt, + SuccessCount: successCnt, + }, nil +} diff --git a/internal/service/site/delete.go b/internal/service/site/delete.go new file mode 100644 index 0000000..587cba1 --- /dev/null +++ b/internal/service/site/delete.go @@ -0,0 +1,21 @@ +/** + * @Author: chentong + * @Date: 2024/06/10 上午12:20 + */ + +package site + +import ( + "context" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (s *service) Delete(ctx context.Context, req *v1.SiteDeleteReq) (resp *v1.SiteDeleteResp, err error) { + err = s.siteRepository.WithContext(ctx).Delete(s.siteRepository.WhereByID(req.ID)) + if err != nil { + return nil, err + } + + return &v1.SiteDeleteResp{ID: req.ID}, nil +} diff --git a/internal/service/site/list.go b/internal/service/site/list.go new file mode 100644 index 0000000..12ceda5 --- /dev/null +++ b/internal/service/site/list.go @@ -0,0 +1,52 @@ +/** + * @Author: chentong + * @Date: 2024/05/27 下午5:58 + */ + +package site + +import ( + "context" + "time" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (s *service) List(ctx context.Context, req *v1.SiteListReq) (resp *v1.SiteListResp, err error) { + sites, count, err := s.siteRepository.WithContext(ctx).FindPage(req.Page, req.PageSize, nil, s.siteRepository.LikeInByTitleOrDescOrURL(req.Search)) + if err != nil { + return nil, err + } + + list := make([]v1.Site, len(sites)) + for i, site := range sites { + + var categoryName string + category, _ := s.categoryRepository.WithContext(ctx).FindOne(s.categoryRepository.WhereByID(site.CategoryID)) + if category != nil { + categoryName = category.Title + } + + list[i] = v1.Site{ + Id: site.ID, + Thumb: site.Icon, + Title: site.Title, + Url: site.URL, + Category: categoryName, + CategoryId: site.CategoryID, + Description: site.Description, + IsUsed: site.IsUsed, + CreatedAt: site.CreatedAt.Format(time.DateTime), + UpdatedAt: site.UpdatedAt.Format(time.DateTime), + } + } + + return &v1.SiteListResp{ + List: list, + Pagination: v1.SiteLisPagination{ + Total: count, + CurrentPage: req.Page, + PerPageCount: req.PageSize, + }, + }, err +} diff --git a/internal/service/site/service.go b/internal/service/site/service.go new file mode 100644 index 0000000..0bf60e9 --- /dev/null +++ b/internal/service/site/service.go @@ -0,0 +1,131 @@ +/** + * @Author: chentong + * @Date: 2024/05/27 下午5:56 + */ + +package site + +import ( + "context" + "crypto/tls" + "fmt" + "io" + "io/ioutil" + "net/http" + "os" + "path" + "path/filepath" + + "github.com/duke-git/lancet/v2/random" + "github.com/gin-gonic/gin" + "github.com/gocolly/colly" + "github.com/mat/besticon/besticon" + + v1 "github.com/ch3nnn/webstack-go/api/v1" + "github.com/ch3nnn/webstack-go/internal/dal/repository" + s "github.com/ch3nnn/webstack-go/internal/service" + "github.com/ch3nnn/webstack-go/pkg/tools" +) + +// Service 层 +var _ Service = (*service)(nil) + +type Service interface { + i() + + List(ctx context.Context, req *v1.SiteListReq) (resp *v1.SiteListResp, err error) + Delete(ctx context.Context, req *v1.SiteDeleteReq) (resp *v1.SiteDeleteResp, err error) + Update(ctx *gin.Context, req *v1.SiteUpdateReq) (resp *v1.SiteUpdateResp, err error) + BatchCreate(ctx context.Context, req *v1.SiteCreateReq) (resp *v1.SiteCreateResp, err error) + Sync(ctx *gin.Context, req *v1.SiteSyncReq) (resp *v1.SiteSyncResp, err error) +} + +type service struct { + *s.Service + siteRepository repository.IStSiteDao + categoryRepository repository.IStCategoryDao +} + +func NewService(s *s.Service) Service { + return &service{ + Service: s, + siteRepository: repository.NewStSiteDao(), + categoryRepository: repository.NewStCategoryDao(), + } +} + +func (s *service) i() {} + +// ----------------------------------------------------------------------------------------------------------------------------------------- + +const defaultIcon = "/upload/favicon.png" + +func getWebLogoIconByURL(url string) string { + client := &http.Client{ + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + }, + } + + b := besticon.New( + besticon.WithLogger(besticon.NewDefaultLogger(ioutil.Discard)), // disable verbose logging + besticon.WithHTTPClient(client), + ) + + icons, err := b.NewIconFinder().FetchIcons(url) + if err != nil || len(icons) == 0 { + return defaultIcon + } + + // get picture format + var format string + if ext := filepath.Ext(icons[0].URL); ext != "" { + format = ext[1:] + } + + // image save static resource directory + dst := path.Join("upload", fmt.Sprintf("%s.%s", random.RandNumeralOrLetter(6), format)) + file, err := os.Create(filepath.Join("web", dst)) + if err != nil { + return defaultIcon + } + defer file.Close() + + response, err := client.Get(icons[0].URL) + if err != nil { + return defaultIcon + } + defer response.Body.Close() + + if _, err := io.Copy(file, response.Body); err != nil { + return defaultIcon + } + + return filepath.Join("/", dst) +} + +func getWebTitle(url string) (title string) { + c := tools.NewColly() + c.OnHTML("title", func(e *colly.HTMLElement) { + title += e.Text + }) + if err := c.Visit(url); err != nil { + return + } + + return +} + +func getWebDescription(url string) (doc string) { + c := tools.NewColly() + c.OnXML("//meta[@name='description']/@content|//meta[@name='Description']/@content|//meta[@name='DESCRIPTION']", + func(e *colly.XMLElement) { + doc += e.Text + }, + ) + if err := c.Visit(url); err != nil { + return + } + + return +} diff --git a/internal/service/site/sync.go b/internal/service/site/sync.go new file mode 100644 index 0000000..23cabb0 --- /dev/null +++ b/internal/service/site/sync.go @@ -0,0 +1,34 @@ +/** + * @Author: chentong + * @Date: 2024/11/12 16:40 + */ + +package site + +import ( + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" + "github.com/ch3nnn/webstack-go/internal/dal/model" +) + +func (s *service) Sync(ctx *gin.Context, req *v1.SiteSyncReq) (resp *v1.SiteSyncResp, err error) { + site, err := s.siteRepository.WithContext(ctx).FindOne(s.siteRepository.WhereByID(req.ID)) + if err != nil { + return nil, err + } + + _, err = s.siteRepository.WithContext(ctx).Update(&model.StSite{ + Title: getWebTitle(site.URL), + Icon: getWebLogoIconByURL(site.URL), + Description: getWebDescription(site.URL), + IsUsed: false, + }, + s.siteRepository.WhereByID(req.ID), + ) + if err != nil { + return nil, err + } + + return &v1.SiteSyncResp{ID: site.ID}, nil +} diff --git a/internal/service/site/update.go b/internal/service/site/update.go new file mode 100644 index 0000000..0403450 --- /dev/null +++ b/internal/service/site/update.go @@ -0,0 +1,66 @@ +/** + * @Author: chentong + * @Date: 2024/06/30 下午10:14 + */ + +package site + +import ( + "path/filepath" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func IconPath(ctx *gin.Context, req *v1.SiteUpdateReq) string { + // 修改操作是否手动上传 logo 图片 + if req.File != nil { + return getWebLogoIconUrlByUploadImg(ctx) + } + + if req.Icon == nil { + return "" + } + + return *req.Icon +} + +func getWebLogoIconUrlByUploadImg(ctx *gin.Context) string { + file, _ := ctx.FormFile("file") + dst := filepath.Join("upload", file.Filename) // 上传静态文件 url + if err := ctx.SaveUploadedFile(file, filepath.Join("web", dst)); err != nil { + return "" + } + return filepath.Join("/", dst) +} + +func (s *service) Update(ctx *gin.Context, req *v1.SiteUpdateReq) (resp *v1.SiteUpdateResp, err error) { + update := make(map[string]any) + + if req.CategoryId != nil { + update["CategoryID"] = req.CategoryId + } + if req.Title != nil { + update["Title"] = req.Title + } + if req.Icon != nil { + update["Icon"] = IconPath(ctx, req) + } + if req.Description != nil { + update["Description"] = req.Description + } + if req.Url != nil { + update["Url"] = req.Url + } + if req.IsUsed != nil { + update["IsUsed"] = req.IsUsed + } + + _, err = s.siteRepository.WithContext(ctx).Update(update, s.siteRepository.WhereByID(req.Id)) + if err != nil { + return nil, err + } + + return &v1.SiteUpdateResp{ID: req.Id}, nil +} diff --git a/internal/service/user/info.go b/internal/service/user/info.go new file mode 100644 index 0000000..b4bf252 --- /dev/null +++ b/internal/service/user/info.go @@ -0,0 +1,74 @@ +/** + * @Author: chentong + * @Date: 2024/05/26 下午3:51 + */ + +package user + +import ( + "github.com/gin-gonic/gin" + "golang.org/x/sync/errgroup" + + v1 "github.com/ch3nnn/webstack-go/api/v1" + "github.com/ch3nnn/webstack-go/internal/dal/model" + "github.com/ch3nnn/webstack-go/internal/middleware" +) + +func (s *service) Info(ctx *gin.Context, _ *v1.InfoReq) (*v1.InfoResp, error) { + var ( + g errgroup.Group + user *model.SysUser + menus []*model.SysMenu + adminMenus []*model.SysUserMenu + ) + + g.Go(func() (err error) { + user, err = s.userRepo.WithContext(ctx).FindOne(s.userRepo.WhereByID(ctx.GetInt(middleware.UserID))) + if err != nil { + return err + } + return nil + }) + + g.Go(func() (err error) { + menus, err = s.menuRepo.WithContext(ctx).FindAll() + if err != nil { + return err + } + + return nil + }) + + g.Go(func() (err error) { + adminMenus, err = s.adminMenuRepo.WithContext(ctx).FindAll(s.adminMenuRepo.WhereByUserID(ctx.GetInt(middleware.UserID))) + if err != nil { + return err + } + + return nil + }) + + if err := g.Wait(); err != nil { + return nil, err + } + + var menuList []v1.Menu + for _, menu := range menus { + for _, adminMenu := range adminMenus { + if menu.ID == adminMenu.MenuID { + menuList = append(menuList, v1.Menu{ + Id: menu.ID, + Pid: menu.Pid, + Name: menu.Name, + Link: menu.Link, + Icon: menu.Icon, + }) + } + } + } + + return &v1.InfoResp{ + Username: user.Username, + Menus: menuList, + }, nil +} diff --git a/internal/service/user/login.go b/internal/service/user/login.go new file mode 100644 index 0000000..1cb7c15 --- /dev/null +++ b/internal/service/user/login.go @@ -0,0 +1,31 @@ +/** + * @Author: chentong + * @Date: 2024/05/26 上午12:27 + */ + +package user + +import ( + "context" + "time" + + v1 "github.com/ch3nnn/webstack-go/api/v1" +) + +func (s *service) Login(ctx context.Context, req *v1.LoginReq) (resp *v1.LoginResp, err error) { + user, err := s.userRepo.WithContext(ctx). + FindOne( + s.userRepo.WhereByUsername(req.Username), + s.userRepo.WhereByPassword(req.Password), + ) + if err != nil { + return nil, v1.ErrorUserNameAndPassword + } + + token, err := s.Jwt.GenToken(user.ID, time.Now().Add(time.Hour*24)) + if err != nil { + return nil, v1.ErrorTokenGeneration + } + + return &v1.LoginResp{Token: token}, nil +} diff --git a/internal/service/user/service.go b/internal/service/user/service.go new file mode 100644 index 0000000..e173122 --- /dev/null +++ b/internal/service/user/service.go @@ -0,0 +1,48 @@ +/** + * @Author: chentong + * @Date: 2024/05/26 上午12:26 + */ + +package user + +import ( + "context" + + "github.com/gin-gonic/gin" + + v1 "github.com/ch3nnn/webstack-go/api/v1" + "github.com/ch3nnn/webstack-go/internal/dal/repository" + s "github.com/ch3nnn/webstack-go/internal/service" +) + +var _ Service = (*service)(nil) + +type Service interface { + i() + + Info(ctx *gin.Context, req *v1.InfoReq) (*v1.InfoResp, error) + Login(ctx context.Context, req *v1.LoginReq) (resp *v1.LoginResp, err error) + UpdatePassword(ctx *gin.Context, req *v1.UpdatePasswordReq) (*v1.UpdatePasswordResp, error) +} + +type service struct { + *s.Service + userRepo repository.ISysUserDao + siteRepo repository.IStSiteDao + categoryRepo repository.IStCategoryDao + menuRepo repository.ISysMenuDao + adminMenuRepo repository.ISysUserMenuDao +} + +func NewService(s *s.Service) Service { + return &service{ + Service: s, + userRepo: repository.NewSysUserDao(), + siteRepo: repository.NewStSiteDao(), + categoryRepo: repository.NewStCategoryDao(), + menuRepo: repository.NewSysMenuDao(), + adminMenuRepo: repository.NewSysUserMenuDao(), + } +} + +func (s *service) i() {} diff --git a/internal/service/user/updatepassword.go b/internal/service/user/updatepassword.go new file mode 100644 index 0000000..ce668d0 --- /dev/null +++ b/internal/service/user/updatepassword.go @@ -0,0 +1,38 @@ +/** + * @Author: chentong + * @Date: 2024/11/11 18:40 + */ + +package user + +import ( + "errors" + + "github.com/gin-gonic/gin" + "gorm.io/gorm" + + v1 "github.com/ch3nnn/webstack-go/api/v1" + "github.com/ch3nnn/webstack-go/internal/dal/model" + "github.com/ch3nnn/webstack-go/internal/middleware" +) + +func (s *service) UpdatePassword(ctx *gin.Context, req *v1.UpdatePasswordReq) (*v1.UpdatePasswordResp, error) { + user, err := s.userRepo.WithContext(ctx). + FindOne( + s.userRepo.WhereByID(ctx.GetInt(middleware.UserID)), + s.userRepo.WhereByPassword(req.OldPassword), + ) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, errors.Join(errors.New("用户ID"), v1.ErrNotFound) + } + return nil, err + } + + _, err = s.userRepo.WithContext(ctx).Update(&model.SysUser{Password: req.NewPassword}, s.userRepo.WhereByID(user.ID)) + if err != nil { + return nil, err + } + + return &v1.UpdatePasswordResp{}, nil +} diff --git a/internal/services/admin/service.go b/internal/services/admin/service.go deleted file mode 100755 index 15bb485..0000000 --- a/internal/services/admin/service.go +++ /dev/null @@ -1,43 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -var _ Service = (*service)(nil) - -type Service interface { - i() - - Create(ctx core.Context, adminData *CreateAdminData) (id int64, err error) - PageList(ctx core.Context, searchData *SearchData) (admins []*model.Admin, err error) - PageListCount(ctx core.Context, searchData *SearchData) (total int64, err error) - UpdateUsed(ctx core.Context, id, used int64) (err error) - Delete(ctx core.Context, id int64) (err error) - Detail(ctx core.Context, searchOneData *SearchOneData) (info *model.Admin, err error) - ResetPassword(ctx core.Context, id int64) (err error) - ModifyPassword(ctx core.Context, id int64, newPassword string) (err error) - ModifyPersonalInfo(ctx core.Context, id int64, modifyData *ModifyData) (err error) - - CreateMenu(ctx core.Context, menuData *CreateMenuData) (err error) - ListMenu(ctx core.Context, searchData *SearchListMenuData) (menuData []ListMenuData, err error) - MyMenu(ctx core.Context, searchData *SearchMyMenuData) (menuData []ListMyMenuData, err error) - MyAction(ctx core.Context, searchData *SearchMyActionData) (actionData []MyActionData, err error) -} - -type service struct { - db mysql.Repo - cache redis.Repo -} - -func New(db mysql.Repo, cache redis.Repo) Service { - return &service{ - db: db, - cache: cache, - } -} - -func (s *service) i() {} diff --git a/internal/services/admin/service_create.go b/internal/services/admin/service_create.go deleted file mode 100755 index 9eee34a..0000000 --- a/internal/services/admin/service_create.go +++ /dev/null @@ -1,31 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/password" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type CreateAdminData struct { - Username string // 用户名 - Nickname string // 昵称 - Mobile string // 手机号 - Password string // 密码 -} - -func (s *service) Create(ctx core.Context, adminData *CreateAdminData) (id int64, err error) { - err = query.Admin.WithContext(ctx.RequestContext()).Create(&model.Admin{ - Username: adminData.Username, - Password: password.GeneratePassword(adminData.Password), - Nickname: adminData.Nickname, - Mobile: adminData.Mobile, - IsUsed: 1, - IsDeleted: -1, - }) - if err != nil { - return 0, err - } - - return -} diff --git a/internal/services/admin/service_createmenu.go b/internal/services/admin/service_createmenu.go deleted file mode 100755 index 047f874..0000000 --- a/internal/services/admin/service_createmenu.go +++ /dev/null @@ -1,36 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "github.com/spf13/cast" - "strings" -) - -type CreateMenuData struct { - AdminId int64 `form:"admin_id"` // AdminID - Actions string `form:"actions"` // 功能权限ID,多个用,分割 -} - -func (s *service) CreateMenu(ctx core.Context, menuData *CreateMenuData) (err error) { - if _, err = query.AdminMenu.WithContext(ctx.RequestContext()). - Where(query.AdminMenu.AdminID.Eq(menuData.AdminId)). - Delete(); err != nil { - return err - } - - menus := make([]*model.AdminMenu, 0, 10) - for _, v := range strings.Split(menuData.Actions, ",") { - menus = append(menus, &model.AdminMenu{ - AdminID: menuData.AdminId, - MenuID: cast.ToInt64(v), - CreatedUser: ctx.SessionUserInfo().UserName, - }) - } - if err = query.AdminMenu.CreateInBatches(menus, len(menus)); err != nil { - return err - } - - return -} diff --git a/internal/services/admin/service_delete.go b/internal/services/admin/service_delete.go deleted file mode 100755 index 1d91904..0000000 --- a/internal/services/admin/service_delete.go +++ /dev/null @@ -1,22 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/password" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -func (s *service) Delete(ctx core.Context, id int64) (err error) { - if _, err = query.Admin.WithContext(ctx.RequestContext()). - Where(query.Admin.ID.Eq(id)). - UpdateColumnSimple(query.Admin.IsDeleted.Value(1), - query.Admin.UpdatedUser.Value(ctx.SessionUserInfo().UserName), - ); err != nil { - return err - } - - s.cache.Del(configs.RedisKeyPrefixLoginUser+password.GenerateLoginToken(id), redis.WithTrace(ctx.Trace())) - return -} diff --git a/internal/services/admin/service_detail.go b/internal/services/admin/service_detail.go deleted file mode 100755 index f2574da..0000000 --- a/internal/services/admin/service_detail.go +++ /dev/null @@ -1,52 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type SearchOneData struct { - Id int64 // 用户ID - Username string // 用户名 - Nickname string // 昵称 - Mobile string // 手机号 - Password string // 密码 - IsUsed int64 // 是否启用 1:是 -1:否 -} - -func (s *service) Detail(ctx core.Context, searchOneData *SearchOneData) (info *model.Admin, err error) { - iAdminDo := query.Admin.WithContext(ctx.RequestContext()) - iAdminDo = iAdminDo.Where(query.Admin.IsDeleted.Eq(-1)) - - if searchOneData.Id != 0 { - iAdminDo = iAdminDo.Where(query.Admin.ID.Eq(searchOneData.Id)) - } - - if searchOneData.Username != "" { - iAdminDo = iAdminDo.Where(query.Admin.Username.Eq(searchOneData.Username)) - } - - if searchOneData.Nickname != "" { - iAdminDo = iAdminDo.Where(query.Admin.Nickname.Eq(searchOneData.Nickname)) - } - - if searchOneData.Mobile != "" { - iAdminDo = iAdminDo.Where(query.Admin.Mobile.Eq(searchOneData.Mobile)) - } - - if searchOneData.Password != "" { - iAdminDo = iAdminDo.Where(query.Admin.Password.Eq(searchOneData.Password)) - } - - if searchOneData.IsUsed != 0 { - iAdminDo = iAdminDo.Where(query.Admin.IsUsed.Eq(searchOneData.IsUsed)) - } - - info, err = iAdminDo.First() - if err != nil { - return nil, err - } - - return -} diff --git a/internal/services/admin/service_listmenu.go b/internal/services/admin/service_listmenu.go deleted file mode 100755 index 3ce73e0..0000000 --- a/internal/services/admin/service_listmenu.go +++ /dev/null @@ -1,64 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type SearchListMenuData struct { - AdminId int64 `json:"admin_id"` // 管理员ID -} - -type ListMenuData struct { - Id int64 `json:"id"` // ID - Pid int64 `json:"pid"` // 父类ID - Name string `json:"name"` // 菜单名称 - IsHave int64 `json:"is_have"` // 是否已拥有权限 -} - -func (s *service) ListMenu(ctx core.Context, searchData *SearchListMenuData) (menuData []ListMenuData, err error) { - menus, err := query.Menu.WithContext(ctx.RequestContext()). - Where(query.Menu.IsDeleted.Eq(-1)). - Order(query.Menu.Sort). - Find() - if err != nil { - return nil, err - } - - if len(menus) <= 0 { - return - } - - menuData = make([]ListMenuData, len(menus)) - for k, v := range menus { - menuData[k] = ListMenuData{ - Id: v.ID, - Pid: v.Pid, - Name: v.Name, - IsHave: 0, - } - } - - iAdminMenuDo := query.AdminMenu.WithContext(ctx.RequestContext()) - if searchData.AdminId != 0 { - iAdminMenuDo = iAdminMenuDo.Where(query.AdminMenu.AdminID.Eq(searchData.AdminId)) - } - adminMenus, err := iAdminMenuDo.Order(query.AdminMenu.ID.Desc()).Find() - if err != nil { - return nil, err - } - - if len(adminMenus) <= 0 { - return - } - - for k, v := range menuData { - for _, haveV := range adminMenus { - if haveV.MenuID == v.Id { - menuData[k].IsHave = 1 - } - } - } - - return -} diff --git a/internal/services/admin/service_modifypassword.go b/internal/services/admin/service_modifypassword.go deleted file mode 100755 index a44847b..0000000 --- a/internal/services/admin/service_modifypassword.go +++ /dev/null @@ -1,24 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/password" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -func (s *service) ModifyPassword(ctx core.Context, id int64, newPassword string) (err error) { - - if _, err = query.Admin.WithContext(ctx.RequestContext()). - Where(query.Admin.ID.Eq(id)). - UpdateColumnSimple( - query.Admin.Password.Value(password.GeneratePassword(newPassword)), - query.Admin.UpdatedUser.Value(ctx.SessionUserInfo().UserName), - ); err != nil { - return err - } - - s.cache.Del(configs.RedisKeyPrefixLoginUser+password.GenerateLoginToken(id), redis.WithTrace(ctx.Trace())) - return -} diff --git a/internal/services/admin/service_modifypersonalinfo.go b/internal/services/admin/service_modifypersonalinfo.go deleted file mode 100755 index 17b5537..0000000 --- a/internal/services/admin/service_modifypersonalinfo.go +++ /dev/null @@ -1,26 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type ModifyData struct { - Nickname string // 昵称 - Mobile string // 手机号 -} - -func (s *service) ModifyPersonalInfo(ctx core.Context, id int64, modifyData *ModifyData) (err error) { - - if _, err = query.Admin.WithContext(ctx.RequestContext()). - Where(query.Admin.ID.Eq(id)). - UpdateColumnSimple( - query.Admin.Nickname.Value(modifyData.Nickname), - query.Admin.Mobile.Value(modifyData.Mobile), - query.Admin.UpdatedUser.Value(ctx.SessionUserInfo().UserName), - ); err != nil { - return err - } - - return -} diff --git a/internal/services/admin/service_myaction.go b/internal/services/admin/service_myaction.go deleted file mode 100755 index e54ca9e..0000000 --- a/internal/services/admin/service_myaction.go +++ /dev/null @@ -1,60 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type SearchMyActionData struct { - AdminId int64 `json:"admin_id"` // 管理员ID -} - -type MyActionData struct { - Id int64 // 主键 - MenuId int64 // 菜单栏ID - Method string // 请求方式 - Api string // 请求地址 -} - -func (s *service) MyAction(ctx core.Context, searchData *SearchMyActionData) (actionData []MyActionData, err error) { - iAdminMenuDo := query.AdminMenu.WithContext(ctx.RequestContext()) - if searchData.AdminId != 0 { - iAdminMenuDo = iAdminMenuDo.Where(query.AdminMenu.AdminID.Eq(searchData.AdminId)) - } - adminMenus, err := iAdminMenuDo.Order(query.AdminMenu.ID.Desc()).Find() - if err != nil { - return nil, err - } - if len(adminMenus) <= 0 { - return - } - - var menuIds []int64 - for _, v := range adminMenus { - menuIds = append(menuIds, v.MenuID) - } - - menuActions, err := query.MenuAction.WithContext(ctx.RequestContext()). - Where(query.MenuAction.IsDeleted.Eq(-1)). - Where(query.MenuAction.ID.In(menuIds...)). - Find() - if err != nil { - return nil, err - } - - if len(menuActions) <= 0 { - return - } - - actionData = make([]MyActionData, len(menuActions)) - for k, v := range menuActions { - actionData[k] = MyActionData{ - Id: v.ID, - MenuId: v.MenuID, - Method: v.Method, - Api: v.API, - } - } - - return -} diff --git a/internal/services/admin/service_mymenu.go b/internal/services/admin/service_mymenu.go deleted file mode 100755 index a14ab14..0000000 --- a/internal/services/admin/service_mymenu.go +++ /dev/null @@ -1,61 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type SearchMyMenuData struct { - AdminId int64 `json:"admin_id"` // 管理员ID -} - -type ListMyMenuData struct { - Id int64 `json:"id"` // ID - Pid int64 `json:"pid"` // 父类ID - Name string `json:"name"` // 菜单名称 - Link string `json:"link"` // 链接地址 - Icon string `json:"icon"` // 图标 -} - -func (s *service) MyMenu(ctx core.Context, searchData *SearchMyMenuData) (menuData []ListMyMenuData, err error) { - iAdminMenuDo := query.AdminMenu.WithContext(ctx.RequestContext()) - if searchData.AdminId != 0 { - iAdminMenuDo = iAdminMenuDo.Where(query.AdminMenu.AdminID.Eq(searchData.AdminId)) - } - adminMenus, err := iAdminMenuDo.Order(query.AdminMenu.ID.Desc()).Find() - if err != nil { - return nil, err - } - - if len(adminMenus) <= 0 { - return - } - - menus, err := query.Menu.WithContext(ctx.RequestContext()). - Where(query.Menu.IsDeleted.Eq(-1)). - Order(query.Menu.Sort). - Find() - if err != nil { - return nil, err - } - - if len(menus) <= 0 { - return - } - - for _, menu := range menus { - for _, adminMenu := range adminMenus { - if menu.ID == adminMenu.MenuID { - menuData = append(menuData, ListMyMenuData{ - Id: menu.ID, - Pid: menu.Pid, - Name: menu.Name, - Link: menu.Link, - Icon: menu.Icon, - }) - } - } - } - - return -} diff --git a/internal/services/admin/service_pagelist.go b/internal/services/admin/service_pagelist.go deleted file mode 100755 index 550a104..0000000 --- a/internal/services/admin/service_pagelist.go +++ /dev/null @@ -1,38 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type SearchData struct { - Page int64 // 第几页 - PageSize int64 // 每页显示条数 - Username string // 用户名 - Nickname string // 昵称 - Mobile string // 手机号 -} - -func (s *service) PageList(ctx core.Context, searchData *SearchData) (admins []*model.Admin, err error) { - - iAdminDo := query.Admin.WithContext(ctx.RequestContext()) - iAdminDo = iAdminDo.Where(query.Admin.IsDeleted.Eq(-1)) - if searchData.Username != "" { - iAdminDo = iAdminDo.Where(query.Admin.Username.Eq(searchData.Username)) - } - if searchData.Nickname != "" { - iAdminDo = iAdminDo.Where(query.Admin.Nickname.Eq(searchData.Nickname)) - } - if searchData.Mobile != "" { - iAdminDo = iAdminDo.Where(query.Admin.Mobile.Eq(searchData.Mobile)) - } - - admins, _, err = iAdminDo.Order(query.Admin.ID.Desc()). - FindByPage(int((searchData.Page-1)*searchData.PageSize), int(searchData.PageSize)) - if err != nil { - return nil, err - } - - return -} diff --git a/internal/services/admin/service_pagelistcount.go b/internal/services/admin/service_pagelistcount.go deleted file mode 100755 index 17f28ce..0000000 --- a/internal/services/admin/service_pagelistcount.go +++ /dev/null @@ -1,31 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) PageListCount(ctx core.Context, searchData *SearchData) (total int64, err error) { - - iAdminDo := query.Admin.WithContext(ctx.RequestContext()) - iAdminDo = iAdminDo.Where(query.Admin.IsDeleted.Eq(-1)) - - if searchData.Username != "" { - iAdminDo.Where(query.Admin.Username.Eq(searchData.Username)) - } - - if searchData.Nickname != "" { - iAdminDo.Where(query.Admin.Nickname.Eq(searchData.Nickname)) - } - - if searchData.Mobile != "" { - iAdminDo.Where(query.Admin.Mobile.Eq(searchData.Mobile)) - } - - total, err = iAdminDo.Count() - if err != nil { - return 0, err - } - - return -} diff --git a/internal/services/admin/service_resetpassword.go b/internal/services/admin/service_resetpassword.go deleted file mode 100755 index 21c6968..0000000 --- a/internal/services/admin/service_resetpassword.go +++ /dev/null @@ -1,23 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/password" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -func (s *service) ResetPassword(ctx core.Context, id int64) (err error) { - if _, err = query.Admin.WithContext(ctx.RequestContext()). - Where(query.Admin.ID.Eq(id)). - UpdateColumnSimple( - query.Admin.Password.Value(password.ResetPassword()), - query.Admin.UpdatedUser.Value(ctx.SessionUserInfo().UserName), - ); err != nil { - return err - } - - s.cache.Del(configs.RedisKeyPrefixLoginUser+password.GenerateLoginToken(id), redis.WithTrace(ctx.Trace())) - return -} diff --git a/internal/services/admin/service_updateused.go b/internal/services/admin/service_updateused.go deleted file mode 100755 index f95d482..0000000 --- a/internal/services/admin/service_updateused.go +++ /dev/null @@ -1,23 +0,0 @@ -package admin - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/password" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -func (s *service) UpdateUsed(ctx core.Context, id, used int64) (err error) { - if _, err = query.Admin.WithContext(ctx.RequestContext()). - Where(query.Admin.ID.Eq(id)). - UpdateColumnSimple( - query.Admin.IsUsed.Value(used), - query.Admin.UpdatedUser.Value(ctx.SessionUserInfo().UserName), - ); err != nil { - return err - } - - s.cache.Del(configs.RedisKeyPrefixLoginUser+password.GenerateLoginToken(id), redis.WithTrace(ctx.Trace())) - return -} diff --git a/internal/services/authorized/service.go b/internal/services/authorized/service.go deleted file mode 100755 index 54c1307..0000000 --- a/internal/services/authorized/service.go +++ /dev/null @@ -1,41 +0,0 @@ -package authorized - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -var _ Service = (*service)(nil) - -type Service interface { - i() - - Create(ctx core.Context, authorizedData *CreateAuthorizedData) (id int64, err error) - List(ctx core.Context, searchData *SearchData) (authorizedList []*model.Authorized, err error) - PageList(ctx core.Context, searchData *SearchData) (authorizedList []*model.Authorized, err error) - PageListCount(ctx core.Context, searchData *SearchData) (total int64, err error) - UpdateUsed(ctx core.Context, id, used int64) (err error) - Delete(ctx core.Context, id int64) (err error) - Detail(ctx core.Context, id int64) (authorizedInfo *model.Authorized, err error) - DetailByKey(ctx core.Context, key string) (data *CacheAuthorizedData, err error) - - CreateAPI(ctx core.Context, authorizedAPIData *CreateAuthorizedAPIData) (id int64, err error) - ListAPI(ctx core.Context, searchAPIData *SearchAPIData) (authorizedAPIS []*model.AuthorizedAPI, err error) - DeleteAPI(ctx core.Context, id int64) (err error) -} - -type service struct { - db mysql.Repo - cache redis.Repo -} - -func New(db mysql.Repo, cache redis.Repo) Service { - return &service{ - db: db, - cache: cache, - } -} - -func (s *service) i() {} diff --git a/internal/services/authorized/service_create.go b/internal/services/authorized/service_create.go deleted file mode 100755 index acf867b..0000000 --- a/internal/services/authorized/service_create.go +++ /dev/null @@ -1,37 +0,0 @@ -package authorized - -import ( - "crypto/rand" - "encoding/hex" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "io" -) - -type CreateAuthorizedData struct { - BusinessKey string `json:"business_key"` // 调用方key - BusinessDeveloper string `json:"business_developer"` // 调用方对接人 - Remark string `json:"remark"` // 备注 -} - -func (s *service) Create(ctx core.Context, authorizedData *CreateAuthorizedData) (id int64, err error) { - buf := make([]byte, 10) - io.ReadFull(rand.Reader, buf) - secret := hex.EncodeToString(buf) - - err = query.Authorized.WithContext(ctx.RequestContext()).Create(&model.Authorized{ - BusinessKey: authorizedData.BusinessKey, - BusinessSecret: secret, - BusinessDeveloper: authorizedData.BusinessDeveloper, - Remark: authorizedData.Remark, - IsUsed: 1, - IsDeleted: -1, - CreatedUser: ctx.SessionUserInfo().UserName, - }) - - if err != nil { - return 0, err - } - return -} diff --git a/internal/services/authorized/service_createapi.go b/internal/services/authorized/service_createapi.go deleted file mode 100755 index 0b34f32..0000000 --- a/internal/services/authorized/service_createapi.go +++ /dev/null @@ -1,31 +0,0 @@ -package authorized - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -type CreateAuthorizedAPIData struct { - BusinessKey string `json:"business_key"` // 调用方key - Method string `json:"method"` // 请求方法 - API string `json:"api"` // 请求地址 -} - -func (s *service) CreateAPI(ctx core.Context, authorizedAPIData *CreateAuthorizedAPIData) (id int64, err error) { - err = query.AuthorizedAPI.WithContext(ctx.RequestContext()).Create(&model.AuthorizedAPI{ - BusinessKey: authorizedAPIData.BusinessKey, - Method: authorizedAPIData.Method, - API: authorizedAPIData.API, - IsDeleted: -1, - CreatedUser: ctx.SessionUserInfo().UserName, - }) - if err != nil { - return 0, err - } - - s.cache.Del(configs.RedisKeyPrefixSignature+authorizedAPIData.BusinessKey, redis.WithTrace(ctx.Trace())) - return -} diff --git a/internal/services/authorized/service_delete.go b/internal/services/authorized/service_delete.go deleted file mode 100755 index 85961a4..0000000 --- a/internal/services/authorized/service_delete.go +++ /dev/null @@ -1,34 +0,0 @@ -package authorized - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "gorm.io/gorm" -) - -func (s *service) Delete(ctx core.Context, id int64) (err error) { - // 先查询 id 是否存在 - authorizedInfo, err := query.Authorized.WithContext(ctx.RequestContext()). - Where(query.Authorized.IsDeleted.Eq(-1)). - Where(query.Authorized.ID.Eq(id)). - First() - if err == gorm.ErrRecordNotFound { - return nil - } - - _, err = query.Authorized.WithContext(ctx.RequestContext()). - Where(query.Authorized.ID.Eq(id)). - UpdateColumnSimple( - query.Authorized.IsDeleted.Value(1), - query.Authorized.UpdatedUser.Value(ctx.SessionUserInfo().UserName), - ) - if err != nil { - return err - } - - s.cache.Del(configs.RedisKeyPrefixSignature+authorizedInfo.BusinessKey, redis.WithTrace(ctx.Trace())) - return -} diff --git a/internal/services/authorized/service_deleteapi.go b/internal/services/authorized/service_deleteapi.go deleted file mode 100755 index e5b718c..0000000 --- a/internal/services/authorized/service_deleteapi.go +++ /dev/null @@ -1,34 +0,0 @@ -package authorized - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "gorm.io/gorm" -) - -func (s *service) DeleteAPI(ctx core.Context, id int64) (err error) { - // 先查询 id 是否存在 - authorizedAPI, err := query.AuthorizedAPI.WithContext(ctx.RequestContext()). - Where(query.AuthorizedAPI.IsDeleted.Eq(-1)). - Where(query.AuthorizedAPI.ID.Eq(id)). - First() - if err == gorm.ErrRecordNotFound { - return nil - } - - _, err = query.AuthorizedAPI.WithContext(ctx.RequestContext()). - Where(query.AuthorizedAPI.ID.Eq(id)). - UpdateColumnSimple( - query.AuthorizedAPI.IsDeleted.Value(1), - query.AuthorizedAPI.UpdatedUser.Value(ctx.SessionUserInfo().UserName), - ) - if err != nil { - return err - } - - s.cache.Del(configs.RedisKeyPrefixSignature+authorizedAPI.BusinessKey, redis.WithTrace(ctx.Trace())) - return -} diff --git a/internal/services/authorized/service_detail.go b/internal/services/authorized/service_detail.go deleted file mode 100755 index cff855f..0000000 --- a/internal/services/authorized/service_detail.go +++ /dev/null @@ -1,19 +0,0 @@ -package authorized - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) Detail(ctx core.Context, id int64) (authorizedInfo *model.Authorized, err error) { - authorizedInfo, err = query.Authorized.WithContext(ctx.RequestContext()). - Where(query.Authorized.IsDeleted.Eq(-1)). - Where(query.Authorized.ID.Eq(id)). - First() - if err != nil { - return nil, err - } - - return -} diff --git a/internal/services/authorized/service_detailbykey.go b/internal/services/authorized/service_detailbykey.go deleted file mode 100755 index 440cc2e..0000000 --- a/internal/services/authorized/service_detailbykey.go +++ /dev/null @@ -1,86 +0,0 @@ -package authorized - -import ( - "encoding/json" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -// CacheAuthorizedData 缓存结构 -type CacheAuthorizedData struct { - Key string `json:"key"` // 调用方 key - Secret string `json:"secret"` // 调用方 secret - IsUsed int64 `json:"is_used"` // 调用方启用状态 1=启用 -1=禁用 - Apis []cacheApiData `json:"apis"` // 调用方授权的 Apis -} - -type cacheApiData struct { - Method string `json:"method"` // 请求方式 - Api string `json:"api"` // 请求地址 -} - -func (s *service) DetailByKey(ctx core.Context, key string) (cacheData *CacheAuthorizedData, err error) { - // 查询缓存 - cacheKey := configs.RedisKeyPrefixSignature + key - - if !s.cache.Exists(cacheKey) { - // 查询调用方信息 - authorizedInfo, err := query.Authorized.WithContext(ctx.RequestContext()). - Where(query.Authorized.IsDeleted.Eq(-1)). - Where(query.Authorized.BusinessKey.Eq(key)). - First() - if err != nil { - return nil, err - } - - // 查询调用方授权 API 信息 - authorizedAPIS, err := query.AuthorizedAPI.WithContext(ctx.RequestContext()). - Where(query.AuthorizedAPI.IsDeleted.Eq(-1)). - Where(query.AuthorizedAPI.BusinessKey.Eq(key)). - Order(query.AuthorizedAPI.ID.Desc()). - Find() - if err != nil { - return nil, err - } - - // 设置缓存 data - cacheData = new(CacheAuthorizedData) - cacheData.Key = key - cacheData.Secret = authorizedInfo.BusinessSecret - cacheData.IsUsed = authorizedInfo.IsUsed - cacheData.Apis = make([]cacheApiData, len(authorizedAPIS)) - - for k, v := range authorizedAPIS { - cacheData.Apis[k] = cacheApiData{ - Method: v.Method, - Api: v.API, - } - } - - cacheDataByte, _ := json.Marshal(cacheData) - - err = s.cache.Set(cacheKey, string(cacheDataByte), configs.LoginSessionTTL, redis.WithTrace(ctx.Trace())) - if err != nil { - return nil, err - } - - return cacheData, nil - } - - value, err := s.cache.Get(cacheKey, redis.WithTrace(ctx.RequestContext().Trace)) - if err != nil { - return nil, err - } - - cacheData = new(CacheAuthorizedData) - err = json.Unmarshal([]byte(value), cacheData) - if err != nil { - return nil, err - } - - return - -} diff --git a/internal/services/authorized/service_list.go b/internal/services/authorized/service_list.go deleted file mode 100755 index b2ba647..0000000 --- a/internal/services/authorized/service_list.go +++ /dev/null @@ -1,30 +0,0 @@ -package authorized - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) List(ctx core.Context, searchData *SearchData) (authorizedList []*model.Authorized, err error) { - - iAuthorizedDo := query.Authorized.WithContext(ctx.RequestContext()) - iAuthorizedDo = iAuthorizedDo.Where(query.Authorized.IsDeleted.Eq(-1)) - if searchData.BusinessKey != "" { - iAuthorizedDo = iAuthorizedDo.Where(query.Authorized.BusinessKey.Eq(searchData.BusinessKey)) - } - - if searchData.BusinessSecret != "" { - iAuthorizedDo = iAuthorizedDo.Where(query.Authorized.BusinessSecret.Eq(searchData.BusinessSecret)) - } - - if searchData.BusinessDeveloper != "" { - iAuthorizedDo = iAuthorizedDo.Where(query.Authorized.BusinessDeveloper.Eq(searchData.BusinessDeveloper)) - } - authorizedList, err = iAuthorizedDo.Order(query.Authorized.ID.Desc()).Find() - if err != nil { - return nil, err - } - - return -} diff --git a/internal/services/authorized/service_listapi.go b/internal/services/authorized/service_listapi.go deleted file mode 100755 index 812f0f4..0000000 --- a/internal/services/authorized/service_listapi.go +++ /dev/null @@ -1,26 +0,0 @@ -package authorized - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type SearchAPIData struct { - BusinessKey string `json:"business_key"` // 调用方key -} - -func (s *service) ListAPI(ctx core.Context, searchAPIData *SearchAPIData) (authorizedAPIS []*model.AuthorizedAPI, err error) { - iAuthorizedAPIDo := query.AuthorizedAPI.WithContext(ctx.RequestContext()) - iAuthorizedAPIDo = iAuthorizedAPIDo.Where(query.AuthorizedAPI.IsDeleted.Eq(-1)) - - if searchAPIData.BusinessKey != "" { - iAuthorizedAPIDo = iAuthorizedAPIDo.Where(query.AuthorizedAPI.BusinessKey.Eq(searchAPIData.BusinessKey)) - } - authorizedAPIS, err = iAuthorizedAPIDo.Order(query.AuthorizedAPI.ID.Desc()).Find() - if err != nil { - return nil, err - } - - return -} diff --git a/internal/services/authorized/service_pagelist.go b/internal/services/authorized/service_pagelist.go deleted file mode 100755 index 4ebda24..0000000 --- a/internal/services/authorized/service_pagelist.go +++ /dev/null @@ -1,46 +0,0 @@ -package authorized - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type SearchData struct { - Page int64 `json:"page"` // 第几页 - PageSize int64 `json:"page_size"` // 每页显示条数 - BusinessKey string `json:"business_key"` // 调用方key - BusinessSecret string `json:"business_secret"` // 调用方secret - BusinessDeveloper string `json:"business_developer"` // 调用方对接人 - Remark string `json:"remark"` // 备注 -} - -func (s *service) PageList(ctx core.Context, searchData *SearchData) (authorizedList []*model.Authorized, err error) { - - offset := (searchData.Page - 1) * searchData.PageSize - - iAuthorizedDo := query.Authorized.WithContext(ctx.RequestContext()) - iAuthorizedDo = iAuthorizedDo.Where(query.Authorized.IsDeleted.Eq(-1)) - if searchData.BusinessKey != "" { - iAuthorizedDo = iAuthorizedDo.Where(query.Authorized.BusinessKey.Eq(searchData.BusinessKey)) - } - - if searchData.BusinessSecret != "" { - iAuthorizedDo = iAuthorizedDo.Where(query.Authorized.BusinessSecret.Eq(searchData.BusinessSecret)) - } - - if searchData.BusinessDeveloper != "" { - iAuthorizedDo = iAuthorizedDo.Where(query.Authorized.BusinessDeveloper.Eq(searchData.BusinessDeveloper)) - } - - authorizedList, err = iAuthorizedDo. - Limit(int(searchData.PageSize)). - Offset(int(offset)). - Order(query.Authorized.ID.Desc()). - Find() - if err != nil { - return nil, err - } - - return -} diff --git a/internal/services/authorized/service_pagelistcount.go b/internal/services/authorized/service_pagelistcount.go deleted file mode 100755 index 77061fb..0000000 --- a/internal/services/authorized/service_pagelistcount.go +++ /dev/null @@ -1,31 +0,0 @@ -package authorized - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) PageListCount(ctx core.Context, searchData *SearchData) (total int64, err error) { - - iAuthorizedDo := query.Authorized.WithContext(ctx.RequestContext()) - iAuthorizedDo = iAuthorizedDo.Where(query.Authorized.IsDeleted.Eq(-1)) - - if searchData.BusinessKey != "" { - iAuthorizedDo = iAuthorizedDo.Where(query.Authorized.BusinessKey.Eq(searchData.BusinessKey)) - } - - if searchData.BusinessSecret != "" { - iAuthorizedDo = iAuthorizedDo.Where(query.Authorized.BusinessSecret.Eq(searchData.BusinessSecret)) - } - - if searchData.BusinessDeveloper != "" { - iAuthorizedDo = iAuthorizedDo.Where(query.Authorized.BusinessDeveloper.Eq(searchData.BusinessDeveloper)) - } - - total, err = iAuthorizedDo.Count() - if err != nil { - return 0, err - } - - return -} diff --git a/internal/services/authorized/service_updateused.go b/internal/services/authorized/service_updateused.go deleted file mode 100755 index eaaabbc..0000000 --- a/internal/services/authorized/service_updateused.go +++ /dev/null @@ -1,34 +0,0 @@ -package authorized - -import ( - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - - "gorm.io/gorm" -) - -func (s *service) UpdateUsed(ctx core.Context, id, used int64) (err error) { - authorizedInfo, err := query.Authorized.WithContext(ctx.RequestContext()). - Where(query.Authorized.IsDeleted.Eq(-1)). - Where(query.Authorized.ID.Eq(id)). - First() - if err == gorm.ErrRecordNotFound { - return nil - } - - _, err = query.Authorized.WithContext(ctx.RequestContext()). - Where(query.Authorized.ID.Eq(id)). - UpdateColumnSimple( - query.Authorized.IsUsed.Value(used), - query.Authorized.UpdatedUser.Value(ctx.SessionUserInfo().UserName), - ) - - if err != nil { - return err - } - - s.cache.Del(configs.RedisKeyPrefixSignature+authorizedInfo.BusinessKey, redis.WithTrace(ctx.Trace())) - return -} diff --git a/internal/services/category/service.go b/internal/services/category/service.go deleted file mode 100755 index 01f6f15..0000000 --- a/internal/services/category/service.go +++ /dev/null @@ -1,37 +0,0 @@ -package category - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -var _ Service = (*service)(nil) - -type Service interface { - i() - - List(ctx core.Context) (categories []*model.Category, err error) - Tree(ctx core.Context) (nodes []*TreeNode, err error) - Create(ctx core.Context, siteData *CreateCategoryData) (err error) - Modify(ctx core.Context, id int64, updateCategory *UpdateCategory) (err error) - Delete(ctx core.Context, id int64) error - Detail(ctx core.Context, id int64) (category *model.Category, err error) - UpdateUsed(ctx core.Context, id, used int64) (err error) - UpdateSort(ctx core.Context, id, sort int64) (err error) -} - -type service struct { - db mysql.Repo - cache redis.Repo -} - -func New(db mysql.Repo, cache redis.Repo) Service { - return &service{ - db: db, - cache: cache, - } -} - -func (s *service) i() {} diff --git a/internal/services/category/service_create.go b/internal/services/category/service_create.go deleted file mode 100755 index 4087b0a..0000000 --- a/internal/services/category/service_create.go +++ /dev/null @@ -1,27 +0,0 @@ -package category - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type CreateCategoryData struct { - Pid int64 // 父类ID - Name string // 分类名称 - Icon string // 图标库 https://lineicons.com/icons/ - Level int64 -} - -func (s *service) Create(ctx core.Context, siteData *CreateCategoryData) (err error) { - if err = query.Category.WithContext(ctx.RequestContext()). - Create(&model.Category{ - ParentID: siteData.Pid, - Title: siteData.Name, - Icon: siteData.Icon, - Level: siteData.Level, - }); err != nil { - return - } - return -} diff --git a/internal/services/category/service_detail.go b/internal/services/category/service_detail.go deleted file mode 100755 index d084b4d..0000000 --- a/internal/services/category/service_detail.go +++ /dev/null @@ -1,17 +0,0 @@ -package category - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) Detail(ctx core.Context, id int64) (category *model.Category, err error) { - if category, err = query.Category.WithContext(ctx.RequestContext()). - Where(query.Category.ID.Eq(id)). - First(); err != nil { - return nil, err - } - - return -} diff --git a/internal/services/category/service_list.go b/internal/services/category/service_list.go deleted file mode 100755 index 0dc313f..0000000 --- a/internal/services/category/service_list.go +++ /dev/null @@ -1,22 +0,0 @@ -package category - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type SearchData struct { - Pid int32 // 父类ID -} - -func (s *service) List(ctx core.Context) (categories []*model.Category, err error) { - categories, err = query.Category.WithContext(ctx.RequestContext()). - Order(query.Category.Sort). - Find() - if err != nil { - return nil, err - } - - return -} diff --git a/internal/services/category/service_modify.go b/internal/services/category/service_modify.go deleted file mode 100755 index 9b84ed0..0000000 --- a/internal/services/category/service_modify.go +++ /dev/null @@ -1,22 +0,0 @@ -package category - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type UpdateCategory struct { - Name string `json:"name"` // 菜单名称 - Icon string `json:"icon"` // 图标 -} - -func (s *service) Modify(ctx core.Context, id int64, updateCategory *UpdateCategory) (err error) { - if _, err = query.Category.WithContext(ctx.RequestContext()). - Where(query.Category.ID.Eq(id)). - Updates(model.Category{Title: updateCategory.Name, Icon: updateCategory.Icon}); err != nil { - return - } - - return -} diff --git a/internal/services/category/service_tree.go b/internal/services/category/service_tree.go deleted file mode 100644 index fd2b195..0000000 --- a/internal/services/category/service_tree.go +++ /dev/null @@ -1,49 +0,0 @@ -package category - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type TreeNode struct { - // Id 节点ID - Id int64 - // Pid 父节点ID - Pid int64 - // Name 节点名称 - Name string - // Icon 图标 - Icon string - // Child 获取子节点切片 - Child []*TreeNode -} - -func buildTree(nodes []*TreeNode, pid int64) []*TreeNode { - res := make([]*TreeNode, 0) - for _, v := range nodes { - if v.Pid == pid { - v.Child = buildTree(nodes, v.Id) - res = append(res, v) - } - } - return res -} - -func (s *service) Tree(ctx core.Context) (nodes []*TreeNode, err error) { - categories, err := query.Category.WithContext(ctx.RequestContext()). - Where(query.Category.IsUsed.Eq(1)). - Order(query.Category.Sort).Find() - if err != nil { - return nil, err - } - for _, cat := range categories { - nodes = append(nodes, &TreeNode{ - Id: cat.ID, - Pid: cat.ParentID, - Name: cat.Title, - Icon: cat.Icon, - Child: nil, - }) - } - return buildTree(nodes, 0), nil -} diff --git a/internal/services/category/service_updatesort.go b/internal/services/category/service_updatesort.go deleted file mode 100755 index 34223f2..0000000 --- a/internal/services/category/service_updatesort.go +++ /dev/null @@ -1,17 +0,0 @@ -package category - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) UpdateSort(ctx core.Context, id, sort int64) (err error) { - if _, err = query.Category.WithContext(ctx.RequestContext()). - Where(query.Category.ID.Eq(id)). - Update(query.Category.Sort, sort); err != nil { - return err - } - - return - -} diff --git a/internal/services/category/service_updateused.go b/internal/services/category/service_updateused.go deleted file mode 100755 index 4d6ad30..0000000 --- a/internal/services/category/service_updateused.go +++ /dev/null @@ -1,16 +0,0 @@ -package category - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) UpdateUsed(ctx core.Context, id, used int64) (err error) { - if _, err = query.Category.WithContext(ctx.RequestContext()). - Where(query.Category.ID.Eq(id)). - Update(query.Category.IsUsed, used); err != nil { - return err - } - - return -} diff --git a/internal/services/category/servier_delete.go b/internal/services/category/servier_delete.go deleted file mode 100644 index f361fce..0000000 --- a/internal/services/category/servier_delete.go +++ /dev/null @@ -1,24 +0,0 @@ -package category - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) Delete(ctx core.Context, id int64) (err error) { - - if _, err = query.Category.WithContext(ctx.RequestContext()). - Where(query.Category.ID.Eq(id)). - Delete(); err != nil { - return - } - - // 删除一级目录 id 需要删除二级分类 - if _, err = query.Category.WithContext(ctx.RequestContext()). - Where(query.Category.ParentID.Eq(id)). - Delete(); err != nil { - return - } - - return -} diff --git a/internal/services/cron/service.go b/internal/services/cron/service.go deleted file mode 100755 index 03b75d5..0000000 --- a/internal/services/cron/service.go +++ /dev/null @@ -1,39 +0,0 @@ -package cron - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/cron" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -var _ Service = (*service)(nil) - -type Service interface { - i() - - Create(ctx core.Context, createData *CreateCronTaskData) (id int64, err error) - Modify(ctx core.Context, id int64, modifyData *ModifyCronTaskData) (err error) - PageList(ctx core.Context, searchData *SearchData) (cronTasks []*model.CronTask, err error) - PageListCount(ctx core.Context, searchData *SearchData) (total int64, err error) - UpdateUsed(ctx core.Context, id, used int64) (err error) - Execute(ctx core.Context, id int64) (err error) - Detail(ctx core.Context, searchOneData *SearchOneData) (cronTask *model.CronTask, err error) -} - -type service struct { - db mysql.Repo - cache redis.Repo - cronServer cron.Server -} - -func New(db mysql.Repo, cache redis.Repo, cron cron.Server) Service { - return &service{ - db: db, - cache: cache, - cronServer: cron, - } -} - -func (s *service) i() {} diff --git a/internal/services/cron/service_create.go b/internal/services/cron/service_create.go deleted file mode 100755 index 8dcee7b..0000000 --- a/internal/services/cron/service_create.go +++ /dev/null @@ -1,51 +0,0 @@ -package cron - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type CreateCronTaskData struct { - Name string // 任务名称 - Spec string // crontab 表达式 - Command string // 执行命令 - Protocol int64 // 执行方式 1:shell 2:http - HttpMethod int64 // http 请求方式 1:get 2:post - Timeout int64 // 超时时间(单位:秒) - RetryTimes int64 // 重试次数 - RetryInterval int64 // 重试间隔(单位:秒) - NotifyStatus int64 // 执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知 - NotifyType int64 // 通知类型 1:邮件 2:webhook - NotifyReceiverEmail string // 通知者邮箱地址(多个用,分割) - NotifyKeyword string // 通知匹配关键字(多个用,分割) - Remark string // 备注 - IsUsed int64 // 是否启用 1:是 -1:否 -} - -func (s *service) Create(ctx core.Context, createData *CreateCronTaskData) (id int64, err error) { - task := model.CronTask{ - Name: createData.Name, - Spec: createData.Spec, - Command: createData.Command, - Protocol: createData.Protocol, - HTTPMethod: createData.HttpMethod, - Timeout: createData.Timeout, - RetryTimes: createData.RetryTimes, - RetryInterval: createData.RetryInterval, - NotifyStatus: createData.NotifyStatus, - NotifyType: createData.NotifyType, - NotifyReceiverEmail: createData.NotifyReceiverEmail, - NotifyKeyword: createData.NotifyKeyword, - Remark: createData.Remark, - IsUsed: createData.IsUsed, - CreatedUser: ctx.SessionUserInfo().UserName, - } - if err = query.CronTask.Create(&task); err != nil { - return 0, err - } - - s.cronServer.AddTask(&task) - - return -} diff --git a/internal/services/cron/service_detail.go b/internal/services/cron/service_detail.go deleted file mode 100755 index 42f65d4..0000000 --- a/internal/services/cron/service_detail.go +++ /dev/null @@ -1,25 +0,0 @@ -package cron - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type SearchOneData struct { - Id int64 // 任务ID -} - -func (s *service) Detail(ctx core.Context, searchOneData *SearchOneData) (cronTask *model.CronTask, err error) { - iCronTaskDo := query.CronTask.WithContext(ctx.RequestContext()) - if searchOneData.Id != 0 { - iCronTaskDo = iCronTaskDo.Where(query.CronTask.ID.Eq(searchOneData.Id)) - } - - cronTask, err = iCronTaskDo.First() - if err != nil { - return nil, err - } - - return -} diff --git a/internal/services/cron/service_execute.go b/internal/services/cron/service_execute.go deleted file mode 100755 index 96c0a0a..0000000 --- a/internal/services/cron/service_execute.go +++ /dev/null @@ -1,19 +0,0 @@ -package cron - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) Execute(ctx core.Context, id int64) (err error) { - - cronTask, err := query.CronTask.WithContext(ctx.RequestContext()).Where(query.CronTask.ID.Eq(id)).First() - if err != nil { - return err - } - - cronTask.Spec = "手动执行" - go s.cronServer.AddJob(cronTask)() - - return nil -} diff --git a/internal/services/cron/service_modify.go b/internal/services/cron/service_modify.go deleted file mode 100755 index c688b5d..0000000 --- a/internal/services/cron/service_modify.go +++ /dev/null @@ -1,67 +0,0 @@ -package cron - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/constant" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type ModifyCronTaskData struct { - Name string // 任务名称 - Spec string // crontab 表达式 - Command string // 执行命令 - Protocol int64 // 执行方式 1:shell 2:http - HttpMethod int64 // http 请求方式 1:get 2:post - Timeout int64 // 超时时间(单位:秒) - RetryTimes int64 // 重试次数 - RetryInterval int64 // 重试间隔(单位:秒) - NotifyStatus int64 // 执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知 - NotifyType int64 // 通知类型 1:邮件 2:webhook - NotifyReceiverEmail string // 通知者邮箱地址(多个用,分割) - NotifyKeyword string // 通知匹配关键字(多个用,分割) - Remark string // 备注 - IsUsed int64 // 是否启用 1:是 -1:否 -} - -func (s *service) Modify(ctx core.Context, id int64, modifyData *ModifyCronTaskData) (err error) { - data := map[string]interface{}{ - "name": modifyData.Name, - "spec": modifyData.Spec, - "command": modifyData.Command, - "protocol": modifyData.Protocol, - "http_method": modifyData.HttpMethod, - "timeout": modifyData.Timeout, - "retry_times": modifyData.RetryTimes, - "retry_interval": modifyData.RetryInterval, - "notify_status": modifyData.NotifyStatus, - "notify_type": modifyData.NotifyType, - "notify_receiver_email": modifyData.NotifyReceiverEmail, - "notify_keyword": modifyData.NotifyKeyword, - "remark": modifyData.Remark, - "is_used": modifyData.IsUsed, - "updated_user": ctx.SessionUserInfo().UserName, - } - - _, err = query.CronTask.WithContext(ctx.RequestContext()). - Where(query.CronTask.ID.Eq(id)). - Updates(data) - if err != nil { - return err - } - - // region 操作定时任务 避免主从同步延迟,在这需要查询主库 - if modifyData.IsUsed == constant.IsUsedNo { - s.cronServer.RemoveTask(id) - } else { - cronTask, err := query.CronTask.WithContext(ctx.RequestContext()).Where(query.CronTask.ID.Eq(id)).First() - if err != nil { - return err - } - - s.cronServer.RemoveTask(id) - s.cronServer.AddTask(cronTask) - } - // endregion - - return -} diff --git a/internal/services/cron/service_pagelist.go b/internal/services/cron/service_pagelist.go deleted file mode 100755 index c44bac3..0000000 --- a/internal/services/cron/service_pagelist.go +++ /dev/null @@ -1,34 +0,0 @@ -package cron - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type SearchData struct { - Page int64 // 第几页 - PageSize int64 // 每页显示条数 - Name string // 任务名称 - Protocol int64 // 执行方式 - IsUsed int64 // 是否启用 -} - -func (s *service) PageList(ctx core.Context, searchData *SearchData) (cronTasks []*model.CronTask, err error) { - iCronTaskDo := query.CronTask.WithContext(ctx.RequestContext()) - if searchData.Name != "" { - iCronTaskDo = iCronTaskDo.Where(query.CronTask.Name.Eq(searchData.Name)) - } - if searchData.Protocol != 0 { - iCronTaskDo = iCronTaskDo.Where(query.CronTask.Protocol.Eq(searchData.Protocol)) - } - if searchData.IsUsed != 0 { - iCronTaskDo = iCronTaskDo.Where(query.CronTask.IsUsed.Eq(searchData.IsUsed)) - } - cronTasks, _, err = iCronTaskDo.Order(query.CronTask.ID.Desc()).FindByPage(int((searchData.Page-1)*searchData.PageSize), int(searchData.PageSize)) - if err != nil { - return nil, err - } - - return -} diff --git a/internal/services/cron/service_pagelistcount.go b/internal/services/cron/service_pagelistcount.go deleted file mode 100755 index f33adf9..0000000 --- a/internal/services/cron/service_pagelistcount.go +++ /dev/null @@ -1,27 +0,0 @@ -package cron - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) PageListCount(ctx core.Context, searchData *SearchData) (total int64, err error) { - iCronTaskDo := query.CronTask.WithContext(ctx.RequestContext()) - if searchData.Name != "" { - iCronTaskDo = iCronTaskDo.Where(query.CronTask.Name.Eq(searchData.Name)) - } - if searchData.Protocol != 0 { - iCronTaskDo = iCronTaskDo.Where(query.CronTask.Protocol.Eq(searchData.Protocol)) - } - if searchData.IsUsed != 0 { - iCronTaskDo = iCronTaskDo.Where(query.CronTask.IsUsed.Eq(searchData.IsUsed)) - - } - - total, err = iCronTaskDo.Count() - if err != nil { - return 0, err - } - - return -} diff --git a/internal/services/cron/service_updateused.go b/internal/services/cron/service_updateused.go deleted file mode 100755 index efbe0e6..0000000 --- a/internal/services/cron/service_updateused.go +++ /dev/null @@ -1,35 +0,0 @@ -package cron - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/constant" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) UpdateUsed(ctx core.Context, id, used int64) (err error) { - _, err = query.CronTask.WithContext(ctx.RequestContext()). - Where(query.CronTask.ID.Eq(id)). - UpdateColumnSimple( - query.CronTask.IsUsed.Value(used), - query.CronTask.UpdatedUser.Value(ctx.SessionUserInfo().UserName), - ) - if err != nil { - return err - } - - // region 操作定时任务 避免主从同步延迟,在这需要查询主库 - if used == constant.IsUsedNo { - s.cronServer.RemoveTask(id) - } else { - cronTask, err := query.CronTask.WithContext(ctx.RequestContext()).Where(query.CronTask.ID.Eq(id)).First() - if err != nil { - return err - } - - s.cronServer.RemoveTask(id) - s.cronServer.AddTask(cronTask) - - } - - return -} diff --git a/internal/services/index/service.go b/internal/services/index/service.go deleted file mode 100755 index ed6cf80..0000000 --- a/internal/services/index/service.go +++ /dev/null @@ -1,30 +0,0 @@ -package index - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -var _ Service = (*service)(nil) - -type Service interface { - i() - - Index(ctx core.Context) (sites []*model.Site, err error) -} - -type service struct { - db mysql.Repo - cache redis.Repo -} - -func New(db mysql.Repo, cache redis.Repo) Service { - return &service{ - db: db, - cache: cache, - } -} - -func (s *service) i() {} diff --git a/internal/services/index/service_index.go b/internal/services/index/service_index.go deleted file mode 100644 index b06f5f3..0000000 --- a/internal/services/index/service_index.go +++ /dev/null @@ -1,15 +0,0 @@ -package index - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) Index(ctx core.Context) (sites []*model.Site, err error) { - sites, err = query.Site.WithContext(ctx.RequestContext()).Find() - if err != nil { - return nil, err - } - return -} diff --git a/internal/services/menu/service.go b/internal/services/menu/service.go deleted file mode 100755 index 5f02b01..0000000 --- a/internal/services/menu/service.go +++ /dev/null @@ -1,40 +0,0 @@ -package menu - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -var _ Service = (*service)(nil) - -type Service interface { - i() - - Create(ctx core.Context, menuData *CreateMenuData) (id int64, err error) - Modify(ctx core.Context, id int64, menuData *UpdateMenuData) (err error) - List(ctx core.Context, searchData *SearchData) (menus []*model.Menu, err error) - UpdateUsed(ctx core.Context, id, sort int64) (err error) - UpdateSort(ctx core.Context, id, sort int64) (err error) - Delete(ctx core.Context, id int64) (err error) - Detail(ctx core.Context, searchOneData *SearchOneData) (menu *model.Menu, err error) - - CreateAction(ctx core.Context, menuActionData *CreateMenuActionData) (id int32, err error) - ListAction(ctx core.Context, searchData *SearchListActionData) (menuActions []*model.MenuAction, err error) - DeleteAction(ctx core.Context, id int64) (err error) -} - -type service struct { - db mysql.Repo - cache redis.Repo -} - -func New(db mysql.Repo, cache redis.Repo) Service { - return &service{ - db: db, - cache: cache, - } -} - -func (s *service) i() {} diff --git a/internal/services/menu/service_create.go b/internal/services/menu/service_create.go deleted file mode 100755 index 7b6f1fd..0000000 --- a/internal/services/menu/service_create.go +++ /dev/null @@ -1,33 +0,0 @@ -package menu - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "time" -) - -type CreateMenuData struct { - Pid int64 // 父类ID - Name string // 菜单名称 - Link string // 链接地址 - Icon string // 图标 - Level int64 // 菜单类型 1:一级菜单 2:二级菜单 -} - -func (s *service) Create(ctx core.Context, menuData *CreateMenuData) (id int64, err error) { - if err = query.Menu.WithContext(ctx.RequestContext()).Create(&model.Menu{ - Pid: menuData.Pid, - Name: menuData.Name, - Link: menuData.Link, - Icon: menuData.Icon, - Level: menuData.Level, - IsUsed: 1, - IsDeleted: -1, - CreatedAt: time.Time{}, - CreatedUser: ctx.SessionUserInfo().UserName, - }); err != nil { - return 0, err - } - return -} diff --git a/internal/services/menu/service_createaction.go b/internal/services/menu/service_createaction.go deleted file mode 100755 index 2011137..0000000 --- a/internal/services/menu/service_createaction.go +++ /dev/null @@ -1,30 +0,0 @@ -package menu - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "time" -) - -type CreateMenuActionData struct { - MenuId int64 `json:"menu_id"` // 菜单栏ID - Method string `json:"method"` // 请求方法 - API string `json:"api"` // 请求地址 -} - -func (s *service) CreateAction(ctx core.Context, menuActionData *CreateMenuActionData) (id int32, err error) { - if err = query.MenuAction.WithContext(ctx.RequestContext()). - Create(&model.MenuAction{ - MenuID: menuActionData.MenuId, - Method: menuActionData.Method, - API: menuActionData.API, - IsDeleted: -1, - CreatedAt: time.Time{}, - CreatedUser: ctx.SessionUserInfo().UserName, - }); err != nil { - return 0, err - } - - return -} diff --git a/internal/services/menu/service_delete.go b/internal/services/menu/service_delete.go deleted file mode 100755 index 5322950..0000000 --- a/internal/services/menu/service_delete.go +++ /dev/null @@ -1,19 +0,0 @@ -package menu - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) Delete(ctx core.Context, id int64) (err error) { - if _, err = query.Menu.WithContext(ctx.RequestContext()). - Where(query.Menu.ID.Eq(id)). - UpdateSimple( - query.Menu.IsDeleted.Value(1), - query.Menu.UpdatedUser.Value(ctx.SessionUserInfo().UserName), - ); err != nil { - return err - } - - return -} diff --git a/internal/services/menu/service_deleteaction.go b/internal/services/menu/service_deleteaction.go deleted file mode 100755 index b78d361..0000000 --- a/internal/services/menu/service_deleteaction.go +++ /dev/null @@ -1,30 +0,0 @@ -package menu - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - - "gorm.io/gorm" -) - -func (s *service) DeleteAction(ctx core.Context, id int64) (err error) { - // 先查询 id 是否存在 - _, err = query.MenuAction.WithContext(ctx.RequestContext()). - Where(query.MenuAction.IsDeleted.Eq(-1)). - Where(query.MenuAction.ID.Eq(id)). - First() - if err == gorm.ErrRecordNotFound { - return nil - } - - if _, err = query.MenuAction.WithContext(ctx.RequestContext()). - Where(query.MenuAction.ID.Eq(id)). - UpdateColumnSimple( - query.MenuAction.IsDeleted.Value(1), - query.MenuAction.UpdatedUser.Value(ctx.SessionUserInfo().UserName), - ); err != nil { - return err - } - - return -} diff --git a/internal/services/menu/service_detail.go b/internal/services/menu/service_detail.go deleted file mode 100755 index fa712a5..0000000 --- a/internal/services/menu/service_detail.go +++ /dev/null @@ -1,29 +0,0 @@ -package menu - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type SearchOneData struct { - Id int64 // 用户ID - IsUsed int64 // 是否启用 1:是 -1:否 -} - -func (s *service) Detail(ctx core.Context, searchOneData *SearchOneData) (menu *model.Menu, err error) { - iMenuDo := query.Menu.WithContext(ctx.RequestContext()) - iMenuDo = iMenuDo.Where(query.Menu.IsDeleted.Eq(-1)) - if searchOneData.Id != 0 { - iMenuDo = iMenuDo.Where(query.Menu.ID.Eq(searchOneData.Id)) - } - if searchOneData.IsUsed != 0 { - iMenuDo = iMenuDo.Where(query.Menu.IsUsed.Eq(searchOneData.IsUsed)) - } - menu, err = iMenuDo.First() - if err != nil { - return nil, err - } - - return -} diff --git a/internal/services/menu/service_list.go b/internal/services/menu/service_list.go deleted file mode 100755 index 53ed0f8..0000000 --- a/internal/services/menu/service_list.go +++ /dev/null @@ -1,24 +0,0 @@ -package menu - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type SearchData struct { - Pid int64 // 父类ID -} - -func (s *service) List(ctx core.Context, searchData *SearchData) (menus []*model.Menu, err error) { - iMenuDo := query.Menu.WithContext(ctx.RequestContext()).Where(query.Menu.IsDeleted.Eq(-1)) - if searchData.Pid != 0 { - iMenuDo = iMenuDo.Where(query.Menu.Pid.Eq(searchData.Pid)) - } - menus, err = iMenuDo.Order(query.Menu.Sort).Find() - if err != nil { - return nil, err - } - - return -} diff --git a/internal/services/menu/service_listaction.go b/internal/services/menu/service_listaction.go deleted file mode 100755 index 5ba097b..0000000 --- a/internal/services/menu/service_listaction.go +++ /dev/null @@ -1,25 +0,0 @@ -package menu - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type SearchListActionData struct { - MenuId int64 `json:"menu_id"` // 菜单栏ID -} - -func (s *service) ListAction(ctx core.Context, searchData *SearchListActionData) (menuActions []*model.MenuAction, err error) { - iMenuActionDo := query.MenuAction.WithContext(ctx.RequestContext()) - iMenuActionDo = iMenuActionDo.Where(query.MenuAction.IsDeleted.Eq(-1)) - if searchData.MenuId != 0 { - iMenuActionDo = iMenuActionDo.Where(query.MenuAction.MenuID.Eq(searchData.MenuId)) - } - menuActions, err = iMenuActionDo.Order(query.MenuAction.ID.Desc()).Find() - if err != nil { - return nil, err - } - - return -} diff --git a/internal/services/menu/service_modify.go b/internal/services/menu/service_modify.go deleted file mode 100755 index 092300b..0000000 --- a/internal/services/menu/service_modify.go +++ /dev/null @@ -1,28 +0,0 @@ -package menu - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type UpdateMenuData struct { - Name string // 菜单名称 - Link string // 链接地址 - Icon string // 图标 -} - -func (s *service) Modify(ctx core.Context, id int64, menuData *UpdateMenuData) (err error) { - - if _, err = query.Menu.WithContext(ctx.RequestContext()). - Where(query.Menu.ID.Eq(id)). - UpdateColumnSimple( - query.Menu.Name.Value(menuData.Name), - query.Menu.Link.Value(menuData.Link), - query.Menu.Icon.Value(menuData.Icon), - query.Menu.UpdatedUser.Value(ctx.SessionUserInfo().UserName), - ); err != nil { - return err - } - - return -} diff --git a/internal/services/menu/service_updatesort.go b/internal/services/menu/service_updatesort.go deleted file mode 100755 index 0ace0ad..0000000 --- a/internal/services/menu/service_updatesort.go +++ /dev/null @@ -1,19 +0,0 @@ -package menu - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) UpdateSort(ctx core.Context, id, sort int64) (err error) { - if _, err = query.Menu.WithContext(ctx.RequestContext()). - Where(query.Menu.ID.Eq(id)). - UpdateColumnSimple( - query.Menu.Sort.Value(sort), - query.Menu.UpdatedUser.Value(ctx.SessionUserInfo().UserName), - ); err != nil { - return err - } - - return -} diff --git a/internal/services/menu/service_updateused.go b/internal/services/menu/service_updateused.go deleted file mode 100755 index 7d104e4..0000000 --- a/internal/services/menu/service_updateused.go +++ /dev/null @@ -1,19 +0,0 @@ -package menu - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) UpdateUsed(ctx core.Context, id, used int64) (err error) { - if _, err = query.Menu.WithContext(ctx.RequestContext()). - Where(query.Menu.ID.Eq(id)). - UpdateColumnSimple( - query.Menu.IsUsed.Value(used), - query.Menu.UpdatedUser.Value(ctx.SessionUserInfo().UserName), - ); err != nil { - return err - } - - return -} diff --git a/internal/services/site/service.go b/internal/services/site/service.go deleted file mode 100755 index 4c7238c..0000000 --- a/internal/services/site/service.go +++ /dev/null @@ -1,38 +0,0 @@ -package site - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/redis" -) - -var _ Service = (*service)(nil) - -type Service interface { - i() - - CategoryList(ctx core.Context) (categories []*model.Category, err error) - PageList(ctx core.Context, searchData *SearchData) (sites []*model.Site, err error) - PageListCount(ctx core.Context, searchData *SearchData) (total int64, err error) - UpdateUsed(ctx core.Context, id, used int64) (err error) - Delete(ctx core.Context, id int64) (err error) - Create(ctx core.Context, sitesData []*CreateSiteData) (successCount, failCount int64) - CategorySite(ctx core.Context) (categorySites []*CategorySite, err error) - UpdateSite(ctx core.Context, updateSite *UpdateSiteRequest) (err error) - Sync(ctx core.Context, id int64) (err error) -} - -type service struct { - db mysql.Repo - cache redis.Repo -} - -func New(db mysql.Repo, cache redis.Repo) Service { - return &service{ - db: db, - cache: cache, - } -} - -func (s *service) i() {} diff --git a/internal/services/site/service_categorylist.go b/internal/services/site/service_categorylist.go deleted file mode 100755 index 5e8cb30..0000000 --- a/internal/services/site/service_categorylist.go +++ /dev/null @@ -1,57 +0,0 @@ -package site - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "sort" - "strconv" - "strings" -) - -func stringSliceToInt64Slice(stringSlice []string) (int64Slice []int64, err error) { - for _, str := range stringSlice { - if i, err := strconv.ParseInt(str, 10, 64); err != nil { - return nil, err - } else { - int64Slice = append(int64Slice, i) - } - } - return int64Slice, nil -} - -func (s *service) CategoryList(ctx core.Context) (categories []*model.Category, err error) { - // 查询父 id - result, err := query.Category.WithContext(ctx.RequestContext()).GetParentIdsByGroupParentId() - if err != nil { - return nil, err - } - stringSlice := strings.Split(result["parent_ids"].(string), ",") - parentIds, err := stringSliceToInt64Slice(stringSlice) - if err != nil { - return nil, err - } - // 一级分类 - categories01, err := query.Category.WithContext(ctx.RequestContext()). - Where(query.Category.ParentID.In(parentIds...)). - Not(query.Category.ParentID.Eq(0)). - Find() - if err != nil { - return nil, err - } - // 二级分类 - categories02, err := query.Category.WithContext(ctx.RequestContext()). - Where(query.Category.ParentID.Eq(0)). - Not(query.Category.ID.In(parentIds...)). - Find() - if err != nil { - return nil, err - } - - categories = append(categories01, categories02...) - // 按分类升序 - sort.Slice(categories, func(i, j int) bool { - return categories[i].Sort < categories[j].Sort - }) - return -} diff --git a/internal/services/site/service_categorysite.go b/internal/services/site/service_categorysite.go deleted file mode 100644 index 9eaf82e..0000000 --- a/internal/services/site/service_categorysite.go +++ /dev/null @@ -1,47 +0,0 @@ -package site - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type CategorySite struct { - Category string - SiteList []model.Site -} - -func (s *service) CategorySite(ctx core.Context) (categorySites []*CategorySite, err error) { - // 获取分类 - categories, err := query.Category.WithContext(ctx.RequestContext()). - Where(query.Category.IsUsed.Eq(1)). - Order(query.Category.Sort). - Order(query.Category.ID). - Find() - - if err != nil { - return nil, err - } - // 获取网站信息 - sites, err := query.Site.WithContext(ctx.RequestContext()). - Where(query.Site.IsUsed.Eq(1)). - Find() - if err != nil { - return nil, err - } - // 拼接数据 - for _, cat := range categories { - var siteList []model.Site - for _, st := range sites { - if cat.ID == st.CategoryID { - siteList = append(siteList, *st) - } - } - categorySites = append(categorySites, &CategorySite{ - Category: cat.Title, - SiteList: siteList, - }) - } - - return -} diff --git a/internal/services/site/service_create.go b/internal/services/site/service_create.go deleted file mode 100755 index a607867..0000000 --- a/internal/services/site/service_create.go +++ /dev/null @@ -1,118 +0,0 @@ -package site - -import ( - "crypto/tls" - "fmt" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "github.com/mat/besticon/besticon" - "io" - "io/ioutil" - "net/http" - "os" - "path" - "path/filepath" - - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/tools" - "github.com/gocolly/colly" -) - -type CreateSiteData struct { - CategoryId int64 `json:"category_id"` - Url string `json:"Url" validate:"url, http_url"` -} - -// 获取网站 logo -func getWebLogoIconUrlByUrl(site *model.Site) string { - - // https 不安全跳过验证 - client := &http.Client{ - Transport: &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}, - } - - b := besticon.New( - besticon.WithLogger(besticon.NewDefaultLogger(ioutil.Discard)), // 禁用详细日志记录 - besticon.WithHTTPClient(client), // 设置用于请求的http客户端 - ) - icons, err := b.NewIconFinder().FetchIcons(site.URL) - if err != nil || len(icons) == 0 { - return "/upload/favicon.png" - } - // 获取图片格式 - var format string - if ext := filepath.Ext(icons[0].URL); ext != "" { - format = ext[1:] - } - // 图片保存静态资源目录 - dst := path.Join("/upload/", fmt.Sprintf("%s.%s", site.Title, format)) - file, err := os.Create(path.Join("assets", dst)) - if err != nil { - return "/upload/favicon.png" - } - defer file.Close() - - response, err := client.Get(icons[0].URL) - if err != nil { - return "/upload/favicon.png" - } - defer response.Body.Close() - - if _, err := io.Copy(file, response.Body); err != nil { - return "/upload/favicon.png" - } - - return dst - -} - -// getWebTitle 获取网站标题 -func getWebTitle(site *model.Site) string { - var title string - c := tools.NewColly() - c.OnHTML("title", func(e *colly.HTMLElement) { - title += e.Text - }) - if err := c.Visit(site.URL); err != nil { - return "" - } - return title - -} - -// getWebDescription 获取网站描述 -func getWebDescription(site *model.Site) string { - var description string - c := tools.NewColly() - c.OnXML("//meta[@name='description']/@content|//meta[@name='Description']/@content|//meta[@name='DESCRIPTION']", - func(e *colly.XMLElement) { - description += e.Text - }, - ) - if err := c.Visit(site.URL); err != nil { - return "" - } - return description -} - -func (s *service) Create(ctx core.Context, sitesData []*CreateSiteData) (successCount, failCount int64) { - - for _, siteData := range sitesData { - siteModel := new(model.Site) - siteModel.IsUsed = -1 - siteModel.URL = siteData.Url - siteModel.CategoryID = siteData.CategoryId - siteModel.Title = getWebTitle(siteModel) - siteModel.Description = getWebDescription(siteModel) - siteModel.Thumb = getWebLogoIconUrlByUrl(siteModel) - - if err := query.Site.WithContext(ctx.RequestContext()).Create(siteModel); err != nil { - failCount++ - } else { - successCount++ - } - } - - return -} diff --git a/internal/services/site/service_delete.go b/internal/services/site/service_delete.go deleted file mode 100755 index a1d240c..0000000 --- a/internal/services/site/service_delete.go +++ /dev/null @@ -1,24 +0,0 @@ -package site - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "gorm.io/gorm" -) - -func (s *service) Delete(ctx core.Context, id int64) (err error) { - // 先查询 id 是否存在 - if _, err = query.Site.WithContext(ctx.RequestContext()). - Where(query.Site.ID.Eq(id)). - First(); err == gorm.ErrRecordNotFound { - return nil - } - // 根据 id 删除 - if _, err = query.Site.WithContext(ctx.RequestContext()). - Where(query.Site.ID.Eq(id)). - Delete(); err != nil { - return - } - - return -} diff --git a/internal/services/site/service_pagelist.go b/internal/services/site/service_pagelist.go deleted file mode 100755 index 124049f..0000000 --- a/internal/services/site/service_pagelist.go +++ /dev/null @@ -1,33 +0,0 @@ -package site - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -type SearchData struct { - Page int64 `json:"page"` // 第几页 - PageSize int64 `json:"page_size"` // 每页显示条数 - BusinessKey string `json:"business_key"` // 调用方key - BusinessSecret string `json:"business_secret"` // 调用方secret - BusinessDeveloper string `json:"business_developer"` // 调用方对接人 - Remark string `json:"remark"` // 备注 - Search string `json:"search"` // 搜索关键字 -} - -func (s *service) PageList(ctx core.Context, searchData *SearchData) (sites []*model.Site, err error) { - - iSiteDo := query.Site.WithContext(ctx.RequestContext()) - if searchData.Search != "" { - iSiteDo = iSiteDo.Where(query.Site.Title.Like("%" + searchData.Search + "%")) - } - sites, _, err = iSiteDo.Preload(query.Site.Category). - Order(query.Site.ID.Desc()). - FindByPage(int((searchData.Page-1)*searchData.PageSize), int(searchData.PageSize)) - if err != nil { - return nil, err - } - - return -} diff --git a/internal/services/site/service_pagelistcount.go b/internal/services/site/service_pagelistcount.go deleted file mode 100755 index cc7020b..0000000 --- a/internal/services/site/service_pagelistcount.go +++ /dev/null @@ -1,19 +0,0 @@ -package site - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) PageListCount(ctx core.Context, searchData *SearchData) (total int64, err error) { - - iSiteDo := query.Site.WithContext(ctx.RequestContext()) - if searchData.Search != "" { - iSiteDo = iSiteDo.Where(query.Site.Title.Like("%" + searchData.Search + "%")) - } - if total, err = iSiteDo.Count(); err != nil { - return 0, err - } else { - return - } -} diff --git a/internal/services/site/service_sync.go b/internal/services/site/service_sync.go deleted file mode 100644 index ff74184..0000000 --- a/internal/services/site/service_sync.go +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @Author: chentong - * @Date: 2024/05/19 下午7:16 - */ - -package site - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/model" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "github.com/pkg/errors" - "gorm.io/gorm" -) - -func (s *service) Sync(ctx core.Context, id int64) error { - site, err := query.Site.WithContext(ctx.RequestContext()).Where(query.Site.ID.Eq(id)).First() - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return errors.New("站点信息不存在!") - } - return err - } - - if _, err := query.Site.WithContext(ctx.RequestContext()). - Where(query.Site.ID.Eq(id)). - Updates(model.Site{ - Title: getWebTitle(site), - Thumb: getWebLogoIconUrlByUrl(site), - Description: getWebDescription(site), - IsUsed: -1, - }); err != nil { - return err - } - - return nil -} diff --git a/internal/services/site/service_updatesite.go b/internal/services/site/service_updatesite.go deleted file mode 100644 index 0021322..0000000 --- a/internal/services/site/service_updatesite.go +++ /dev/null @@ -1,50 +0,0 @@ -package site - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" - "mime/multipart" - "path" -) - -type UpdateSiteRequest struct { - Id int64 `json:"id"` - CategoryId int64 `json:"category_id"` // 网站分类id - Title string `json:"title"` // 网站标题 - Thumb string `json:"thumb"` // 网站 logo - Description string `json:"description"` // 网站描述 - Url string `json:"url"` // 网站地址 - File *multipart.FileHeader `json:"file"` // 上传 logo 图片 -} - -func getWebThumb(ctx core.Context, updateSite *UpdateSiteRequest) (thumb string) { - // 修改操作是否手动上传 logo 图片 - if updateSite.File != nil { - return getWebLogoIconUrlByUploadImg(ctx) - } - return updateSite.Thumb -} - -func getWebLogoIconUrlByUploadImg(ctx core.Context) string { - file, _ := ctx.FormFile("file") - dst := path.Join("/upload/" + file.Filename) // 上传静态文件 url - if err := ctx.SaveUploadedFile(file, path.Join("assets", dst)); err != nil { - return "" - } - return dst -} - -func (s *service) UpdateSite(ctx core.Context, updateSite *UpdateSiteRequest) (err error) { - if _, err = query.Site.WithContext(ctx.RequestContext()). - Where(query.Site.ID.Eq(updateSite.Id)). - Updates(map[string]any{ - "CategoryID": updateSite.CategoryId, - "Title": updateSite.Title, - "Thumb": getWebThumb(ctx, updateSite), - "Description": updateSite.Description, - "Url": updateSite.Url, - }); err != nil { - return err - } - return -} diff --git a/internal/services/site/service_updateused.go b/internal/services/site/service_updateused.go deleted file mode 100755 index b81d55b..0000000 --- a/internal/services/site/service_updateused.go +++ /dev/null @@ -1,16 +0,0 @@ -package site - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/repository/mysql/query" -) - -func (s *service) UpdateUsed(ctx core.Context, id, used int64) (err error) { - if _, err = query.Site.WithContext(ctx.RequestContext()). - Where(query.Site.ID.Eq(id)). - Update(query.Site.IsUsed, used); err != nil { - return err - } - - return -} diff --git a/internal/websocket/sysmessage/sysmessage.go b/internal/websocket/sysmessage/sysmessage.go deleted file mode 100755 index c3837b3..0000000 --- a/internal/websocket/sysmessage/sysmessage.go +++ /dev/null @@ -1,49 +0,0 @@ -package sysmessage - -import ( - "github.com/ch3nnn/webstack-go/internal/pkg/core" - "github.com/ch3nnn/webstack-go/internal/pkg/errors" - "github.com/ch3nnn/webstack-go/internal/repository/mysql" - "github.com/ch3nnn/webstack-go/internal/repository/redis" - "github.com/ch3nnn/webstack-go/internal/repository/socket" - - "go.uber.org/zap" -) - -var ( - err error - server socket.Server -) - -type handler struct { - logger *zap.Logger - cache redis.Repo - db mysql.Repo -} - -func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) *handler { - return &handler{ - logger: logger, - cache: cache, - db: db, - } -} - -func GetConn() (socket.Server, error) { - if server != nil { - return server, nil - } - - return nil, errors.New("conn is nil") -} - -func (h *handler) Connect() core.HandlerFunc { - return func(ctx core.Context) { - server, err = socket.New(h.logger, h.db, h.cache, ctx.ResponseWriter(), ctx.Request(), nil) - if err != nil { - return - } - - go server.OnMessage() - } -} diff --git a/main.go b/main.go deleted file mode 100755 index 407261b..0000000 --- a/main.go +++ /dev/null @@ -1,121 +0,0 @@ -package main - -import ( - "context" - "errors" - "fmt" - "github.com/ch3nnn/webstack-go/configs" - "github.com/ch3nnn/webstack-go/internal/pkg/env" - "github.com/ch3nnn/webstack-go/internal/pkg/logger" - "github.com/ch3nnn/webstack-go/internal/pkg/shutdown" - "github.com/ch3nnn/webstack-go/internal/pkg/timeutil" - "github.com/ch3nnn/webstack-go/internal/router" - "go.uber.org/zap" - "net/http" - "time" -) - -// @title swagger 接口文档 -// @version 2.0 -// @description - -// @contact.name -// @contact.url -// @contact.email - -// @license.name MIT -// @license.url https://github.com/xinliangnote/go-gin-api/blob/master/LICENSE - -// @securityDefinitions.apikey LoginToken -// @in header -// @name token - -// @BasePath / -func main() { - // 初始化 access logger - accessLogger, err := logger.NewJSONLogger( - logger.WithDisableConsole(), - logger.WithField("domain", fmt.Sprintf("%s[%s]", configs.ProjectName, env.Active().Value())), - logger.WithTimeLayout(timeutil.CSTLayout), - logger.WithFileP(configs.ProjectAccessLogFile), - ) - if err != nil { - panic(err) - } - - // 初始化 cron logger - cronLogger, err := logger.NewJSONLogger( - logger.WithDisableConsole(), - logger.WithField("domain", fmt.Sprintf("%s[%s]", configs.ProjectName, env.Active().Value())), - logger.WithTimeLayout(timeutil.CSTLayout), - logger.WithFileP(configs.ProjectCronLogFile), - ) - - if err != nil { - panic(err) - } - - defer func() { - _ = accessLogger.Sync() - _ = cronLogger.Sync() - }() - - // 初始化 HTTP 服务 - s, err := router.NewHTTPServer(accessLogger, cronLogger) - if err != nil { - panic(err) - } - - server := &http.Server{ - Addr: configs.ProjectPort, - Handler: s.Mux, - } - - go func() { - if err := server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { - accessLogger.Fatal("http server startup err", zap.Error(err)) - } - }() - - // 优雅关闭 - shutdown.NewHook().Close( - // 关闭 http server - func() { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) - defer cancel() - - if err := server.Shutdown(ctx); err != nil { - accessLogger.Error("server shutdown err", zap.Error(err)) - } - }, - - // 关闭 db - func() { - if s.Db != nil { - if err := s.Db.DbWClose(); err != nil { - accessLogger.Error("dbw close err", zap.Error(err)) - } - - if err := s.Db.DbRClose(); err != nil { - accessLogger.Error("dbr close err", zap.Error(err)) - } - } - }, - - // 关闭 cache - func() { - if s.Cache != nil { - if err := s.Cache.Close(); err != nil { - accessLogger.Error("cache close err", zap.Error(err)) - } - } - }, - - // 关闭 cron Server - func() { - if s.CronServer != nil { - s.CronServer.Stop() - } - }, - ) -} diff --git a/pkg/app/app.go b/pkg/app/app.go new file mode 100644 index 0000000..f3b7240 --- /dev/null +++ b/pkg/app/app.go @@ -0,0 +1,75 @@ +package app + +import ( + "context" + "log" + "os" + "os/signal" + "syscall" + + "github.com/ch3nnn/webstack-go/pkg/server" +) + +type App struct { + name string + servers []server.Server +} + +type Option func(a *App) + +func NewApp(opts ...Option) *App { + a := &App{} + for _, opt := range opts { + opt(a) + } + return a +} + +func WithServer(servers ...server.Server) Option { + return func(a *App) { + a.servers = servers + } +} + +func WithName(name string) Option { + return func(a *App) { + a.name = name + } +} + +func (a *App) Run(ctx context.Context) error { + var cancel context.CancelFunc + ctx, cancel = context.WithCancel(ctx) + defer cancel() + + signals := make(chan os.Signal, 1) + signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM) + + for _, srv := range a.servers { + go func(srv server.Server) { + err := srv.Start(ctx) + if err != nil { + log.Printf("Server start err: %v", err) + } + }(srv) + } + + select { + case <-signals: + // Received termination signal + log.Println("Received termination signal") + case <-ctx.Done(): + // Context canceled + log.Println("Context canceled") + } + + // Gracefully stop the servers + for _, srv := range a.servers { + err := srv.Stop(ctx) + if err != nil { + log.Printf("Server stop err: %v", err) + } + } + + return nil +} diff --git a/pkg/config/config.go b/pkg/config/config.go new file mode 100644 index 0000000..4ee8f6e --- /dev/null +++ b/pkg/config/config.go @@ -0,0 +1,27 @@ +package config + +import ( + "fmt" + "os" + + "github.com/spf13/viper" +) + +func NewConfig(p string) *viper.Viper { + envConf := os.Getenv("APP_CONF") + if envConf == "" { + envConf = p + } + fmt.Println("load conf file:", envConf) + return getConfig(envConf) +} + +func getConfig(path string) *viper.Viper { + conf := viper.New() + conf.SetConfigFile(path) + err := conf.ReadInConfig() + if err != nil { + panic(err) + } + return conf +} diff --git a/pkg/jwt/jwt.go b/pkg/jwt/jwt.go new file mode 100644 index 0000000..c69b36b --- /dev/null +++ b/pkg/jwt/jwt.go @@ -0,0 +1,63 @@ +package jwt + +import ( + "errors" + "strings" + "time" + + jwt "github.com/golang-jwt/jwt/v5" + "github.com/spf13/viper" +) + +type ( + JWT struct { + key []byte + } + + MyCustomClaims struct { + UserID int + jwt.RegisteredClaims + } +) + +func NewJwt(conf *viper.Viper) *JWT { + return &JWT{key: []byte(conf.GetString("security.jwt.key"))} +} + +func (j *JWT) GenToken(userID int, expiresAt time.Time) (string, error) { + token := jwt.NewWithClaims(jwt.SigningMethodHS256, MyCustomClaims{ + UserID: userID, + RegisteredClaims: jwt.RegisteredClaims{ + ExpiresAt: jwt.NewNumericDate(expiresAt), + IssuedAt: jwt.NewNumericDate(time.Now()), + NotBefore: jwt.NewNumericDate(time.Now()), + }, + }) + + // Sign and get the complete encoded token as a string using the key + tokenString, err := token.SignedString(j.key) + if err != nil { + return "", err + } + + return tokenString, nil +} + +func (j *JWT) ParseToken(tokenString string) (*MyCustomClaims, error) { + if strings.TrimSpace(tokenString) == "" { + return nil, errors.New("token is empty") + } + + token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) { + return j.key, nil + }) + if err != nil { + return nil, err + } + + if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid { + return claims, nil + } + + return nil, err +} diff --git a/pkg/log/log.go b/pkg/log/log.go new file mode 100644 index 0000000..3095876 --- /dev/null +++ b/pkg/log/log.go @@ -0,0 +1,115 @@ +package log + +import ( + "context" + "os" + "time" + + "github.com/gin-gonic/gin" + "github.com/spf13/viper" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + lumberjack "gopkg.in/natefinch/lumberjack.v2" +) + +const ctxLoggerKey = "zapLogger" + +type Logger struct { + *zap.Logger +} + +func NewLog(conf *viper.Viper) *Logger { + // log address "out.log" User-defined + lp := conf.GetString("log.log_file_name") + lv := conf.GetString("log.log_level") + var level zapcore.Level + // debug 0 { + result = append(result, base62[n%62]) + n /= 62 + } + + // 反转字符串 + for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 { + result[i], result[j] = result[j], result[i] + } + + return string(result) +} diff --git a/pkg/sid/sid.go b/pkg/sid/sid.go new file mode 100644 index 0000000..a734b79 --- /dev/null +++ b/pkg/sid/sid.go @@ -0,0 +1,29 @@ +package sid + +import ( + "github.com/sony/sonyflake" +) + +type Sid struct { + sf *sonyflake.Sonyflake +} + +func NewSid() *Sid { + sf := sonyflake.NewSonyflake(sonyflake.Settings{}) + if sf == nil { + panic("sonyflake not created") + } + return &Sid{sf} +} + +func (s Sid) GenString() (string, error) { + id, err := s.sf.NextID() + if err != nil { + return "", err + } + return IntToBase62(int(id)), nil +} + +func (s Sid) GenUint64() (uint64, error) { + return s.sf.NextID() +} diff --git a/internal/pkg/tools/colly.go b/pkg/tools/colly.go similarity index 96% rename from internal/pkg/tools/colly.go rename to pkg/tools/colly.go index a8ae3c6..d33c900 100644 --- a/internal/pkg/tools/colly.go +++ b/pkg/tools/colly.go @@ -2,11 +2,12 @@ package tools import ( "crypto/tls" - "github.com/gocolly/colly" - "github.com/gocolly/colly/extensions" "net" "net/http" "time" + + "github.com/gocolly/colly" + "github.com/gocolly/colly/extensions" ) func NewColly() *colly.Collector { @@ -30,7 +31,7 @@ func NewColly() *colly.Collector { TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // 不安全的跳过验证 }) - // 随机 useragent 请求头 + // 随机 user agent 请求头 extensions.RandomUserAgent(collector) extensions.Referer(collector) return collector diff --git a/pkg/zapgorm2/zapgorm2.go b/pkg/zapgorm2/zapgorm2.go new file mode 100644 index 0000000..362f6bc --- /dev/null +++ b/pkg/zapgorm2/zapgorm2.go @@ -0,0 +1,126 @@ +package zapgorm2 + +import ( + "context" + "errors" + "fmt" + "path/filepath" + "runtime" + "strings" + "time" + + "github.com/gin-gonic/gin" + "go.uber.org/zap" + gormlogger "gorm.io/gorm/logger" +) + +const ctxLoggerKey = "zapLogger" + +type Logger struct { + ZapLogger *zap.Logger + SlowThreshold time.Duration + Colorful bool + IgnoreRecordNotFoundError bool + ParameterizedQueries bool + LogLevel gormlogger.LogLevel +} + +func New(zapLogger *zap.Logger) gormlogger.Interface { + return &Logger{ + ZapLogger: zapLogger, + LogLevel: gormlogger.Warn, + SlowThreshold: 100 * time.Millisecond, + Colorful: false, + IgnoreRecordNotFoundError: false, + ParameterizedQueries: false, + } +} + +func (l *Logger) LogMode(level gormlogger.LogLevel) gormlogger.Interface { + newlogger := *l + newlogger.LogLevel = level + return &newlogger +} + +// Info print info +func (l Logger) Info(ctx context.Context, msg string, data ...interface{}) { + if l.LogLevel >= gormlogger.Info { + l.logger(ctx).Sugar().Infof(msg, data...) + } +} + +// Warn print warn messages +func (l Logger) Warn(ctx context.Context, msg string, data ...interface{}) { + if l.LogLevel >= gormlogger.Warn { + l.logger(ctx).Sugar().Warnf(msg, data...) + } +} + +// Error print error messages +func (l Logger) Error(ctx context.Context, msg string, data ...interface{}) { + if l.LogLevel >= gormlogger.Error { + l.logger(ctx).Sugar().Errorf(msg, data...) + } +} + +func (l Logger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) { + if l.LogLevel <= gormlogger.Silent { + return + } + + elapsed := time.Since(begin) + elapsedStr := fmt.Sprintf("%.3fms", float64(elapsed.Nanoseconds())/1e6) + logger := l.logger(ctx) + switch { + case err != nil && l.LogLevel >= gormlogger.Error && (!errors.Is(err, gormlogger.ErrRecordNotFound) || !l.IgnoreRecordNotFoundError): + sql, rows := fc() + if rows == -1 { + logger.Error("trace", zap.Error(err), zap.String("elapsed", elapsedStr), zap.Int64("rows", rows), zap.String("sql", sql)) + } else { + logger.Error("trace", zap.Error(err), zap.String("elapsed", elapsedStr), zap.Int64("rows", rows), zap.String("sql", sql)) + } + case elapsed > l.SlowThreshold && l.SlowThreshold != 0 && l.LogLevel >= gormlogger.Warn: + sql, rows := fc() + slowLog := fmt.Sprintf("SLOW SQL >= %v", l.SlowThreshold) + if rows == -1 { + logger.Warn("trace", zap.String("slow", slowLog), zap.String("elapsed", elapsedStr), zap.Int64("rows", rows), zap.String("sql", sql)) + } else { + logger.Warn("trace", zap.String("slow", slowLog), zap.String("elapsed", elapsedStr), zap.Int64("rows", rows), zap.String("sql", sql)) + } + case l.LogLevel == gormlogger.Info: + sql, rows := fc() + if rows == -1 { + logger.Info("trace", zap.String("elapsed", elapsedStr), zap.Int64("rows", rows), zap.String("sql", sql)) + } else { + logger.Info("trace", zap.String("elapsed", elapsedStr), zap.Int64("rows", rows), zap.String("sql", sql)) + } + } +} + +var gormPackage = filepath.Join("gorm.io", "gorm") + +func (l Logger) logger(ctx context.Context) *zap.Logger { + logger := l.ZapLogger + if ctx != nil { + if c, ok := ctx.(*gin.Context); ok { + ctx = c.Request.Context() + } + zl := ctx.Value(ctxLoggerKey) + ctxLogger, ok := zl.(*zap.Logger) + if ok { + logger = ctxLogger + } + } + + for i := 2; i < 15; i++ { + _, file, _, ok := runtime.Caller(i) + switch { + case !ok: + case strings.HasSuffix(file, "_test.go"): + case strings.Contains(file, gormPackage): + default: + return logger.WithOptions(zap.AddCallerSkip(i - 1)) + } + } + return logger +} diff --git a/scripts/gqlgen.bat b/scripts/gqlgen.bat deleted file mode 100644 index d1e2436..0000000 --- a/scripts/gqlgen.bat +++ /dev/null @@ -1,11 +0,0 @@ -@echo off -chcp 65001 -echo. -echo Regenerating gqlgen file -echo. -del internal\graph\generated\generated.go internal\graph\model\generated.go internal\graph\resolvers\generated\generated.go -go get github.com/99designs/gqlgen -gqlgen -echo. -echo Done. -echo. \ No newline at end of file diff --git a/scripts/gqlgen.sh b/scripts/gqlgen.sh deleted file mode 100644 index f99c4aa..0000000 --- a/scripts/gqlgen.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -printf "\nRegenerating gqlgen files\n" -rm -f internal/graph/generated/generated.go \ - internal/graph/model/generated.go \ - internal/graph/resolvers/generated/generated.go -go get github.com/99designs/gqlgen -time gqlgen -printf "\nDone.\n\n" \ No newline at end of file diff --git a/scripts/runserver.sh b/scripts/runserver.sh deleted file mode 100644 index aeb6043..0000000 --- a/scripts/runserver.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash -# shellcheck disable=SC2103 - -# 构建依赖 -function build() { - cd .. || exit - go mod tidy - echo "build server" - go build -o . - cd .. -} - - -# 运行服务 -function start() { - cd ../ || exit - nohup ./webstack-go >/dev/null 2>&1 & - echo "service running" -} - -# 停止服务 -function stop() { - - PID="" - query_pid() { - PID=$(ps -ef | grep webstack-go | grep -v grep | awk '{print $2}') - } - query_pid - kill -TERM "$PID" - - -} - -# 服务状态 -function status() { - PID=$(ps -ef | grep webstack-go | grep -v grep | wc -l) - if [ $PID != 0 ]; then - echo "webstack-go is running..." - else - echo "webstack-go is not running..." - fi -} - -# 重启服务 -function restart() { - stop - sleep 3 - start - echo "restart success .... " -} - -case $1 in -build) - build - ;; -start) - start - ;; -stop) - stop - ;; -restart) - restart - ;; -status) - status - ;; -*) - echo -e "\033[0;31m 输入操作名错误 \033[0m \033[0;31m {build|start|stop|restart|status} \033[0m" - ;; -esac diff --git a/scripts/swagger.bat b/scripts/swagger.bat deleted file mode 100644 index 91f1f08..0000000 --- a/scripts/swagger.bat +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -chcp 65001 -echo. -echo Regenerating swagger doc -echo. -go install github.com/swaggo/swag/cmd/swag@v1.7.4 -swag init -echo. -echo Done. \ No newline at end of file diff --git a/scripts/swagger.sh b/scripts/swagger.sh deleted file mode 100755 index 9ebbaf2..0000000 --- a/scripts/swagger.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -printf "\nRegenerating swagger doc\n\n" -go install github.com/swaggo/swag/cmd/swag@v1.7.4 -time swag init -printf "\nDone.\n\n" \ No newline at end of file diff --git a/logs/.gitkeep b/storage/.gitkeep old mode 100755 new mode 100644 similarity index 100% rename from logs/.gitkeep rename to storage/.gitkeep diff --git a/assets/assets.go b/web/assets.go similarity index 66% rename from assets/assets.go rename to web/assets.go index 5406c2d..9169b85 100755 --- a/assets/assets.go +++ b/web/assets.go @@ -3,8 +3,8 @@ package assets import "embed" var ( - //go:embed bootstrap - Bootstrap embed.FS + //go:embed static + Static embed.FS //go:embed templates Templates embed.FS diff --git a/web/static/admin/css/animate.min.css b/web/static/admin/css/animate.min.css new file mode 100644 index 0000000..7245c8c --- /dev/null +++ b/web/static/admin/css/animate.min.css @@ -0,0 +1 @@ +@charset "UTF-8";.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s;}.animated.flipOutX,.animated.flipOutY,.animated.bounceIn,.animated.bounceOut{-webkit-animation-duration:.75s;animation-duration:.75s;}@-webkit-keyframes bounce{from,20%,53%,80%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}40%,43%{-webkit-animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0);}70%{-webkit-animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0);}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0);}}@keyframes bounce{from,20%,53%,80%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}40%,43%{-webkit-animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0);}70%{-webkit-animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0);}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0);}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;transform-origin:center bottom;}@-webkit-keyframes flash{from,50%,to{opacity:1;}25%,75%{opacity:0;}}@keyframes flash{from,50%,to{opacity:1;}25%,75%{opacity:0;}}.flash{-webkit-animation-name:flash;animation-name:flash;}@-webkit-keyframes pulse{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05);}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);}}@keyframes pulse{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05);}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);}}.pulse{-webkit-animation-name:pulse;animation-name:pulse;}@-webkit-keyframes rubberBand{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);}30%{-webkit-transform:scale3d(1.25,0.75,1);transform:scale3d(1.25,0.75,1);}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1);}50%{-webkit-transform:scale3d(1.15,0.85,1);transform:scale3d(1.15,0.85,1);}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1);}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1);}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);}}@keyframes rubberBand{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);}30%{-webkit-transform:scale3d(1.25,0.75,1);transform:scale3d(1.25,0.75,1);}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1);}50%{-webkit-transform:scale3d(1.15,0.85,1);transform:scale3d(1.15,0.85,1);}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1);}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1);}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand;}@-webkit-keyframes shake{from,to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0);}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0);}}@keyframes shake{from,to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0);}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0);}}.shake{-webkit-animation-name:shake;animation-name:shake;}@-webkit-keyframes headShake{0%{-webkit-transform:translateX(0);transform:translateX(0);}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg);}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg);}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg);}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg);}50%{-webkit-transform:translateX(0);transform:translateX(0);}}@keyframes headShake{0%{-webkit-transform:translateX(0);transform:translateX(0);}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg);}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg);}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg);}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg);}50%{-webkit-transform:translateX(0);transform:translateX(0);}}.headShake{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-name:headShake;animation-name:headShake;}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg);}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg);}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg);}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg);}to{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg);}}@keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg);}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg);}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg);}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg);}to{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg);}}.swing{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing;}@-webkit-keyframes tada{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);}}@keyframes tada{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);}}.tada{-webkit-animation-name:tada;animation-name:tada;}@-webkit-keyframes wobble{from{-webkit-transform:none;transform:none;}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);}to{-webkit-transform:none;transform:none;}}@keyframes wobble{from{-webkit-transform:none;transform:none;}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);}to{-webkit-transform:none;transform:none;}}.wobble{-webkit-animation-name:wobble;animation-name:wobble;}@-webkit-keyframes jello{from,11.1%,to{-webkit-transform:none;transform:none;}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg);}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg);}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg);}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg);}66.6%{-webkit-transform:skewX(-0.78125deg) skewY(-0.78125deg);transform:skewX(-0.78125deg) skewY(-0.78125deg);}77.7%{-webkit-transform:skewX(0.390625deg) skewY(0.390625deg);transform:skewX(0.390625deg) skewY(0.390625deg);}88.8%{-webkit-transform:skewX(-0.1953125deg) skewY(-0.1953125deg);transform:skewX(-0.1953125deg) skewY(-0.1953125deg);}}@keyframes jello{from,11.1%,to{-webkit-transform:none;transform:none;}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg);}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg);}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg);}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg);}66.6%{-webkit-transform:skewX(-0.78125deg) skewY(-0.78125deg);transform:skewX(-0.78125deg) skewY(-0.78125deg);}77.7%{-webkit-transform:skewX(0.390625deg) skewY(0.390625deg);transform:skewX(0.390625deg) skewY(0.390625deg);}88.8%{-webkit-transform:skewX(-0.1953125deg) skewY(-0.1953125deg);transform:skewX(-0.1953125deg) skewY(-0.1953125deg);}}.jello{-webkit-animation-name:jello;animation-name:jello;-webkit-transform-origin:center;transform-origin:center;}@-webkit-keyframes bounceIn{from,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3);}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1);}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9);}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03);}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97);}to{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);}}@keyframes bounceIn{from,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3);}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1);}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9);}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03);}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97);}to{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1);}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn;}@-webkit-keyframes bounceInDown{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0);}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0);}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0);}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0);}to{-webkit-transform:none;transform:none;}}@keyframes bounceInDown{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0);}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0);}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0);}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0);}to{-webkit-transform:none;transform:none;}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown;}@-webkit-keyframes bounceInLeft{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0);}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0);}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0);}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0);}to{-webkit-transform:none;transform:none;}}@keyframes bounceInLeft{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0);}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0);}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0);}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0);}to{-webkit-transform:none;transform:none;}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft;}@-webkit-keyframes bounceInRight{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);}from{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0);}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0);}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0);}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0);}to{-webkit-transform:none;transform:none;}}@keyframes bounceInRight{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);}from{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0);}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0);}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0);}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0);}to{-webkit-transform:none;transform:none;}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight;}@-webkit-keyframes bounceInUp{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);}from{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0);}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0);}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0);}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}@keyframes bounceInUp{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);}from{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0);}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0);}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0);}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp;}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9);}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1);}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3);}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9);}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1);}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3);}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut;}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0);}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0);}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0);}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0);}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown;}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0);}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0);}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0);}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0);}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft;}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0);}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0);}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0);}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0);}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight;}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0);}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0);}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0);}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0);}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0);}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0);}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp;}@-webkit-keyframes fadeIn{from{opacity:0;}to{opacity:1;}}@keyframes fadeIn{from{opacity:0;}to{opacity:1;}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn;}@-webkit-keyframes fadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);}to{opacity:1;-webkit-transform:none;transform:none;}}@keyframes fadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);}to{opacity:1;-webkit-transform:none;transform:none;}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown;}@-webkit-keyframes fadeInDownBig{from{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0);}to{opacity:1;-webkit-transform:none;transform:none;}}@keyframes fadeInDownBig{from{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0);}to{opacity:1;-webkit-transform:none;transform:none;}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig;}@-webkit-keyframes fadeInLeft{from{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);}to{opacity:1;-webkit-transform:none;transform:none;}}@keyframes fadeInLeft{from{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);}to{opacity:1;-webkit-transform:none;transform:none;}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft;}@-webkit-keyframes fadeInLeftBig{from{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0);}to{opacity:1;-webkit-transform:none;transform:none;}}@keyframes fadeInLeftBig{from{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0);}to{opacity:1;-webkit-transform:none;transform:none;}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig;}@-webkit-keyframes fadeInRight{from{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);}to{opacity:1;-webkit-transform:none;transform:none;}}@keyframes fadeInRight{from{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);}to{opacity:1;-webkit-transform:none;transform:none;}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight;}@-webkit-keyframes fadeInRightBig{from{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0);}to{opacity:1;-webkit-transform:none;transform:none;}}@keyframes fadeInRightBig{from{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0);}to{opacity:1;-webkit-transform:none;transform:none;}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig;}@-webkit-keyframes fadeInUp{from{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);}to{opacity:1;-webkit-transform:none;transform:none;}}@keyframes fadeInUp{from{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);}to{opacity:1;-webkit-transform:none;transform:none;}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp;}@-webkit-keyframes fadeInUpBig{from{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0);}to{opacity:1;-webkit-transform:none;transform:none;}}@keyframes fadeInUpBig{from{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0);}to{opacity:1;-webkit-transform:none;transform:none;}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig;}@-webkit-keyframes fadeOut{from{opacity:1;}to{opacity:0;}}@keyframes fadeOut{from{opacity:1;}to{opacity:0;}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut;}@-webkit-keyframes fadeOutDown{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);}}@keyframes fadeOutDown{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown;}@-webkit-keyframes fadeOutDownBig{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0);}}@keyframes fadeOutDownBig{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0);}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig;}@-webkit-keyframes fadeOutLeft{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);}}@keyframes fadeOutLeft{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft;}@-webkit-keyframes fadeOutLeftBig{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0);}}@keyframes fadeOutLeftBig{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0);}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig;}@-webkit-keyframes fadeOutRight{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);}}@keyframes fadeOutRight{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight;}@-webkit-keyframes fadeOutRightBig{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0);}}@keyframes fadeOutRightBig{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0);}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig;}@-webkit-keyframes fadeOutUp{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);}}@keyframes fadeOutUp{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp;}@-webkit-keyframes fadeOutUpBig{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0);}}@keyframes fadeOutUpBig{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0);}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig;}@-webkit-keyframes flip{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;}to{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;}}@keyframes flip{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;}to{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip;}@-webkit-keyframes flipInX{from{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0;}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1;}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg);}to{-webkit-transform:perspective(400px);transform:perspective(400px);}}@keyframes flipInX{from{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0;}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1;}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg);}to{-webkit-transform:perspective(400px);transform:perspective(400px);}}.flipInX{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipInX;animation-name:flipInX;}@-webkit-keyframes flipInY{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0;}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1;}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg);}to{-webkit-transform:perspective(400px);transform:perspective(400px);}}@keyframes flipInY{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0;}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1;}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg);}to{-webkit-transform:perspective(400px);transform:perspective(400px);}}.flipInY{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipInY;animation-name:flipInY;}@-webkit-keyframes flipOutX{from{-webkit-transform:perspective(400px);transform:perspective(400px);}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1;}to{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0;}}@keyframes flipOutX{from{-webkit-transform:perspective(400px);transform:perspective(400px);}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1;}to{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0;}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-backface-visibility:visible !important;backface-visibility:visible !important;}@-webkit-keyframes flipOutY{from{-webkit-transform:perspective(400px);transform:perspective(400px);}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1;}to{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0;}}@keyframes flipOutY{from{-webkit-transform:perspective(400px);transform:perspective(400px);}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1;}to{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0;}}.flipOutY{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipOutY;animation-name:flipOutY;}@-webkit-keyframes lightSpeedIn{from{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0;}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1;}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1;}to{-webkit-transform:none;transform:none;opacity:1;}}@keyframes lightSpeedIn{from{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0;}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1;}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1;}to{-webkit-transform:none;transform:none;opacity:1;}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;}@-webkit-keyframes lightSpeedOut{from{opacity:1;}to{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0;}}@keyframes lightSpeedOut{from{opacity:1;}to{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0;}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;}@-webkit-keyframes rotateIn{from{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0;}to{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1;}}@keyframes rotateIn{from{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0;}to{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1;}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn;}@-webkit-keyframes rotateInDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0;}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1;}}@keyframes rotateInDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0;}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1;}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft;}@-webkit-keyframes rotateInDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0;}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1;}}@keyframes rotateInDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0;}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1;}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight;}@-webkit-keyframes rotateInUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0;}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1;}}@keyframes rotateInUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0;}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1;}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft;}@-webkit-keyframes rotateInUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0;}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1;}}@keyframes rotateInUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0;}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1;}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight;}@-webkit-keyframes rotateOut{from{-webkit-transform-origin:center;transform-origin:center;opacity:1;}to{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0;}}@keyframes rotateOut{from{-webkit-transform-origin:center;transform-origin:center;opacity:1;}to{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0;}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut;}@-webkit-keyframes rotateOutDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1;}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0;}}@keyframes rotateOutDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1;}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0;}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft;}@-webkit-keyframes rotateOutDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1;}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0;}}@keyframes rotateOutDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1;}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0;}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight;}@-webkit-keyframes rotateOutUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1;}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0;}}@keyframes rotateOutUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1;}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0;}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft;}@-webkit-keyframes rotateOutUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1;}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0;}}@keyframes rotateOutUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1;}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0;}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight;}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1;}to{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0;}}@keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1;}to{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0;}}.hinge{-webkit-animation-name:hinge;animation-name:hinge;}@-webkit-keyframes rollIn{from{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);}to{opacity:1;-webkit-transform:none;transform:none;}}@keyframes rollIn{from{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);}to{opacity:1;-webkit-transform:none;transform:none;}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn;}@-webkit-keyframes rollOut{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);}}@keyframes rollOut{from{opacity:1;}to{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut;}@-webkit-keyframes zoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3);}50%{opacity:1;}}@keyframes zoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3);}50%{opacity:1;}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn;}@-webkit-keyframes zoomInDown{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);}}@keyframes zoomInDown{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown;}@-webkit-keyframes zoomInLeft{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);}}@keyframes zoomInLeft{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft;}@-webkit-keyframes zoomInRight{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);}}@keyframes zoomInRight{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight;}@-webkit-keyframes zoomInUp{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);}}@keyframes zoomInUp{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp;}@-webkit-keyframes zoomOut{from{opacity:1;}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3);}to{opacity:0;}}@keyframes zoomOut{from{opacity:1;}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3);}to{opacity:0;}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut;}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown;}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0);}to{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center;}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0);}to{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center;}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft;}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);}to{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center;}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);}to{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center;}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight;}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp;}@-webkit-keyframes slideInDown{from{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible;}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}@keyframes slideInDown{from{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible;}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown;}@-webkit-keyframes slideInLeft{from{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible;}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}@keyframes slideInLeft{from{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible;}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft;}@-webkit-keyframes slideInRight{from{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible;}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}@keyframes slideInRight{from{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible;}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight;}@-webkit-keyframes slideInUp{from{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible;}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}@keyframes slideInUp{from{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible;}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp;}@-webkit-keyframes slideOutDown{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}to{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);}}@keyframes slideOutDown{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}to{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown;}@-webkit-keyframes slideOutLeft{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}to{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);}}@keyframes slideOutLeft{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}to{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft;}@-webkit-keyframes slideOutRight{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}to{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);}}@keyframes slideOutRight{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}to{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight;}@-webkit-keyframes slideOutUp{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}to{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);}}@keyframes slideOutUp{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}to{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp;} \ No newline at end of file diff --git a/web/static/admin/css/bootstrap.min.css b/web/static/admin/css/bootstrap.min.css new file mode 100644 index 0000000..613d28a --- /dev/null +++ b/web/static/admin/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v4.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]){color:inherit;text-decoration:none}a:not([href]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 0%;flex:1 1 0%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{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);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal .list-group-item.active{margin-top:0}.list-group-horizontal .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm .list-group-item.active{margin-top:0}.list-group-horizontal-sm .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md .list-group-item.active{margin-top:0}.list-group-horizontal-md .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg .list-group-item.active{margin-top:0}.list-group-horizontal-lg .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl .list-group-item.active{margin-top:0}.list-group-horizontal-xl .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush .list-group-item{border-right-width:0;border-left-width:0;border-radius:0}.list-group-flush .list-group-item:first-child{border-top-width:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} diff --git a/web/static/admin/css/materialdesignicons.min.css b/web/static/admin/css/materialdesignicons.min.css new file mode 100644 index 0000000..b1aab02 --- /dev/null +++ b/web/static/admin/css/materialdesignicons.min.css @@ -0,0 +1 @@ +@font-face{font-family:"Material Design Icons";src:url("../fonts/materialdesignicons-webfont.eot?v=4.1.95");src:url("../fonts/materialdesignicons-webfont.eot?#iefix&v=4.1.95") format("embedded-opentype"),url("../fonts/materialdesignicons-webfont.woff2?v=4.1.95") format("woff2"),url("../fonts/materialdesignicons-webfont.woff?v=4.1.95") format("woff"),url("../fonts/materialdesignicons-webfont.ttf?v=4.1.95") format("truetype");font-weight:normal;font-style:normal}.mdi:before,.mdi-set{display:inline-block;font:normal normal normal 24px/1 "Material Design Icons";line-height:inherit;font-size:inherit;text-rendering:auto;-moz-osx-font-smoothing:grayscale}.mdi-ab-testing::before{content:"\F001C"}.mdi-access-point::before{content:"\F002"}.mdi-access-point-network::before{content:"\F003"}.mdi-access-point-network-off::before{content:"\FBBD"}.mdi-account::before{content:"\F004"}.mdi-account-alert::before{content:"\F005"}.mdi-account-alert-outline::before{content:"\FB2C"}.mdi-account-arrow-left::before{content:"\FB2D"}.mdi-account-arrow-left-outline::before{content:"\FB2E"}.mdi-account-arrow-right::before{content:"\FB2F"}.mdi-account-arrow-right-outline::before{content:"\FB30"}.mdi-account-badge::before{content:"\FD83"}.mdi-account-badge-alert::before{content:"\FD84"}.mdi-account-badge-alert-outline::before{content:"\FD85"}.mdi-account-badge-horizontal::before{content:"\FDF0"}.mdi-account-badge-horizontal-outline::before{content:"\FDF1"}.mdi-account-badge-outline::before{content:"\FD86"}.mdi-account-box::before{content:"\F006"}.mdi-account-box-multiple::before{content:"\F933"}.mdi-account-box-multiple-outline::before{content:"\F002C"}.mdi-account-box-outline::before{content:"\F007"}.mdi-account-card-details::before{content:"\F5D2"}.mdi-account-card-details-outline::before{content:"\FD87"}.mdi-account-check::before{content:"\F008"}.mdi-account-check-outline::before{content:"\FBBE"}.mdi-account-child::before{content:"\FA88"}.mdi-account-child-circle::before{content:"\FA89"}.mdi-account-circle::before{content:"\F009"}.mdi-account-circle-outline::before{content:"\FB31"}.mdi-account-clock::before{content:"\FB32"}.mdi-account-clock-outline::before{content:"\FB33"}.mdi-account-convert::before{content:"\F00A"}.mdi-account-details::before{content:"\F631"}.mdi-account-edit::before{content:"\F6BB"}.mdi-account-edit-outline::before{content:"\F001D"}.mdi-account-group::before{content:"\F848"}.mdi-account-group-outline::before{content:"\FB34"}.mdi-account-heart::before{content:"\F898"}.mdi-account-heart-outline::before{content:"\FBBF"}.mdi-account-key::before{content:"\F00B"}.mdi-account-key-outline::before{content:"\FBC0"}.mdi-account-minus::before{content:"\F00D"}.mdi-account-minus-outline::before{content:"\FAEB"}.mdi-account-multiple::before{content:"\F00E"}.mdi-account-multiple-check::before{content:"\F8C4"}.mdi-account-multiple-minus::before{content:"\F5D3"}.mdi-account-multiple-minus-outline::before{content:"\FBC1"}.mdi-account-multiple-outline::before{content:"\F00F"}.mdi-account-multiple-plus::before{content:"\F010"}.mdi-account-multiple-plus-outline::before{content:"\F7FF"}.mdi-account-network::before{content:"\F011"}.mdi-account-network-outline::before{content:"\FBC2"}.mdi-account-off::before{content:"\F012"}.mdi-account-off-outline::before{content:"\FBC3"}.mdi-account-outline::before{content:"\F013"}.mdi-account-plus::before{content:"\F014"}.mdi-account-plus-outline::before{content:"\F800"}.mdi-account-question::before{content:"\FB35"}.mdi-account-question-outline::before{content:"\FB36"}.mdi-account-remove::before{content:"\F015"}.mdi-account-remove-outline::before{content:"\FAEC"}.mdi-account-search::before{content:"\F016"}.mdi-account-search-outline::before{content:"\F934"}.mdi-account-settings::before{content:"\F630"}.mdi-account-star::before{content:"\F017"}.mdi-account-star-outline::before{content:"\FBC4"}.mdi-account-supervisor::before{content:"\FA8A"}.mdi-account-supervisor-circle::before{content:"\FA8B"}.mdi-account-switch::before{content:"\F019"}.mdi-account-tie::before{content:"\FCBF"}.mdi-accusoft::before{content:"\F849"}.mdi-adchoices::before{content:"\FD1E"}.mdi-adjust::before{content:"\F01A"}.mdi-adobe::before{content:"\F935"}.mdi-adobe-acrobat::before{content:"\FFBD"}.mdi-air-conditioner::before{content:"\F01B"}.mdi-air-filter::before{content:"\FD1F"}.mdi-air-horn::before{content:"\FD88"}.mdi-air-purifier::before{content:"\FD20"}.mdi-airbag::before{content:"\FBC5"}.mdi-airballoon::before{content:"\F01C"}.mdi-airballoon-outline::before{content:"\F002D"}.mdi-airplane::before{content:"\F01D"}.mdi-airplane-landing::before{content:"\F5D4"}.mdi-airplane-off::before{content:"\F01E"}.mdi-airplane-takeoff::before{content:"\F5D5"}.mdi-airplay::before{content:"\F01F"}.mdi-airport::before{content:"\F84A"}.mdi-alarm::before{content:"\F020"}.mdi-alarm-bell::before{content:"\F78D"}.mdi-alarm-check::before{content:"\F021"}.mdi-alarm-light::before{content:"\F78E"}.mdi-alarm-light-outline::before{content:"\FBC6"}.mdi-alarm-multiple::before{content:"\F022"}.mdi-alarm-note::before{content:"\FE8E"}.mdi-alarm-note-off::before{content:"\FE8F"}.mdi-alarm-off::before{content:"\F023"}.mdi-alarm-plus::before{content:"\F024"}.mdi-alarm-snooze::before{content:"\F68D"}.mdi-album::before{content:"\F025"}.mdi-alert::before{content:"\F026"}.mdi-alert-box::before{content:"\F027"}.mdi-alert-box-outline::before{content:"\FCC0"}.mdi-alert-circle::before{content:"\F028"}.mdi-alert-circle-outline::before{content:"\F5D6"}.mdi-alert-decagram::before{content:"\F6BC"}.mdi-alert-decagram-outline::before{content:"\FCC1"}.mdi-alert-octagon::before{content:"\F029"}.mdi-alert-octagon-outline::before{content:"\FCC2"}.mdi-alert-octagram::before{content:"\F766"}.mdi-alert-octagram-outline::before{content:"\FCC3"}.mdi-alert-outline::before{content:"\F02A"}.mdi-alien::before{content:"\F899"}.mdi-all-inclusive::before{content:"\F6BD"}.mdi-alpha::before{content:"\F02B"}.mdi-alpha-a::before{content:"\41"}.mdi-alpha-a-box::before{content:"\FAED"}.mdi-alpha-a-box-outline::before{content:"\FBC7"}.mdi-alpha-a-circle::before{content:"\FBC8"}.mdi-alpha-a-circle-outline::before{content:"\FBC9"}.mdi-alpha-b::before{content:"\42"}.mdi-alpha-b-box::before{content:"\FAEE"}.mdi-alpha-b-box-outline::before{content:"\FBCA"}.mdi-alpha-b-circle::before{content:"\FBCB"}.mdi-alpha-b-circle-outline::before{content:"\FBCC"}.mdi-alpha-c::before{content:"\43"}.mdi-alpha-c-box::before{content:"\FAEF"}.mdi-alpha-c-box-outline::before{content:"\FBCD"}.mdi-alpha-c-circle::before{content:"\FBCE"}.mdi-alpha-c-circle-outline::before{content:"\FBCF"}.mdi-alpha-d::before{content:"\44"}.mdi-alpha-d-box::before{content:"\FAF0"}.mdi-alpha-d-box-outline::before{content:"\FBD0"}.mdi-alpha-d-circle::before{content:"\FBD1"}.mdi-alpha-d-circle-outline::before{content:"\FBD2"}.mdi-alpha-e::before{content:"\45"}.mdi-alpha-e-box::before{content:"\FAF1"}.mdi-alpha-e-box-outline::before{content:"\FBD3"}.mdi-alpha-e-circle::before{content:"\FBD4"}.mdi-alpha-e-circle-outline::before{content:"\FBD5"}.mdi-alpha-f::before{content:"\46"}.mdi-alpha-f-box::before{content:"\FAF2"}.mdi-alpha-f-box-outline::before{content:"\FBD6"}.mdi-alpha-f-circle::before{content:"\FBD7"}.mdi-alpha-f-circle-outline::before{content:"\FBD8"}.mdi-alpha-g::before{content:"\47"}.mdi-alpha-g-box::before{content:"\FAF3"}.mdi-alpha-g-box-outline::before{content:"\FBD9"}.mdi-alpha-g-circle::before{content:"\FBDA"}.mdi-alpha-g-circle-outline::before{content:"\FBDB"}.mdi-alpha-h::before{content:"\48"}.mdi-alpha-h-box::before{content:"\FAF4"}.mdi-alpha-h-box-outline::before{content:"\FBDC"}.mdi-alpha-h-circle::before{content:"\FBDD"}.mdi-alpha-h-circle-outline::before{content:"\FBDE"}.mdi-alpha-i::before{content:"\49"}.mdi-alpha-i-box::before{content:"\FAF5"}.mdi-alpha-i-box-outline::before{content:"\FBDF"}.mdi-alpha-i-circle::before{content:"\FBE0"}.mdi-alpha-i-circle-outline::before{content:"\FBE1"}.mdi-alpha-j::before{content:"\4A"}.mdi-alpha-j-box::before{content:"\FAF6"}.mdi-alpha-j-box-outline::before{content:"\FBE2"}.mdi-alpha-j-circle::before{content:"\FBE3"}.mdi-alpha-j-circle-outline::before{content:"\FBE4"}.mdi-alpha-k::before{content:"\4B"}.mdi-alpha-k-box::before{content:"\FAF7"}.mdi-alpha-k-box-outline::before{content:"\FBE5"}.mdi-alpha-k-circle::before{content:"\FBE6"}.mdi-alpha-k-circle-outline::before{content:"\FBE7"}.mdi-alpha-l::before{content:"\4C"}.mdi-alpha-l-box::before{content:"\FAF8"}.mdi-alpha-l-box-outline::before{content:"\FBE8"}.mdi-alpha-l-circle::before{content:"\FBE9"}.mdi-alpha-l-circle-outline::before{content:"\FBEA"}.mdi-alpha-m::before{content:"\4D"}.mdi-alpha-m-box::before{content:"\FAF9"}.mdi-alpha-m-box-outline::before{content:"\FBEB"}.mdi-alpha-m-circle::before{content:"\FBEC"}.mdi-alpha-m-circle-outline::before{content:"\FBED"}.mdi-alpha-n::before{content:"\4E"}.mdi-alpha-n-box::before{content:"\FAFA"}.mdi-alpha-n-box-outline::before{content:"\FBEE"}.mdi-alpha-n-circle::before{content:"\FBEF"}.mdi-alpha-n-circle-outline::before{content:"\FBF0"}.mdi-alpha-o::before{content:"\4F"}.mdi-alpha-o-box::before{content:"\FAFB"}.mdi-alpha-o-box-outline::before{content:"\FBF1"}.mdi-alpha-o-circle::before{content:"\FBF2"}.mdi-alpha-o-circle-outline::before{content:"\FBF3"}.mdi-alpha-p::before{content:"\50"}.mdi-alpha-p-box::before{content:"\FAFC"}.mdi-alpha-p-box-outline::before{content:"\FBF4"}.mdi-alpha-p-circle::before{content:"\FBF5"}.mdi-alpha-p-circle-outline::before{content:"\FBF6"}.mdi-alpha-q::before{content:"\51"}.mdi-alpha-q-box::before{content:"\FAFD"}.mdi-alpha-q-box-outline::before{content:"\FBF7"}.mdi-alpha-q-circle::before{content:"\FBF8"}.mdi-alpha-q-circle-outline::before{content:"\FBF9"}.mdi-alpha-r::before{content:"\52"}.mdi-alpha-r-box::before{content:"\FAFE"}.mdi-alpha-r-box-outline::before{content:"\FBFA"}.mdi-alpha-r-circle::before{content:"\FBFB"}.mdi-alpha-r-circle-outline::before{content:"\FBFC"}.mdi-alpha-s::before{content:"\53"}.mdi-alpha-s-box::before{content:"\FAFF"}.mdi-alpha-s-box-outline::before{content:"\FBFD"}.mdi-alpha-s-circle::before{content:"\FBFE"}.mdi-alpha-s-circle-outline::before{content:"\FBFF"}.mdi-alpha-t::before{content:"\54"}.mdi-alpha-t-box::before{content:"\FB00"}.mdi-alpha-t-box-outline::before{content:"\FC00"}.mdi-alpha-t-circle::before{content:"\FC01"}.mdi-alpha-t-circle-outline::before{content:"\FC02"}.mdi-alpha-u::before{content:"\55"}.mdi-alpha-u-box::before{content:"\FB01"}.mdi-alpha-u-box-outline::before{content:"\FC03"}.mdi-alpha-u-circle::before{content:"\FC04"}.mdi-alpha-u-circle-outline::before{content:"\FC05"}.mdi-alpha-v::before{content:"\56"}.mdi-alpha-v-box::before{content:"\FB02"}.mdi-alpha-v-box-outline::before{content:"\FC06"}.mdi-alpha-v-circle::before{content:"\FC07"}.mdi-alpha-v-circle-outline::before{content:"\FC08"}.mdi-alpha-w::before{content:"\57"}.mdi-alpha-w-box::before{content:"\FB03"}.mdi-alpha-w-box-outline::before{content:"\FC09"}.mdi-alpha-w-circle::before{content:"\FC0A"}.mdi-alpha-w-circle-outline::before{content:"\FC0B"}.mdi-alpha-x::before{content:"\58"}.mdi-alpha-x-box::before{content:"\FB04"}.mdi-alpha-x-box-outline::before{content:"\FC0C"}.mdi-alpha-x-circle::before{content:"\FC0D"}.mdi-alpha-x-circle-outline::before{content:"\FC0E"}.mdi-alpha-y::before{content:"\59"}.mdi-alpha-y-box::before{content:"\FB05"}.mdi-alpha-y-box-outline::before{content:"\FC0F"}.mdi-alpha-y-circle::before{content:"\FC10"}.mdi-alpha-y-circle-outline::before{content:"\FC11"}.mdi-alpha-z::before{content:"\5A"}.mdi-alpha-z-box::before{content:"\FB06"}.mdi-alpha-z-box-outline::before{content:"\FC12"}.mdi-alpha-z-circle::before{content:"\FC13"}.mdi-alpha-z-circle-outline::before{content:"\FC14"}.mdi-alphabetical::before{content:"\F02C"}.mdi-alphabetical-off::before{content:"\F002E"}.mdi-alphabetical-variant::before{content:"\F002F"}.mdi-alphabetical-variant-off::before{content:"\F0030"}.mdi-altimeter::before{content:"\F5D7"}.mdi-amazon::before{content:"\F02D"}.mdi-amazon-alexa::before{content:"\F8C5"}.mdi-amazon-drive::before{content:"\F02E"}.mdi-ambulance::before{content:"\F02F"}.mdi-ammunition::before{content:"\FCC4"}.mdi-ampersand::before{content:"\FA8C"}.mdi-amplifier::before{content:"\F030"}.mdi-anchor::before{content:"\F031"}.mdi-android::before{content:"\F032"}.mdi-android-auto::before{content:"\FA8D"}.mdi-android-debug-bridge::before{content:"\F033"}.mdi-android-head::before{content:"\F78F"}.mdi-android-messages::before{content:"\FD21"}.mdi-android-studio::before{content:"\F034"}.mdi-angle-acute::before{content:"\F936"}.mdi-angle-obtuse::before{content:"\F937"}.mdi-angle-right::before{content:"\F938"}.mdi-angular::before{content:"\F6B1"}.mdi-angularjs::before{content:"\F6BE"}.mdi-animation::before{content:"\F5D8"}.mdi-animation-outline::before{content:"\FA8E"}.mdi-animation-play::before{content:"\F939"}.mdi-animation-play-outline::before{content:"\FA8F"}.mdi-anvil::before{content:"\F89A"}.mdi-apache-kafka::before{content:"\F0031"}.mdi-apple::before{content:"\F035"}.mdi-apple-finder::before{content:"\F036"}.mdi-apple-icloud::before{content:"\F038"}.mdi-apple-ios::before{content:"\F037"}.mdi-apple-keyboard-caps::before{content:"\F632"}.mdi-apple-keyboard-command::before{content:"\F633"}.mdi-apple-keyboard-control::before{content:"\F634"}.mdi-apple-keyboard-option::before{content:"\F635"}.mdi-apple-keyboard-shift::before{content:"\F636"}.mdi-apple-safari::before{content:"\F039"}.mdi-application::before{content:"\F614"}.mdi-application-export::before{content:"\FD89"}.mdi-application-import::before{content:"\FD8A"}.mdi-approximately-equal::before{content:"\FFBE"}.mdi-approximately-equal-box::before{content:"\FFBF"}.mdi-apps::before{content:"\F03B"}.mdi-apps-box::before{content:"\FD22"}.mdi-arch::before{content:"\F8C6"}.mdi-archive::before{content:"\F03C"}.mdi-arrange-bring-forward::before{content:"\F03D"}.mdi-arrange-bring-to-front::before{content:"\F03E"}.mdi-arrange-send-backward::before{content:"\F03F"}.mdi-arrange-send-to-back::before{content:"\F040"}.mdi-arrow-all::before{content:"\F041"}.mdi-arrow-bottom-left::before{content:"\F042"}.mdi-arrow-bottom-left-bold-outline::before{content:"\F9B6"}.mdi-arrow-bottom-left-thick::before{content:"\F9B7"}.mdi-arrow-bottom-right::before{content:"\F043"}.mdi-arrow-bottom-right-bold-outline::before{content:"\F9B8"}.mdi-arrow-bottom-right-thick::before{content:"\F9B9"}.mdi-arrow-collapse::before{content:"\F615"}.mdi-arrow-collapse-all::before{content:"\F044"}.mdi-arrow-collapse-down::before{content:"\F791"}.mdi-arrow-collapse-horizontal::before{content:"\F84B"}.mdi-arrow-collapse-left::before{content:"\F792"}.mdi-arrow-collapse-right::before{content:"\F793"}.mdi-arrow-collapse-up::before{content:"\F794"}.mdi-arrow-collapse-vertical::before{content:"\F84C"}.mdi-arrow-decision::before{content:"\F9BA"}.mdi-arrow-decision-auto::before{content:"\F9BB"}.mdi-arrow-decision-auto-outline::before{content:"\F9BC"}.mdi-arrow-decision-outline::before{content:"\F9BD"}.mdi-arrow-down::before{content:"\F045"}.mdi-arrow-down-bold::before{content:"\F72D"}.mdi-arrow-down-bold-box::before{content:"\F72E"}.mdi-arrow-down-bold-box-outline::before{content:"\F72F"}.mdi-arrow-down-bold-circle::before{content:"\F047"}.mdi-arrow-down-bold-circle-outline::before{content:"\F048"}.mdi-arrow-down-bold-hexagon-outline::before{content:"\F049"}.mdi-arrow-down-bold-outline::before{content:"\F9BE"}.mdi-arrow-down-box::before{content:"\F6BF"}.mdi-arrow-down-circle::before{content:"\FCB7"}.mdi-arrow-down-circle-outline::before{content:"\FCB8"}.mdi-arrow-down-drop-circle::before{content:"\F04A"}.mdi-arrow-down-drop-circle-outline::before{content:"\F04B"}.mdi-arrow-down-thick::before{content:"\F046"}.mdi-arrow-expand::before{content:"\F616"}.mdi-arrow-expand-all::before{content:"\F04C"}.mdi-arrow-expand-down::before{content:"\F795"}.mdi-arrow-expand-horizontal::before{content:"\F84D"}.mdi-arrow-expand-left::before{content:"\F796"}.mdi-arrow-expand-right::before{content:"\F797"}.mdi-arrow-expand-up::before{content:"\F798"}.mdi-arrow-expand-vertical::before{content:"\F84E"}.mdi-arrow-left::before{content:"\F04D"}.mdi-arrow-left-bold::before{content:"\F730"}.mdi-arrow-left-bold-box::before{content:"\F731"}.mdi-arrow-left-bold-box-outline::before{content:"\F732"}.mdi-arrow-left-bold-circle::before{content:"\F04F"}.mdi-arrow-left-bold-circle-outline::before{content:"\F050"}.mdi-arrow-left-bold-hexagon-outline::before{content:"\F051"}.mdi-arrow-left-bold-outline::before{content:"\F9BF"}.mdi-arrow-left-box::before{content:"\F6C0"}.mdi-arrow-left-circle::before{content:"\FCB9"}.mdi-arrow-left-circle-outline::before{content:"\FCBA"}.mdi-arrow-left-drop-circle::before{content:"\F052"}.mdi-arrow-left-drop-circle-outline::before{content:"\F053"}.mdi-arrow-left-right::before{content:"\FE90"}.mdi-arrow-left-right-bold::before{content:"\FE91"}.mdi-arrow-left-right-bold-outline::before{content:"\F9C0"}.mdi-arrow-left-thick::before{content:"\F04E"}.mdi-arrow-right::before{content:"\F054"}.mdi-arrow-right-bold::before{content:"\F733"}.mdi-arrow-right-bold-box::before{content:"\F734"}.mdi-arrow-right-bold-box-outline::before{content:"\F735"}.mdi-arrow-right-bold-circle::before{content:"\F056"}.mdi-arrow-right-bold-circle-outline::before{content:"\F057"}.mdi-arrow-right-bold-hexagon-outline::before{content:"\F058"}.mdi-arrow-right-bold-outline::before{content:"\F9C1"}.mdi-arrow-right-box::before{content:"\F6C1"}.mdi-arrow-right-circle::before{content:"\FCBB"}.mdi-arrow-right-circle-outline::before{content:"\FCBC"}.mdi-arrow-right-drop-circle::before{content:"\F059"}.mdi-arrow-right-drop-circle-outline::before{content:"\F05A"}.mdi-arrow-right-thick::before{content:"\F055"}.mdi-arrow-split-horizontal::before{content:"\F93A"}.mdi-arrow-split-vertical::before{content:"\F93B"}.mdi-arrow-top-left::before{content:"\F05B"}.mdi-arrow-top-left-bold-outline::before{content:"\F9C2"}.mdi-arrow-top-left-bottom-right::before{content:"\FE92"}.mdi-arrow-top-left-bottom-right-bold::before{content:"\FE93"}.mdi-arrow-top-left-thick::before{content:"\F9C3"}.mdi-arrow-top-right::before{content:"\F05C"}.mdi-arrow-top-right-bold-outline::before{content:"\F9C4"}.mdi-arrow-top-right-bottom-left::before{content:"\FE94"}.mdi-arrow-top-right-bottom-left-bold::before{content:"\FE95"}.mdi-arrow-top-right-thick::before{content:"\F9C5"}.mdi-arrow-up::before{content:"\F05D"}.mdi-arrow-up-bold::before{content:"\F736"}.mdi-arrow-up-bold-box::before{content:"\F737"}.mdi-arrow-up-bold-box-outline::before{content:"\F738"}.mdi-arrow-up-bold-circle::before{content:"\F05F"}.mdi-arrow-up-bold-circle-outline::before{content:"\F060"}.mdi-arrow-up-bold-hexagon-outline::before{content:"\F061"}.mdi-arrow-up-bold-outline::before{content:"\F9C6"}.mdi-arrow-up-box::before{content:"\F6C2"}.mdi-arrow-up-circle::before{content:"\FCBD"}.mdi-arrow-up-circle-outline::before{content:"\FCBE"}.mdi-arrow-up-down::before{content:"\FE96"}.mdi-arrow-up-down-bold::before{content:"\FE97"}.mdi-arrow-up-down-bold-outline::before{content:"\F9C7"}.mdi-arrow-up-drop-circle::before{content:"\F062"}.mdi-arrow-up-drop-circle-outline::before{content:"\F063"}.mdi-arrow-up-thick::before{content:"\F05E"}.mdi-artist::before{content:"\F802"}.mdi-artist-outline::before{content:"\FCC5"}.mdi-artstation::before{content:"\FB37"}.mdi-aspect-ratio::before{content:"\FA23"}.mdi-assistant::before{content:"\F064"}.mdi-asterisk::before{content:"\F6C3"}.mdi-at::before{content:"\F065"}.mdi-atlassian::before{content:"\F803"}.mdi-atm::before{content:"\FD23"}.mdi-atom::before{content:"\F767"}.mdi-atom-variant::before{content:"\FE98"}.mdi-attachment::before{content:"\F066"}.mdi-audio-video::before{content:"\F93C"}.mdi-audiobook::before{content:"\F067"}.mdi-augmented-reality::before{content:"\F84F"}.mdi-auto-fix::before{content:"\F068"}.mdi-auto-upload::before{content:"\F069"}.mdi-autorenew::before{content:"\F06A"}.mdi-av-timer::before{content:"\F06B"}.mdi-aws::before{content:"\FDF2"}.mdi-axe::before{content:"\F8C7"}.mdi-axis::before{content:"\FD24"}.mdi-axis-arrow::before{content:"\FD25"}.mdi-axis-arrow-lock::before{content:"\FD26"}.mdi-axis-lock::before{content:"\FD27"}.mdi-axis-x-arrow::before{content:"\FD28"}.mdi-axis-x-arrow-lock::before{content:"\FD29"}.mdi-axis-x-rotate-clockwise::before{content:"\FD2A"}.mdi-axis-x-rotate-counterclockwise::before{content:"\FD2B"}.mdi-axis-x-y-arrow-lock::before{content:"\FD2C"}.mdi-axis-y-arrow::before{content:"\FD2D"}.mdi-axis-y-arrow-lock::before{content:"\FD2E"}.mdi-axis-y-rotate-clockwise::before{content:"\FD2F"}.mdi-axis-y-rotate-counterclockwise::before{content:"\FD30"}.mdi-axis-z-arrow::before{content:"\FD31"}.mdi-axis-z-arrow-lock::before{content:"\FD32"}.mdi-axis-z-rotate-clockwise::before{content:"\FD33"}.mdi-axis-z-rotate-counterclockwise::before{content:"\FD34"}.mdi-azure::before{content:"\F804"}.mdi-babel::before{content:"\FA24"}.mdi-baby::before{content:"\F06C"}.mdi-baby-bottle::before{content:"\FF56"}.mdi-baby-bottle-outline::before{content:"\FF57"}.mdi-baby-carriage::before{content:"\F68E"}.mdi-baby-carriage-off::before{content:"\FFC0"}.mdi-baby-face::before{content:"\FE99"}.mdi-baby-face-outline::before{content:"\FE9A"}.mdi-backburger::before{content:"\F06D"}.mdi-backspace::before{content:"\F06E"}.mdi-backspace-outline::before{content:"\FB38"}.mdi-backspace-reverse::before{content:"\FE9B"}.mdi-backspace-reverse-outline::before{content:"\FE9C"}.mdi-backup-restore::before{content:"\F06F"}.mdi-bacteria::before{content:"\FEF2"}.mdi-bacteria-outline::before{content:"\FEF3"}.mdi-badminton::before{content:"\F850"}.mdi-bag-carry-on::before{content:"\FF58"}.mdi-bag-carry-on-check::before{content:"\FD41"}.mdi-bag-carry-on-off::before{content:"\FF59"}.mdi-bag-checked::before{content:"\FF5A"}.mdi-bag-personal::before{content:"\FDF3"}.mdi-bag-personal-off::before{content:"\FDF4"}.mdi-bag-personal-off-outline::before{content:"\FDF5"}.mdi-bag-personal-outline::before{content:"\FDF6"}.mdi-baguette::before{content:"\FF5B"}.mdi-balloon::before{content:"\FA25"}.mdi-ballot::before{content:"\F9C8"}.mdi-ballot-outline::before{content:"\F9C9"}.mdi-ballot-recount::before{content:"\FC15"}.mdi-ballot-recount-outline::before{content:"\FC16"}.mdi-bandage::before{content:"\FD8B"}.mdi-bandcamp::before{content:"\F674"}.mdi-bank::before{content:"\F070"}.mdi-bank-minus::before{content:"\FD8C"}.mdi-bank-outline::before{content:"\FE9D"}.mdi-bank-plus::before{content:"\FD8D"}.mdi-bank-remove::before{content:"\FD8E"}.mdi-bank-transfer::before{content:"\FA26"}.mdi-bank-transfer-in::before{content:"\FA27"}.mdi-bank-transfer-out::before{content:"\FA28"}.mdi-barcode::before{content:"\F071"}.mdi-barcode-scan::before{content:"\F072"}.mdi-barley::before{content:"\F073"}.mdi-barley-off::before{content:"\FB39"}.mdi-barn::before{content:"\FB3A"}.mdi-barrel::before{content:"\F074"}.mdi-baseball::before{content:"\F851"}.mdi-baseball-bat::before{content:"\F852"}.mdi-basecamp::before{content:"\F075"}.mdi-basket::before{content:"\F076"}.mdi-basket-fill::before{content:"\F077"}.mdi-basket-unfill::before{content:"\F078"}.mdi-basketball::before{content:"\F805"}.mdi-basketball-hoop::before{content:"\FC17"}.mdi-basketball-hoop-outline::before{content:"\FC18"}.mdi-bat::before{content:"\FB3B"}.mdi-battery::before{content:"\F079"}.mdi-battery-10::before{content:"\F07A"}.mdi-battery-10-bluetooth::before{content:"\F93D"}.mdi-battery-20::before{content:"\F07B"}.mdi-battery-20-bluetooth::before{content:"\F93E"}.mdi-battery-30::before{content:"\F07C"}.mdi-battery-30-bluetooth::before{content:"\F93F"}.mdi-battery-40::before{content:"\F07D"}.mdi-battery-40-bluetooth::before{content:"\F940"}.mdi-battery-50::before{content:"\F07E"}.mdi-battery-50-bluetooth::before{content:"\F941"}.mdi-battery-60::before{content:"\F07F"}.mdi-battery-60-bluetooth::before{content:"\F942"}.mdi-battery-70::before{content:"\F080"}.mdi-battery-70-bluetooth::before{content:"\F943"}.mdi-battery-80::before{content:"\F081"}.mdi-battery-80-bluetooth::before{content:"\F944"}.mdi-battery-90::before{content:"\F082"}.mdi-battery-90-bluetooth::before{content:"\F945"}.mdi-battery-alert::before{content:"\F083"}.mdi-battery-alert-bluetooth::before{content:"\F946"}.mdi-battery-bluetooth::before{content:"\F947"}.mdi-battery-bluetooth-variant::before{content:"\F948"}.mdi-battery-charging::before{content:"\F084"}.mdi-battery-charging-10::before{content:"\F89B"}.mdi-battery-charging-100::before{content:"\F085"}.mdi-battery-charging-20::before{content:"\F086"}.mdi-battery-charging-30::before{content:"\F087"}.mdi-battery-charging-40::before{content:"\F088"}.mdi-battery-charging-50::before{content:"\F89C"}.mdi-battery-charging-60::before{content:"\F089"}.mdi-battery-charging-70::before{content:"\F89D"}.mdi-battery-charging-80::before{content:"\F08A"}.mdi-battery-charging-90::before{content:"\F08B"}.mdi-battery-charging-outline::before{content:"\F89E"}.mdi-battery-charging-wireless::before{content:"\F806"}.mdi-battery-charging-wireless-10::before{content:"\F807"}.mdi-battery-charging-wireless-20::before{content:"\F808"}.mdi-battery-charging-wireless-30::before{content:"\F809"}.mdi-battery-charging-wireless-40::before{content:"\F80A"}.mdi-battery-charging-wireless-50::before{content:"\F80B"}.mdi-battery-charging-wireless-60::before{content:"\F80C"}.mdi-battery-charging-wireless-70::before{content:"\F80D"}.mdi-battery-charging-wireless-80::before{content:"\F80E"}.mdi-battery-charging-wireless-90::before{content:"\F80F"}.mdi-battery-charging-wireless-alert::before{content:"\F810"}.mdi-battery-charging-wireless-outline::before{content:"\F811"}.mdi-battery-minus::before{content:"\F08C"}.mdi-battery-negative::before{content:"\F08D"}.mdi-battery-outline::before{content:"\F08E"}.mdi-battery-plus::before{content:"\F08F"}.mdi-battery-positive::before{content:"\F090"}.mdi-battery-unknown::before{content:"\F091"}.mdi-battery-unknown-bluetooth::before{content:"\F949"}.mdi-battlenet::before{content:"\FB3C"}.mdi-beach::before{content:"\F092"}.mdi-beaker::before{content:"\FCC6"}.mdi-beaker-outline::before{content:"\F68F"}.mdi-beats::before{content:"\F097"}.mdi-bed-empty::before{content:"\F89F"}.mdi-bee::before{content:"\FFC1"}.mdi-bee-flower::before{content:"\FFC2"}.mdi-beer::before{content:"\F098"}.mdi-behance::before{content:"\F099"}.mdi-bell::before{content:"\F09A"}.mdi-bell-alert::before{content:"\FD35"}.mdi-bell-alert-outline::before{content:"\FE9E"}.mdi-bell-circle::before{content:"\FD36"}.mdi-bell-circle-outline::before{content:"\FD37"}.mdi-bell-off::before{content:"\F09B"}.mdi-bell-off-outline::before{content:"\FA90"}.mdi-bell-outline::before{content:"\F09C"}.mdi-bell-plus::before{content:"\F09D"}.mdi-bell-plus-outline::before{content:"\FA91"}.mdi-bell-ring::before{content:"\F09E"}.mdi-bell-ring-outline::before{content:"\F09F"}.mdi-bell-sleep::before{content:"\F0A0"}.mdi-bell-sleep-outline::before{content:"\FA92"}.mdi-beta::before{content:"\F0A1"}.mdi-betamax::before{content:"\F9CA"}.mdi-biathlon::before{content:"\FDF7"}.mdi-bible::before{content:"\F0A2"}.mdi-bike::before{content:"\F0A3"}.mdi-billboard::before{content:"\F0032"}.mdi-billiards::before{content:"\FB3D"}.mdi-billiards-rack::before{content:"\FB3E"}.mdi-bing::before{content:"\F0A4"}.mdi-binoculars::before{content:"\F0A5"}.mdi-bio::before{content:"\F0A6"}.mdi-biohazard::before{content:"\F0A7"}.mdi-bitbucket::before{content:"\F0A8"}.mdi-bitcoin::before{content:"\F812"}.mdi-black-mesa::before{content:"\F0A9"}.mdi-blackberry::before{content:"\F0AA"}.mdi-blender::before{content:"\FCC7"}.mdi-blender-software::before{content:"\F0AB"}.mdi-blinds::before{content:"\F0AC"}.mdi-blinds-open::before{content:"\F0033"}.mdi-block-helper::before{content:"\F0AD"}.mdi-blogger::before{content:"\F0AE"}.mdi-blood-bag::before{content:"\FCC8"}.mdi-bluetooth::before{content:"\F0AF"}.mdi-bluetooth-audio::before{content:"\F0B0"}.mdi-bluetooth-connect::before{content:"\F0B1"}.mdi-bluetooth-off::before{content:"\F0B2"}.mdi-bluetooth-settings::before{content:"\F0B3"}.mdi-bluetooth-transfer::before{content:"\F0B4"}.mdi-blur::before{content:"\F0B5"}.mdi-blur-linear::before{content:"\F0B6"}.mdi-blur-off::before{content:"\F0B7"}.mdi-blur-radial::before{content:"\F0B8"}.mdi-bolnisi-cross::before{content:"\FCC9"}.mdi-bolt::before{content:"\FD8F"}.mdi-bomb::before{content:"\F690"}.mdi-bomb-off::before{content:"\F6C4"}.mdi-bone::before{content:"\F0B9"}.mdi-book::before{content:"\F0BA"}.mdi-book-lock::before{content:"\F799"}.mdi-book-lock-open::before{content:"\F79A"}.mdi-book-minus::before{content:"\F5D9"}.mdi-book-minus-multiple::before{content:"\FA93"}.mdi-book-multiple::before{content:"\F0BB"}.mdi-book-open::before{content:"\F0BD"}.mdi-book-open-outline::before{content:"\FB3F"}.mdi-book-open-page-variant::before{content:"\F5DA"}.mdi-book-open-variant::before{content:"\F0BE"}.mdi-book-outline::before{content:"\FB40"}.mdi-book-play::before{content:"\FE9F"}.mdi-book-play-outline::before{content:"\FEA0"}.mdi-book-plus::before{content:"\F5DB"}.mdi-book-plus-multiple::before{content:"\FA94"}.mdi-book-remove::before{content:"\FA96"}.mdi-book-remove-multiple::before{content:"\FA95"}.mdi-book-search::before{content:"\FEA1"}.mdi-book-search-outline::before{content:"\FEA2"}.mdi-book-variant::before{content:"\F0BF"}.mdi-book-variant-multiple::before{content:"\F0BC"}.mdi-bookmark::before{content:"\F0C0"}.mdi-bookmark-check::before{content:"\F0C1"}.mdi-bookmark-minus::before{content:"\F9CB"}.mdi-bookmark-minus-outline::before{content:"\F9CC"}.mdi-bookmark-multiple::before{content:"\FDF8"}.mdi-bookmark-multiple-outline::before{content:"\FDF9"}.mdi-bookmark-music::before{content:"\F0C2"}.mdi-bookmark-off::before{content:"\F9CD"}.mdi-bookmark-off-outline::before{content:"\F9CE"}.mdi-bookmark-outline::before{content:"\F0C3"}.mdi-bookmark-plus::before{content:"\F0C5"}.mdi-bookmark-plus-outline::before{content:"\F0C4"}.mdi-bookmark-remove::before{content:"\F0C6"}.mdi-boom-gate::before{content:"\FEA3"}.mdi-boom-gate-alert::before{content:"\FEA4"}.mdi-boom-gate-alert-outline::before{content:"\FEA5"}.mdi-boom-gate-down::before{content:"\FEA6"}.mdi-boom-gate-down-outline::before{content:"\FEA7"}.mdi-boom-gate-outline::before{content:"\FEA8"}.mdi-boom-gate-up::before{content:"\FEA9"}.mdi-boom-gate-up-outline::before{content:"\FEAA"}.mdi-boombox::before{content:"\F5DC"}.mdi-bootstrap::before{content:"\F6C5"}.mdi-border-all::before{content:"\F0C7"}.mdi-border-all-variant::before{content:"\F8A0"}.mdi-border-bottom::before{content:"\F0C8"}.mdi-border-bottom-variant::before{content:"\F8A1"}.mdi-border-color::before{content:"\F0C9"}.mdi-border-horizontal::before{content:"\F0CA"}.mdi-border-inside::before{content:"\F0CB"}.mdi-border-left::before{content:"\F0CC"}.mdi-border-left-variant::before{content:"\F8A2"}.mdi-border-none::before{content:"\F0CD"}.mdi-border-none-variant::before{content:"\F8A3"}.mdi-border-outside::before{content:"\F0CE"}.mdi-border-right::before{content:"\F0CF"}.mdi-border-right-variant::before{content:"\F8A4"}.mdi-border-style::before{content:"\F0D0"}.mdi-border-top::before{content:"\F0D1"}.mdi-border-top-variant::before{content:"\F8A5"}.mdi-border-vertical::before{content:"\F0D2"}.mdi-bottle-wine::before{content:"\F853"}.mdi-bow-tie::before{content:"\F677"}.mdi-bowl::before{content:"\F617"}.mdi-bowling::before{content:"\F0D3"}.mdi-box::before{content:"\F0D4"}.mdi-box-cutter::before{content:"\F0D5"}.mdi-box-shadow::before{content:"\F637"}.mdi-boxing-glove::before{content:"\FB41"}.mdi-braille::before{content:"\F9CF"}.mdi-brain::before{content:"\F9D0"}.mdi-bread-slice::before{content:"\FCCA"}.mdi-bread-slice-outline::before{content:"\FCCB"}.mdi-bridge::before{content:"\F618"}.mdi-briefcase::before{content:"\F0D6"}.mdi-briefcase-account::before{content:"\FCCC"}.mdi-briefcase-account-outline::before{content:"\FCCD"}.mdi-briefcase-check::before{content:"\F0D7"}.mdi-briefcase-download::before{content:"\F0D8"}.mdi-briefcase-download-outline::before{content:"\FC19"}.mdi-briefcase-edit::before{content:"\FA97"}.mdi-briefcase-edit-outline::before{content:"\FC1A"}.mdi-briefcase-minus::before{content:"\FA29"}.mdi-briefcase-minus-outline::before{content:"\FC1B"}.mdi-briefcase-outline::before{content:"\F813"}.mdi-briefcase-plus::before{content:"\FA2A"}.mdi-briefcase-plus-outline::before{content:"\FC1C"}.mdi-briefcase-remove::before{content:"\FA2B"}.mdi-briefcase-remove-outline::before{content:"\FC1D"}.mdi-briefcase-search::before{content:"\FA2C"}.mdi-briefcase-search-outline::before{content:"\FC1E"}.mdi-briefcase-upload::before{content:"\F0D9"}.mdi-briefcase-upload-outline::before{content:"\FC1F"}.mdi-brightness-1::before{content:"\F0DA"}.mdi-brightness-2::before{content:"\F0DB"}.mdi-brightness-3::before{content:"\F0DC"}.mdi-brightness-4::before{content:"\F0DD"}.mdi-brightness-5::before{content:"\F0DE"}.mdi-brightness-6::before{content:"\F0DF"}.mdi-brightness-7::before{content:"\F0E0"}.mdi-brightness-auto::before{content:"\F0E1"}.mdi-brightness-percent::before{content:"\FCCE"}.mdi-broom::before{content:"\F0E2"}.mdi-brush::before{content:"\F0E3"}.mdi-buddhism::before{content:"\F94A"}.mdi-buffer::before{content:"\F619"}.mdi-bug::before{content:"\F0E4"}.mdi-bug-check::before{content:"\FA2D"}.mdi-bug-check-outline::before{content:"\FA2E"}.mdi-bug-outline::before{content:"\FA2F"}.mdi-bugle::before{content:"\FD90"}.mdi-bulldozer::before{content:"\FB07"}.mdi-bullet::before{content:"\FCCF"}.mdi-bulletin-board::before{content:"\F0E5"}.mdi-bullhorn::before{content:"\F0E6"}.mdi-bullhorn-outline::before{content:"\FB08"}.mdi-bullseye::before{content:"\F5DD"}.mdi-bullseye-arrow::before{content:"\F8C8"}.mdi-bus::before{content:"\F0E7"}.mdi-bus-alert::before{content:"\FA98"}.mdi-bus-articulated-end::before{content:"\F79B"}.mdi-bus-articulated-front::before{content:"\F79C"}.mdi-bus-clock::before{content:"\F8C9"}.mdi-bus-double-decker::before{content:"\F79D"}.mdi-bus-multiple::before{content:"\FF5C"}.mdi-bus-school::before{content:"\F79E"}.mdi-bus-side::before{content:"\F79F"}.mdi-bus-stop::before{content:"\F0034"}.mdi-bus-stop-covered::before{content:"\F0035"}.mdi-bus-stop-uncovered::before{content:"\F0036"}.mdi-cached::before{content:"\F0E8"}.mdi-cactus::before{content:"\FD91"}.mdi-cake::before{content:"\F0E9"}.mdi-cake-layered::before{content:"\F0EA"}.mdi-cake-variant::before{content:"\F0EB"}.mdi-calculator::before{content:"\F0EC"}.mdi-calculator-variant::before{content:"\FA99"}.mdi-calendar::before{content:"\F0ED"}.mdi-calendar-account::before{content:"\FEF4"}.mdi-calendar-account-outline::before{content:"\FEF5"}.mdi-calendar-alert::before{content:"\FA30"}.mdi-calendar-blank::before{content:"\F0EE"}.mdi-calendar-blank-outline::before{content:"\FB42"}.mdi-calendar-check::before{content:"\F0EF"}.mdi-calendar-check-outline::before{content:"\FC20"}.mdi-calendar-clock::before{content:"\F0F0"}.mdi-calendar-edit::before{content:"\F8A6"}.mdi-calendar-export::before{content:"\FB09"}.mdi-calendar-heart::before{content:"\F9D1"}.mdi-calendar-import::before{content:"\FB0A"}.mdi-calendar-minus::before{content:"\FD38"}.mdi-calendar-month::before{content:"\FDFA"}.mdi-calendar-month-outline::before{content:"\FDFB"}.mdi-calendar-multiple::before{content:"\F0F1"}.mdi-calendar-multiple-check::before{content:"\F0F2"}.mdi-calendar-multiselect::before{content:"\FA31"}.mdi-calendar-outline::before{content:"\FB43"}.mdi-calendar-plus::before{content:"\F0F3"}.mdi-calendar-question::before{content:"\F691"}.mdi-calendar-range::before{content:"\F678"}.mdi-calendar-range-outline::before{content:"\FB44"}.mdi-calendar-remove::before{content:"\F0F4"}.mdi-calendar-remove-outline::before{content:"\FC21"}.mdi-calendar-repeat::before{content:"\FEAB"}.mdi-calendar-repeat-outline::before{content:"\FEAC"}.mdi-calendar-search::before{content:"\F94B"}.mdi-calendar-star::before{content:"\F9D2"}.mdi-calendar-text::before{content:"\F0F5"}.mdi-calendar-text-outline::before{content:"\FC22"}.mdi-calendar-today::before{content:"\F0F6"}.mdi-calendar-week::before{content:"\FA32"}.mdi-calendar-week-begin::before{content:"\FA33"}.mdi-calendar-weekend::before{content:"\FEF6"}.mdi-calendar-weekend-outline::before{content:"\FEF7"}.mdi-call-made::before{content:"\F0F7"}.mdi-call-merge::before{content:"\F0F8"}.mdi-call-missed::before{content:"\F0F9"}.mdi-call-received::before{content:"\F0FA"}.mdi-call-split::before{content:"\F0FB"}.mdi-camcorder::before{content:"\F0FC"}.mdi-camcorder-box::before{content:"\F0FD"}.mdi-camcorder-box-off::before{content:"\F0FE"}.mdi-camcorder-off::before{content:"\F0FF"}.mdi-camera::before{content:"\F100"}.mdi-camera-account::before{content:"\F8CA"}.mdi-camera-burst::before{content:"\F692"}.mdi-camera-control::before{content:"\FB45"}.mdi-camera-enhance::before{content:"\F101"}.mdi-camera-enhance-outline::before{content:"\FB46"}.mdi-camera-front::before{content:"\F102"}.mdi-camera-front-variant::before{content:"\F103"}.mdi-camera-gopro::before{content:"\F7A0"}.mdi-camera-image::before{content:"\F8CB"}.mdi-camera-iris::before{content:"\F104"}.mdi-camera-metering-center::before{content:"\F7A1"}.mdi-camera-metering-matrix::before{content:"\F7A2"}.mdi-camera-metering-partial::before{content:"\F7A3"}.mdi-camera-metering-spot::before{content:"\F7A4"}.mdi-camera-off::before{content:"\F5DF"}.mdi-camera-outline::before{content:"\FD39"}.mdi-camera-party-mode::before{content:"\F105"}.mdi-camera-plus::before{content:"\FEF8"}.mdi-camera-plus-outline::before{content:"\FEF9"}.mdi-camera-rear::before{content:"\F106"}.mdi-camera-rear-variant::before{content:"\F107"}.mdi-camera-retake::before{content:"\FDFC"}.mdi-camera-retake-outline::before{content:"\FDFD"}.mdi-camera-switch::before{content:"\F108"}.mdi-camera-timer::before{content:"\F109"}.mdi-camera-wireless::before{content:"\FD92"}.mdi-camera-wireless-outline::before{content:"\FD93"}.mdi-campfire::before{content:"\FEFA"}.mdi-cancel::before{content:"\F739"}.mdi-candle::before{content:"\F5E2"}.mdi-candycane::before{content:"\F10A"}.mdi-cannabis::before{content:"\F7A5"}.mdi-caps-lock::before{content:"\FA9A"}.mdi-car::before{content:"\F10B"}.mdi-car-2-plus::before{content:"\F0037"}.mdi-car-3-plus::before{content:"\F0038"}.mdi-car-back::before{content:"\FDFE"}.mdi-car-battery::before{content:"\F10C"}.mdi-car-brake-abs::before{content:"\FC23"}.mdi-car-brake-alert::before{content:"\FC24"}.mdi-car-brake-hold::before{content:"\FD3A"}.mdi-car-brake-parking::before{content:"\FD3B"}.mdi-car-brake-retarder::before{content:"\F0039"}.mdi-car-child-seat::before{content:"\FFC3"}.mdi-car-clutch::before{content:"\F003A"}.mdi-car-connected::before{content:"\F10D"}.mdi-car-convertible::before{content:"\F7A6"}.mdi-car-coolant-level::before{content:"\F003B"}.mdi-car-cruise-control::before{content:"\FD3C"}.mdi-car-defrost-front::before{content:"\FD3D"}.mdi-car-defrost-rear::before{content:"\FD3E"}.mdi-car-door::before{content:"\FB47"}.mdi-car-electric::before{content:"\FB48"}.mdi-car-esp::before{content:"\FC25"}.mdi-car-estate::before{content:"\F7A7"}.mdi-car-hatchback::before{content:"\F7A8"}.mdi-car-key::before{content:"\FB49"}.mdi-car-light-dimmed::before{content:"\FC26"}.mdi-car-light-fog::before{content:"\FC27"}.mdi-car-light-high::before{content:"\FC28"}.mdi-car-limousine::before{content:"\F8CC"}.mdi-car-multiple::before{content:"\FB4A"}.mdi-car-off::before{content:"\FDFF"}.mdi-car-parking-lights::before{content:"\FD3F"}.mdi-car-pickup::before{content:"\F7A9"}.mdi-car-seat::before{content:"\FFC4"}.mdi-car-seat-cooler::before{content:"\FFC5"}.mdi-car-seat-heater::before{content:"\FFC6"}.mdi-car-shift-pattern::before{content:"\FF5D"}.mdi-car-side::before{content:"\F7AA"}.mdi-car-sports::before{content:"\F7AB"}.mdi-car-tire-alert::before{content:"\FC29"}.mdi-car-traction-control::before{content:"\FD40"}.mdi-car-turbocharger::before{content:"\F003C"}.mdi-car-wash::before{content:"\F10E"}.mdi-car-windshield::before{content:"\F003D"}.mdi-car-windshield-outline::before{content:"\F003E"}.mdi-caravan::before{content:"\F7AC"}.mdi-card::before{content:"\FB4B"}.mdi-card-bulleted::before{content:"\FB4C"}.mdi-card-bulleted-off::before{content:"\FB4D"}.mdi-card-bulleted-off-outline::before{content:"\FB4E"}.mdi-card-bulleted-outline::before{content:"\FB4F"}.mdi-card-bulleted-settings::before{content:"\FB50"}.mdi-card-bulleted-settings-outline::before{content:"\FB51"}.mdi-card-outline::before{content:"\FB52"}.mdi-card-text::before{content:"\FB53"}.mdi-card-text-outline::before{content:"\FB54"}.mdi-cards::before{content:"\F638"}.mdi-cards-club::before{content:"\F8CD"}.mdi-cards-diamond::before{content:"\F8CE"}.mdi-cards-diamond-outline::before{content:"\F003F"}.mdi-cards-heart::before{content:"\F8CF"}.mdi-cards-outline::before{content:"\F639"}.mdi-cards-playing-outline::before{content:"\F63A"}.mdi-cards-spade::before{content:"\F8D0"}.mdi-cards-variant::before{content:"\F6C6"}.mdi-carrot::before{content:"\F10F"}.mdi-cart::before{content:"\F110"}.mdi-cart-arrow-down::before{content:"\FD42"}.mdi-cart-arrow-right::before{content:"\FC2A"}.mdi-cart-arrow-up::before{content:"\FD43"}.mdi-cart-minus::before{content:"\FD44"}.mdi-cart-off::before{content:"\F66B"}.mdi-cart-outline::before{content:"\F111"}.mdi-cart-plus::before{content:"\F112"}.mdi-cart-remove::before{content:"\FD45"}.mdi-case-sensitive-alt::before{content:"\F113"}.mdi-cash::before{content:"\F114"}.mdi-cash-100::before{content:"\F115"}.mdi-cash-marker::before{content:"\FD94"}.mdi-cash-multiple::before{content:"\F116"}.mdi-cash-refund::before{content:"\FA9B"}.mdi-cash-register::before{content:"\FCD0"}.mdi-cash-usd::before{content:"\F117"}.mdi-cassette::before{content:"\F9D3"}.mdi-cast::before{content:"\F118"}.mdi-cast-audio::before{content:"\F0040"}.mdi-cast-connected::before{content:"\F119"}.mdi-cast-education::before{content:"\FE6D"}.mdi-cast-off::before{content:"\F789"}.mdi-castle::before{content:"\F11A"}.mdi-cat::before{content:"\F11B"}.mdi-cctv::before{content:"\F7AD"}.mdi-ceiling-light::before{content:"\F768"}.mdi-cellphone::before{content:"\F11C"}.mdi-cellphone-android::before{content:"\F11D"}.mdi-cellphone-arrow-down::before{content:"\F9D4"}.mdi-cellphone-basic::before{content:"\F11E"}.mdi-cellphone-dock::before{content:"\F11F"}.mdi-cellphone-erase::before{content:"\F94C"}.mdi-cellphone-information::before{content:"\FF5E"}.mdi-cellphone-iphone::before{content:"\F120"}.mdi-cellphone-key::before{content:"\F94D"}.mdi-cellphone-link::before{content:"\F121"}.mdi-cellphone-link-off::before{content:"\F122"}.mdi-cellphone-lock::before{content:"\F94E"}.mdi-cellphone-message::before{content:"\F8D2"}.mdi-cellphone-nfc::before{content:"\FEAD"}.mdi-cellphone-off::before{content:"\F94F"}.mdi-cellphone-play::before{content:"\F0041"}.mdi-cellphone-screenshot::before{content:"\FA34"}.mdi-cellphone-settings::before{content:"\F123"}.mdi-cellphone-settings-variant::before{content:"\F950"}.mdi-cellphone-sound::before{content:"\F951"}.mdi-cellphone-text::before{content:"\F8D1"}.mdi-cellphone-wireless::before{content:"\F814"}.mdi-celtic-cross::before{content:"\FCD1"}.mdi-certificate::before{content:"\F124"}.mdi-chair-rolling::before{content:"\FFBA"}.mdi-chair-school::before{content:"\F125"}.mdi-charity::before{content:"\FC2B"}.mdi-chart-arc::before{content:"\F126"}.mdi-chart-areaspline::before{content:"\F127"}.mdi-chart-areaspline-variant::before{content:"\FEAE"}.mdi-chart-bar::before{content:"\F128"}.mdi-chart-bar-stacked::before{content:"\F769"}.mdi-chart-bell-curve::before{content:"\FC2C"}.mdi-chart-bell-curve-cumulative::before{content:"\FFC7"}.mdi-chart-bubble::before{content:"\F5E3"}.mdi-chart-donut::before{content:"\F7AE"}.mdi-chart-donut-variant::before{content:"\F7AF"}.mdi-chart-gantt::before{content:"\F66C"}.mdi-chart-histogram::before{content:"\F129"}.mdi-chart-line::before{content:"\F12A"}.mdi-chart-line-stacked::before{content:"\F76A"}.mdi-chart-line-variant::before{content:"\F7B0"}.mdi-chart-multiline::before{content:"\F8D3"}.mdi-chart-pie::before{content:"\F12B"}.mdi-chart-scatter-plot::before{content:"\FEAF"}.mdi-chart-scatter-plot-hexbin::before{content:"\F66D"}.mdi-chart-timeline::before{content:"\F66E"}.mdi-chart-timeline-variant::before{content:"\FEB0"}.mdi-chart-tree::before{content:"\FEB1"}.mdi-chat::before{content:"\FB55"}.mdi-chat-alert::before{content:"\FB56"}.mdi-chat-outline::before{content:"\FEFB"}.mdi-chat-processing::before{content:"\FB57"}.mdi-check::before{content:"\F12C"}.mdi-check-all::before{content:"\F12D"}.mdi-check-bold::before{content:"\FE6E"}.mdi-check-box-multiple-outline::before{content:"\FC2D"}.mdi-check-box-outline::before{content:"\FC2E"}.mdi-check-circle::before{content:"\F5E0"}.mdi-check-circle-outline::before{content:"\F5E1"}.mdi-check-decagram::before{content:"\F790"}.mdi-check-network::before{content:"\FC2F"}.mdi-check-network-outline::before{content:"\FC30"}.mdi-check-outline::before{content:"\F854"}.mdi-check-underline::before{content:"\FE70"}.mdi-check-underline-circle::before{content:"\FE71"}.mdi-check-underline-circle-outline::before{content:"\FE72"}.mdi-checkbook::before{content:"\FA9C"}.mdi-checkbox-blank::before{content:"\F12E"}.mdi-checkbox-blank-circle::before{content:"\F12F"}.mdi-checkbox-blank-circle-outline::before{content:"\F130"}.mdi-checkbox-blank-outline::before{content:"\F131"}.mdi-checkbox-intermediate::before{content:"\F855"}.mdi-checkbox-marked::before{content:"\F132"}.mdi-checkbox-marked-circle::before{content:"\F133"}.mdi-checkbox-marked-circle-outline::before{content:"\F134"}.mdi-checkbox-marked-outline::before{content:"\F135"}.mdi-checkbox-multiple-blank::before{content:"\F136"}.mdi-checkbox-multiple-blank-circle::before{content:"\F63B"}.mdi-checkbox-multiple-blank-circle-outline::before{content:"\F63C"}.mdi-checkbox-multiple-blank-outline::before{content:"\F137"}.mdi-checkbox-multiple-marked::before{content:"\F138"}.mdi-checkbox-multiple-marked-circle::before{content:"\F63D"}.mdi-checkbox-multiple-marked-circle-outline::before{content:"\F63E"}.mdi-checkbox-multiple-marked-outline::before{content:"\F139"}.mdi-checkerboard::before{content:"\F13A"}.mdi-chef-hat::before{content:"\FB58"}.mdi-chemical-weapon::before{content:"\F13B"}.mdi-chess-bishop::before{content:"\F85B"}.mdi-chess-king::before{content:"\F856"}.mdi-chess-knight::before{content:"\F857"}.mdi-chess-pawn::before{content:"\F858"}.mdi-chess-queen::before{content:"\F859"}.mdi-chess-rook::before{content:"\F85A"}.mdi-chevron-double-down::before{content:"\F13C"}.mdi-chevron-double-left::before{content:"\F13D"}.mdi-chevron-double-right::before{content:"\F13E"}.mdi-chevron-double-up::before{content:"\F13F"}.mdi-chevron-down::before{content:"\F140"}.mdi-chevron-down-box::before{content:"\F9D5"}.mdi-chevron-down-box-outline::before{content:"\F9D6"}.mdi-chevron-down-circle::before{content:"\FB0B"}.mdi-chevron-down-circle-outline::before{content:"\FB0C"}.mdi-chevron-left::before{content:"\F141"}.mdi-chevron-left-box::before{content:"\F9D7"}.mdi-chevron-left-box-outline::before{content:"\F9D8"}.mdi-chevron-left-circle::before{content:"\FB0D"}.mdi-chevron-left-circle-outline::before{content:"\FB0E"}.mdi-chevron-right::before{content:"\F142"}.mdi-chevron-right-box::before{content:"\F9D9"}.mdi-chevron-right-box-outline::before{content:"\F9DA"}.mdi-chevron-right-circle::before{content:"\FB0F"}.mdi-chevron-right-circle-outline::before{content:"\FB10"}.mdi-chevron-triple-down::before{content:"\FD95"}.mdi-chevron-triple-left::before{content:"\FD96"}.mdi-chevron-triple-right::before{content:"\FD97"}.mdi-chevron-triple-up::before{content:"\FD98"}.mdi-chevron-up::before{content:"\F143"}.mdi-chevron-up-box::before{content:"\F9DB"}.mdi-chevron-up-box-outline::before{content:"\F9DC"}.mdi-chevron-up-circle::before{content:"\FB11"}.mdi-chevron-up-circle-outline::before{content:"\FB12"}.mdi-chili-hot::before{content:"\F7B1"}.mdi-chili-medium::before{content:"\F7B2"}.mdi-chili-mild::before{content:"\F7B3"}.mdi-chip::before{content:"\F61A"}.mdi-christianity::before{content:"\F952"}.mdi-christianity-outline::before{content:"\FCD2"}.mdi-church::before{content:"\F144"}.mdi-circle::before{content:"\F764"}.mdi-circle-double::before{content:"\FEB2"}.mdi-circle-edit-outline::before{content:"\F8D4"}.mdi-circle-expand::before{content:"\FEB3"}.mdi-circle-medium::before{content:"\F9DD"}.mdi-circle-outline::before{content:"\F765"}.mdi-circle-slice-1::before{content:"\FA9D"}.mdi-circle-slice-2::before{content:"\FA9E"}.mdi-circle-slice-3::before{content:"\FA9F"}.mdi-circle-slice-4::before{content:"\FAA0"}.mdi-circle-slice-5::before{content:"\FAA1"}.mdi-circle-slice-6::before{content:"\FAA2"}.mdi-circle-slice-7::before{content:"\FAA3"}.mdi-circle-slice-8::before{content:"\FAA4"}.mdi-circle-small::before{content:"\F9DE"}.mdi-circular-saw::before{content:"\FE73"}.mdi-cisco-webex::before{content:"\F145"}.mdi-city::before{content:"\F146"}.mdi-city-variant::before{content:"\FA35"}.mdi-city-variant-outline::before{content:"\FA36"}.mdi-clipboard::before{content:"\F147"}.mdi-clipboard-account::before{content:"\F148"}.mdi-clipboard-account-outline::before{content:"\FC31"}.mdi-clipboard-alert::before{content:"\F149"}.mdi-clipboard-alert-outline::before{content:"\FCD3"}.mdi-clipboard-arrow-down::before{content:"\F14A"}.mdi-clipboard-arrow-down-outline::before{content:"\FC32"}.mdi-clipboard-arrow-left::before{content:"\F14B"}.mdi-clipboard-arrow-left-outline::before{content:"\FCD4"}.mdi-clipboard-arrow-right::before{content:"\FCD5"}.mdi-clipboard-arrow-right-outline::before{content:"\FCD6"}.mdi-clipboard-arrow-up::before{content:"\FC33"}.mdi-clipboard-arrow-up-outline::before{content:"\FC34"}.mdi-clipboard-check::before{content:"\F14C"}.mdi-clipboard-check-outline::before{content:"\F8A7"}.mdi-clipboard-flow::before{content:"\F6C7"}.mdi-clipboard-outline::before{content:"\F14D"}.mdi-clipboard-play::before{content:"\FC35"}.mdi-clipboard-play-outline::before{content:"\FC36"}.mdi-clipboard-plus::before{content:"\F750"}.mdi-clipboard-pulse::before{content:"\F85C"}.mdi-clipboard-pulse-outline::before{content:"\F85D"}.mdi-clipboard-text::before{content:"\F14E"}.mdi-clipboard-text-outline::before{content:"\FA37"}.mdi-clipboard-text-play::before{content:"\FC37"}.mdi-clipboard-text-play-outline::before{content:"\FC38"}.mdi-clippy::before{content:"\F14F"}.mdi-clock::before{content:"\F953"}.mdi-clock-alert::before{content:"\F954"}.mdi-clock-alert-outline::before{content:"\F5CE"}.mdi-clock-check::before{content:"\FFC8"}.mdi-clock-check-outline::before{content:"\FFC9"}.mdi-clock-digital::before{content:"\FEB4"}.mdi-clock-end::before{content:"\F151"}.mdi-clock-fast::before{content:"\F152"}.mdi-clock-in::before{content:"\F153"}.mdi-clock-out::before{content:"\F154"}.mdi-clock-outline::before{content:"\F150"}.mdi-clock-start::before{content:"\F155"}.mdi-close::before{content:"\F156"}.mdi-close-box::before{content:"\F157"}.mdi-close-box-multiple::before{content:"\FC39"}.mdi-close-box-multiple-outline::before{content:"\FC3A"}.mdi-close-box-outline::before{content:"\F158"}.mdi-close-circle::before{content:"\F159"}.mdi-close-circle-outline::before{content:"\F15A"}.mdi-close-network::before{content:"\F15B"}.mdi-close-network-outline::before{content:"\FC3B"}.mdi-close-octagon::before{content:"\F15C"}.mdi-close-octagon-outline::before{content:"\F15D"}.mdi-close-outline::before{content:"\F6C8"}.mdi-closed-caption::before{content:"\F15E"}.mdi-closed-caption-outline::before{content:"\FD99"}.mdi-cloud::before{content:"\F15F"}.mdi-cloud-alert::before{content:"\F9DF"}.mdi-cloud-braces::before{content:"\F7B4"}.mdi-cloud-check::before{content:"\F160"}.mdi-cloud-circle::before{content:"\F161"}.mdi-cloud-download::before{content:"\F162"}.mdi-cloud-download-outline::before{content:"\FB59"}.mdi-cloud-off-outline::before{content:"\F164"}.mdi-cloud-outline::before{content:"\F163"}.mdi-cloud-print::before{content:"\F165"}.mdi-cloud-print-outline::before{content:"\F166"}.mdi-cloud-question::before{content:"\FA38"}.mdi-cloud-search::before{content:"\F955"}.mdi-cloud-search-outline::before{content:"\F956"}.mdi-cloud-sync::before{content:"\F63F"}.mdi-cloud-tags::before{content:"\F7B5"}.mdi-cloud-upload::before{content:"\F167"}.mdi-cloud-upload-outline::before{content:"\FB5A"}.mdi-clover::before{content:"\F815"}.mdi-coach-lamp::before{content:"\F0042"}.mdi-code-array::before{content:"\F168"}.mdi-code-braces::before{content:"\F169"}.mdi-code-brackets::before{content:"\F16A"}.mdi-code-equal::before{content:"\F16B"}.mdi-code-greater-than::before{content:"\F16C"}.mdi-code-greater-than-or-equal::before{content:"\F16D"}.mdi-code-less-than::before{content:"\F16E"}.mdi-code-less-than-or-equal::before{content:"\F16F"}.mdi-code-not-equal::before{content:"\F170"}.mdi-code-not-equal-variant::before{content:"\F171"}.mdi-code-parentheses::before{content:"\F172"}.mdi-code-string::before{content:"\F173"}.mdi-code-tags::before{content:"\F174"}.mdi-code-tags-check::before{content:"\F693"}.mdi-codepen::before{content:"\F175"}.mdi-coffee::before{content:"\F176"}.mdi-coffee-off::before{content:"\FFCA"}.mdi-coffee-off-outline::before{content:"\FFCB"}.mdi-coffee-outline::before{content:"\F6C9"}.mdi-coffee-to-go::before{content:"\F177"}.mdi-coffin::before{content:"\FB5B"}.mdi-cogs::before{content:"\F8D5"}.mdi-coin::before{content:"\F178"}.mdi-coins::before{content:"\F694"}.mdi-collage::before{content:"\F640"}.mdi-collapse-all::before{content:"\FAA5"}.mdi-collapse-all-outline::before{content:"\FAA6"}.mdi-color-helper::before{content:"\F179"}.mdi-comma::before{content:"\FE74"}.mdi-comma-box::before{content:"\FE75"}.mdi-comma-box-outline::before{content:"\FE76"}.mdi-comma-circle::before{content:"\FE77"}.mdi-comma-circle-outline::before{content:"\FE78"}.mdi-comment::before{content:"\F17A"}.mdi-comment-account::before{content:"\F17B"}.mdi-comment-account-outline::before{content:"\F17C"}.mdi-comment-alert::before{content:"\F17D"}.mdi-comment-alert-outline::before{content:"\F17E"}.mdi-comment-arrow-left::before{content:"\F9E0"}.mdi-comment-arrow-left-outline::before{content:"\F9E1"}.mdi-comment-arrow-right::before{content:"\F9E2"}.mdi-comment-arrow-right-outline::before{content:"\F9E3"}.mdi-comment-check::before{content:"\F17F"}.mdi-comment-check-outline::before{content:"\F180"}.mdi-comment-eye::before{content:"\FA39"}.mdi-comment-eye-outline::before{content:"\FA3A"}.mdi-comment-multiple::before{content:"\F85E"}.mdi-comment-multiple-outline::before{content:"\F181"}.mdi-comment-outline::before{content:"\F182"}.mdi-comment-plus::before{content:"\F9E4"}.mdi-comment-plus-outline::before{content:"\F183"}.mdi-comment-processing::before{content:"\F184"}.mdi-comment-processing-outline::before{content:"\F185"}.mdi-comment-question::before{content:"\F816"}.mdi-comment-question-outline::before{content:"\F186"}.mdi-comment-quote::before{content:"\F0043"}.mdi-comment-quote-outline::before{content:"\F0044"}.mdi-comment-remove::before{content:"\F5DE"}.mdi-comment-remove-outline::before{content:"\F187"}.mdi-comment-search::before{content:"\FA3B"}.mdi-comment-search-outline::before{content:"\FA3C"}.mdi-comment-text::before{content:"\F188"}.mdi-comment-text-multiple::before{content:"\F85F"}.mdi-comment-text-multiple-outline::before{content:"\F860"}.mdi-comment-text-outline::before{content:"\F189"}.mdi-compare::before{content:"\F18A"}.mdi-compass::before{content:"\F18B"}.mdi-compass-off::before{content:"\FB5C"}.mdi-compass-off-outline::before{content:"\FB5D"}.mdi-compass-outline::before{content:"\F18C"}.mdi-console::before{content:"\F18D"}.mdi-console-line::before{content:"\F7B6"}.mdi-console-network::before{content:"\F8A8"}.mdi-console-network-outline::before{content:"\FC3C"}.mdi-contact-mail::before{content:"\F18E"}.mdi-contact-mail-outline::before{content:"\FEB5"}.mdi-contact-phone::before{content:"\FEB6"}.mdi-contact-phone-outline::before{content:"\FEB7"}.mdi-contactless-payment::before{content:"\FD46"}.mdi-contacts::before{content:"\F6CA"}.mdi-contain::before{content:"\FA3D"}.mdi-contain-end::before{content:"\FA3E"}.mdi-contain-start::before{content:"\FA3F"}.mdi-content-copy::before{content:"\F18F"}.mdi-content-cut::before{content:"\F190"}.mdi-content-duplicate::before{content:"\F191"}.mdi-content-paste::before{content:"\F192"}.mdi-content-save::before{content:"\F193"}.mdi-content-save-alert::before{content:"\FF5F"}.mdi-content-save-alert-outline::before{content:"\FF60"}.mdi-content-save-all::before{content:"\F194"}.mdi-content-save-all-outline::before{content:"\FF61"}.mdi-content-save-edit::before{content:"\FCD7"}.mdi-content-save-edit-outline::before{content:"\FCD8"}.mdi-content-save-move::before{content:"\FE79"}.mdi-content-save-move-outline::before{content:"\FE7A"}.mdi-content-save-outline::before{content:"\F817"}.mdi-content-save-settings::before{content:"\F61B"}.mdi-content-save-settings-outline::before{content:"\FB13"}.mdi-contrast::before{content:"\F195"}.mdi-contrast-box::before{content:"\F196"}.mdi-contrast-circle::before{content:"\F197"}.mdi-controller-classic::before{content:"\FB5E"}.mdi-controller-classic-outline::before{content:"\FB5F"}.mdi-cookie::before{content:"\F198"}.mdi-coolant-temperature::before{content:"\F3C8"}.mdi-copyright::before{content:"\F5E6"}.mdi-cordova::before{content:"\F957"}.mdi-corn::before{content:"\F7B7"}.mdi-counter::before{content:"\F199"}.mdi-cow::before{content:"\F19A"}.mdi-cowboy::before{content:"\FEB8"}.mdi-cpu-32-bit::before{content:"\FEFC"}.mdi-cpu-64-bit::before{content:"\FEFD"}.mdi-crane::before{content:"\F861"}.mdi-creation::before{content:"\F1C9"}.mdi-creative-commons::before{content:"\FD47"}.mdi-credit-card::before{content:"\F0010"}.mdi-credit-card-clock::before{content:"\FEFE"}.mdi-credit-card-clock-outline::before{content:"\FFBC"}.mdi-credit-card-marker::before{content:"\F6A7"}.mdi-credit-card-marker-outline::before{content:"\FD9A"}.mdi-credit-card-minus::before{content:"\FFCC"}.mdi-credit-card-minus-outline::before{content:"\FFCD"}.mdi-credit-card-multiple::before{content:"\F0011"}.mdi-credit-card-multiple-outline::before{content:"\F19C"}.mdi-credit-card-off::before{content:"\F0012"}.mdi-credit-card-off-outline::before{content:"\F5E4"}.mdi-credit-card-outline::before{content:"\F19B"}.mdi-credit-card-plus::before{content:"\F0013"}.mdi-credit-card-plus-outline::before{content:"\F675"}.mdi-credit-card-refund::before{content:"\F0014"}.mdi-credit-card-refund-outline::before{content:"\FAA7"}.mdi-credit-card-remove::before{content:"\FFCE"}.mdi-credit-card-remove-outline::before{content:"\FFCF"}.mdi-credit-card-scan::before{content:"\F0015"}.mdi-credit-card-scan-outline::before{content:"\F19D"}.mdi-credit-card-settings::before{content:"\F0016"}.mdi-credit-card-settings-outline::before{content:"\F8D6"}.mdi-credit-card-wireless::before{content:"\F801"}.mdi-credit-card-wireless-outline::before{content:"\FD48"}.mdi-cricket::before{content:"\FD49"}.mdi-crop::before{content:"\F19E"}.mdi-crop-free::before{content:"\F19F"}.mdi-crop-landscape::before{content:"\F1A0"}.mdi-crop-portrait::before{content:"\F1A1"}.mdi-crop-rotate::before{content:"\F695"}.mdi-crop-square::before{content:"\F1A2"}.mdi-crosshairs::before{content:"\F1A3"}.mdi-crosshairs-gps::before{content:"\F1A4"}.mdi-crosshairs-off::before{content:"\FF62"}.mdi-crown::before{content:"\F1A5"}.mdi-cryengine::before{content:"\F958"}.mdi-crystal-ball::before{content:"\FB14"}.mdi-cube::before{content:"\F1A6"}.mdi-cube-outline::before{content:"\F1A7"}.mdi-cube-scan::before{content:"\FB60"}.mdi-cube-send::before{content:"\F1A8"}.mdi-cube-unfolded::before{content:"\F1A9"}.mdi-cup::before{content:"\F1AA"}.mdi-cup-off::before{content:"\F5E5"}.mdi-cup-water::before{content:"\F1AB"}.mdi-cupboard::before{content:"\FF63"}.mdi-cupboard-outline::before{content:"\FF64"}.mdi-cupcake::before{content:"\F959"}.mdi-curling::before{content:"\F862"}.mdi-currency-bdt::before{content:"\F863"}.mdi-currency-brl::before{content:"\FB61"}.mdi-currency-btc::before{content:"\F1AC"}.mdi-currency-cny::before{content:"\F7B9"}.mdi-currency-eth::before{content:"\F7BA"}.mdi-currency-eur::before{content:"\F1AD"}.mdi-currency-gbp::before{content:"\F1AE"}.mdi-currency-ils::before{content:"\FC3D"}.mdi-currency-inr::before{content:"\F1AF"}.mdi-currency-jpy::before{content:"\F7BB"}.mdi-currency-krw::before{content:"\F7BC"}.mdi-currency-kzt::before{content:"\F864"}.mdi-currency-ngn::before{content:"\F1B0"}.mdi-currency-php::before{content:"\F9E5"}.mdi-currency-rial::before{content:"\FEB9"}.mdi-currency-rub::before{content:"\F1B1"}.mdi-currency-sign::before{content:"\F7BD"}.mdi-currency-try::before{content:"\F1B2"}.mdi-currency-twd::before{content:"\F7BE"}.mdi-currency-usd::before{content:"\F1B3"}.mdi-currency-usd-off::before{content:"\F679"}.mdi-current-ac::before{content:"\F95A"}.mdi-current-dc::before{content:"\F95B"}.mdi-cursor-default::before{content:"\F1B4"}.mdi-cursor-default-click::before{content:"\FCD9"}.mdi-cursor-default-click-outline::before{content:"\FCDA"}.mdi-cursor-default-outline::before{content:"\F1B5"}.mdi-cursor-move::before{content:"\F1B6"}.mdi-cursor-pointer::before{content:"\F1B7"}.mdi-cursor-text::before{content:"\F5E7"}.mdi-database::before{content:"\F1B8"}.mdi-database-check::before{content:"\FAA8"}.mdi-database-edit::before{content:"\FB62"}.mdi-database-export::before{content:"\F95D"}.mdi-database-import::before{content:"\F95C"}.mdi-database-lock::before{content:"\FAA9"}.mdi-database-minus::before{content:"\F1B9"}.mdi-database-plus::before{content:"\F1BA"}.mdi-database-refresh::before{content:"\FCDB"}.mdi-database-remove::before{content:"\FCDC"}.mdi-database-search::before{content:"\F865"}.mdi-database-settings::before{content:"\FCDD"}.mdi-death-star::before{content:"\F8D7"}.mdi-death-star-variant::before{content:"\F8D8"}.mdi-deathly-hallows::before{content:"\FB63"}.mdi-debian::before{content:"\F8D9"}.mdi-debug-step-into::before{content:"\F1BB"}.mdi-debug-step-out::before{content:"\F1BC"}.mdi-debug-step-over::before{content:"\F1BD"}.mdi-decagram::before{content:"\F76B"}.mdi-decagram-outline::before{content:"\F76C"}.mdi-decimal-decrease::before{content:"\F1BE"}.mdi-decimal-increase::before{content:"\F1BF"}.mdi-delete::before{content:"\F1C0"}.mdi-delete-circle::before{content:"\F682"}.mdi-delete-circle-outline::before{content:"\FB64"}.mdi-delete-empty::before{content:"\F6CB"}.mdi-delete-empty-outline::before{content:"\FEBA"}.mdi-delete-forever::before{content:"\F5E8"}.mdi-delete-forever-outline::before{content:"\FB65"}.mdi-delete-outline::before{content:"\F9E6"}.mdi-delete-restore::before{content:"\F818"}.mdi-delete-sweep::before{content:"\F5E9"}.mdi-delete-sweep-outline::before{content:"\FC3E"}.mdi-delete-variant::before{content:"\F1C1"}.mdi-delta::before{content:"\F1C2"}.mdi-desk-lamp::before{content:"\F95E"}.mdi-deskphone::before{content:"\F1C3"}.mdi-desktop-classic::before{content:"\F7BF"}.mdi-desktop-mac::before{content:"\F1C4"}.mdi-desktop-mac-dashboard::before{content:"\F9E7"}.mdi-desktop-tower::before{content:"\F1C5"}.mdi-desktop-tower-monitor::before{content:"\FAAA"}.mdi-details::before{content:"\F1C6"}.mdi-dev-to::before{content:"\FD4A"}.mdi-developer-board::before{content:"\F696"}.mdi-deviantart::before{content:"\F1C7"}.mdi-devices::before{content:"\FFD0"}.mdi-dialpad::before{content:"\F61C"}.mdi-diameter::before{content:"\FC3F"}.mdi-diameter-outline::before{content:"\FC40"}.mdi-diameter-variant::before{content:"\FC41"}.mdi-diamond::before{content:"\FB66"}.mdi-diamond-outline::before{content:"\FB67"}.mdi-diamond-stone::before{content:"\F1C8"}.mdi-dice-1::before{content:"\F1CA"}.mdi-dice-2::before{content:"\F1CB"}.mdi-dice-3::before{content:"\F1CC"}.mdi-dice-4::before{content:"\F1CD"}.mdi-dice-5::before{content:"\F1CE"}.mdi-dice-6::before{content:"\F1CF"}.mdi-dice-d10-outline::before{content:"\F76E"}.mdi-dice-d12-outline::before{content:"\F866"}.mdi-dice-d20-outline::before{content:"\F5EA"}.mdi-dice-d4-outline::before{content:"\F5EB"}.mdi-dice-d6-outline::before{content:"\F5EC"}.mdi-dice-d8-outline::before{content:"\F5ED"}.mdi-dice-multiple::before{content:"\F76D"}.mdi-dictionary::before{content:"\F61D"}.mdi-dip-switch::before{content:"\F7C0"}.mdi-directions::before{content:"\F1D0"}.mdi-directions-fork::before{content:"\F641"}.mdi-disc::before{content:"\F5EE"}.mdi-disc-alert::before{content:"\F1D1"}.mdi-disc-player::before{content:"\F95F"}.mdi-discord::before{content:"\F66F"}.mdi-dishwasher::before{content:"\FAAB"}.mdi-disqus::before{content:"\F1D2"}.mdi-disqus-outline::before{content:"\F1D3"}.mdi-diving-flippers::before{content:"\FD9B"}.mdi-diving-helmet::before{content:"\FD9C"}.mdi-diving-scuba::before{content:"\FD9D"}.mdi-diving-scuba-flag::before{content:"\FD9E"}.mdi-diving-scuba-tank::before{content:"\FD9F"}.mdi-diving-scuba-tank-multiple::before{content:"\FDA0"}.mdi-diving-snorkel::before{content:"\FDA1"}.mdi-division::before{content:"\F1D4"}.mdi-division-box::before{content:"\F1D5"}.mdi-dlna::before{content:"\FA40"}.mdi-dna::before{content:"\F683"}.mdi-dns::before{content:"\F1D6"}.mdi-dns-outline::before{content:"\FB68"}.mdi-do-not-disturb::before{content:"\F697"}.mdi-do-not-disturb-off::before{content:"\F698"}.mdi-docker::before{content:"\F867"}.mdi-doctor::before{content:"\FA41"}.mdi-dog::before{content:"\FA42"}.mdi-dog-service::before{content:"\FAAC"}.mdi-dog-side::before{content:"\FA43"}.mdi-dolby::before{content:"\F6B2"}.mdi-dolly::before{content:"\FEBB"}.mdi-domain::before{content:"\F1D7"}.mdi-domain-off::before{content:"\FD4B"}.mdi-domino-mask::before{content:"\F0045"}.mdi-donkey::before{content:"\F7C1"}.mdi-door::before{content:"\F819"}.mdi-door-closed::before{content:"\F81A"}.mdi-door-open::before{content:"\F81B"}.mdi-doorbell-video::before{content:"\F868"}.mdi-dot-net::before{content:"\FAAD"}.mdi-dots-horizontal::before{content:"\F1D8"}.mdi-dots-horizontal-circle::before{content:"\F7C2"}.mdi-dots-horizontal-circle-outline::before{content:"\FB69"}.mdi-dots-vertical::before{content:"\F1D9"}.mdi-dots-vertical-circle::before{content:"\F7C3"}.mdi-dots-vertical-circle-outline::before{content:"\FB6A"}.mdi-douban::before{content:"\F699"}.mdi-download::before{content:"\F1DA"}.mdi-download-multiple::before{content:"\F9E8"}.mdi-download-network::before{content:"\F6F3"}.mdi-download-network-outline::before{content:"\FC42"}.mdi-download-outline::before{content:"\FB6B"}.mdi-drag::before{content:"\F1DB"}.mdi-drag-horizontal::before{content:"\F1DC"}.mdi-drag-variant::before{content:"\FB6C"}.mdi-drag-vertical::before{content:"\F1DD"}.mdi-drama-masks::before{content:"\FCDE"}.mdi-draw::before{content:"\FF66"}.mdi-drawing::before{content:"\F1DE"}.mdi-drawing-box::before{content:"\F1DF"}.mdi-dresser::before{content:"\FF67"}.mdi-dresser-outline::before{content:"\FF68"}.mdi-dribbble::before{content:"\F1E0"}.mdi-dribbble-box::before{content:"\F1E1"}.mdi-drone::before{content:"\F1E2"}.mdi-dropbox::before{content:"\F1E3"}.mdi-drupal::before{content:"\F1E4"}.mdi-duck::before{content:"\F1E5"}.mdi-dumbbell::before{content:"\F1E6"}.mdi-dump-truck::before{content:"\FC43"}.mdi-ear-hearing::before{content:"\F7C4"}.mdi-ear-hearing-off::before{content:"\FA44"}.mdi-earth::before{content:"\F1E7"}.mdi-earth-box::before{content:"\F6CC"}.mdi-earth-box-off::before{content:"\F6CD"}.mdi-earth-off::before{content:"\F1E8"}.mdi-edge::before{content:"\F1E9"}.mdi-egg::before{content:"\FAAE"}.mdi-egg-easter::before{content:"\FAAF"}.mdi-eight-track::before{content:"\F9E9"}.mdi-eject::before{content:"\F1EA"}.mdi-eject-outline::before{content:"\FB6D"}.mdi-electric-switch::before{content:"\FEBC"}.mdi-electron-framework::before{content:"\F0046"}.mdi-elephant::before{content:"\F7C5"}.mdi-elevation-decline::before{content:"\F1EB"}.mdi-elevation-rise::before{content:"\F1EC"}.mdi-elevator::before{content:"\F1ED"}.mdi-ellipse::before{content:"\FEBD"}.mdi-ellipse-outline::before{content:"\FEBE"}.mdi-email::before{content:"\F1EE"}.mdi-email-alert::before{content:"\F6CE"}.mdi-email-box::before{content:"\FCDF"}.mdi-email-check::before{content:"\FAB0"}.mdi-email-check-outline::before{content:"\FAB1"}.mdi-email-edit::before{content:"\FF00"}.mdi-email-edit-outline::before{content:"\FF01"}.mdi-email-lock::before{content:"\F1F1"}.mdi-email-mark-as-unread::before{content:"\FB6E"}.mdi-email-minus::before{content:"\FF02"}.mdi-email-minus-outline::before{content:"\FF03"}.mdi-email-multiple::before{content:"\FF04"}.mdi-email-multiple-outline::before{content:"\FF05"}.mdi-email-newsletter::before{content:"\FFD1"}.mdi-email-open::before{content:"\F1EF"}.mdi-email-open-multiple::before{content:"\FF06"}.mdi-email-open-multiple-outline::before{content:"\FF07"}.mdi-email-open-outline::before{content:"\F5EF"}.mdi-email-outline::before{content:"\F1F0"}.mdi-email-plus::before{content:"\F9EA"}.mdi-email-plus-outline::before{content:"\F9EB"}.mdi-email-search::before{content:"\F960"}.mdi-email-search-outline::before{content:"\F961"}.mdi-email-variant::before{content:"\F5F0"}.mdi-ember::before{content:"\FB15"}.mdi-emby::before{content:"\F6B3"}.mdi-emoticon::before{content:"\FC44"}.mdi-emoticon-angry::before{content:"\FC45"}.mdi-emoticon-angry-outline::before{content:"\FC46"}.mdi-emoticon-cool::before{content:"\FC47"}.mdi-emoticon-cool-outline::before{content:"\F1F3"}.mdi-emoticon-cry::before{content:"\FC48"}.mdi-emoticon-cry-outline::before{content:"\FC49"}.mdi-emoticon-dead::before{content:"\FC4A"}.mdi-emoticon-dead-outline::before{content:"\F69A"}.mdi-emoticon-devil::before{content:"\FC4B"}.mdi-emoticon-devil-outline::before{content:"\F1F4"}.mdi-emoticon-excited::before{content:"\FC4C"}.mdi-emoticon-excited-outline::before{content:"\F69B"}.mdi-emoticon-frown::before{content:"\FF69"}.mdi-emoticon-frown-outline::before{content:"\FF6A"}.mdi-emoticon-happy::before{content:"\FC4D"}.mdi-emoticon-happy-outline::before{content:"\F1F5"}.mdi-emoticon-kiss::before{content:"\FC4E"}.mdi-emoticon-kiss-outline::before{content:"\FC4F"}.mdi-emoticon-neutral::before{content:"\FC50"}.mdi-emoticon-neutral-outline::before{content:"\F1F6"}.mdi-emoticon-outline::before{content:"\F1F2"}.mdi-emoticon-poop::before{content:"\F1F7"}.mdi-emoticon-poop-outline::before{content:"\FC51"}.mdi-emoticon-sad::before{content:"\FC52"}.mdi-emoticon-sad-outline::before{content:"\F1F8"}.mdi-emoticon-tongue::before{content:"\F1F9"}.mdi-emoticon-tongue-outline::before{content:"\FC53"}.mdi-emoticon-wink::before{content:"\FC54"}.mdi-emoticon-wink-outline::before{content:"\FC55"}.mdi-engine::before{content:"\F1FA"}.mdi-engine-off::before{content:"\FA45"}.mdi-engine-off-outline::before{content:"\FA46"}.mdi-engine-outline::before{content:"\F1FB"}.mdi-equal::before{content:"\F1FC"}.mdi-equal-box::before{content:"\F1FD"}.mdi-equalizer::before{content:"\FEBF"}.mdi-equalizer-outline::before{content:"\FEC0"}.mdi-eraser::before{content:"\F1FE"}.mdi-eraser-variant::before{content:"\F642"}.mdi-escalator::before{content:"\F1FF"}.mdi-eslint::before{content:"\FC56"}.mdi-et::before{content:"\FAB2"}.mdi-ethereum::before{content:"\F869"}.mdi-ethernet::before{content:"\F200"}.mdi-ethernet-cable::before{content:"\F201"}.mdi-ethernet-cable-off::before{content:"\F202"}.mdi-etsy::before{content:"\F203"}.mdi-ev-station::before{content:"\F5F1"}.mdi-eventbrite::before{content:"\F7C6"}.mdi-evernote::before{content:"\F204"}.mdi-excavator::before{content:"\F0047"}.mdi-exclamation::before{content:"\F205"}.mdi-exit-run::before{content:"\FA47"}.mdi-exit-to-app::before{content:"\F206"}.mdi-expand-all::before{content:"\FAB3"}.mdi-expand-all-outline::before{content:"\FAB4"}.mdi-expansion-card::before{content:"\F8AD"}.mdi-expansion-card-variant::before{content:"\FFD2"}.mdi-exponent::before{content:"\F962"}.mdi-exponent-box::before{content:"\F963"}.mdi-export::before{content:"\F207"}.mdi-export-variant::before{content:"\FB6F"}.mdi-eye::before{content:"\F208"}.mdi-eye-check::before{content:"\FCE0"}.mdi-eye-check-outline::before{content:"\FCE1"}.mdi-eye-circle::before{content:"\FB70"}.mdi-eye-circle-outline::before{content:"\FB71"}.mdi-eye-minus::before{content:"\F0048"}.mdi-eye-minus-outline::before{content:"\F0049"}.mdi-eye-off::before{content:"\F209"}.mdi-eye-off-outline::before{content:"\F6D0"}.mdi-eye-outline::before{content:"\F6CF"}.mdi-eye-plus::before{content:"\F86A"}.mdi-eye-plus-outline::before{content:"\F86B"}.mdi-eye-settings::before{content:"\F86C"}.mdi-eye-settings-outline::before{content:"\F86D"}.mdi-eyedropper::before{content:"\F20A"}.mdi-eyedropper-variant::before{content:"\F20B"}.mdi-face::before{content:"\F643"}.mdi-face-agent::before{content:"\FD4C"}.mdi-face-outline::before{content:"\FB72"}.mdi-face-profile::before{content:"\F644"}.mdi-face-recognition::before{content:"\FC57"}.mdi-facebook::before{content:"\F20C"}.mdi-facebook-box::before{content:"\F20D"}.mdi-facebook-messenger::before{content:"\F20E"}.mdi-facebook-workplace::before{content:"\FB16"}.mdi-factory::before{content:"\F20F"}.mdi-fan::before{content:"\F210"}.mdi-fan-off::before{content:"\F81C"}.mdi-fast-forward::before{content:"\F211"}.mdi-fast-forward-10::before{content:"\FD4D"}.mdi-fast-forward-30::before{content:"\FCE2"}.mdi-fast-forward-outline::before{content:"\F6D1"}.mdi-fax::before{content:"\F212"}.mdi-feather::before{content:"\F6D2"}.mdi-feature-search::before{content:"\FA48"}.mdi-feature-search-outline::before{content:"\FA49"}.mdi-fedora::before{content:"\F8DA"}.mdi-ferris-wheel::before{content:"\FEC1"}.mdi-ferry::before{content:"\F213"}.mdi-file::before{content:"\F214"}.mdi-file-account::before{content:"\F73A"}.mdi-file-account-outline::before{content:"\F004A"}.mdi-file-alert::before{content:"\FA4A"}.mdi-file-alert-outline::before{content:"\FA4B"}.mdi-file-cabinet::before{content:"\FAB5"}.mdi-file-cad::before{content:"\FF08"}.mdi-file-cad-box::before{content:"\FF09"}.mdi-file-cancel::before{content:"\FDA2"}.mdi-file-cancel-outline::before{content:"\FDA3"}.mdi-file-chart::before{content:"\F215"}.mdi-file-chart-outline::before{content:"\F004B"}.mdi-file-check::before{content:"\F216"}.mdi-file-check-outline::before{content:"\FE7B"}.mdi-file-cloud::before{content:"\F217"}.mdi-file-cloud-outline::before{content:"\F004C"}.mdi-file-code::before{content:"\F22E"}.mdi-file-code-outline::before{content:"\F004D"}.mdi-file-compare::before{content:"\F8A9"}.mdi-file-delimited::before{content:"\F218"}.mdi-file-delimited-outline::before{content:"\FEC2"}.mdi-file-document::before{content:"\F219"}.mdi-file-document-box::before{content:"\F21A"}.mdi-file-document-box-check::before{content:"\FEC3"}.mdi-file-document-box-check-outline::before{content:"\FEC4"}.mdi-file-document-box-minus::before{content:"\FEC5"}.mdi-file-document-box-minus-outline::before{content:"\FEC6"}.mdi-file-document-box-multiple::before{content:"\FAB6"}.mdi-file-document-box-multiple-outline::before{content:"\FAB7"}.mdi-file-document-box-outline::before{content:"\F9EC"}.mdi-file-document-box-plus::before{content:"\FEC7"}.mdi-file-document-box-plus-outline::before{content:"\FEC8"}.mdi-file-document-box-remove::before{content:"\FEC9"}.mdi-file-document-box-remove-outline::before{content:"\FECA"}.mdi-file-document-box-search::before{content:"\FECB"}.mdi-file-document-box-search-outline::before{content:"\FECC"}.mdi-file-document-edit::before{content:"\FDA4"}.mdi-file-document-edit-outline::before{content:"\FDA5"}.mdi-file-document-outline::before{content:"\F9ED"}.mdi-file-download::before{content:"\F964"}.mdi-file-download-outline::before{content:"\F965"}.mdi-file-excel::before{content:"\F21B"}.mdi-file-excel-box::before{content:"\F21C"}.mdi-file-excel-box-outline::before{content:"\F004E"}.mdi-file-excel-outline::before{content:"\F004F"}.mdi-file-export::before{content:"\F21D"}.mdi-file-export-outline::before{content:"\F0050"}.mdi-file-eye::before{content:"\FDA6"}.mdi-file-eye-outline::before{content:"\FDA7"}.mdi-file-find::before{content:"\F21E"}.mdi-file-find-outline::before{content:"\FB73"}.mdi-file-hidden::before{content:"\F613"}.mdi-file-image::before{content:"\F21F"}.mdi-file-image-outline::before{content:"\FECD"}.mdi-file-import::before{content:"\F220"}.mdi-file-import-outline::before{content:"\F0051"}.mdi-file-lock::before{content:"\F221"}.mdi-file-lock-outline::before{content:"\F0052"}.mdi-file-move::before{content:"\FAB8"}.mdi-file-move-outline::before{content:"\F0053"}.mdi-file-multiple::before{content:"\F222"}.mdi-file-multiple-outline::before{content:"\F0054"}.mdi-file-music::before{content:"\F223"}.mdi-file-music-outline::before{content:"\FE7C"}.mdi-file-outline::before{content:"\F224"}.mdi-file-pdf::before{content:"\F225"}.mdi-file-pdf-box::before{content:"\F226"}.mdi-file-pdf-box-outline::before{content:"\FFD3"}.mdi-file-pdf-outline::before{content:"\FE7D"}.mdi-file-percent::before{content:"\F81D"}.mdi-file-percent-outline::before{content:"\F0055"}.mdi-file-plus::before{content:"\F751"}.mdi-file-plus-outline::before{content:"\FF0A"}.mdi-file-powerpoint::before{content:"\F227"}.mdi-file-powerpoint-box::before{content:"\F228"}.mdi-file-powerpoint-box-outline::before{content:"\F0056"}.mdi-file-powerpoint-outline::before{content:"\F0057"}.mdi-file-presentation-box::before{content:"\F229"}.mdi-file-question::before{content:"\F86E"}.mdi-file-question-outline::before{content:"\F0058"}.mdi-file-remove::before{content:"\FB74"}.mdi-file-remove-outline::before{content:"\F0059"}.mdi-file-replace::before{content:"\FB17"}.mdi-file-replace-outline::before{content:"\FB18"}.mdi-file-restore::before{content:"\F670"}.mdi-file-restore-outline::before{content:"\F005A"}.mdi-file-search::before{content:"\FC58"}.mdi-file-search-outline::before{content:"\FC59"}.mdi-file-send::before{content:"\F22A"}.mdi-file-send-outline::before{content:"\F005B"}.mdi-file-star::before{content:"\F005C"}.mdi-file-star-outline::before{content:"\F005D"}.mdi-file-swap::before{content:"\FFD4"}.mdi-file-swap-outline::before{content:"\FFD5"}.mdi-file-table::before{content:"\FC5A"}.mdi-file-table-outline::before{content:"\FC5B"}.mdi-file-tree::before{content:"\F645"}.mdi-file-undo::before{content:"\F8DB"}.mdi-file-undo-outline::before{content:"\F005E"}.mdi-file-upload::before{content:"\FA4C"}.mdi-file-upload-outline::before{content:"\FA4D"}.mdi-file-video::before{content:"\F22B"}.mdi-file-video-outline::before{content:"\FE10"}.mdi-file-word::before{content:"\F22C"}.mdi-file-word-box::before{content:"\F22D"}.mdi-file-word-box-outline::before{content:"\F005F"}.mdi-file-word-outline::before{content:"\F0060"}.mdi-film::before{content:"\F22F"}.mdi-filmstrip::before{content:"\F230"}.mdi-filmstrip-off::before{content:"\F231"}.mdi-filter::before{content:"\F232"}.mdi-filter-minus::before{content:"\FF0B"}.mdi-filter-minus-outline::before{content:"\FF0C"}.mdi-filter-outline::before{content:"\F233"}.mdi-filter-plus::before{content:"\FF0D"}.mdi-filter-plus-outline::before{content:"\FF0E"}.mdi-filter-remove::before{content:"\F234"}.mdi-filter-remove-outline::before{content:"\F235"}.mdi-filter-variant::before{content:"\F236"}.mdi-filter-variant-remove::before{content:"\F0061"}.mdi-finance::before{content:"\F81E"}.mdi-find-replace::before{content:"\F6D3"}.mdi-fingerprint::before{content:"\F237"}.mdi-fingerprint-off::before{content:"\FECE"}.mdi-fire::before{content:"\F238"}.mdi-fire-extinguisher::before{content:"\FF0F"}.mdi-fire-truck::before{content:"\F8AA"}.mdi-firebase::before{content:"\F966"}.mdi-firefox::before{content:"\F239"}.mdi-fireplace::before{content:"\FE11"}.mdi-fireplace-off::before{content:"\FE12"}.mdi-firework::before{content:"\FE13"}.mdi-fish::before{content:"\F23A"}.mdi-fishbowl::before{content:"\FF10"}.mdi-fishbowl-outline::before{content:"\FF11"}.mdi-fit-to-page::before{content:"\FF12"}.mdi-fit-to-page-outline::before{content:"\FF13"}.mdi-flag::before{content:"\F23B"}.mdi-flag-checkered::before{content:"\F23C"}.mdi-flag-minus::before{content:"\FB75"}.mdi-flag-outline::before{content:"\F23D"}.mdi-flag-plus::before{content:"\FB76"}.mdi-flag-remove::before{content:"\FB77"}.mdi-flag-triangle::before{content:"\F23F"}.mdi-flag-variant::before{content:"\F240"}.mdi-flag-variant-outline::before{content:"\F23E"}.mdi-flare::before{content:"\FD4E"}.mdi-flash::before{content:"\F241"}.mdi-flash-alert::before{content:"\FF14"}.mdi-flash-alert-outline::before{content:"\FF15"}.mdi-flash-auto::before{content:"\F242"}.mdi-flash-circle::before{content:"\F81F"}.mdi-flash-off::before{content:"\F243"}.mdi-flash-outline::before{content:"\F6D4"}.mdi-flash-red-eye::before{content:"\F67A"}.mdi-flashlight::before{content:"\F244"}.mdi-flashlight-off::before{content:"\F245"}.mdi-flask::before{content:"\F093"}.mdi-flask-empty::before{content:"\F094"}.mdi-flask-empty-outline::before{content:"\F095"}.mdi-flask-outline::before{content:"\F096"}.mdi-flattr::before{content:"\F246"}.mdi-flickr::before{content:"\FCE3"}.mdi-flip-to-back::before{content:"\F247"}.mdi-flip-to-front::before{content:"\F248"}.mdi-floor-lamp::before{content:"\F8DC"}.mdi-floor-lamp-dual::before{content:"\F0062"}.mdi-floor-lamp-variant::before{content:"\F0063"}.mdi-floor-plan::before{content:"\F820"}.mdi-floppy::before{content:"\F249"}.mdi-floppy-variant::before{content:"\F9EE"}.mdi-flower::before{content:"\F24A"}.mdi-flower-outline::before{content:"\F9EF"}.mdi-flower-poppy::before{content:"\FCE4"}.mdi-flower-tulip::before{content:"\F9F0"}.mdi-flower-tulip-outline::before{content:"\F9F1"}.mdi-focus-auto::before{content:"\FF6B"}.mdi-focus-field::before{content:"\FF6C"}.mdi-focus-field-horizontal::before{content:"\FF6D"}.mdi-focus-field-vertical::before{content:"\FF6E"}.mdi-folder::before{content:"\F24B"}.mdi-folder-account::before{content:"\F24C"}.mdi-folder-account-outline::before{content:"\FB78"}.mdi-folder-alert::before{content:"\FDA8"}.mdi-folder-alert-outline::before{content:"\FDA9"}.mdi-folder-clock::before{content:"\FAB9"}.mdi-folder-clock-outline::before{content:"\FABA"}.mdi-folder-download::before{content:"\F24D"}.mdi-folder-edit::before{content:"\F8DD"}.mdi-folder-edit-outline::before{content:"\FDAA"}.mdi-folder-google-drive::before{content:"\F24E"}.mdi-folder-image::before{content:"\F24F"}.mdi-folder-key::before{content:"\F8AB"}.mdi-folder-key-network::before{content:"\F8AC"}.mdi-folder-key-network-outline::before{content:"\FC5C"}.mdi-folder-lock::before{content:"\F250"}.mdi-folder-lock-open::before{content:"\F251"}.mdi-folder-move::before{content:"\F252"}.mdi-folder-multiple::before{content:"\F253"}.mdi-folder-multiple-image::before{content:"\F254"}.mdi-folder-multiple-outline::before{content:"\F255"}.mdi-folder-network::before{content:"\F86F"}.mdi-folder-network-outline::before{content:"\FC5D"}.mdi-folder-open::before{content:"\F76F"}.mdi-folder-open-outline::before{content:"\FDAB"}.mdi-folder-outline::before{content:"\F256"}.mdi-folder-plus::before{content:"\F257"}.mdi-folder-plus-outline::before{content:"\FB79"}.mdi-folder-pound::before{content:"\FCE5"}.mdi-folder-pound-outline::before{content:"\FCE6"}.mdi-folder-remove::before{content:"\F258"}.mdi-folder-remove-outline::before{content:"\FB7A"}.mdi-folder-search::before{content:"\F967"}.mdi-folder-search-outline::before{content:"\F968"}.mdi-folder-star::before{content:"\F69C"}.mdi-folder-star-outline::before{content:"\FB7B"}.mdi-folder-swap::before{content:"\FFD6"}.mdi-folder-swap-outline::before{content:"\FFD7"}.mdi-folder-sync::before{content:"\FCE7"}.mdi-folder-sync-outline::before{content:"\FCE8"}.mdi-folder-text::before{content:"\FC5E"}.mdi-folder-text-outline::before{content:"\FC5F"}.mdi-folder-upload::before{content:"\F259"}.mdi-folder-zip::before{content:"\F6EA"}.mdi-folder-zip-outline::before{content:"\F7B8"}.mdi-font-awesome::before{content:"\F03A"}.mdi-food::before{content:"\F25A"}.mdi-food-apple::before{content:"\F25B"}.mdi-food-apple-outline::before{content:"\FC60"}.mdi-food-croissant::before{content:"\F7C7"}.mdi-food-fork-drink::before{content:"\F5F2"}.mdi-food-off::before{content:"\F5F3"}.mdi-food-variant::before{content:"\F25C"}.mdi-foot-print::before{content:"\FF6F"}.mdi-football::before{content:"\F25D"}.mdi-football-australian::before{content:"\F25E"}.mdi-football-helmet::before{content:"\F25F"}.mdi-forklift::before{content:"\F7C8"}.mdi-format-align-bottom::before{content:"\F752"}.mdi-format-align-center::before{content:"\F260"}.mdi-format-align-justify::before{content:"\F261"}.mdi-format-align-left::before{content:"\F262"}.mdi-format-align-middle::before{content:"\F753"}.mdi-format-align-right::before{content:"\F263"}.mdi-format-align-top::before{content:"\F754"}.mdi-format-annotation-minus::before{content:"\FABB"}.mdi-format-annotation-plus::before{content:"\F646"}.mdi-format-bold::before{content:"\F264"}.mdi-format-clear::before{content:"\F265"}.mdi-format-color-fill::before{content:"\F266"}.mdi-format-color-highlight::before{content:"\FE14"}.mdi-format-color-text::before{content:"\F69D"}.mdi-format-columns::before{content:"\F8DE"}.mdi-format-float-center::before{content:"\F267"}.mdi-format-float-left::before{content:"\F268"}.mdi-format-float-none::before{content:"\F269"}.mdi-format-float-right::before{content:"\F26A"}.mdi-format-font::before{content:"\F6D5"}.mdi-format-font-size-decrease::before{content:"\F9F2"}.mdi-format-font-size-increase::before{content:"\F9F3"}.mdi-format-header-1::before{content:"\F26B"}.mdi-format-header-2::before{content:"\F26C"}.mdi-format-header-3::before{content:"\F26D"}.mdi-format-header-4::before{content:"\F26E"}.mdi-format-header-5::before{content:"\F26F"}.mdi-format-header-6::before{content:"\F270"}.mdi-format-header-decrease::before{content:"\F271"}.mdi-format-header-equal::before{content:"\F272"}.mdi-format-header-increase::before{content:"\F273"}.mdi-format-header-pound::before{content:"\F274"}.mdi-format-horizontal-align-center::before{content:"\F61E"}.mdi-format-horizontal-align-left::before{content:"\F61F"}.mdi-format-horizontal-align-right::before{content:"\F620"}.mdi-format-indent-decrease::before{content:"\F275"}.mdi-format-indent-increase::before{content:"\F276"}.mdi-format-italic::before{content:"\F277"}.mdi-format-letter-case::before{content:"\FB19"}.mdi-format-letter-case-lower::before{content:"\FB1A"}.mdi-format-letter-case-upper::before{content:"\FB1B"}.mdi-format-letter-ends-with::before{content:"\FFD8"}.mdi-format-letter-matches::before{content:"\FFD9"}.mdi-format-letter-starts-with::before{content:"\FFDA"}.mdi-format-line-spacing::before{content:"\F278"}.mdi-format-line-style::before{content:"\F5C8"}.mdi-format-line-weight::before{content:"\F5C9"}.mdi-format-list-bulleted::before{content:"\F279"}.mdi-format-list-bulleted-square::before{content:"\FDAC"}.mdi-format-list-bulleted-triangle::before{content:"\FECF"}.mdi-format-list-bulleted-type::before{content:"\F27A"}.mdi-format-list-checkbox::before{content:"\F969"}.mdi-format-list-checks::before{content:"\F755"}.mdi-format-list-numbered::before{content:"\F27B"}.mdi-format-list-numbered-rtl::before{content:"\FCE9"}.mdi-format-overline::before{content:"\FED0"}.mdi-format-page-break::before{content:"\F6D6"}.mdi-format-paint::before{content:"\F27C"}.mdi-format-paragraph::before{content:"\F27D"}.mdi-format-pilcrow::before{content:"\F6D7"}.mdi-format-quote-close::before{content:"\F27E"}.mdi-format-quote-open::before{content:"\F756"}.mdi-format-rotate-90::before{content:"\F6A9"}.mdi-format-section::before{content:"\F69E"}.mdi-format-size::before{content:"\F27F"}.mdi-format-strikethrough::before{content:"\F280"}.mdi-format-strikethrough-variant::before{content:"\F281"}.mdi-format-subscript::before{content:"\F282"}.mdi-format-superscript::before{content:"\F283"}.mdi-format-text::before{content:"\F284"}.mdi-format-text-rotation-angle-down::before{content:"\FFDB"}.mdi-format-text-rotation-angle-up::before{content:"\FFDC"}.mdi-format-text-rotation-down::before{content:"\FD4F"}.mdi-format-text-rotation-down-vertical::before{content:"\FFDD"}.mdi-format-text-rotation-none::before{content:"\FD50"}.mdi-format-text-rotation-up::before{content:"\FFDE"}.mdi-format-text-rotation-vertical::before{content:"\FFDF"}.mdi-format-text-variant::before{content:"\FE15"}.mdi-format-text-wrapping-clip::before{content:"\FCEA"}.mdi-format-text-wrapping-overflow::before{content:"\FCEB"}.mdi-format-text-wrapping-wrap::before{content:"\FCEC"}.mdi-format-textbox::before{content:"\FCED"}.mdi-format-textdirection-l-to-r::before{content:"\F285"}.mdi-format-textdirection-r-to-l::before{content:"\F286"}.mdi-format-title::before{content:"\F5F4"}.mdi-format-underline::before{content:"\F287"}.mdi-format-vertical-align-bottom::before{content:"\F621"}.mdi-format-vertical-align-center::before{content:"\F622"}.mdi-format-vertical-align-top::before{content:"\F623"}.mdi-format-wrap-inline::before{content:"\F288"}.mdi-format-wrap-square::before{content:"\F289"}.mdi-format-wrap-tight::before{content:"\F28A"}.mdi-format-wrap-top-bottom::before{content:"\F28B"}.mdi-forum::before{content:"\F28C"}.mdi-forum-outline::before{content:"\F821"}.mdi-forward::before{content:"\F28D"}.mdi-forwardburger::before{content:"\FD51"}.mdi-fountain::before{content:"\F96A"}.mdi-fountain-pen::before{content:"\FCEE"}.mdi-fountain-pen-tip::before{content:"\FCEF"}.mdi-foursquare::before{content:"\F28E"}.mdi-freebsd::before{content:"\F8DF"}.mdi-frequently-asked-questions::before{content:"\FED1"}.mdi-fridge::before{content:"\F290"}.mdi-fridge-bottom::before{content:"\F292"}.mdi-fridge-outline::before{content:"\F28F"}.mdi-fridge-top::before{content:"\F291"}.mdi-fruit-cherries::before{content:"\F0064"}.mdi-fruit-citrus::before{content:"\F0065"}.mdi-fruit-grapes::before{content:"\F0066"}.mdi-fruit-grapes-outline::before{content:"\F0067"}.mdi-fruit-pineapple::before{content:"\F0068"}.mdi-fruit-watermelon::before{content:"\F0069"}.mdi-fuel::before{content:"\F7C9"}.mdi-fullscreen::before{content:"\F293"}.mdi-fullscreen-exit::before{content:"\F294"}.mdi-function::before{content:"\F295"}.mdi-function-variant::before{content:"\F870"}.mdi-fuse::before{content:"\FC61"}.mdi-fuse-blade::before{content:"\FC62"}.mdi-gamepad::before{content:"\F296"}.mdi-gamepad-circle::before{content:"\FE16"}.mdi-gamepad-circle-down::before{content:"\FE17"}.mdi-gamepad-circle-left::before{content:"\FE18"}.mdi-gamepad-circle-outline::before{content:"\FE19"}.mdi-gamepad-circle-right::before{content:"\FE1A"}.mdi-gamepad-circle-up::before{content:"\FE1B"}.mdi-gamepad-down::before{content:"\FE1C"}.mdi-gamepad-left::before{content:"\FE1D"}.mdi-gamepad-right::before{content:"\FE1E"}.mdi-gamepad-round::before{content:"\FE1F"}.mdi-gamepad-round-down::before{content:"\FE7E"}.mdi-gamepad-round-left::before{content:"\FE7F"}.mdi-gamepad-round-outline::before{content:"\FE80"}.mdi-gamepad-round-right::before{content:"\FE81"}.mdi-gamepad-round-up::before{content:"\FE82"}.mdi-gamepad-square::before{content:"\FED2"}.mdi-gamepad-square-outline::before{content:"\FED3"}.mdi-gamepad-up::before{content:"\FE83"}.mdi-gamepad-variant::before{content:"\F297"}.mdi-gamepad-variant-outline::before{content:"\FED4"}.mdi-gantry-crane::before{content:"\FDAD"}.mdi-garage::before{content:"\F6D8"}.mdi-garage-alert::before{content:"\F871"}.mdi-garage-open::before{content:"\F6D9"}.mdi-gas-cylinder::before{content:"\F647"}.mdi-gas-station::before{content:"\F298"}.mdi-gas-station-outline::before{content:"\FED5"}.mdi-gate::before{content:"\F299"}.mdi-gate-and::before{content:"\F8E0"}.mdi-gate-nand::before{content:"\F8E1"}.mdi-gate-nor::before{content:"\F8E2"}.mdi-gate-not::before{content:"\F8E3"}.mdi-gate-or::before{content:"\F8E4"}.mdi-gate-xnor::before{content:"\F8E5"}.mdi-gate-xor::before{content:"\F8E6"}.mdi-gatsby::before{content:"\FE84"}.mdi-gauge::before{content:"\F29A"}.mdi-gauge-empty::before{content:"\F872"}.mdi-gauge-full::before{content:"\F873"}.mdi-gauge-low::before{content:"\F874"}.mdi-gavel::before{content:"\F29B"}.mdi-gender-female::before{content:"\F29C"}.mdi-gender-male::before{content:"\F29D"}.mdi-gender-male-female::before{content:"\F29E"}.mdi-gender-transgender::before{content:"\F29F"}.mdi-gentoo::before{content:"\F8E7"}.mdi-gesture::before{content:"\F7CA"}.mdi-gesture-double-tap::before{content:"\F73B"}.mdi-gesture-pinch::before{content:"\FABC"}.mdi-gesture-spread::before{content:"\FABD"}.mdi-gesture-swipe::before{content:"\FD52"}.mdi-gesture-swipe-down::before{content:"\F73C"}.mdi-gesture-swipe-horizontal::before{content:"\FABE"}.mdi-gesture-swipe-left::before{content:"\F73D"}.mdi-gesture-swipe-right::before{content:"\F73E"}.mdi-gesture-swipe-up::before{content:"\F73F"}.mdi-gesture-swipe-vertical::before{content:"\FABF"}.mdi-gesture-tap::before{content:"\F740"}.mdi-gesture-tap-hold::before{content:"\FD53"}.mdi-gesture-two-double-tap::before{content:"\F741"}.mdi-gesture-two-tap::before{content:"\F742"}.mdi-ghost::before{content:"\F2A0"}.mdi-ghost-off::before{content:"\F9F4"}.mdi-gif::before{content:"\FD54"}.mdi-gift::before{content:"\FE85"}.mdi-gift-outline::before{content:"\F2A1"}.mdi-git::before{content:"\F2A2"}.mdi-github-box::before{content:"\F2A3"}.mdi-github-circle::before{content:"\F2A4"}.mdi-github-face::before{content:"\F6DA"}.mdi-gitlab::before{content:"\FB7C"}.mdi-glass-cocktail::before{content:"\F356"}.mdi-glass-flute::before{content:"\F2A5"}.mdi-glass-mug::before{content:"\F2A6"}.mdi-glass-stange::before{content:"\F2A7"}.mdi-glass-tulip::before{content:"\F2A8"}.mdi-glass-wine::before{content:"\F875"}.mdi-glassdoor::before{content:"\F2A9"}.mdi-glasses::before{content:"\F2AA"}.mdi-globe-model::before{content:"\F8E8"}.mdi-gmail::before{content:"\F2AB"}.mdi-gnome::before{content:"\F2AC"}.mdi-go-kart::before{content:"\FD55"}.mdi-go-kart-track::before{content:"\FD56"}.mdi-gog::before{content:"\FB7D"}.mdi-golf::before{content:"\F822"}.mdi-gondola::before{content:"\F685"}.mdi-goodreads::before{content:"\FD57"}.mdi-google::before{content:"\F2AD"}.mdi-google-adwords::before{content:"\FC63"}.mdi-google-analytics::before{content:"\F7CB"}.mdi-google-assistant::before{content:"\F7CC"}.mdi-google-cardboard::before{content:"\F2AE"}.mdi-google-chrome::before{content:"\F2AF"}.mdi-google-circles::before{content:"\F2B0"}.mdi-google-circles-communities::before{content:"\F2B1"}.mdi-google-circles-extended::before{content:"\F2B2"}.mdi-google-circles-group::before{content:"\F2B3"}.mdi-google-classroom::before{content:"\F2C0"}.mdi-google-controller::before{content:"\F2B4"}.mdi-google-controller-off::before{content:"\F2B5"}.mdi-google-drive::before{content:"\F2B6"}.mdi-google-earth::before{content:"\F2B7"}.mdi-google-fit::before{content:"\F96B"}.mdi-google-glass::before{content:"\F2B8"}.mdi-google-hangouts::before{content:"\F2C9"}.mdi-google-home::before{content:"\F823"}.mdi-google-keep::before{content:"\F6DB"}.mdi-google-lens::before{content:"\F9F5"}.mdi-google-maps::before{content:"\F5F5"}.mdi-google-my-business::before{content:"\F006A"}.mdi-google-nearby::before{content:"\F2B9"}.mdi-google-pages::before{content:"\F2BA"}.mdi-google-photos::before{content:"\F6DC"}.mdi-google-physical-web::before{content:"\F2BB"}.mdi-google-play::before{content:"\F2BC"}.mdi-google-plus::before{content:"\F2BD"}.mdi-google-plus-box::before{content:"\F2BE"}.mdi-google-podcast::before{content:"\FED6"}.mdi-google-spreadsheet::before{content:"\F9F6"}.mdi-google-street-view::before{content:"\FC64"}.mdi-google-translate::before{content:"\F2BF"}.mdi-gradient::before{content:"\F69F"}.mdi-grain::before{content:"\FD58"}.mdi-graph::before{content:"\F006B"}.mdi-graph-outline::before{content:"\F006C"}.mdi-graphql::before{content:"\F876"}.mdi-grave-stone::before{content:"\FB7E"}.mdi-grease-pencil::before{content:"\F648"}.mdi-greater-than::before{content:"\F96C"}.mdi-greater-than-or-equal::before{content:"\F96D"}.mdi-grid::before{content:"\F2C1"}.mdi-grid-large::before{content:"\F757"}.mdi-grid-off::before{content:"\F2C2"}.mdi-grill::before{content:"\FE86"}.mdi-group::before{content:"\F2C3"}.mdi-guitar-acoustic::before{content:"\F770"}.mdi-guitar-electric::before{content:"\F2C4"}.mdi-guitar-pick::before{content:"\F2C5"}.mdi-guitar-pick-outline::before{content:"\F2C6"}.mdi-guy-fawkes-mask::before{content:"\F824"}.mdi-hackernews::before{content:"\F624"}.mdi-hail::before{content:"\FAC0"}.mdi-halloween::before{content:"\FB7F"}.mdi-hamburger::before{content:"\F684"}.mdi-hammer::before{content:"\F8E9"}.mdi-hand::before{content:"\FA4E"}.mdi-hand-left::before{content:"\FE87"}.mdi-hand-okay::before{content:"\FA4F"}.mdi-hand-peace::before{content:"\FA50"}.mdi-hand-peace-variant::before{content:"\FA51"}.mdi-hand-pointing-down::before{content:"\FA52"}.mdi-hand-pointing-left::before{content:"\FA53"}.mdi-hand-pointing-right::before{content:"\F2C7"}.mdi-hand-pointing-up::before{content:"\FA54"}.mdi-hand-right::before{content:"\FE88"}.mdi-hand-saw::before{content:"\FE89"}.mdi-handball::before{content:"\FF70"}.mdi-hanger::before{content:"\F2C8"}.mdi-hard-hat::before{content:"\F96E"}.mdi-harddisk::before{content:"\F2CA"}.mdi-harddisk-plus::before{content:"\F006D"}.mdi-harddisk-remove::before{content:"\F006E"}.mdi-hat-fedora::before{content:"\FB80"}.mdi-hazard-lights::before{content:"\FC65"}.mdi-hdr::before{content:"\FD59"}.mdi-hdr-off::before{content:"\FD5A"}.mdi-headphones::before{content:"\F2CB"}.mdi-headphones-bluetooth::before{content:"\F96F"}.mdi-headphones-box::before{content:"\F2CC"}.mdi-headphones-off::before{content:"\F7CD"}.mdi-headphones-settings::before{content:"\F2CD"}.mdi-headset::before{content:"\F2CE"}.mdi-headset-dock::before{content:"\F2CF"}.mdi-headset-off::before{content:"\F2D0"}.mdi-heart::before{content:"\F2D1"}.mdi-heart-box::before{content:"\F2D2"}.mdi-heart-box-outline::before{content:"\F2D3"}.mdi-heart-broken::before{content:"\F2D4"}.mdi-heart-broken-outline::before{content:"\FCF0"}.mdi-heart-circle::before{content:"\F970"}.mdi-heart-circle-outline::before{content:"\F971"}.mdi-heart-flash::before{content:"\FF16"}.mdi-heart-half::before{content:"\F6DE"}.mdi-heart-half-full::before{content:"\F6DD"}.mdi-heart-half-outline::before{content:"\F6DF"}.mdi-heart-multiple::before{content:"\FA55"}.mdi-heart-multiple-outline::before{content:"\FA56"}.mdi-heart-off::before{content:"\F758"}.mdi-heart-outline::before{content:"\F2D5"}.mdi-heart-pulse::before{content:"\F5F6"}.mdi-helicopter::before{content:"\FAC1"}.mdi-help::before{content:"\F2D6"}.mdi-help-box::before{content:"\F78A"}.mdi-help-circle::before{content:"\F2D7"}.mdi-help-circle-outline::before{content:"\F625"}.mdi-help-network::before{content:"\F6F4"}.mdi-help-network-outline::before{content:"\FC66"}.mdi-help-rhombus::before{content:"\FB81"}.mdi-help-rhombus-outline::before{content:"\FB82"}.mdi-hexagon::before{content:"\F2D8"}.mdi-hexagon-multiple::before{content:"\F6E0"}.mdi-hexagon-outline::before{content:"\F2D9"}.mdi-hexagon-slice-1::before{content:"\FAC2"}.mdi-hexagon-slice-2::before{content:"\FAC3"}.mdi-hexagon-slice-3::before{content:"\FAC4"}.mdi-hexagon-slice-4::before{content:"\FAC5"}.mdi-hexagon-slice-5::before{content:"\FAC6"}.mdi-hexagon-slice-6::before{content:"\FAC7"}.mdi-hexagram::before{content:"\FAC8"}.mdi-hexagram-outline::before{content:"\FAC9"}.mdi-high-definition::before{content:"\F7CE"}.mdi-high-definition-box::before{content:"\F877"}.mdi-highway::before{content:"\F5F7"}.mdi-hiking::before{content:"\FD5B"}.mdi-hinduism::before{content:"\F972"}.mdi-history::before{content:"\F2DA"}.mdi-hockey-puck::before{content:"\F878"}.mdi-hockey-sticks::before{content:"\F879"}.mdi-hololens::before{content:"\F2DB"}.mdi-home::before{content:"\F2DC"}.mdi-home-account::before{content:"\F825"}.mdi-home-alert::before{content:"\F87A"}.mdi-home-analytics::before{content:"\FED7"}.mdi-home-assistant::before{content:"\F7CF"}.mdi-home-automation::before{content:"\F7D0"}.mdi-home-circle::before{content:"\F7D1"}.mdi-home-circle-outline::before{content:"\F006F"}.mdi-home-city::before{content:"\FCF1"}.mdi-home-city-outline::before{content:"\FCF2"}.mdi-home-currency-usd::before{content:"\F8AE"}.mdi-home-export-outline::before{content:"\FFB8"}.mdi-home-flood::before{content:"\FF17"}.mdi-home-floor-0::before{content:"\FDAE"}.mdi-home-floor-1::before{content:"\FD5C"}.mdi-home-floor-2::before{content:"\FD5D"}.mdi-home-floor-3::before{content:"\FD5E"}.mdi-home-floor-a::before{content:"\FD5F"}.mdi-home-floor-b::before{content:"\FD60"}.mdi-home-floor-g::before{content:"\FD61"}.mdi-home-floor-l::before{content:"\FD62"}.mdi-home-floor-negative-1::before{content:"\FDAF"}.mdi-home-group::before{content:"\FDB0"}.mdi-home-heart::before{content:"\F826"}.mdi-home-import-outline::before{content:"\FFB9"}.mdi-home-lock::before{content:"\F8EA"}.mdi-home-lock-open::before{content:"\F8EB"}.mdi-home-map-marker::before{content:"\F5F8"}.mdi-home-minus::before{content:"\F973"}.mdi-home-modern::before{content:"\F2DD"}.mdi-home-outline::before{content:"\F6A0"}.mdi-home-plus::before{content:"\F974"}.mdi-home-thermometer::before{content:"\FF71"}.mdi-home-thermometer-outline::before{content:"\FF72"}.mdi-home-variant::before{content:"\F2DE"}.mdi-home-variant-outline::before{content:"\FB83"}.mdi-hook::before{content:"\F6E1"}.mdi-hook-off::before{content:"\F6E2"}.mdi-hops::before{content:"\F2DF"}.mdi-horseshoe::before{content:"\FA57"}.mdi-hospital::before{content:"\F0017"}.mdi-hospital-box::before{content:"\F2E0"}.mdi-hospital-box-outline::before{content:"\F0018"}.mdi-hospital-building::before{content:"\F2E1"}.mdi-hospital-marker::before{content:"\F2E2"}.mdi-hot-tub::before{content:"\F827"}.mdi-hotel::before{content:"\F2E3"}.mdi-houzz::before{content:"\F2E4"}.mdi-houzz-box::before{content:"\F2E5"}.mdi-hubspot::before{content:"\FCF3"}.mdi-hulu::before{content:"\F828"}.mdi-human::before{content:"\F2E6"}.mdi-human-child::before{content:"\F2E7"}.mdi-human-female::before{content:"\F649"}.mdi-human-female-boy::before{content:"\FA58"}.mdi-human-female-female::before{content:"\FA59"}.mdi-human-female-girl::before{content:"\FA5A"}.mdi-human-greeting::before{content:"\F64A"}.mdi-human-handsdown::before{content:"\F64B"}.mdi-human-handsup::before{content:"\F64C"}.mdi-human-male::before{content:"\F64D"}.mdi-human-male-boy::before{content:"\FA5B"}.mdi-human-male-female::before{content:"\F2E8"}.mdi-human-male-girl::before{content:"\FA5C"}.mdi-human-male-height::before{content:"\FF18"}.mdi-human-male-height-variant::before{content:"\FF19"}.mdi-human-male-male::before{content:"\FA5D"}.mdi-human-pregnant::before{content:"\F5CF"}.mdi-humble-bundle::before{content:"\F743"}.mdi-ice-cream::before{content:"\F829"}.mdi-ice-pop::before{content:"\FF1A"}.mdi-id-card::before{content:"\FFE0"}.mdi-identifier::before{content:"\FF1B"}.mdi-iframe::before{content:"\FC67"}.mdi-iframe-outline::before{content:"\FC68"}.mdi-image::before{content:"\F2E9"}.mdi-image-album::before{content:"\F2EA"}.mdi-image-area::before{content:"\F2EB"}.mdi-image-area-close::before{content:"\F2EC"}.mdi-image-auto-adjust::before{content:"\FFE1"}.mdi-image-broken::before{content:"\F2ED"}.mdi-image-broken-variant::before{content:"\F2EE"}.mdi-image-filter::before{content:"\F2EF"}.mdi-image-filter-black-white::before{content:"\F2F0"}.mdi-image-filter-center-focus::before{content:"\F2F1"}.mdi-image-filter-center-focus-strong::before{content:"\FF1C"}.mdi-image-filter-center-focus-strong-outline::before{content:"\FF1D"}.mdi-image-filter-center-focus-weak::before{content:"\F2F2"}.mdi-image-filter-drama::before{content:"\F2F3"}.mdi-image-filter-frames::before{content:"\F2F4"}.mdi-image-filter-hdr::before{content:"\F2F5"}.mdi-image-filter-none::before{content:"\F2F6"}.mdi-image-filter-tilt-shift::before{content:"\F2F7"}.mdi-image-filter-vintage::before{content:"\F2F8"}.mdi-image-frame::before{content:"\FE8A"}.mdi-image-move::before{content:"\F9F7"}.mdi-image-multiple::before{content:"\F2F9"}.mdi-image-off::before{content:"\F82A"}.mdi-image-outline::before{content:"\F975"}.mdi-image-plus::before{content:"\F87B"}.mdi-image-search::before{content:"\F976"}.mdi-image-search-outline::before{content:"\F977"}.mdi-image-size-select-actual::before{content:"\FC69"}.mdi-image-size-select-large::before{content:"\FC6A"}.mdi-image-size-select-small::before{content:"\FC6B"}.mdi-import::before{content:"\F2FA"}.mdi-inbox::before{content:"\F686"}.mdi-inbox-arrow-down::before{content:"\F2FB"}.mdi-inbox-arrow-up::before{content:"\F3D1"}.mdi-inbox-multiple::before{content:"\F8AF"}.mdi-inbox-multiple-outline::before{content:"\FB84"}.mdi-incognito::before{content:"\F5F9"}.mdi-infinity::before{content:"\F6E3"}.mdi-information::before{content:"\F2FC"}.mdi-information-outline::before{content:"\F2FD"}.mdi-information-variant::before{content:"\F64E"}.mdi-instagram::before{content:"\F2FE"}.mdi-instapaper::before{content:"\F2FF"}.mdi-instrument-triangle::before{content:"\F0070"}.mdi-internet-explorer::before{content:"\F300"}.mdi-invert-colors::before{content:"\F301"}.mdi-invert-colors-off::before{content:"\FE8B"}.mdi-ip::before{content:"\FA5E"}.mdi-ip-network::before{content:"\FA5F"}.mdi-ip-network-outline::before{content:"\FC6C"}.mdi-ipod::before{content:"\FC6D"}.mdi-islam::before{content:"\F978"}.mdi-island::before{content:"\F0071"}.mdi-itunes::before{content:"\F676"}.mdi-jabber::before{content:"\FDB1"}.mdi-jeepney::before{content:"\F302"}.mdi-jellyfish::before{content:"\FF1E"}.mdi-jellyfish-outline::before{content:"\FF1F"}.mdi-jira::before{content:"\F303"}.mdi-jquery::before{content:"\F87C"}.mdi-jsfiddle::before{content:"\F304"}.mdi-json::before{content:"\F626"}.mdi-judaism::before{content:"\F979"}.mdi-kabaddi::before{content:"\FD63"}.mdi-karate::before{content:"\F82B"}.mdi-keg::before{content:"\F305"}.mdi-kettle::before{content:"\F5FA"}.mdi-kettle-outline::before{content:"\FF73"}.mdi-key::before{content:"\F306"}.mdi-key-change::before{content:"\F307"}.mdi-key-minus::before{content:"\F308"}.mdi-key-outline::before{content:"\FDB2"}.mdi-key-plus::before{content:"\F309"}.mdi-key-remove::before{content:"\F30A"}.mdi-key-variant::before{content:"\F30B"}.mdi-key-wireless::before{content:"\FFE2"}.mdi-keyboard::before{content:"\F30C"}.mdi-keyboard-backspace::before{content:"\F30D"}.mdi-keyboard-caps::before{content:"\F30E"}.mdi-keyboard-close::before{content:"\F30F"}.mdi-keyboard-off::before{content:"\F310"}.mdi-keyboard-off-outline::before{content:"\FE8C"}.mdi-keyboard-outline::before{content:"\F97A"}.mdi-keyboard-return::before{content:"\F311"}.mdi-keyboard-settings::before{content:"\F9F8"}.mdi-keyboard-settings-outline::before{content:"\F9F9"}.mdi-keyboard-space::before{content:"\F0072"}.mdi-keyboard-tab::before{content:"\F312"}.mdi-keyboard-variant::before{content:"\F313"}.mdi-kickstarter::before{content:"\F744"}.mdi-knife::before{content:"\F9FA"}.mdi-knife-military::before{content:"\F9FB"}.mdi-kodi::before{content:"\F314"}.mdi-label::before{content:"\F315"}.mdi-label-off::before{content:"\FACA"}.mdi-label-off-outline::before{content:"\FACB"}.mdi-label-outline::before{content:"\F316"}.mdi-label-variant::before{content:"\FACC"}.mdi-label-variant-outline::before{content:"\FACD"}.mdi-ladybug::before{content:"\F82C"}.mdi-lambda::before{content:"\F627"}.mdi-lamp::before{content:"\F6B4"}.mdi-lan::before{content:"\F317"}.mdi-lan-connect::before{content:"\F318"}.mdi-lan-disconnect::before{content:"\F319"}.mdi-lan-pending::before{content:"\F31A"}.mdi-language-c::before{content:"\F671"}.mdi-language-cpp::before{content:"\F672"}.mdi-language-csharp::before{content:"\F31B"}.mdi-language-css3::before{content:"\F31C"}.mdi-language-go::before{content:"\F7D2"}.mdi-language-haskell::before{content:"\FC6E"}.mdi-language-html5::before{content:"\F31D"}.mdi-language-java::before{content:"\FB1C"}.mdi-language-javascript::before{content:"\F31E"}.mdi-language-lua::before{content:"\F8B0"}.mdi-language-php::before{content:"\F31F"}.mdi-language-python::before{content:"\F320"}.mdi-language-python-text::before{content:"\F321"}.mdi-language-r::before{content:"\F7D3"}.mdi-language-ruby-on-rails::before{content:"\FACE"}.mdi-language-swift::before{content:"\F6E4"}.mdi-language-typescript::before{content:"\F6E5"}.mdi-laptop::before{content:"\F322"}.mdi-laptop-chromebook::before{content:"\F323"}.mdi-laptop-mac::before{content:"\F324"}.mdi-laptop-off::before{content:"\F6E6"}.mdi-laptop-windows::before{content:"\F325"}.mdi-laravel::before{content:"\FACF"}.mdi-lasso::before{content:"\FF20"}.mdi-lastfm::before{content:"\F326"}.mdi-lastpass::before{content:"\F446"}.mdi-latitude::before{content:"\FF74"}.mdi-launch::before{content:"\F327"}.mdi-lava-lamp::before{content:"\F7D4"}.mdi-layers::before{content:"\F328"}.mdi-layers-minus::before{content:"\FE8D"}.mdi-layers-off::before{content:"\F329"}.mdi-layers-off-outline::before{content:"\F9FC"}.mdi-layers-outline::before{content:"\F9FD"}.mdi-layers-plus::before{content:"\FE30"}.mdi-layers-remove::before{content:"\FE31"}.mdi-layers-triple::before{content:"\FF75"}.mdi-layers-triple-outline::before{content:"\FF76"}.mdi-lead-pencil::before{content:"\F64F"}.mdi-leaf::before{content:"\F32A"}.mdi-leaf-maple::before{content:"\FC6F"}.mdi-leak::before{content:"\FDB3"}.mdi-leak-off::before{content:"\FDB4"}.mdi-led-off::before{content:"\F32B"}.mdi-led-on::before{content:"\F32C"}.mdi-led-outline::before{content:"\F32D"}.mdi-led-strip::before{content:"\F7D5"}.mdi-led-strip-variant::before{content:"\F0073"}.mdi-led-variant-off::before{content:"\F32E"}.mdi-led-variant-on::before{content:"\F32F"}.mdi-led-variant-outline::before{content:"\F330"}.mdi-less-than::before{content:"\F97B"}.mdi-less-than-or-equal::before{content:"\F97C"}.mdi-library::before{content:"\F331"}.mdi-library-books::before{content:"\F332"}.mdi-library-movie::before{content:"\FCF4"}.mdi-library-music::before{content:"\F333"}.mdi-library-music-outline::before{content:"\FF21"}.mdi-library-shelves::before{content:"\FB85"}.mdi-library-video::before{content:"\FCF5"}.mdi-license::before{content:"\FFE3"}.mdi-lifebuoy::before{content:"\F87D"}.mdi-light-switch::before{content:"\F97D"}.mdi-lightbulb::before{content:"\F335"}.mdi-lightbulb-off::before{content:"\FE32"}.mdi-lightbulb-off-outline::before{content:"\FE33"}.mdi-lightbulb-on::before{content:"\F6E7"}.mdi-lightbulb-on-outline::before{content:"\F6E8"}.mdi-lightbulb-outline::before{content:"\F336"}.mdi-lighthouse::before{content:"\F9FE"}.mdi-lighthouse-on::before{content:"\F9FF"}.mdi-link::before{content:"\F337"}.mdi-link-box::before{content:"\FCF6"}.mdi-link-box-outline::before{content:"\FCF7"}.mdi-link-box-variant::before{content:"\FCF8"}.mdi-link-box-variant-outline::before{content:"\FCF9"}.mdi-link-off::before{content:"\F338"}.mdi-link-plus::before{content:"\FC70"}.mdi-link-variant::before{content:"\F339"}.mdi-link-variant-off::before{content:"\F33A"}.mdi-linkedin::before{content:"\F33B"}.mdi-linkedin-box::before{content:"\F33C"}.mdi-linux::before{content:"\F33D"}.mdi-linux-mint::before{content:"\F8EC"}.mdi-litecoin::before{content:"\FA60"}.mdi-loading::before{content:"\F771"}.mdi-location-enter::before{content:"\FFE4"}.mdi-location-exit::before{content:"\FFE5"}.mdi-lock::before{content:"\F33E"}.mdi-lock-alert::before{content:"\F8ED"}.mdi-lock-clock::before{content:"\F97E"}.mdi-lock-open::before{content:"\F33F"}.mdi-lock-open-outline::before{content:"\F340"}.mdi-lock-open-variant::before{content:"\FFE6"}.mdi-lock-open-variant-outline::before{content:"\FFE7"}.mdi-lock-outline::before{content:"\F341"}.mdi-lock-pattern::before{content:"\F6E9"}.mdi-lock-plus::before{content:"\F5FB"}.mdi-lock-question::before{content:"\F8EE"}.mdi-lock-reset::before{content:"\F772"}.mdi-lock-smart::before{content:"\F8B1"}.mdi-locker::before{content:"\F7D6"}.mdi-locker-multiple::before{content:"\F7D7"}.mdi-login::before{content:"\F342"}.mdi-login-variant::before{content:"\F5FC"}.mdi-logout::before{content:"\F343"}.mdi-logout-variant::before{content:"\F5FD"}.mdi-longitude::before{content:"\FF77"}.mdi-looks::before{content:"\F344"}.mdi-loupe::before{content:"\F345"}.mdi-lumx::before{content:"\F346"}.mdi-lyft::before{content:"\FB1D"}.mdi-magnet::before{content:"\F347"}.mdi-magnet-on::before{content:"\F348"}.mdi-magnify::before{content:"\F349"}.mdi-magnify-close::before{content:"\F97F"}.mdi-magnify-minus::before{content:"\F34A"}.mdi-magnify-minus-cursor::before{content:"\FA61"}.mdi-magnify-minus-outline::before{content:"\F6EB"}.mdi-magnify-plus::before{content:"\F34B"}.mdi-magnify-plus-cursor::before{content:"\FA62"}.mdi-magnify-plus-outline::before{content:"\F6EC"}.mdi-mail::before{content:"\FED8"}.mdi-mail-ru::before{content:"\F34C"}.mdi-mailbox::before{content:"\F6ED"}.mdi-mailbox-open::before{content:"\FD64"}.mdi-mailbox-open-outline::before{content:"\FD65"}.mdi-mailbox-open-up::before{content:"\FD66"}.mdi-mailbox-open-up-outline::before{content:"\FD67"}.mdi-mailbox-outline::before{content:"\FD68"}.mdi-mailbox-up::before{content:"\FD69"}.mdi-mailbox-up-outline::before{content:"\FD6A"}.mdi-map::before{content:"\F34D"}.mdi-map-check::before{content:"\FED9"}.mdi-map-check-outline::before{content:"\FEDA"}.mdi-map-clock::before{content:"\FCFA"}.mdi-map-clock-outline::before{content:"\FCFB"}.mdi-map-legend::before{content:"\FA00"}.mdi-map-marker::before{content:"\F34E"}.mdi-map-marker-alert::before{content:"\FF22"}.mdi-map-marker-alert-outline::before{content:"\FF23"}.mdi-map-marker-check::before{content:"\FC71"}.mdi-map-marker-circle::before{content:"\F34F"}.mdi-map-marker-distance::before{content:"\F8EF"}.mdi-map-marker-minus::before{content:"\F650"}.mdi-map-marker-multiple::before{content:"\F350"}.mdi-map-marker-off::before{content:"\F351"}.mdi-map-marker-outline::before{content:"\F7D8"}.mdi-map-marker-path::before{content:"\FCFC"}.mdi-map-marker-plus::before{content:"\F651"}.mdi-map-marker-question::before{content:"\FF24"}.mdi-map-marker-question-outline::before{content:"\FF25"}.mdi-map-marker-radius::before{content:"\F352"}.mdi-map-marker-remove::before{content:"\FF26"}.mdi-map-marker-remove-variant::before{content:"\FF27"}.mdi-map-minus::before{content:"\F980"}.mdi-map-outline::before{content:"\F981"}.mdi-map-plus::before{content:"\F982"}.mdi-map-search::before{content:"\F983"}.mdi-map-search-outline::before{content:"\F984"}.mdi-mapbox::before{content:"\FB86"}.mdi-margin::before{content:"\F353"}.mdi-markdown::before{content:"\F354"}.mdi-markdown-outline::before{content:"\FF78"}.mdi-marker::before{content:"\F652"}.mdi-marker-cancel::before{content:"\FDB5"}.mdi-marker-check::before{content:"\F355"}.mdi-mastodon::before{content:"\FAD0"}.mdi-mastodon-variant::before{content:"\FAD1"}.mdi-material-design::before{content:"\F985"}.mdi-material-ui::before{content:"\F357"}.mdi-math-compass::before{content:"\F358"}.mdi-math-cos::before{content:"\FC72"}.mdi-math-integral::before{content:"\FFE8"}.mdi-math-integral-box::before{content:"\FFE9"}.mdi-math-norm::before{content:"\FFEA"}.mdi-math-norm-box::before{content:"\FFEB"}.mdi-math-sin::before{content:"\FC73"}.mdi-math-tan::before{content:"\FC74"}.mdi-matrix::before{content:"\F628"}.mdi-maxcdn::before{content:"\F359"}.mdi-medal::before{content:"\F986"}.mdi-medical-bag::before{content:"\F6EE"}.mdi-medium::before{content:"\F35A"}.mdi-meetup::before{content:"\FAD2"}.mdi-memory::before{content:"\F35B"}.mdi-menu::before{content:"\F35C"}.mdi-menu-down::before{content:"\F35D"}.mdi-menu-down-outline::before{content:"\F6B5"}.mdi-menu-left::before{content:"\F35E"}.mdi-menu-left-outline::before{content:"\FA01"}.mdi-menu-open::before{content:"\FB87"}.mdi-menu-right::before{content:"\F35F"}.mdi-menu-right-outline::before{content:"\FA02"}.mdi-menu-swap::before{content:"\FA63"}.mdi-menu-swap-outline::before{content:"\FA64"}.mdi-menu-up::before{content:"\F360"}.mdi-menu-up-outline::before{content:"\F6B6"}.mdi-merge::before{content:"\FF79"}.mdi-message::before{content:"\F361"}.mdi-message-alert::before{content:"\F362"}.mdi-message-alert-outline::before{content:"\FA03"}.mdi-message-bulleted::before{content:"\F6A1"}.mdi-message-bulleted-off::before{content:"\F6A2"}.mdi-message-draw::before{content:"\F363"}.mdi-message-image::before{content:"\F364"}.mdi-message-lock::before{content:"\FFEC"}.mdi-message-outline::before{content:"\F365"}.mdi-message-plus::before{content:"\F653"}.mdi-message-processing::before{content:"\F366"}.mdi-message-reply::before{content:"\F367"}.mdi-message-reply-text::before{content:"\F368"}.mdi-message-settings::before{content:"\F6EF"}.mdi-message-settings-variant::before{content:"\F6F0"}.mdi-message-text::before{content:"\F369"}.mdi-message-text-lock::before{content:"\FFED"}.mdi-message-text-outline::before{content:"\F36A"}.mdi-message-video::before{content:"\F36B"}.mdi-meteor::before{content:"\F629"}.mdi-metronome::before{content:"\F7D9"}.mdi-metronome-tick::before{content:"\F7DA"}.mdi-micro-sd::before{content:"\F7DB"}.mdi-microphone::before{content:"\F36C"}.mdi-microphone-minus::before{content:"\F8B2"}.mdi-microphone-off::before{content:"\F36D"}.mdi-microphone-outline::before{content:"\F36E"}.mdi-microphone-plus::before{content:"\F8B3"}.mdi-microphone-settings::before{content:"\F36F"}.mdi-microphone-variant::before{content:"\F370"}.mdi-microphone-variant-off::before{content:"\F371"}.mdi-microscope::before{content:"\F654"}.mdi-microsoft::before{content:"\F372"}.mdi-microsoft-dynamics::before{content:"\F987"}.mdi-microwave::before{content:"\FC75"}.mdi-middleware::before{content:"\FF7A"}.mdi-middleware-outline::before{content:"\FF7B"}.mdi-midi::before{content:"\F8F0"}.mdi-midi-port::before{content:"\F8F1"}.mdi-mine::before{content:"\FDB6"}.mdi-minecraft::before{content:"\F373"}.mdi-mini-sd::before{content:"\FA04"}.mdi-minidisc::before{content:"\FA05"}.mdi-minus::before{content:"\F374"}.mdi-minus-box::before{content:"\F375"}.mdi-minus-box-outline::before{content:"\F6F1"}.mdi-minus-circle::before{content:"\F376"}.mdi-minus-circle-outline::before{content:"\F377"}.mdi-minus-network::before{content:"\F378"}.mdi-minus-network-outline::before{content:"\FC76"}.mdi-mixcloud::before{content:"\F62A"}.mdi-mixed-martial-arts::before{content:"\FD6B"}.mdi-mixed-reality::before{content:"\F87E"}.mdi-mixer::before{content:"\F7DC"}.mdi-molecule::before{content:"\FB88"}.mdi-monitor::before{content:"\F379"}.mdi-monitor-cellphone::before{content:"\F988"}.mdi-monitor-cellphone-star::before{content:"\F989"}.mdi-monitor-dashboard::before{content:"\FA06"}.mdi-monitor-lock::before{content:"\FDB7"}.mdi-monitor-multiple::before{content:"\F37A"}.mdi-monitor-off::before{content:"\FD6C"}.mdi-monitor-screenshot::before{content:"\FE34"}.mdi-monitor-speaker::before{content:"\FF7C"}.mdi-monitor-speaker-off::before{content:"\FF7D"}.mdi-monitor-star::before{content:"\FDB8"}.mdi-moon-first-quarter::before{content:"\FF7E"}.mdi-moon-full::before{content:"\FF7F"}.mdi-moon-last-quarter::before{content:"\FF80"}.mdi-moon-new::before{content:"\FF81"}.mdi-moon-waning-crescent::before{content:"\FF82"}.mdi-moon-waning-gibbous::before{content:"\FF83"}.mdi-moon-waxing-crescent::before{content:"\FF84"}.mdi-moon-waxing-gibbous::before{content:"\FF85"}.mdi-more::before{content:"\F37B"}.mdi-mother-nurse::before{content:"\FCFD"}.mdi-motion-sensor::before{content:"\FD6D"}.mdi-motorbike::before{content:"\F37C"}.mdi-mouse::before{content:"\F37D"}.mdi-mouse-bluetooth::before{content:"\F98A"}.mdi-mouse-off::before{content:"\F37E"}.mdi-mouse-variant::before{content:"\F37F"}.mdi-mouse-variant-off::before{content:"\F380"}.mdi-move-resize::before{content:"\F655"}.mdi-move-resize-variant::before{content:"\F656"}.mdi-movie::before{content:"\F381"}.mdi-movie-open::before{content:"\FFEE"}.mdi-movie-open-outline::before{content:"\FFEF"}.mdi-movie-outline::before{content:"\FDB9"}.mdi-movie-roll::before{content:"\F7DD"}.mdi-muffin::before{content:"\F98B"}.mdi-multiplication::before{content:"\F382"}.mdi-multiplication-box::before{content:"\F383"}.mdi-mushroom::before{content:"\F7DE"}.mdi-mushroom-outline::before{content:"\F7DF"}.mdi-music::before{content:"\F759"}.mdi-music-accidental-double-flat::before{content:"\FF86"}.mdi-music-accidental-double-sharp::before{content:"\FF87"}.mdi-music-accidental-flat::before{content:"\FF88"}.mdi-music-accidental-natural::before{content:"\FF89"}.mdi-music-accidental-sharp::before{content:"\FF8A"}.mdi-music-box::before{content:"\F384"}.mdi-music-box-outline::before{content:"\F385"}.mdi-music-circle::before{content:"\F386"}.mdi-music-circle-outline::before{content:"\FAD3"}.mdi-music-clef-alto::before{content:"\FF8B"}.mdi-music-clef-bass::before{content:"\FF8C"}.mdi-music-clef-treble::before{content:"\FF8D"}.mdi-music-note::before{content:"\F387"}.mdi-music-note-bluetooth::before{content:"\F5FE"}.mdi-music-note-bluetooth-off::before{content:"\F5FF"}.mdi-music-note-eighth::before{content:"\F388"}.mdi-music-note-eighth-dotted::before{content:"\FF8E"}.mdi-music-note-half::before{content:"\F389"}.mdi-music-note-half-dotted::before{content:"\FF8F"}.mdi-music-note-off::before{content:"\F38A"}.mdi-music-note-off-outline::before{content:"\FF90"}.mdi-music-note-outline::before{content:"\FF91"}.mdi-music-note-plus::before{content:"\FDBA"}.mdi-music-note-quarter::before{content:"\F38B"}.mdi-music-note-quarter-dotted::before{content:"\FF92"}.mdi-music-note-sixteenth::before{content:"\F38C"}.mdi-music-note-sixteenth-dotted::before{content:"\FF93"}.mdi-music-note-whole::before{content:"\F38D"}.mdi-music-note-whole-dotted::before{content:"\FF94"}.mdi-music-off::before{content:"\F75A"}.mdi-music-rest-eighth::before{content:"\FF95"}.mdi-music-rest-half::before{content:"\FF96"}.mdi-music-rest-quarter::before{content:"\FF97"}.mdi-music-rest-sixteenth::before{content:"\FF98"}.mdi-music-rest-whole::before{content:"\FF99"}.mdi-nail::before{content:"\FDBB"}.mdi-nas::before{content:"\F8F2"}.mdi-nativescript::before{content:"\F87F"}.mdi-nature::before{content:"\F38E"}.mdi-nature-people::before{content:"\F38F"}.mdi-navigation::before{content:"\F390"}.mdi-near-me::before{content:"\F5CD"}.mdi-necklace::before{content:"\FF28"}.mdi-needle::before{content:"\F391"}.mdi-netflix::before{content:"\F745"}.mdi-network::before{content:"\F6F2"}.mdi-network-off::before{content:"\FC77"}.mdi-network-off-outline::before{content:"\FC78"}.mdi-network-outline::before{content:"\FC79"}.mdi-network-strength-1::before{content:"\F8F3"}.mdi-network-strength-1-alert::before{content:"\F8F4"}.mdi-network-strength-2::before{content:"\F8F5"}.mdi-network-strength-2-alert::before{content:"\F8F6"}.mdi-network-strength-3::before{content:"\F8F7"}.mdi-network-strength-3-alert::before{content:"\F8F8"}.mdi-network-strength-4::before{content:"\F8F9"}.mdi-network-strength-4-alert::before{content:"\F8FA"}.mdi-network-strength-off::before{content:"\F8FB"}.mdi-network-strength-off-outline::before{content:"\F8FC"}.mdi-network-strength-outline::before{content:"\F8FD"}.mdi-new-box::before{content:"\F394"}.mdi-newspaper::before{content:"\F395"}.mdi-newspaper-minus::before{content:"\FF29"}.mdi-newspaper-plus::before{content:"\FF2A"}.mdi-newspaper-variant::before{content:"\F0023"}.mdi-newspaper-variant-multiple::before{content:"\F0024"}.mdi-newspaper-variant-multiple-outline::before{content:"\F0025"}.mdi-newspaper-variant-outline::before{content:"\F0026"}.mdi-nfc::before{content:"\F396"}.mdi-nfc-off::before{content:"\FE35"}.mdi-nfc-search-variant::before{content:"\FE36"}.mdi-nfc-tap::before{content:"\F397"}.mdi-nfc-variant::before{content:"\F398"}.mdi-nfc-variant-off::before{content:"\FE37"}.mdi-ninja::before{content:"\F773"}.mdi-nintendo-switch::before{content:"\F7E0"}.mdi-nodejs::before{content:"\F399"}.mdi-not-equal::before{content:"\F98C"}.mdi-not-equal-variant::before{content:"\F98D"}.mdi-note::before{content:"\F39A"}.mdi-note-multiple::before{content:"\F6B7"}.mdi-note-multiple-outline::before{content:"\F6B8"}.mdi-note-outline::before{content:"\F39B"}.mdi-note-plus::before{content:"\F39C"}.mdi-note-plus-outline::before{content:"\F39D"}.mdi-note-text::before{content:"\F39E"}.mdi-notebook::before{content:"\F82D"}.mdi-notebook-multiple::before{content:"\FE38"}.mdi-notebook-outline::before{content:"\FEDC"}.mdi-notification-clear-all::before{content:"\F39F"}.mdi-npm::before{content:"\F6F6"}.mdi-npm-variant::before{content:"\F98E"}.mdi-npm-variant-outline::before{content:"\F98F"}.mdi-nuke::before{content:"\F6A3"}.mdi-null::before{content:"\F7E1"}.mdi-numeric::before{content:"\F3A0"}.mdi-numeric-0::before{content:"\30"}.mdi-numeric-0-box::before{content:"\F3A1"}.mdi-numeric-0-box-multiple::before{content:"\FF2B"}.mdi-numeric-0-box-multiple-outline::before{content:"\F3A2"}.mdi-numeric-0-box-outline::before{content:"\F3A3"}.mdi-numeric-0-circle::before{content:"\FC7A"}.mdi-numeric-0-circle-outline::before{content:"\FC7B"}.mdi-numeric-1::before{content:"\31"}.mdi-numeric-1-box::before{content:"\F3A4"}.mdi-numeric-1-box-multiple::before{content:"\FF2C"}.mdi-numeric-1-box-multiple-outline::before{content:"\F3A5"}.mdi-numeric-1-box-outline::before{content:"\F3A6"}.mdi-numeric-1-circle::before{content:"\FC7C"}.mdi-numeric-1-circle-outline::before{content:"\FC7D"}.mdi-numeric-10::before{content:"\F000A"}.mdi-numeric-10-box::before{content:"\FF9A"}.mdi-numeric-10-box-multiple::before{content:"\F000B"}.mdi-numeric-10-box-multiple-outline::before{content:"\F000C"}.mdi-numeric-10-box-outline::before{content:"\FF9B"}.mdi-numeric-10-circle::before{content:"\F000D"}.mdi-numeric-10-circle-outline::before{content:"\F000E"}.mdi-numeric-2::before{content:"\32"}.mdi-numeric-2-box::before{content:"\F3A7"}.mdi-numeric-2-box-multiple::before{content:"\FF2D"}.mdi-numeric-2-box-multiple-outline::before{content:"\F3A8"}.mdi-numeric-2-box-outline::before{content:"\F3A9"}.mdi-numeric-2-circle::before{content:"\FC7E"}.mdi-numeric-2-circle-outline::before{content:"\FC7F"}.mdi-numeric-3::before{content:"\33"}.mdi-numeric-3-box::before{content:"\F3AA"}.mdi-numeric-3-box-multiple::before{content:"\FF2E"}.mdi-numeric-3-box-multiple-outline::before{content:"\F3AB"}.mdi-numeric-3-box-outline::before{content:"\F3AC"}.mdi-numeric-3-circle::before{content:"\FC80"}.mdi-numeric-3-circle-outline::before{content:"\FC81"}.mdi-numeric-4::before{content:"\34"}.mdi-numeric-4-box::before{content:"\F3AD"}.mdi-numeric-4-box-multiple::before{content:"\FF2F"}.mdi-numeric-4-box-multiple-outline::before{content:"\F3AE"}.mdi-numeric-4-box-outline::before{content:"\F3AF"}.mdi-numeric-4-circle::before{content:"\FC82"}.mdi-numeric-4-circle-outline::before{content:"\FC83"}.mdi-numeric-5::before{content:"\35"}.mdi-numeric-5-box::before{content:"\F3B0"}.mdi-numeric-5-box-multiple::before{content:"\FF30"}.mdi-numeric-5-box-multiple-outline::before{content:"\F3B1"}.mdi-numeric-5-box-outline::before{content:"\F3B2"}.mdi-numeric-5-circle::before{content:"\FC84"}.mdi-numeric-5-circle-outline::before{content:"\FC85"}.mdi-numeric-6::before{content:"\36"}.mdi-numeric-6-box::before{content:"\F3B3"}.mdi-numeric-6-box-multiple::before{content:"\FF31"}.mdi-numeric-6-box-multiple-outline::before{content:"\F3B4"}.mdi-numeric-6-box-outline::before{content:"\F3B5"}.mdi-numeric-6-circle::before{content:"\FC86"}.mdi-numeric-6-circle-outline::before{content:"\FC87"}.mdi-numeric-7::before{content:"\37"}.mdi-numeric-7-box::before{content:"\F3B6"}.mdi-numeric-7-box-multiple::before{content:"\FF32"}.mdi-numeric-7-box-multiple-outline::before{content:"\F3B7"}.mdi-numeric-7-box-outline::before{content:"\F3B8"}.mdi-numeric-7-circle::before{content:"\FC88"}.mdi-numeric-7-circle-outline::before{content:"\FC89"}.mdi-numeric-8::before{content:"\38"}.mdi-numeric-8-box::before{content:"\F3B9"}.mdi-numeric-8-box-multiple::before{content:"\FF33"}.mdi-numeric-8-box-multiple-outline::before{content:"\F3BA"}.mdi-numeric-8-box-outline::before{content:"\F3BB"}.mdi-numeric-8-circle::before{content:"\FC8A"}.mdi-numeric-8-circle-outline::before{content:"\FC8B"}.mdi-numeric-9::before{content:"\39"}.mdi-numeric-9-box::before{content:"\F3BC"}.mdi-numeric-9-box-multiple::before{content:"\FF34"}.mdi-numeric-9-box-multiple-outline::before{content:"\F3BD"}.mdi-numeric-9-box-outline::before{content:"\F3BE"}.mdi-numeric-9-circle::before{content:"\FC8C"}.mdi-numeric-9-circle-outline::before{content:"\FC8D"}.mdi-numeric-9-plus::before{content:"\F000F"}.mdi-numeric-9-plus-box::before{content:"\F3BF"}.mdi-numeric-9-plus-box-multiple::before{content:"\FF35"}.mdi-numeric-9-plus-box-multiple-outline::before{content:"\F3C0"}.mdi-numeric-9-plus-box-outline::before{content:"\F3C1"}.mdi-numeric-9-plus-circle::before{content:"\FC8E"}.mdi-numeric-9-plus-circle-outline::before{content:"\FC8F"}.mdi-numeric-negative-1::before{content:"\F0074"}.mdi-nut::before{content:"\F6F7"}.mdi-nutrition::before{content:"\F3C2"}.mdi-oar::before{content:"\F67B"}.mdi-ocarina::before{content:"\FDBC"}.mdi-octagon::before{content:"\F3C3"}.mdi-octagon-outline::before{content:"\F3C4"}.mdi-octagram::before{content:"\F6F8"}.mdi-octagram-outline::before{content:"\F774"}.mdi-odnoklassniki::before{content:"\F3C5"}.mdi-office::before{content:"\F3C6"}.mdi-office-building::before{content:"\F990"}.mdi-oil::before{content:"\F3C7"}.mdi-oil-lamp::before{content:"\FF36"}.mdi-oil-level::before{content:"\F0075"}.mdi-oil-temperature::before{content:"\F0019"}.mdi-omega::before{content:"\F3C9"}.mdi-one-up::before{content:"\FB89"}.mdi-onedrive::before{content:"\F3CA"}.mdi-onenote::before{content:"\F746"}.mdi-onepassword::before{content:"\F880"}.mdi-opacity::before{content:"\F5CC"}.mdi-open-in-app::before{content:"\F3CB"}.mdi-open-in-new::before{content:"\F3CC"}.mdi-open-source-initiative::before{content:"\FB8A"}.mdi-openid::before{content:"\F3CD"}.mdi-opera::before{content:"\F3CE"}.mdi-orbit::before{content:"\F018"}.mdi-origin::before{content:"\FB2B"}.mdi-ornament::before{content:"\F3CF"}.mdi-ornament-variant::before{content:"\F3D0"}.mdi-outdoor-lamp::before{content:"\F0076"}.mdi-outlook::before{content:"\FCFE"}.mdi-overscan::before{content:"\F0027"}.mdi-owl::before{content:"\F3D2"}.mdi-pac-man::before{content:"\FB8B"}.mdi-package::before{content:"\F3D3"}.mdi-package-down::before{content:"\F3D4"}.mdi-package-up::before{content:"\F3D5"}.mdi-package-variant::before{content:"\F3D6"}.mdi-package-variant-closed::before{content:"\F3D7"}.mdi-page-first::before{content:"\F600"}.mdi-page-last::before{content:"\F601"}.mdi-page-layout-body::before{content:"\F6F9"}.mdi-page-layout-footer::before{content:"\F6FA"}.mdi-page-layout-header::before{content:"\F6FB"}.mdi-page-layout-header-footer::before{content:"\FF9C"}.mdi-page-layout-sidebar-left::before{content:"\F6FC"}.mdi-page-layout-sidebar-right::before{content:"\F6FD"}.mdi-page-next::before{content:"\FB8C"}.mdi-page-next-outline::before{content:"\FB8D"}.mdi-page-previous::before{content:"\FB8E"}.mdi-page-previous-outline::before{content:"\FB8F"}.mdi-palette::before{content:"\F3D8"}.mdi-palette-advanced::before{content:"\F3D9"}.mdi-palette-outline::before{content:"\FE6C"}.mdi-palette-swatch::before{content:"\F8B4"}.mdi-palm-tree::before{content:"\F0077"}.mdi-pan::before{content:"\FB90"}.mdi-pan-bottom-left::before{content:"\FB91"}.mdi-pan-bottom-right::before{content:"\FB92"}.mdi-pan-down::before{content:"\FB93"}.mdi-pan-horizontal::before{content:"\FB94"}.mdi-pan-left::before{content:"\FB95"}.mdi-pan-right::before{content:"\FB96"}.mdi-pan-top-left::before{content:"\FB97"}.mdi-pan-top-right::before{content:"\FB98"}.mdi-pan-up::before{content:"\FB99"}.mdi-pan-vertical::before{content:"\FB9A"}.mdi-panda::before{content:"\F3DA"}.mdi-pandora::before{content:"\F3DB"}.mdi-panorama::before{content:"\F3DC"}.mdi-panorama-fisheye::before{content:"\F3DD"}.mdi-panorama-horizontal::before{content:"\F3DE"}.mdi-panorama-vertical::before{content:"\F3DF"}.mdi-panorama-wide-angle::before{content:"\F3E0"}.mdi-paper-cut-vertical::before{content:"\F3E1"}.mdi-paperclip::before{content:"\F3E2"}.mdi-parachute::before{content:"\FC90"}.mdi-parachute-outline::before{content:"\FC91"}.mdi-parking::before{content:"\F3E3"}.mdi-party-popper::before{content:"\F0078"}.mdi-passport::before{content:"\F7E2"}.mdi-passport-biometric::before{content:"\FDBD"}.mdi-patio-heater::before{content:"\FF9D"}.mdi-patreon::before{content:"\F881"}.mdi-pause::before{content:"\F3E4"}.mdi-pause-circle::before{content:"\F3E5"}.mdi-pause-circle-outline::before{content:"\F3E6"}.mdi-pause-octagon::before{content:"\F3E7"}.mdi-pause-octagon-outline::before{content:"\F3E8"}.mdi-paw::before{content:"\F3E9"}.mdi-paw-off::before{content:"\F657"}.mdi-paypal::before{content:"\F882"}.mdi-pdf-box::before{content:"\FE39"}.mdi-peace::before{content:"\F883"}.mdi-peanut::before{content:"\F001E"}.mdi-peanut-off::before{content:"\F001F"}.mdi-peanut-off-outline::before{content:"\F0021"}.mdi-peanut-outline::before{content:"\F0020"}.mdi-pen::before{content:"\F3EA"}.mdi-pen-lock::before{content:"\FDBE"}.mdi-pen-minus::before{content:"\FDBF"}.mdi-pen-off::before{content:"\FDC0"}.mdi-pen-plus::before{content:"\FDC1"}.mdi-pen-remove::before{content:"\FDC2"}.mdi-pencil::before{content:"\F3EB"}.mdi-pencil-box::before{content:"\F3EC"}.mdi-pencil-box-outline::before{content:"\F3ED"}.mdi-pencil-circle::before{content:"\F6FE"}.mdi-pencil-circle-outline::before{content:"\F775"}.mdi-pencil-lock::before{content:"\F3EE"}.mdi-pencil-lock-outline::before{content:"\FDC3"}.mdi-pencil-minus::before{content:"\FDC4"}.mdi-pencil-minus-outline::before{content:"\FDC5"}.mdi-pencil-off::before{content:"\F3EF"}.mdi-pencil-off-outline::before{content:"\FDC6"}.mdi-pencil-outline::before{content:"\FC92"}.mdi-pencil-plus::before{content:"\FDC7"}.mdi-pencil-plus-outline::before{content:"\FDC8"}.mdi-pencil-remove::before{content:"\FDC9"}.mdi-pencil-remove-outline::before{content:"\FDCA"}.mdi-penguin::before{content:"\FEDD"}.mdi-pentagon::before{content:"\F6FF"}.mdi-pentagon-outline::before{content:"\F700"}.mdi-percent::before{content:"\F3F0"}.mdi-periodic-table::before{content:"\F8B5"}.mdi-periodic-table-co2::before{content:"\F7E3"}.mdi-periscope::before{content:"\F747"}.mdi-perspective-less::before{content:"\FCFF"}.mdi-perspective-more::before{content:"\FD00"}.mdi-pharmacy::before{content:"\F3F1"}.mdi-phone::before{content:"\F3F2"}.mdi-phone-alert::before{content:"\FF37"}.mdi-phone-bluetooth::before{content:"\F3F3"}.mdi-phone-classic::before{content:"\F602"}.mdi-phone-forward::before{content:"\F3F4"}.mdi-phone-hangup::before{content:"\F3F5"}.mdi-phone-in-talk::before{content:"\F3F6"}.mdi-phone-incoming::before{content:"\F3F7"}.mdi-phone-lock::before{content:"\F3F8"}.mdi-phone-log::before{content:"\F3F9"}.mdi-phone-minus::before{content:"\F658"}.mdi-phone-missed::before{content:"\F3FA"}.mdi-phone-off::before{content:"\FDCB"}.mdi-phone-outgoing::before{content:"\F3FB"}.mdi-phone-outline::before{content:"\FDCC"}.mdi-phone-paused::before{content:"\F3FC"}.mdi-phone-plus::before{content:"\F659"}.mdi-phone-return::before{content:"\F82E"}.mdi-phone-rotate-landscape::before{content:"\F884"}.mdi-phone-rotate-portrait::before{content:"\F885"}.mdi-phone-settings::before{content:"\F3FD"}.mdi-phone-voip::before{content:"\F3FE"}.mdi-pi::before{content:"\F3FF"}.mdi-pi-box::before{content:"\F400"}.mdi-pi-hole::before{content:"\FDCD"}.mdi-piano::before{content:"\F67C"}.mdi-pickaxe::before{content:"\F8B6"}.mdi-picture-in-picture-bottom-right::before{content:"\FE3A"}.mdi-picture-in-picture-bottom-right-outline::before{content:"\FE3B"}.mdi-picture-in-picture-top-right::before{content:"\FE3C"}.mdi-picture-in-picture-top-right-outline::before{content:"\FE3D"}.mdi-pier::before{content:"\F886"}.mdi-pier-crane::before{content:"\F887"}.mdi-pig::before{content:"\F401"}.mdi-pig-variant::before{content:"\F0028"}.mdi-piggy-bank::before{content:"\F0029"}.mdi-pill::before{content:"\F402"}.mdi-pillar::before{content:"\F701"}.mdi-pin::before{content:"\F403"}.mdi-pin-off::before{content:"\F404"}.mdi-pin-off-outline::before{content:"\F92F"}.mdi-pin-outline::before{content:"\F930"}.mdi-pine-tree::before{content:"\F405"}.mdi-pine-tree-box::before{content:"\F406"}.mdi-pinterest::before{content:"\F407"}.mdi-pinterest-box::before{content:"\F408"}.mdi-pinwheel::before{content:"\FAD4"}.mdi-pinwheel-outline::before{content:"\FAD5"}.mdi-pipe::before{content:"\F7E4"}.mdi-pipe-disconnected::before{content:"\F7E5"}.mdi-pipe-leak::before{content:"\F888"}.mdi-pirate::before{content:"\FA07"}.mdi-pistol::before{content:"\F702"}.mdi-piston::before{content:"\F889"}.mdi-pizza::before{content:"\F409"}.mdi-play::before{content:"\F40A"}.mdi-play-box-outline::before{content:"\F40B"}.mdi-play-circle::before{content:"\F40C"}.mdi-play-circle-outline::before{content:"\F40D"}.mdi-play-network::before{content:"\F88A"}.mdi-play-network-outline::before{content:"\FC93"}.mdi-play-outline::before{content:"\FF38"}.mdi-play-pause::before{content:"\F40E"}.mdi-play-protected-content::before{content:"\F40F"}.mdi-play-speed::before{content:"\F8FE"}.mdi-playlist-check::before{content:"\F5C7"}.mdi-playlist-edit::before{content:"\F8FF"}.mdi-playlist-minus::before{content:"\F410"}.mdi-playlist-music::before{content:"\FC94"}.mdi-playlist-music-outline::before{content:"\FC95"}.mdi-playlist-play::before{content:"\F411"}.mdi-playlist-plus::before{content:"\F412"}.mdi-playlist-remove::before{content:"\F413"}.mdi-playlist-star::before{content:"\FDCE"}.mdi-playstation::before{content:"\F414"}.mdi-plex::before{content:"\F6B9"}.mdi-plus::before{content:"\F415"}.mdi-plus-box::before{content:"\F416"}.mdi-plus-box-multiple::before{content:"\F334"}.mdi-plus-box-outline::before{content:"\F703"}.mdi-plus-circle::before{content:"\F417"}.mdi-plus-circle-multiple-outline::before{content:"\F418"}.mdi-plus-circle-outline::before{content:"\F419"}.mdi-plus-minus::before{content:"\F991"}.mdi-plus-minus-box::before{content:"\F992"}.mdi-plus-network::before{content:"\F41A"}.mdi-plus-network-outline::before{content:"\FC96"}.mdi-plus-one::before{content:"\F41B"}.mdi-plus-outline::before{content:"\F704"}.mdi-pocket::before{content:"\F41C"}.mdi-podcast::before{content:"\F993"}.mdi-podium::before{content:"\FD01"}.mdi-podium-bronze::before{content:"\FD02"}.mdi-podium-gold::before{content:"\FD03"}.mdi-podium-silver::before{content:"\FD04"}.mdi-point-of-sale::before{content:"\FD6E"}.mdi-pokeball::before{content:"\F41D"}.mdi-pokemon-go::before{content:"\FA08"}.mdi-poker-chip::before{content:"\F82F"}.mdi-polaroid::before{content:"\F41E"}.mdi-poll::before{content:"\F41F"}.mdi-poll-box::before{content:"\F420"}.mdi-polymer::before{content:"\F421"}.mdi-pool::before{content:"\F606"}.mdi-popcorn::before{content:"\F422"}.mdi-post::before{content:"\F002A"}.mdi-post-outline::before{content:"\F002B"}.mdi-postage-stamp::before{content:"\FC97"}.mdi-pot::before{content:"\F65A"}.mdi-pot-mix::before{content:"\F65B"}.mdi-pound::before{content:"\F423"}.mdi-pound-box::before{content:"\F424"}.mdi-power::before{content:"\F425"}.mdi-power-cycle::before{content:"\F900"}.mdi-power-off::before{content:"\F901"}.mdi-power-on::before{content:"\F902"}.mdi-power-plug::before{content:"\F6A4"}.mdi-power-plug-off::before{content:"\F6A5"}.mdi-power-settings::before{content:"\F426"}.mdi-power-sleep::before{content:"\F903"}.mdi-power-socket::before{content:"\F427"}.mdi-power-socket-au::before{content:"\F904"}.mdi-power-socket-eu::before{content:"\F7E6"}.mdi-power-socket-uk::before{content:"\F7E7"}.mdi-power-socket-us::before{content:"\F7E8"}.mdi-power-standby::before{content:"\F905"}.mdi-powershell::before{content:"\FA09"}.mdi-prescription::before{content:"\F705"}.mdi-presentation::before{content:"\F428"}.mdi-presentation-play::before{content:"\F429"}.mdi-printer::before{content:"\F42A"}.mdi-printer-3d::before{content:"\F42B"}.mdi-printer-3d-nozzle::before{content:"\FE3E"}.mdi-printer-3d-nozzle-outline::before{content:"\FE3F"}.mdi-printer-alert::before{content:"\F42C"}.mdi-printer-off::before{content:"\FE40"}.mdi-printer-pos::before{content:"\F0079"}.mdi-printer-settings::before{content:"\F706"}.mdi-printer-wireless::before{content:"\FA0A"}.mdi-priority-high::before{content:"\F603"}.mdi-priority-low::before{content:"\F604"}.mdi-professional-hexagon::before{content:"\F42D"}.mdi-progress-alert::before{content:"\FC98"}.mdi-progress-check::before{content:"\F994"}.mdi-progress-clock::before{content:"\F995"}.mdi-progress-download::before{content:"\F996"}.mdi-progress-upload::before{content:"\F997"}.mdi-progress-wrench::before{content:"\FC99"}.mdi-projector::before{content:"\F42E"}.mdi-projector-screen::before{content:"\F42F"}.mdi-protocol::before{content:"\FFF9"}.mdi-publish::before{content:"\F6A6"}.mdi-pulse::before{content:"\F430"}.mdi-pumpkin::before{content:"\FB9B"}.mdi-purse::before{content:"\FF39"}.mdi-purse-outline::before{content:"\FF3A"}.mdi-puzzle::before{content:"\F431"}.mdi-puzzle-outline::before{content:"\FA65"}.mdi-qi::before{content:"\F998"}.mdi-qqchat::before{content:"\F605"}.mdi-qrcode::before{content:"\F432"}.mdi-qrcode-edit::before{content:"\F8B7"}.mdi-qrcode-scan::before{content:"\F433"}.mdi-quadcopter::before{content:"\F434"}.mdi-quality-high::before{content:"\F435"}.mdi-quality-low::before{content:"\FA0B"}.mdi-quality-medium::before{content:"\FA0C"}.mdi-quicktime::before{content:"\F436"}.mdi-quora::before{content:"\FD05"}.mdi-rabbit::before{content:"\F906"}.mdi-racing-helmet::before{content:"\FD6F"}.mdi-racquetball::before{content:"\FD70"}.mdi-radar::before{content:"\F437"}.mdi-radiator::before{content:"\F438"}.mdi-radiator-disabled::before{content:"\FAD6"}.mdi-radiator-off::before{content:"\FAD7"}.mdi-radio::before{content:"\F439"}.mdi-radio-am::before{content:"\FC9A"}.mdi-radio-fm::before{content:"\FC9B"}.mdi-radio-handheld::before{content:"\F43A"}.mdi-radio-tower::before{content:"\F43B"}.mdi-radioactive::before{content:"\F43C"}.mdi-radioactive-off::before{content:"\FEDE"}.mdi-radiobox-blank::before{content:"\F43D"}.mdi-radiobox-marked::before{content:"\F43E"}.mdi-radius::before{content:"\FC9C"}.mdi-radius-outline::before{content:"\FC9D"}.mdi-railroad-light::before{content:"\FF3B"}.mdi-raspberry-pi::before{content:"\F43F"}.mdi-ray-end::before{content:"\F440"}.mdi-ray-end-arrow::before{content:"\F441"}.mdi-ray-start::before{content:"\F442"}.mdi-ray-start-arrow::before{content:"\F443"}.mdi-ray-start-end::before{content:"\F444"}.mdi-ray-vertex::before{content:"\F445"}.mdi-react::before{content:"\F707"}.mdi-read::before{content:"\F447"}.mdi-receipt::before{content:"\F449"}.mdi-record::before{content:"\F44A"}.mdi-record-circle::before{content:"\FEDF"}.mdi-record-circle-outline::before{content:"\FEE0"}.mdi-record-player::before{content:"\F999"}.mdi-record-rec::before{content:"\F44B"}.mdi-rectangle::before{content:"\FE41"}.mdi-rectangle-outline::before{content:"\FE42"}.mdi-recycle::before{content:"\F44C"}.mdi-reddit::before{content:"\F44D"}.mdi-redo::before{content:"\F44E"}.mdi-redo-variant::before{content:"\F44F"}.mdi-reflect-horizontal::before{content:"\FA0D"}.mdi-reflect-vertical::before{content:"\FA0E"}.mdi-refresh::before{content:"\F450"}.mdi-regex::before{content:"\F451"}.mdi-registered-trademark::before{content:"\FA66"}.mdi-relative-scale::before{content:"\F452"}.mdi-reload::before{content:"\F453"}.mdi-reminder::before{content:"\F88B"}.mdi-remote::before{content:"\F454"}.mdi-remote-desktop::before{content:"\F8B8"}.mdi-remote-off::before{content:"\FEE1"}.mdi-remote-tv::before{content:"\FEE2"}.mdi-remote-tv-off::before{content:"\FEE3"}.mdi-rename-box::before{content:"\F455"}.mdi-reorder-horizontal::before{content:"\F687"}.mdi-reorder-vertical::before{content:"\F688"}.mdi-repeat::before{content:"\F456"}.mdi-repeat-off::before{content:"\F457"}.mdi-repeat-once::before{content:"\F458"}.mdi-replay::before{content:"\F459"}.mdi-reply::before{content:"\F45A"}.mdi-reply-all::before{content:"\F45B"}.mdi-reply-all-outline::before{content:"\FF3C"}.mdi-reply-outline::before{content:"\FF3D"}.mdi-reproduction::before{content:"\F45C"}.mdi-resistor::before{content:"\FB1F"}.mdi-resistor-nodes::before{content:"\FB20"}.mdi-resize::before{content:"\FA67"}.mdi-resize-bottom-right::before{content:"\F45D"}.mdi-responsive::before{content:"\F45E"}.mdi-restart::before{content:"\F708"}.mdi-restart-off::before{content:"\FD71"}.mdi-restore::before{content:"\F99A"}.mdi-rewind::before{content:"\F45F"}.mdi-rewind-10::before{content:"\FD06"}.mdi-rewind-30::before{content:"\FD72"}.mdi-rewind-outline::before{content:"\F709"}.mdi-rhombus::before{content:"\F70A"}.mdi-rhombus-medium::before{content:"\FA0F"}.mdi-rhombus-outline::before{content:"\F70B"}.mdi-rhombus-split::before{content:"\FA10"}.mdi-ribbon::before{content:"\F460"}.mdi-rice::before{content:"\F7E9"}.mdi-ring::before{content:"\F7EA"}.mdi-rivet::before{content:"\FE43"}.mdi-road::before{content:"\F461"}.mdi-road-variant::before{content:"\F462"}.mdi-robber::before{content:"\F007A"}.mdi-robot::before{content:"\F6A8"}.mdi-robot-industrial::before{content:"\FB21"}.mdi-robot-vacuum::before{content:"\F70C"}.mdi-robot-vacuum-variant::before{content:"\F907"}.mdi-rocket::before{content:"\F463"}.mdi-roller-skate::before{content:"\FD07"}.mdi-rollerblade::before{content:"\FD08"}.mdi-rollupjs::before{content:"\FB9C"}.mdi-room-service::before{content:"\F88C"}.mdi-room-service-outline::before{content:"\FD73"}.mdi-rotate-3d::before{content:"\FEE4"}.mdi-rotate-3d-variant::before{content:"\F464"}.mdi-rotate-left::before{content:"\F465"}.mdi-rotate-left-variant::before{content:"\F466"}.mdi-rotate-orbit::before{content:"\FD74"}.mdi-rotate-right::before{content:"\F467"}.mdi-rotate-right-variant::before{content:"\F468"}.mdi-rounded-corner::before{content:"\F607"}.mdi-router-wireless::before{content:"\F469"}.mdi-router-wireless-settings::before{content:"\FA68"}.mdi-routes::before{content:"\F46A"}.mdi-routes-clock::before{content:"\F007B"}.mdi-rowing::before{content:"\F608"}.mdi-rss::before{content:"\F46B"}.mdi-rss-box::before{content:"\F46C"}.mdi-rss-off::before{content:"\FF3E"}.mdi-ruby::before{content:"\FD09"}.mdi-rugby::before{content:"\FD75"}.mdi-ruler::before{content:"\F46D"}.mdi-ruler-square::before{content:"\FC9E"}.mdi-ruler-square-compass::before{content:"\FEDB"}.mdi-run::before{content:"\F70D"}.mdi-run-fast::before{content:"\F46E"}.mdi-sack::before{content:"\FD0A"}.mdi-sack-percent::before{content:"\FD0B"}.mdi-safe::before{content:"\FA69"}.mdi-safety-goggles::before{content:"\FD0C"}.mdi-sailing::before{content:"\FEE5"}.mdi-sale::before{content:"\F46F"}.mdi-salesforce::before{content:"\F88D"}.mdi-sass::before{content:"\F7EB"}.mdi-satellite::before{content:"\F470"}.mdi-satellite-uplink::before{content:"\F908"}.mdi-satellite-variant::before{content:"\F471"}.mdi-sausage::before{content:"\F8B9"}.mdi-saw-blade::before{content:"\FE44"}.mdi-saxophone::before{content:"\F609"}.mdi-scale::before{content:"\F472"}.mdi-scale-balance::before{content:"\F5D1"}.mdi-scale-bathroom::before{content:"\F473"}.mdi-scale-off::before{content:"\F007C"}.mdi-scanner::before{content:"\F6AA"}.mdi-scanner-off::before{content:"\F909"}.mdi-scatter-plot::before{content:"\FEE6"}.mdi-scatter-plot-outline::before{content:"\FEE7"}.mdi-school::before{content:"\F474"}.mdi-scissors-cutting::before{content:"\FA6A"}.mdi-screen-rotation::before{content:"\F475"}.mdi-screen-rotation-lock::before{content:"\F476"}.mdi-screw-flat-top::before{content:"\FDCF"}.mdi-screw-lag::before{content:"\FE54"}.mdi-screw-machine-flat-top::before{content:"\FE55"}.mdi-screw-machine-round-top::before{content:"\FE56"}.mdi-screw-round-top::before{content:"\FE57"}.mdi-screwdriver::before{content:"\F477"}.mdi-script::before{content:"\FB9D"}.mdi-script-outline::before{content:"\F478"}.mdi-script-text::before{content:"\FB9E"}.mdi-script-text-outline::before{content:"\FB9F"}.mdi-sd::before{content:"\F479"}.mdi-seal::before{content:"\F47A"}.mdi-seal-variant::before{content:"\FFFA"}.mdi-search-web::before{content:"\F70E"}.mdi-seat::before{content:"\FC9F"}.mdi-seat-flat::before{content:"\F47B"}.mdi-seat-flat-angled::before{content:"\F47C"}.mdi-seat-individual-suite::before{content:"\F47D"}.mdi-seat-legroom-extra::before{content:"\F47E"}.mdi-seat-legroom-normal::before{content:"\F47F"}.mdi-seat-legroom-reduced::before{content:"\F480"}.mdi-seat-outline::before{content:"\FCA0"}.mdi-seat-recline-extra::before{content:"\F481"}.mdi-seat-recline-normal::before{content:"\F482"}.mdi-seatbelt::before{content:"\FCA1"}.mdi-security::before{content:"\F483"}.mdi-security-network::before{content:"\F484"}.mdi-seed::before{content:"\FE45"}.mdi-seed-outline::before{content:"\FE46"}.mdi-segment::before{content:"\FEE8"}.mdi-select::before{content:"\F485"}.mdi-select-all::before{content:"\F486"}.mdi-select-color::before{content:"\FD0D"}.mdi-select-compare::before{content:"\FAD8"}.mdi-select-drag::before{content:"\FA6B"}.mdi-select-group::before{content:"\FF9F"}.mdi-select-inverse::before{content:"\F487"}.mdi-select-off::before{content:"\F488"}.mdi-select-place::before{content:"\FFFB"}.mdi-selection::before{content:"\F489"}.mdi-selection-drag::before{content:"\FA6C"}.mdi-selection-ellipse::before{content:"\FD0E"}.mdi-selection-ellipse-arrow-inside::before{content:"\FF3F"}.mdi-selection-off::before{content:"\F776"}.mdi-send::before{content:"\F48A"}.mdi-send-circle::before{content:"\FE58"}.mdi-send-circle-outline::before{content:"\FE59"}.mdi-send-lock::before{content:"\F7EC"}.mdi-serial-port::before{content:"\F65C"}.mdi-server::before{content:"\F48B"}.mdi-server-minus::before{content:"\F48C"}.mdi-server-network::before{content:"\F48D"}.mdi-server-network-off::before{content:"\F48E"}.mdi-server-off::before{content:"\F48F"}.mdi-server-plus::before{content:"\F490"}.mdi-server-remove::before{content:"\F491"}.mdi-server-security::before{content:"\F492"}.mdi-set-all::before{content:"\F777"}.mdi-set-center::before{content:"\F778"}.mdi-set-center-right::before{content:"\F779"}.mdi-set-left::before{content:"\F77A"}.mdi-set-left-center::before{content:"\F77B"}.mdi-set-left-right::before{content:"\F77C"}.mdi-set-none::before{content:"\F77D"}.mdi-set-right::before{content:"\F77E"}.mdi-set-top-box::before{content:"\F99E"}.mdi-settings::before{content:"\F493"}.mdi-settings-box::before{content:"\F494"}.mdi-settings-helper::before{content:"\FA6D"}.mdi-settings-outline::before{content:"\F8BA"}.mdi-settings-transfer::before{content:"\F007D"}.mdi-settings-transfer-outline::before{content:"\F007E"}.mdi-shape::before{content:"\F830"}.mdi-shape-circle-plus::before{content:"\F65D"}.mdi-shape-outline::before{content:"\F831"}.mdi-shape-plus::before{content:"\F495"}.mdi-shape-polygon-plus::before{content:"\F65E"}.mdi-shape-rectangle-plus::before{content:"\F65F"}.mdi-shape-square-plus::before{content:"\F660"}.mdi-share::before{content:"\F496"}.mdi-share-off::before{content:"\FF40"}.mdi-share-off-outline::before{content:"\FF41"}.mdi-share-outline::before{content:"\F931"}.mdi-share-variant::before{content:"\F497"}.mdi-sheep::before{content:"\FCA2"}.mdi-shield::before{content:"\F498"}.mdi-shield-account::before{content:"\F88E"}.mdi-shield-account-outline::before{content:"\FA11"}.mdi-shield-airplane::before{content:"\F6BA"}.mdi-shield-airplane-outline::before{content:"\FCA3"}.mdi-shield-alert::before{content:"\FEE9"}.mdi-shield-alert-outline::before{content:"\FEEA"}.mdi-shield-car::before{content:"\FFA0"}.mdi-shield-check::before{content:"\F565"}.mdi-shield-check-outline::before{content:"\FCA4"}.mdi-shield-cross::before{content:"\FCA5"}.mdi-shield-cross-outline::before{content:"\FCA6"}.mdi-shield-half-full::before{content:"\F77F"}.mdi-shield-home::before{content:"\F689"}.mdi-shield-home-outline::before{content:"\FCA7"}.mdi-shield-key::before{content:"\FBA0"}.mdi-shield-key-outline::before{content:"\FBA1"}.mdi-shield-link-variant::before{content:"\FD0F"}.mdi-shield-link-variant-outline::before{content:"\FD10"}.mdi-shield-lock::before{content:"\F99C"}.mdi-shield-lock-outline::before{content:"\FCA8"}.mdi-shield-off::before{content:"\F99D"}.mdi-shield-off-outline::before{content:"\F99B"}.mdi-shield-outline::before{content:"\F499"}.mdi-shield-plus::before{content:"\FAD9"}.mdi-shield-plus-outline::before{content:"\FADA"}.mdi-shield-remove::before{content:"\FADB"}.mdi-shield-remove-outline::before{content:"\FADC"}.mdi-shield-search::before{content:"\FD76"}.mdi-shield-sun::before{content:"\F007F"}.mdi-shield-sun-outline::before{content:"\F0080"}.mdi-ship-wheel::before{content:"\F832"}.mdi-shoe-formal::before{content:"\FB22"}.mdi-shoe-heel::before{content:"\FB23"}.mdi-shoe-print::before{content:"\FE5A"}.mdi-shopify::before{content:"\FADD"}.mdi-shopping::before{content:"\F49A"}.mdi-shopping-music::before{content:"\F49B"}.mdi-shopping-search::before{content:"\FFA1"}.mdi-shovel::before{content:"\F70F"}.mdi-shovel-off::before{content:"\F710"}.mdi-shower::before{content:"\F99F"}.mdi-shower-head::before{content:"\F9A0"}.mdi-shredder::before{content:"\F49C"}.mdi-shuffle::before{content:"\F49D"}.mdi-shuffle-disabled::before{content:"\F49E"}.mdi-shuffle-variant::before{content:"\F49F"}.mdi-sigma::before{content:"\F4A0"}.mdi-sigma-lower::before{content:"\F62B"}.mdi-sign-caution::before{content:"\F4A1"}.mdi-sign-direction::before{content:"\F780"}.mdi-sign-direction-minus::before{content:"\F0022"}.mdi-sign-direction-plus::before{content:"\FFFD"}.mdi-sign-direction-remove::before{content:"\FFFE"}.mdi-sign-text::before{content:"\F781"}.mdi-signal::before{content:"\F4A2"}.mdi-signal-2g::before{content:"\F711"}.mdi-signal-3g::before{content:"\F712"}.mdi-signal-4g::before{content:"\F713"}.mdi-signal-5g::before{content:"\FA6E"}.mdi-signal-cellular-1::before{content:"\F8BB"}.mdi-signal-cellular-2::before{content:"\F8BC"}.mdi-signal-cellular-3::before{content:"\F8BD"}.mdi-signal-cellular-outline::before{content:"\F8BE"}.mdi-signal-distance-variant::before{content:"\FE47"}.mdi-signal-hspa::before{content:"\F714"}.mdi-signal-hspa-plus::before{content:"\F715"}.mdi-signal-off::before{content:"\F782"}.mdi-signal-variant::before{content:"\F60A"}.mdi-signature::before{content:"\FE5B"}.mdi-signature-freehand::before{content:"\FE5C"}.mdi-signature-image::before{content:"\FE5D"}.mdi-signature-text::before{content:"\FE5E"}.mdi-silo::before{content:"\FB24"}.mdi-silverware::before{content:"\F4A3"}.mdi-silverware-clean::before{content:"\FFFF"}.mdi-silverware-fork::before{content:"\F4A4"}.mdi-silverware-fork-knife::before{content:"\FA6F"}.mdi-silverware-spoon::before{content:"\F4A5"}.mdi-silverware-variant::before{content:"\F4A6"}.mdi-sim::before{content:"\F4A7"}.mdi-sim-alert::before{content:"\F4A8"}.mdi-sim-off::before{content:"\F4A9"}.mdi-sina-weibo::before{content:"\FADE"}.mdi-sitemap::before{content:"\F4AA"}.mdi-skate::before{content:"\FD11"}.mdi-skew-less::before{content:"\FD12"}.mdi-skew-more::before{content:"\FD13"}.mdi-skip-backward::before{content:"\F4AB"}.mdi-skip-backward-outline::before{content:"\FF42"}.mdi-skip-forward::before{content:"\F4AC"}.mdi-skip-forward-outline::before{content:"\FF43"}.mdi-skip-next::before{content:"\F4AD"}.mdi-skip-next-circle::before{content:"\F661"}.mdi-skip-next-circle-outline::before{content:"\F662"}.mdi-skip-next-outline::before{content:"\FF44"}.mdi-skip-previous::before{content:"\F4AE"}.mdi-skip-previous-circle::before{content:"\F663"}.mdi-skip-previous-circle-outline::before{content:"\F664"}.mdi-skip-previous-outline::before{content:"\FF45"}.mdi-skull::before{content:"\F68B"}.mdi-skull-crossbones::before{content:"\FBA2"}.mdi-skull-crossbones-outline::before{content:"\FBA3"}.mdi-skull-outline::before{content:"\FBA4"}.mdi-skype::before{content:"\F4AF"}.mdi-skype-business::before{content:"\F4B0"}.mdi-slack::before{content:"\F4B1"}.mdi-slackware::before{content:"\F90A"}.mdi-slash-forward::before{content:"\F0000"}.mdi-slash-forward-box::before{content:"\F0001"}.mdi-sleep::before{content:"\F4B2"}.mdi-sleep-off::before{content:"\F4B3"}.mdi-slope-downhill::before{content:"\FE5F"}.mdi-slope-uphill::before{content:"\FE60"}.mdi-smog::before{content:"\FA70"}.mdi-smoke-detector::before{content:"\F392"}.mdi-smoking::before{content:"\F4B4"}.mdi-smoking-off::before{content:"\F4B5"}.mdi-snapchat::before{content:"\F4B6"}.mdi-snowflake::before{content:"\F716"}.mdi-snowflake-alert::before{content:"\FF46"}.mdi-snowflake-variant::before{content:"\FF47"}.mdi-snowman::before{content:"\F4B7"}.mdi-soccer::before{content:"\F4B8"}.mdi-soccer-field::before{content:"\F833"}.mdi-sofa::before{content:"\F4B9"}.mdi-solar-panel::before{content:"\FD77"}.mdi-solar-panel-large::before{content:"\FD78"}.mdi-solar-power::before{content:"\FA71"}.mdi-solid::before{content:"\F68C"}.mdi-sort::before{content:"\F4BA"}.mdi-sort-alphabetical::before{content:"\F4BB"}.mdi-sort-ascending::before{content:"\F4BC"}.mdi-sort-descending::before{content:"\F4BD"}.mdi-sort-numeric::before{content:"\F4BE"}.mdi-sort-variant::before{content:"\F4BF"}.mdi-sort-variant-lock::before{content:"\FCA9"}.mdi-sort-variant-lock-open::before{content:"\FCAA"}.mdi-soundcloud::before{content:"\F4C0"}.mdi-source-branch::before{content:"\F62C"}.mdi-source-commit::before{content:"\F717"}.mdi-source-commit-end::before{content:"\F718"}.mdi-source-commit-end-local::before{content:"\F719"}.mdi-source-commit-local::before{content:"\F71A"}.mdi-source-commit-next-local::before{content:"\F71B"}.mdi-source-commit-start::before{content:"\F71C"}.mdi-source-commit-start-next-local::before{content:"\F71D"}.mdi-source-fork::before{content:"\F4C1"}.mdi-source-merge::before{content:"\F62D"}.mdi-source-pull::before{content:"\F4C2"}.mdi-source-repository::before{content:"\FCAB"}.mdi-source-repository-multiple::before{content:"\FCAC"}.mdi-soy-sauce::before{content:"\F7ED"}.mdi-spa::before{content:"\FCAD"}.mdi-spa-outline::before{content:"\FCAE"}.mdi-space-invaders::before{content:"\FBA5"}.mdi-spade::before{content:"\FE48"}.mdi-speaker::before{content:"\F4C3"}.mdi-speaker-bluetooth::before{content:"\F9A1"}.mdi-speaker-multiple::before{content:"\FD14"}.mdi-speaker-off::before{content:"\F4C4"}.mdi-speaker-wireless::before{content:"\F71E"}.mdi-speedometer::before{content:"\F4C5"}.mdi-speedometer-medium::before{content:"\FFA2"}.mdi-speedometer-slow::before{content:"\FFA3"}.mdi-spellcheck::before{content:"\F4C6"}.mdi-spider-web::before{content:"\FBA6"}.mdi-spotify::before{content:"\F4C7"}.mdi-spotlight::before{content:"\F4C8"}.mdi-spotlight-beam::before{content:"\F4C9"}.mdi-spray::before{content:"\F665"}.mdi-spray-bottle::before{content:"\FADF"}.mdi-sprinkler::before{content:"\F0081"}.mdi-sprinkler-variant::before{content:"\F0082"}.mdi-sprout::before{content:"\FE49"}.mdi-sprout-outline::before{content:"\FE4A"}.mdi-square::before{content:"\F763"}.mdi-square-edit-outline::before{content:"\F90B"}.mdi-square-inc::before{content:"\F4CA"}.mdi-square-inc-cash::before{content:"\F4CB"}.mdi-square-medium::before{content:"\FA12"}.mdi-square-medium-outline::before{content:"\FA13"}.mdi-square-outline::before{content:"\F762"}.mdi-square-root::before{content:"\F783"}.mdi-square-root-box::before{content:"\F9A2"}.mdi-square-small::before{content:"\FA14"}.mdi-squeegee::before{content:"\FAE0"}.mdi-ssh::before{content:"\F8BF"}.mdi-stack-exchange::before{content:"\F60B"}.mdi-stack-overflow::before{content:"\F4CC"}.mdi-stadium::before{content:"\F001A"}.mdi-stadium-variant::before{content:"\F71F"}.mdi-stairs::before{content:"\F4CD"}.mdi-stamper::before{content:"\FD15"}.mdi-standard-definition::before{content:"\F7EE"}.mdi-star::before{content:"\F4CE"}.mdi-star-box::before{content:"\FA72"}.mdi-star-box-outline::before{content:"\FA73"}.mdi-star-circle::before{content:"\F4CF"}.mdi-star-circle-outline::before{content:"\F9A3"}.mdi-star-face::before{content:"\F9A4"}.mdi-star-four-points::before{content:"\FAE1"}.mdi-star-four-points-outline::before{content:"\FAE2"}.mdi-star-half::before{content:"\F4D0"}.mdi-star-off::before{content:"\F4D1"}.mdi-star-outline::before{content:"\F4D2"}.mdi-star-three-points::before{content:"\FAE3"}.mdi-star-three-points-outline::before{content:"\FAE4"}.mdi-steam::before{content:"\F4D3"}.mdi-steam-box::before{content:"\F90C"}.mdi-steering::before{content:"\F4D4"}.mdi-steering-off::before{content:"\F90D"}.mdi-step-backward::before{content:"\F4D5"}.mdi-step-backward-2::before{content:"\F4D6"}.mdi-step-forward::before{content:"\F4D7"}.mdi-step-forward-2::before{content:"\F4D8"}.mdi-stethoscope::before{content:"\F4D9"}.mdi-sticker::before{content:"\F5D0"}.mdi-sticker-emoji::before{content:"\F784"}.mdi-stocking::before{content:"\F4DA"}.mdi-stop::before{content:"\F4DB"}.mdi-stop-circle::before{content:"\F666"}.mdi-stop-circle-outline::before{content:"\F667"}.mdi-store::before{content:"\F4DC"}.mdi-store-24-hour::before{content:"\F4DD"}.mdi-stove::before{content:"\F4DE"}.mdi-strava::before{content:"\FB25"}.mdi-stretch-to-page::before{content:"\FF48"}.mdi-stretch-to-page-outline::before{content:"\FF49"}.mdi-subdirectory-arrow-left::before{content:"\F60C"}.mdi-subdirectory-arrow-right::before{content:"\F60D"}.mdi-subtitles::before{content:"\FA15"}.mdi-subtitles-outline::before{content:"\FA16"}.mdi-subway::before{content:"\F6AB"}.mdi-subway-alert-variant::before{content:"\FD79"}.mdi-subway-variant::before{content:"\F4DF"}.mdi-summit::before{content:"\F785"}.mdi-sunglasses::before{content:"\F4E0"}.mdi-surround-sound::before{content:"\F5C5"}.mdi-surround-sound-2-0::before{content:"\F7EF"}.mdi-surround-sound-3-1::before{content:"\F7F0"}.mdi-surround-sound-5-1::before{content:"\F7F1"}.mdi-surround-sound-7-1::before{content:"\F7F2"}.mdi-svg::before{content:"\F720"}.mdi-swap-horizontal::before{content:"\F4E1"}.mdi-swap-horizontal-bold::before{content:"\FBA9"}.mdi-swap-horizontal-circle::before{content:"\F0002"}.mdi-swap-horizontal-circle-outline::before{content:"\F0003"}.mdi-swap-horizontal-variant::before{content:"\F8C0"}.mdi-swap-vertical::before{content:"\F4E2"}.mdi-swap-vertical-bold::before{content:"\FBAA"}.mdi-swap-vertical-circle::before{content:"\F0004"}.mdi-swap-vertical-circle-outline::before{content:"\F0005"}.mdi-swap-vertical-variant::before{content:"\F8C1"}.mdi-swim::before{content:"\F4E3"}.mdi-switch::before{content:"\F4E4"}.mdi-sword::before{content:"\F4E5"}.mdi-sword-cross::before{content:"\F786"}.mdi-symfony::before{content:"\FAE5"}.mdi-sync::before{content:"\F4E6"}.mdi-sync-alert::before{content:"\F4E7"}.mdi-sync-off::before{content:"\F4E8"}.mdi-tab::before{content:"\F4E9"}.mdi-tab-minus::before{content:"\FB26"}.mdi-tab-plus::before{content:"\F75B"}.mdi-tab-remove::before{content:"\FB27"}.mdi-tab-unselected::before{content:"\F4EA"}.mdi-table::before{content:"\F4EB"}.mdi-table-border::before{content:"\FA17"}.mdi-table-chair::before{content:"\F0083"}.mdi-table-column::before{content:"\F834"}.mdi-table-column-plus-after::before{content:"\F4EC"}.mdi-table-column-plus-before::before{content:"\F4ED"}.mdi-table-column-remove::before{content:"\F4EE"}.mdi-table-column-width::before{content:"\F4EF"}.mdi-table-edit::before{content:"\F4F0"}.mdi-table-large::before{content:"\F4F1"}.mdi-table-large-plus::before{content:"\FFA4"}.mdi-table-large-remove::before{content:"\FFA5"}.mdi-table-merge-cells::before{content:"\F9A5"}.mdi-table-of-contents::before{content:"\F835"}.mdi-table-plus::before{content:"\FA74"}.mdi-table-remove::before{content:"\FA75"}.mdi-table-row::before{content:"\F836"}.mdi-table-row-height::before{content:"\F4F2"}.mdi-table-row-plus-after::before{content:"\F4F3"}.mdi-table-row-plus-before::before{content:"\F4F4"}.mdi-table-row-remove::before{content:"\F4F5"}.mdi-table-search::before{content:"\F90E"}.mdi-table-settings::before{content:"\F837"}.mdi-table-tennis::before{content:"\FE4B"}.mdi-tablet::before{content:"\F4F6"}.mdi-tablet-android::before{content:"\F4F7"}.mdi-tablet-cellphone::before{content:"\F9A6"}.mdi-tablet-dashboard::before{content:"\FEEB"}.mdi-tablet-ipad::before{content:"\F4F8"}.mdi-taco::before{content:"\F761"}.mdi-tag::before{content:"\F4F9"}.mdi-tag-faces::before{content:"\F4FA"}.mdi-tag-heart::before{content:"\F68A"}.mdi-tag-heart-outline::before{content:"\FBAB"}.mdi-tag-minus::before{content:"\F90F"}.mdi-tag-multiple::before{content:"\F4FB"}.mdi-tag-outline::before{content:"\F4FC"}.mdi-tag-plus::before{content:"\F721"}.mdi-tag-remove::before{content:"\F722"}.mdi-tag-text-outline::before{content:"\F4FD"}.mdi-tank::before{content:"\FD16"}.mdi-tanker-truck::before{content:"\F0006"}.mdi-tape-measure::before{content:"\FB28"}.mdi-target::before{content:"\F4FE"}.mdi-target-account::before{content:"\FBAC"}.mdi-target-variant::before{content:"\FA76"}.mdi-taxi::before{content:"\F4FF"}.mdi-tea::before{content:"\FD7A"}.mdi-tea-outline::before{content:"\FD7B"}.mdi-teach::before{content:"\F88F"}.mdi-teamviewer::before{content:"\F500"}.mdi-telegram::before{content:"\F501"}.mdi-telescope::before{content:"\FB29"}.mdi-television::before{content:"\F502"}.mdi-television-box::before{content:"\F838"}.mdi-television-classic::before{content:"\F7F3"}.mdi-television-classic-off::before{content:"\F839"}.mdi-television-guide::before{content:"\F503"}.mdi-television-off::before{content:"\F83A"}.mdi-television-pause::before{content:"\FFA6"}.mdi-television-play::before{content:"\FEEC"}.mdi-television-stop::before{content:"\FFA7"}.mdi-temperature-celsius::before{content:"\F504"}.mdi-temperature-fahrenheit::before{content:"\F505"}.mdi-temperature-kelvin::before{content:"\F506"}.mdi-tennis::before{content:"\FD7C"}.mdi-tennis-ball::before{content:"\F507"}.mdi-tent::before{content:"\F508"}.mdi-terraform::before{content:"\F0084"}.mdi-terrain::before{content:"\F509"}.mdi-test-tube::before{content:"\F668"}.mdi-test-tube-empty::before{content:"\F910"}.mdi-test-tube-off::before{content:"\F911"}.mdi-text::before{content:"\F9A7"}.mdi-text-shadow::before{content:"\F669"}.mdi-text-short::before{content:"\F9A8"}.mdi-text-subject::before{content:"\F9A9"}.mdi-text-to-speech::before{content:"\F50A"}.mdi-text-to-speech-off::before{content:"\F50B"}.mdi-textbox::before{content:"\F60E"}.mdi-textbox-password::before{content:"\F7F4"}.mdi-texture::before{content:"\F50C"}.mdi-texture-box::before{content:"\F0007"}.mdi-theater::before{content:"\F50D"}.mdi-theme-light-dark::before{content:"\F50E"}.mdi-thermometer::before{content:"\F50F"}.mdi-thermometer-alert::before{content:"\FE61"}.mdi-thermometer-chevron-down::before{content:"\FE62"}.mdi-thermometer-chevron-up::before{content:"\FE63"}.mdi-thermometer-lines::before{content:"\F510"}.mdi-thermometer-minus::before{content:"\FE64"}.mdi-thermometer-plus::before{content:"\FE65"}.mdi-thermostat::before{content:"\F393"}.mdi-thermostat-box::before{content:"\F890"}.mdi-thought-bubble::before{content:"\F7F5"}.mdi-thought-bubble-outline::before{content:"\F7F6"}.mdi-thumb-down::before{content:"\F511"}.mdi-thumb-down-outline::before{content:"\F512"}.mdi-thumb-up::before{content:"\F513"}.mdi-thumb-up-outline::before{content:"\F514"}.mdi-thumbs-up-down::before{content:"\F515"}.mdi-ticket::before{content:"\F516"}.mdi-ticket-account::before{content:"\F517"}.mdi-ticket-confirmation::before{content:"\F518"}.mdi-ticket-outline::before{content:"\F912"}.mdi-ticket-percent::before{content:"\F723"}.mdi-tie::before{content:"\F519"}.mdi-tilde::before{content:"\F724"}.mdi-timelapse::before{content:"\F51A"}.mdi-timeline::before{content:"\FBAD"}.mdi-timeline-alert::before{content:"\FFB2"}.mdi-timeline-alert-outline::before{content:"\FFB5"}.mdi-timeline-help::before{content:"\FFB6"}.mdi-timeline-help-outline::before{content:"\FFB7"}.mdi-timeline-outline::before{content:"\FBAE"}.mdi-timeline-plus::before{content:"\FFB3"}.mdi-timeline-plus-outline::before{content:"\FFB4"}.mdi-timeline-text::before{content:"\FBAF"}.mdi-timeline-text-outline::before{content:"\FBB0"}.mdi-timer::before{content:"\F51B"}.mdi-timer-10::before{content:"\F51C"}.mdi-timer-3::before{content:"\F51D"}.mdi-timer-off::before{content:"\F51E"}.mdi-timer-sand::before{content:"\F51F"}.mdi-timer-sand-empty::before{content:"\F6AC"}.mdi-timer-sand-full::before{content:"\F78B"}.mdi-timetable::before{content:"\F520"}.mdi-toaster::before{content:"\F0085"}.mdi-toaster-oven::before{content:"\FCAF"}.mdi-toggle-switch::before{content:"\F521"}.mdi-toggle-switch-off::before{content:"\F522"}.mdi-toggle-switch-off-outline::before{content:"\FA18"}.mdi-toggle-switch-outline::before{content:"\FA19"}.mdi-toilet::before{content:"\F9AA"}.mdi-toolbox::before{content:"\F9AB"}.mdi-toolbox-outline::before{content:"\F9AC"}.mdi-tools::before{content:"\F0086"}.mdi-tooltip::before{content:"\F523"}.mdi-tooltip-account::before{content:"\F00C"}.mdi-tooltip-edit::before{content:"\F524"}.mdi-tooltip-image::before{content:"\F525"}.mdi-tooltip-image-outline::before{content:"\FBB1"}.mdi-tooltip-outline::before{content:"\F526"}.mdi-tooltip-plus::before{content:"\FBB2"}.mdi-tooltip-plus-outline::before{content:"\F527"}.mdi-tooltip-text::before{content:"\F528"}.mdi-tooltip-text-outline::before{content:"\FBB3"}.mdi-tooth::before{content:"\F8C2"}.mdi-tooth-outline::before{content:"\F529"}.mdi-tor::before{content:"\F52A"}.mdi-tortoise::before{content:"\FD17"}.mdi-tournament::before{content:"\F9AD"}.mdi-tower-beach::before{content:"\F680"}.mdi-tower-fire::before{content:"\F681"}.mdi-towing::before{content:"\F83B"}.mdi-track-light::before{content:"\F913"}.mdi-trackpad::before{content:"\F7F7"}.mdi-trackpad-lock::before{content:"\F932"}.mdi-tractor::before{content:"\F891"}.mdi-trademark::before{content:"\FA77"}.mdi-traffic-light::before{content:"\F52B"}.mdi-train::before{content:"\F52C"}.mdi-train-car::before{content:"\FBB4"}.mdi-train-variant::before{content:"\F8C3"}.mdi-tram::before{content:"\F52D"}.mdi-tram-side::before{content:"\F0008"}.mdi-transcribe::before{content:"\F52E"}.mdi-transcribe-close::before{content:"\F52F"}.mdi-transfer::before{content:"\F0087"}.mdi-transfer-down::before{content:"\FD7D"}.mdi-transfer-left::before{content:"\FD7E"}.mdi-transfer-right::before{content:"\F530"}.mdi-transfer-up::before{content:"\FD7F"}.mdi-transit-connection::before{content:"\FD18"}.mdi-transit-connection-variant::before{content:"\FD19"}.mdi-transit-detour::before{content:"\FFA8"}.mdi-transit-transfer::before{content:"\F6AD"}.mdi-transition::before{content:"\F914"}.mdi-transition-masked::before{content:"\F915"}.mdi-translate::before{content:"\F5CA"}.mdi-translate-off::before{content:"\FE66"}.mdi-transmission-tower::before{content:"\FD1A"}.mdi-trash-can::before{content:"\FA78"}.mdi-trash-can-outline::before{content:"\FA79"}.mdi-treasure-chest::before{content:"\F725"}.mdi-tree::before{content:"\F531"}.mdi-tree-outline::before{content:"\FE4C"}.mdi-trello::before{content:"\F532"}.mdi-trending-down::before{content:"\F533"}.mdi-trending-neutral::before{content:"\F534"}.mdi-trending-up::before{content:"\F535"}.mdi-triangle::before{content:"\F536"}.mdi-triangle-outline::before{content:"\F537"}.mdi-triforce::before{content:"\FBB5"}.mdi-trophy::before{content:"\F538"}.mdi-trophy-award::before{content:"\F539"}.mdi-trophy-broken::before{content:"\FD80"}.mdi-trophy-outline::before{content:"\F53A"}.mdi-trophy-variant::before{content:"\F53B"}.mdi-trophy-variant-outline::before{content:"\F53C"}.mdi-truck::before{content:"\F53D"}.mdi-truck-check::before{content:"\FCB0"}.mdi-truck-delivery::before{content:"\F53E"}.mdi-truck-fast::before{content:"\F787"}.mdi-truck-trailer::before{content:"\F726"}.mdi-tshirt-crew::before{content:"\FA7A"}.mdi-tshirt-crew-outline::before{content:"\F53F"}.mdi-tshirt-v::before{content:"\FA7B"}.mdi-tshirt-v-outline::before{content:"\F540"}.mdi-tumble-dryer::before{content:"\F916"}.mdi-tumblr::before{content:"\F541"}.mdi-tumblr-box::before{content:"\F917"}.mdi-tumblr-reblog::before{content:"\F542"}.mdi-tune::before{content:"\F62E"}.mdi-tune-vertical::before{content:"\F66A"}.mdi-turnstile::before{content:"\FCB1"}.mdi-turnstile-outline::before{content:"\FCB2"}.mdi-turtle::before{content:"\FCB3"}.mdi-twitch::before{content:"\F543"}.mdi-twitter::before{content:"\F544"}.mdi-twitter-box::before{content:"\F545"}.mdi-twitter-circle::before{content:"\F546"}.mdi-twitter-retweet::before{content:"\F547"}.mdi-two-factor-authentication::before{content:"\F9AE"}.mdi-typewriter::before{content:"\FF4A"}.mdi-uber::before{content:"\F748"}.mdi-ubisoft::before{content:"\FBB6"}.mdi-ubuntu::before{content:"\F548"}.mdi-ultra-high-definition::before{content:"\F7F8"}.mdi-umbraco::before{content:"\F549"}.mdi-umbrella::before{content:"\F54A"}.mdi-umbrella-closed::before{content:"\F9AF"}.mdi-umbrella-outline::before{content:"\F54B"}.mdi-undo::before{content:"\F54C"}.mdi-undo-variant::before{content:"\F54D"}.mdi-unfold-less-horizontal::before{content:"\F54E"}.mdi-unfold-less-vertical::before{content:"\F75F"}.mdi-unfold-more-horizontal::before{content:"\F54F"}.mdi-unfold-more-vertical::before{content:"\F760"}.mdi-ungroup::before{content:"\F550"}.mdi-unicode::before{content:"\FEED"}.mdi-unity::before{content:"\F6AE"}.mdi-unreal::before{content:"\F9B0"}.mdi-untappd::before{content:"\F551"}.mdi-update::before{content:"\F6AF"}.mdi-upload::before{content:"\F552"}.mdi-upload-multiple::before{content:"\F83C"}.mdi-upload-network::before{content:"\F6F5"}.mdi-upload-network-outline::before{content:"\FCB4"}.mdi-upload-outline::before{content:"\FE67"}.mdi-usb::before{content:"\F553"}.mdi-valve::before{content:"\F0088"}.mdi-valve-closed::before{content:"\F0089"}.mdi-valve-open::before{content:"\F008A"}.mdi-van-passenger::before{content:"\F7F9"}.mdi-van-utility::before{content:"\F7FA"}.mdi-vanish::before{content:"\F7FB"}.mdi-variable::before{content:"\FAE6"}.mdi-vector-arrange-above::before{content:"\F554"}.mdi-vector-arrange-below::before{content:"\F555"}.mdi-vector-bezier::before{content:"\FAE7"}.mdi-vector-circle::before{content:"\F556"}.mdi-vector-circle-variant::before{content:"\F557"}.mdi-vector-combine::before{content:"\F558"}.mdi-vector-curve::before{content:"\F559"}.mdi-vector-difference::before{content:"\F55A"}.mdi-vector-difference-ab::before{content:"\F55B"}.mdi-vector-difference-ba::before{content:"\F55C"}.mdi-vector-ellipse::before{content:"\F892"}.mdi-vector-intersection::before{content:"\F55D"}.mdi-vector-line::before{content:"\F55E"}.mdi-vector-link::before{content:"\F0009"}.mdi-vector-point::before{content:"\F55F"}.mdi-vector-polygon::before{content:"\F560"}.mdi-vector-polyline::before{content:"\F561"}.mdi-vector-radius::before{content:"\F749"}.mdi-vector-rectangle::before{content:"\F5C6"}.mdi-vector-selection::before{content:"\F562"}.mdi-vector-square::before{content:"\F001"}.mdi-vector-triangle::before{content:"\F563"}.mdi-vector-union::before{content:"\F564"}.mdi-venmo::before{content:"\F578"}.mdi-vhs::before{content:"\FA1A"}.mdi-vibrate::before{content:"\F566"}.mdi-vibrate-off::before{content:"\FCB5"}.mdi-video::before{content:"\F567"}.mdi-video-3d::before{content:"\F7FC"}.mdi-video-3d-variant::before{content:"\FEEE"}.mdi-video-4k-box::before{content:"\F83D"}.mdi-video-account::before{content:"\F918"}.mdi-video-check::before{content:"\F008B"}.mdi-video-check-outline::before{content:"\F008C"}.mdi-video-image::before{content:"\F919"}.mdi-video-input-antenna::before{content:"\F83E"}.mdi-video-input-component::before{content:"\F83F"}.mdi-video-input-hdmi::before{content:"\F840"}.mdi-video-input-scart::before{content:"\FFA9"}.mdi-video-input-svideo::before{content:"\F841"}.mdi-video-minus::before{content:"\F9B1"}.mdi-video-off::before{content:"\F568"}.mdi-video-off-outline::before{content:"\FBB7"}.mdi-video-outline::before{content:"\FBB8"}.mdi-video-plus::before{content:"\F9B2"}.mdi-video-stabilization::before{content:"\F91A"}.mdi-video-switch::before{content:"\F569"}.mdi-video-vintage::before{content:"\FA1B"}.mdi-video-wireless::before{content:"\FEEF"}.mdi-video-wireless-outline::before{content:"\FEF0"}.mdi-view-agenda::before{content:"\F56A"}.mdi-view-array::before{content:"\F56B"}.mdi-view-carousel::before{content:"\F56C"}.mdi-view-column::before{content:"\F56D"}.mdi-view-comfy::before{content:"\FE4D"}.mdi-view-compact::before{content:"\FE4E"}.mdi-view-compact-outline::before{content:"\FE4F"}.mdi-view-dashboard::before{content:"\F56E"}.mdi-view-dashboard-outline::before{content:"\FA1C"}.mdi-view-dashboard-variant::before{content:"\F842"}.mdi-view-day::before{content:"\F56F"}.mdi-view-grid::before{content:"\F570"}.mdi-view-grid-plus::before{content:"\FFAA"}.mdi-view-headline::before{content:"\F571"}.mdi-view-list::before{content:"\F572"}.mdi-view-module::before{content:"\F573"}.mdi-view-parallel::before{content:"\F727"}.mdi-view-quilt::before{content:"\F574"}.mdi-view-sequential::before{content:"\F728"}.mdi-view-split-horizontal::before{content:"\FBA7"}.mdi-view-split-vertical::before{content:"\FBA8"}.mdi-view-stream::before{content:"\F575"}.mdi-view-week::before{content:"\F576"}.mdi-vimeo::before{content:"\F577"}.mdi-violin::before{content:"\F60F"}.mdi-virtual-reality::before{content:"\F893"}.mdi-visual-studio::before{content:"\F610"}.mdi-visual-studio-code::before{content:"\FA1D"}.mdi-vk::before{content:"\F579"}.mdi-vk-box::before{content:"\F57A"}.mdi-vk-circle::before{content:"\F57B"}.mdi-vlc::before{content:"\F57C"}.mdi-voice::before{content:"\F5CB"}.mdi-voice-off::before{content:"\FEF1"}.mdi-voicemail::before{content:"\F57D"}.mdi-volleyball::before{content:"\F9B3"}.mdi-volume-high::before{content:"\F57E"}.mdi-volume-low::before{content:"\F57F"}.mdi-volume-medium::before{content:"\F580"}.mdi-volume-minus::before{content:"\F75D"}.mdi-volume-mute::before{content:"\F75E"}.mdi-volume-off::before{content:"\F581"}.mdi-volume-plus::before{content:"\F75C"}.mdi-volume-variant-off::before{content:"\FE68"}.mdi-vote::before{content:"\FA1E"}.mdi-vote-outline::before{content:"\FA1F"}.mdi-vpn::before{content:"\F582"}.mdi-vuejs::before{content:"\F843"}.mdi-vuetify::before{content:"\FE50"}.mdi-walk::before{content:"\F583"}.mdi-wall::before{content:"\F7FD"}.mdi-wall-sconce::before{content:"\F91B"}.mdi-wall-sconce-flat::before{content:"\F91C"}.mdi-wall-sconce-variant::before{content:"\F91D"}.mdi-wallet::before{content:"\F584"}.mdi-wallet-giftcard::before{content:"\F585"}.mdi-wallet-membership::before{content:"\F586"}.mdi-wallet-outline::before{content:"\FBB9"}.mdi-wallet-plus::before{content:"\FFAB"}.mdi-wallet-plus-outline::before{content:"\FFAC"}.mdi-wallet-travel::before{content:"\F587"}.mdi-wallpaper::before{content:"\FE69"}.mdi-wan::before{content:"\F588"}.mdi-wardrobe::before{content:"\FFAD"}.mdi-wardrobe-outline::before{content:"\FFAE"}.mdi-warehouse::before{content:"\FFBB"}.mdi-washing-machine::before{content:"\F729"}.mdi-watch::before{content:"\F589"}.mdi-watch-export::before{content:"\F58A"}.mdi-watch-export-variant::before{content:"\F894"}.mdi-watch-import::before{content:"\F58B"}.mdi-watch-import-variant::before{content:"\F895"}.mdi-watch-variant::before{content:"\F896"}.mdi-watch-vibrate::before{content:"\F6B0"}.mdi-watch-vibrate-off::before{content:"\FCB6"}.mdi-water::before{content:"\F58C"}.mdi-water-boiler::before{content:"\FFAF"}.mdi-water-off::before{content:"\F58D"}.mdi-water-outline::before{content:"\FE6A"}.mdi-water-percent::before{content:"\F58E"}.mdi-water-pump::before{content:"\F58F"}.mdi-water-pump-off::before{content:"\FFB0"}.mdi-water-well::before{content:"\F008D"}.mdi-water-well-outline::before{content:"\F008E"}.mdi-watermark::before{content:"\F612"}.mdi-wave::before{content:"\FF4B"}.mdi-waves::before{content:"\F78C"}.mdi-waze::before{content:"\FBBA"}.mdi-weather-cloudy::before{content:"\F590"}.mdi-weather-cloudy-alert::before{content:"\FF4C"}.mdi-weather-cloudy-arrow-right::before{content:"\FE51"}.mdi-weather-fog::before{content:"\F591"}.mdi-weather-hail::before{content:"\F592"}.mdi-weather-hazy::before{content:"\FF4D"}.mdi-weather-hurricane::before{content:"\F897"}.mdi-weather-lightning::before{content:"\F593"}.mdi-weather-lightning-rainy::before{content:"\F67D"}.mdi-weather-night::before{content:"\F594"}.mdi-weather-night-partly-cloudy::before{content:"\FF4E"}.mdi-weather-partly-cloudy::before{content:"\F595"}.mdi-weather-partly-lightning::before{content:"\FF4F"}.mdi-weather-partly-rainy::before{content:"\FF50"}.mdi-weather-partly-snowy::before{content:"\FF51"}.mdi-weather-partly-snowy-rainy::before{content:"\FF52"}.mdi-weather-pouring::before{content:"\F596"}.mdi-weather-rainy::before{content:"\F597"}.mdi-weather-snowy::before{content:"\F598"}.mdi-weather-snowy-heavy::before{content:"\FF53"}.mdi-weather-snowy-rainy::before{content:"\F67E"}.mdi-weather-sunny::before{content:"\F599"}.mdi-weather-sunny-alert::before{content:"\FF54"}.mdi-weather-sunset::before{content:"\F59A"}.mdi-weather-sunset-down::before{content:"\F59B"}.mdi-weather-sunset-up::before{content:"\F59C"}.mdi-weather-tornado::before{content:"\FF55"}.mdi-weather-windy::before{content:"\F59D"}.mdi-weather-windy-variant::before{content:"\F59E"}.mdi-web::before{content:"\F59F"}.mdi-web-box::before{content:"\FFB1"}.mdi-webcam::before{content:"\F5A0"}.mdi-webhook::before{content:"\F62F"}.mdi-webpack::before{content:"\F72A"}.mdi-wechat::before{content:"\F611"}.mdi-weight::before{content:"\F5A1"}.mdi-weight-gram::before{content:"\FD1B"}.mdi-weight-kilogram::before{content:"\F5A2"}.mdi-weight-pound::before{content:"\F9B4"}.mdi-whatsapp::before{content:"\F5A3"}.mdi-wheelchair-accessibility::before{content:"\F5A4"}.mdi-whistle::before{content:"\F9B5"}.mdi-white-balance-auto::before{content:"\F5A5"}.mdi-white-balance-incandescent::before{content:"\F5A6"}.mdi-white-balance-iridescent::before{content:"\F5A7"}.mdi-white-balance-sunny::before{content:"\F5A8"}.mdi-widgets::before{content:"\F72B"}.mdi-wifi::before{content:"\F5A9"}.mdi-wifi-off::before{content:"\F5AA"}.mdi-wifi-star::before{content:"\FE6B"}.mdi-wifi-strength-1::before{content:"\F91E"}.mdi-wifi-strength-1-alert::before{content:"\F91F"}.mdi-wifi-strength-1-lock::before{content:"\F920"}.mdi-wifi-strength-2::before{content:"\F921"}.mdi-wifi-strength-2-alert::before{content:"\F922"}.mdi-wifi-strength-2-lock::before{content:"\F923"}.mdi-wifi-strength-3::before{content:"\F924"}.mdi-wifi-strength-3-alert::before{content:"\F925"}.mdi-wifi-strength-3-lock::before{content:"\F926"}.mdi-wifi-strength-4::before{content:"\F927"}.mdi-wifi-strength-4-alert::before{content:"\F928"}.mdi-wifi-strength-4-lock::before{content:"\F929"}.mdi-wifi-strength-alert-outline::before{content:"\F92A"}.mdi-wifi-strength-lock-outline::before{content:"\F92B"}.mdi-wifi-strength-off::before{content:"\F92C"}.mdi-wifi-strength-off-outline::before{content:"\F92D"}.mdi-wifi-strength-outline::before{content:"\F92E"}.mdi-wii::before{content:"\F5AB"}.mdi-wiiu::before{content:"\F72C"}.mdi-wikipedia::before{content:"\F5AC"}.mdi-wind-turbine::before{content:"\FD81"}.mdi-window-close::before{content:"\F5AD"}.mdi-window-closed::before{content:"\F5AE"}.mdi-window-maximize::before{content:"\F5AF"}.mdi-window-minimize::before{content:"\F5B0"}.mdi-window-open::before{content:"\F5B1"}.mdi-window-restore::before{content:"\F5B2"}.mdi-windows::before{content:"\F5B3"}.mdi-windows-classic::before{content:"\FA20"}.mdi-wiper::before{content:"\FAE8"}.mdi-wiper-wash::before{content:"\FD82"}.mdi-wordpress::before{content:"\F5B4"}.mdi-worker::before{content:"\F5B5"}.mdi-wrap::before{content:"\F5B6"}.mdi-wrap-disabled::before{content:"\FBBB"}.mdi-wrench::before{content:"\F5B7"}.mdi-wrench-outline::before{content:"\FBBC"}.mdi-wunderlist::before{content:"\F5B8"}.mdi-xamarin::before{content:"\F844"}.mdi-xamarin-outline::before{content:"\F845"}.mdi-xaml::before{content:"\F673"}.mdi-xbox::before{content:"\F5B9"}.mdi-xbox-controller::before{content:"\F5BA"}.mdi-xbox-controller-battery-alert::before{content:"\F74A"}.mdi-xbox-controller-battery-charging::before{content:"\FA21"}.mdi-xbox-controller-battery-empty::before{content:"\F74B"}.mdi-xbox-controller-battery-full::before{content:"\F74C"}.mdi-xbox-controller-battery-low::before{content:"\F74D"}.mdi-xbox-controller-battery-medium::before{content:"\F74E"}.mdi-xbox-controller-battery-unknown::before{content:"\F74F"}.mdi-xbox-controller-menu::before{content:"\FE52"}.mdi-xbox-controller-off::before{content:"\F5BB"}.mdi-xbox-controller-view::before{content:"\FE53"}.mdi-xda::before{content:"\F5BC"}.mdi-xing::before{content:"\F5BD"}.mdi-xing-box::before{content:"\F5BE"}.mdi-xing-circle::before{content:"\F5BF"}.mdi-xml::before{content:"\F5C0"}.mdi-xmpp::before{content:"\F7FE"}.mdi-yahoo::before{content:"\FB2A"}.mdi-yammer::before{content:"\F788"}.mdi-yeast::before{content:"\F5C1"}.mdi-yelp::before{content:"\F5C2"}.mdi-yin-yang::before{content:"\F67F"}.mdi-youtube::before{content:"\F5C3"}.mdi-youtube-creator-studio::before{content:"\F846"}.mdi-youtube-gaming::before{content:"\F847"}.mdi-youtube-subscription::before{content:"\FD1C"}.mdi-youtube-tv::before{content:"\F448"}.mdi-z-wave::before{content:"\FAE9"}.mdi-zend::before{content:"\FAEA"}.mdi-zigbee::before{content:"\FD1D"}.mdi-zip-box::before{content:"\F5C4"}.mdi-zip-box-outline::before{content:"\F001B"}.mdi-zip-disk::before{content:"\FA22"}.mdi-zodiac-aquarius::before{content:"\FA7C"}.mdi-zodiac-aries::before{content:"\FA7D"}.mdi-zodiac-cancer::before{content:"\FA7E"}.mdi-zodiac-capricorn::before{content:"\FA7F"}.mdi-zodiac-gemini::before{content:"\FA80"}.mdi-zodiac-leo::before{content:"\FA81"}.mdi-zodiac-libra::before{content:"\FA82"}.mdi-zodiac-pisces::before{content:"\FA83"}.mdi-zodiac-sagittarius::before{content:"\FA84"}.mdi-zodiac-scorpio::before{content:"\FA85"}.mdi-zodiac-taurus::before{content:"\FA86"}.mdi-zodiac-virgo::before{content:"\FA87"}.mdi-blank::before{content:"\F68C";visibility:hidden}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:rgba(0,0,0,0.54)}.mdi-dark.mdi-inactive:before{color:rgba(0,0,0,0.26)}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:rgba(255,255,255,0.3)}.mdi-rotate-45:before{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.mdi-rotate-90:before{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.mdi-rotate-135:before{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg)}.mdi-rotate-180:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.mdi-rotate-225:before{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);transform:rotate(225deg)}.mdi-rotate-270:before{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.mdi-rotate-315:before{-webkit-transform:rotate(315deg);-ms-transform:rotate(315deg);transform:rotate(315deg)}.mdi-flip-h:before{-webkit-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.mdi-flip-v:before{-webkit-transform:scaleY(-1);transform:scaleY(-1);filter:FlipV;-ms-filter:"FlipV"}.mdi-spin:before{-webkit-animation:mdi-spin 2s infinite linear;animation:mdi-spin 2s infinite linear}@-webkit-keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}} diff --git a/assets/bootstrap/css/style.min.css b/web/static/admin/css/style.min.css similarity index 100% rename from assets/bootstrap/css/style.min.css rename to web/static/admin/css/style.min.css diff --git a/assets/bootstrap/fonts/materialdesignicons-webfont.eot b/web/static/admin/fonts/materialdesignicons-webfont.eot similarity index 99% rename from assets/bootstrap/fonts/materialdesignicons-webfont.eot rename to web/static/admin/fonts/materialdesignicons-webfont.eot index ba6e04a..37dd380 100755 Binary files a/assets/bootstrap/fonts/materialdesignicons-webfont.eot and b/web/static/admin/fonts/materialdesignicons-webfont.eot differ diff --git a/assets/bootstrap/fonts/materialdesignicons-webfont.ttf b/web/static/admin/fonts/materialdesignicons-webfont.ttf similarity index 99% rename from assets/bootstrap/fonts/materialdesignicons-webfont.ttf rename to web/static/admin/fonts/materialdesignicons-webfont.ttf index e8f8c39..7f8198d 100755 Binary files a/assets/bootstrap/fonts/materialdesignicons-webfont.ttf and b/web/static/admin/fonts/materialdesignicons-webfont.ttf differ diff --git a/assets/bootstrap/fonts/materialdesignicons-webfont.woff b/web/static/admin/fonts/materialdesignicons-webfont.woff similarity index 99% rename from assets/bootstrap/fonts/materialdesignicons-webfont.woff rename to web/static/admin/fonts/materialdesignicons-webfont.woff index 8fc669b..c86db3f 100755 Binary files a/assets/bootstrap/fonts/materialdesignicons-webfont.woff and b/web/static/admin/fonts/materialdesignicons-webfont.woff differ diff --git a/assets/bootstrap/fonts/materialdesignicons-webfont.woff2 b/web/static/admin/fonts/materialdesignicons-webfont.woff2 similarity index 99% rename from assets/bootstrap/fonts/materialdesignicons-webfont.woff2 rename to web/static/admin/fonts/materialdesignicons-webfont.woff2 index ceaa601..444e34c 100755 Binary files a/assets/bootstrap/fonts/materialdesignicons-webfont.woff2 and b/web/static/admin/fonts/materialdesignicons-webfont.woff2 differ diff --git a/web/static/admin/image/gr-code.png b/web/static/admin/image/gr-code.png new file mode 100644 index 0000000..550ab42 Binary files /dev/null and b/web/static/admin/image/gr-code.png differ diff --git a/assets/bootstrap/images/logo-sidebar.png b/web/static/admin/image/logo-sidebar.png similarity index 100% rename from assets/bootstrap/images/logo-sidebar.png rename to web/static/admin/image/logo-sidebar.png diff --git a/assets/bootstrap/js/authorization/crypto-js.min.js b/web/static/admin/js/authorization/crypto-js.min.js similarity index 100% rename from assets/bootstrap/js/authorization/crypto-js.min.js rename to web/static/admin/js/authorization/crypto-js.min.js diff --git a/assets/bootstrap/js/authorization/enc-base64.min.js b/web/static/admin/js/authorization/enc-base64.min.js similarity index 100% rename from assets/bootstrap/js/authorization/enc-base64.min.js rename to web/static/admin/js/authorization/enc-base64.min.js diff --git a/assets/bootstrap/js/authorization/hmac-sha256.js b/web/static/admin/js/authorization/hmac-sha256.js similarity index 100% rename from assets/bootstrap/js/authorization/hmac-sha256.js rename to web/static/admin/js/authorization/hmac-sha256.js diff --git a/assets/bootstrap/js/authorization/ksort.js b/web/static/admin/js/authorization/ksort.js similarity index 100% rename from assets/bootstrap/js/authorization/ksort.js rename to web/static/admin/js/authorization/ksort.js diff --git a/assets/bootstrap/js/authorization/md5.min.js b/web/static/admin/js/authorization/md5.min.js similarity index 100% rename from assets/bootstrap/js/authorization/md5.min.js rename to web/static/admin/js/authorization/md5.min.js diff --git a/web/static/admin/js/bootstrap.bundle.min.js b/web/static/admin/js/bootstrap.bundle.min.js new file mode 100644 index 0000000..2be3c7a --- /dev/null +++ b/web/static/admin/js/bootstrap.bundle.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],t):t((e=e||self).bootstrap={},e.jQuery)}(this,function(e,p){"use strict";function i(e,t){for(var n=0;nthis._items.length-1||e<0))if(this._isSliding)p(this._element).one(V.SLID,function(){return t.to(e)});else{if(n===e)return this.pause(),void this.cycle();var i=n=i.clientWidth&&n>=i.clientHeight}),u=0l[e]&&!i.escapeWithReference&&(n=Math.min(h[t],l[e]-("right"===e?h.width:h.height))),Ye({},t,n)}};return c.forEach(function(e){var t=-1!==["left","top"].indexOf(e)?"primary":"secondary";h=ze({},h,u[t](e))}),e.offsets.popper=h,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,n=t.popper,i=t.reference,o=e.placement.split("-")[0],r=Math.floor,s=-1!==["top","bottom"].indexOf(o),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]r(i[a])&&(e.offsets.popper[l]=r(i[a])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){var n;if(!gt(e.instance.modifiers,"arrow","keepTogether"))return e;var i=t.element;if("string"==typeof i){if(!(i=e.instance.popper.querySelector(i)))return e}else if(!e.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var o=e.placement.split("-")[0],r=e.offsets,s=r.popper,a=r.reference,l=-1!==["left","right"].indexOf(o),c=l?"height":"width",h=l?"Top":"Left",u=h.toLowerCase(),f=l?"left":"top",d=l?"bottom":"right",p=nt(i)[c];a[d]-ps[d]&&(e.offsets.popper[u]+=a[u]+p-s[d]),e.offsets.popper=Xe(e.offsets.popper);var m=a[u]+a[c]/2-p/2,g=ke(e.instance.popper),_=parseFloat(g["margin"+h],10),v=parseFloat(g["border"+h+"Width"],10),y=m-e.offsets.popper[u]-_-v;return y=Math.max(Math.min(s[c]-p,y),0),e.arrowElement=i,e.offsets.arrow=(Ye(n={},u,Math.round(y)),Ye(n,f,""),n),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(m,g){if(at(m.instance.modifiers,"inner"))return m;if(m.flipped&&m.placement===m.originalPlacement)return m;var _=Ze(m.instance.popper,m.instance.reference,g.padding,g.boundariesElement,m.positionFixed),v=m.placement.split("-")[0],y=it(v),E=m.placement.split("-")[1]||"",b=[];switch(g.behavior){case Et:b=[v,y];break;case bt:b=yt(v);break;case wt:b=yt(v,!0);break;default:b=g.behavior}return b.forEach(function(e,t){if(v!==e||b.length===t+1)return m;v=m.placement.split("-")[0],y=it(v);var n=m.offsets.popper,i=m.offsets.reference,o=Math.floor,r="left"===v&&o(n.right)>o(i.left)||"right"===v&&o(n.left)o(i.top)||"bottom"===v&&o(n.top)o(_.right),l=o(n.top)o(_.bottom),h="left"===v&&s||"right"===v&&a||"top"===v&&l||"bottom"===v&&c,u=-1!==["top","bottom"].indexOf(v),f=!!g.flipVariations&&(u&&"start"===E&&s||u&&"end"===E&&a||!u&&"start"===E&&l||!u&&"end"===E&&c),d=!!g.flipVariationsByContent&&(u&&"start"===E&&a||u&&"end"===E&&s||!u&&"start"===E&&c||!u&&"end"===E&&l),p=f||d;(r||h||p)&&(m.flipped=!0,(r||h)&&(v=b[t+1]),p&&(E=function(e){return"end"===e?"start":"start"===e?"end":e}(E)),m.placement=v+(E?"-"+E:""),m.offsets.popper=ze({},m.offsets.popper,ot(m.instance.popper,m.offsets.reference,m.placement)),m=st(m.instance.modifiers,m,"flip"))}),m},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,n=t.split("-")[0],i=e.offsets,o=i.popper,r=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return o[s?"left":"top"]=r[n]-(a?o[s?"width":"height"]:0),e.placement=it(t),e.offsets.popper=Xe(o),e}},hide:{order:800,enabled:!0,fn:function(e){if(!gt(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,n=rt(e.instance.modifiers,function(e){return"preventOverflow"===e.name}).boundaries;if(t.bottomn.right||t.top>n.bottom||t.rightdocument.documentElement.clientHeight;!this._isBodyOverflowing&&e&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!e&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var e=document.body.getBoundingClientRect();this._isBodyOverflowing=e.left+e.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Cn,popperConfig:null},Fn="show",Mn="out",Wn={HIDE:"hide"+Nn,HIDDEN:"hidden"+Nn,SHOW:"show"+Nn,SHOWN:"shown"+Nn,INSERTED:"inserted"+Nn,CLICK:"click"+Nn,FOCUSIN:"focusin"+Nn,FOCUSOUT:"focusout"+Nn,MOUSEENTER:"mouseenter"+Nn,MOUSELEAVE:"mouseleave"+Nn},Un="fade",Bn="show",qn=".tooltip-inner",Kn=".arrow",Qn="hover",Vn="focus",Yn="click",zn="manual",Xn=function(){function i(e,t){if("undefined"==typeof St)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=e,this.config=this._getConfig(t),this.tip=null,this._setListeners()}var e=i.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(e){if(this._isEnabled)if(e){var t=this.constructor.DATA_KEY,n=p(e.currentTarget).data(t);n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(t,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(Bn))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===p(this.element).css("display"))throw new Error("Please use show on visible elements");var e=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(e);var n=m.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=m.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&p(o).addClass(Un);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();p(o).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(o).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new St(this.element,o,this._getPopperConfig(a)),p(o).addClass(Bn),"ontouchstart"in document.documentElement&&p(document.body).children().on("mouseover",null,p.noop);var c=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,p(t.element).trigger(t.constructor.Event.SHOWN),e===Mn&&t._leave(null,t)};if(p(this.tip).hasClass(Un)){var h=m.getTransitionDurationFromElement(this.tip);p(this.tip).one(m.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},e.hide=function(e){function t(){n._hoverState!==Fn&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),p(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()}var n=this,i=this.getTipElement(),o=p.Event(this.constructor.Event.HIDE);if(p(this.element).trigger(o),!o.isDefaultPrevented()){if(p(i).removeClass(Bn),"ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),this._activeTrigger[Yn]=!1,this._activeTrigger[Vn]=!1,this._activeTrigger[Qn]=!1,p(this.tip).hasClass(Un)){var r=m.getTransitionDurationFromElement(i);p(i).one(m.TRANSITION_END,t).emulateTransitionEnd(r)}else t();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(e){p(this.getTipElement()).addClass(Ln+"-"+e)},e.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},e.setContent=function(){var e=this.getTipElement();this.setElementContent(p(e.querySelectorAll(qn)),this.getTitle()),p(e).removeClass(Un+" "+Bn)},e.setElementContent=function(e,t){"object"!=typeof t||!t.nodeType&&!t.jquery?this.config.html?(this.config.sanitize&&(t=In(t,this.config.whiteList,this.config.sanitizeFn)),e.html(t)):e.text(t):this.config.html?p(t).parent().is(e)||e.empty().append(t):e.text(p(t).text())},e.getTitle=function(){var e=this.element.getAttribute("data-original-title");return e=e||("function"==typeof this.config.title?this.config.title.call(this.element):this.config.title)},e._getPopperConfig=function(e){var t=this;return l({},{placement:e,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:Kn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){return t._handlePopperPlacementChange(e)}},{},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=l({},e.offsets,{},t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:m.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},e._getAttachment=function(e){return Hn[e.toUpperCase()]},e._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(e){if("click"===e)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(e){return i.toggle(e)});else if(e!==zn){var t=e===Qn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=e===Qn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(t,i.config.selector,function(e){return i._enter(e)}).on(n,i.config.selector,function(e){return i._leave(e)})}}),this._hideModalHandler=function(){i.element&&i.hide()},p(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var e=typeof this.element.getAttribute("data-original-title");!this.element.getAttribute("title")&&"string"==e||(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusin"===e.type?Vn:Qn]=!0),p(t.getTipElement()).hasClass(Bn)||t._hoverState===Fn?t._hoverState=Fn:(clearTimeout(t._timeout),t._hoverState=Fn,t.config.delay&&t.config.delay.show?t._timeout=setTimeout(function(){t._hoverState===Fn&&t.show()},t.config.delay.show):t.show())},e._leave=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusout"===e.type?Vn:Qn]=!1),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState=Mn,t.config.delay&&t.config.delay.hide?t._timeout=setTimeout(function(){t._hoverState===Mn&&t.hide()},t.config.delay.hide):t.hide())},e._isWithActiveTrigger=function(){for(var e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1},e._getConfig=function(e){var t=p(this.element).data();return Object.keys(t).forEach(function(e){-1!==xn.indexOf(e)&&delete t[e]}),"number"==typeof(e=l({},this.constructor.Default,{},t,{},"object"==typeof e&&e?e:{})).delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),m.typeCheckConfig(An,e,this.constructor.DefaultType),e.sanitize&&(e.template=In(e.template,e.whiteList,e.sanitizeFn)),e},e._getDelegateConfig=function(){var e={};if(this.config)for(var t in this.config)this.constructor.Default[t]!==this.config[t]&&(e[t]=this.config[t]);return e},e._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(Pn);null!==t&&t.length&&e.removeClass(t.join(""))},e._handlePopperPlacementChange=function(e){var t=e.instance;this.tip=t.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(e.placement))},e._fixTransition=function(){var e=this.getTipElement(),t=this.config.animation;null===e.getAttribute("x-placement")&&(p(e).removeClass(Un),this.config.animation=!1,this.hide(),this.show(),this.config.animation=t)},i._jQueryInterface=function(n){return this.each(function(){var e=p(this).data(On),t="object"==typeof n&&n;if((e||!/dispose|hide/.test(n))&&(e||(e=new i(this,t),p(this).data(On,e)),"string"==typeof n)){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return Rn}},{key:"NAME",get:function(){return An}},{key:"DATA_KEY",get:function(){return On}},{key:"Event",get:function(){return Wn}},{key:"EVENT_KEY",get:function(){return Nn}},{key:"DefaultType",get:function(){return jn}}]),i}();p.fn[An]=Xn._jQueryInterface,p.fn[An].Constructor=Xn,p.fn[An].noConflict=function(){return p.fn[An]=kn,Xn._jQueryInterface};var Gn="popover",$n="bs.popover",Jn="."+$n,Zn=p.fn[Gn],ei="bs-popover",ti=new RegExp("(^|\\s)"+ei+"\\S+","g"),ni=l({},Xn.Default,{placement:"right",trigger:"click",content:"",template:''}),ii=l({},Xn.DefaultType,{content:"(string|element|function)"}),oi="fade",ri="show",si=".popover-header",ai=".popover-body",li={HIDE:"hide"+Jn,HIDDEN:"hidden"+Jn,SHOW:"show"+Jn,SHOWN:"shown"+Jn,INSERTED:"inserted"+Jn,CLICK:"click"+Jn,FOCUSIN:"focusin"+Jn,FOCUSOUT:"focusout"+Jn,MOUSEENTER:"mouseenter"+Jn,MOUSELEAVE:"mouseleave"+Jn},ci=function(e){function i(){return e.apply(this,arguments)||this}!function(e,t){e.prototype=Object.create(t.prototype),(e.prototype.constructor=e).__proto__=t}(i,e);var t=i.prototype;return t.isWithContent=function(){return this.getTitle()||this._getContent()},t.addAttachmentClass=function(e){p(this.getTipElement()).addClass(ei+"-"+e)},t.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},t.setContent=function(){var e=p(this.getTipElement());this.setElementContent(e.find(si),this.getTitle());var t=this._getContent();"function"==typeof t&&(t=t.call(this.element)),this.setElementContent(e.find(ai),t),e.removeClass(oi+" "+ri)},t._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},t._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(ti);null!==t&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||ethis._items.length-1||t<0))if(this._isSliding)g(this._element).one(Y.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Se,popperConfig:null},Fe="show",Ue="out",We={HIDE:"hide"+Oe,HIDDEN:"hidden"+Oe,SHOW:"show"+Oe,SHOWN:"shown"+Oe,INSERTED:"inserted"+Oe,CLICK:"click"+Oe,FOCUSIN:"focusin"+Oe,FOCUSOUT:"focusout"+Oe,MOUSEENTER:"mouseenter"+Oe,MOUSELEAVE:"mouseleave"+Oe},qe="fade",Me="show",Ke=".tooltip-inner",Qe=".arrow",Be="hover",Ve="focus",Ye="click",ze="manual",Xe=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Me))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(qe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,this._getPopperConfig(a)),g(o).addClass(Me),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===Ue&&e._leave(null,e)};if(g(this.tip).hasClass(qe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){function e(){n._hoverState!==Fe&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),g(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),t&&t()}var n=this,i=this.getTipElement(),o=g.Event(this.constructor.Event.HIDE);if(g(this.element).trigger(o),!o.isDefaultPrevented()){if(g(i).removeClass(Me),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ye]=!1,this._activeTrigger[Ve]=!1,this._activeTrigger[Be]=!1,g(this.tip).hasClass(qe)){var r=_.getTransitionDurationFromElement(i);g(i).one(_.TRANSITION_END,e).emulateTransitionEnd(r)}else e();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Pe+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ke)),this.getTitle()),g(t).removeClass(qe+" "+Me)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=we(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t=t||("function"==typeof this.config.title?this.config.title.call(this.element):this.config.title)},t._getPopperConfig=function(t){var e=this;return l({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:Qe},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},{},this.config.popperConfig)},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,{},e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Re[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==ze){var e=t===Be?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===Be?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),this._hideModalHandler=function(){i.element&&i.hide()},g(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");!this.element.getAttribute("title")&&"string"==t||(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Ve:Be]=!0),g(e.getTipElement()).hasClass(Me)||e._hoverState===Fe?e._hoverState=Fe:(clearTimeout(e._timeout),e._hoverState=Fe,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===Fe&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Ve:Be]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=Ue,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===Ue&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==je.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,{},e,{},"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(Ae,t,this.constructor.DefaultType),t.sanitize&&(t.template=we(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Le);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(qe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ne),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ne,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return xe}},{key:"NAME",get:function(){return Ae}},{key:"DATA_KEY",get:function(){return Ne}},{key:"Event",get:function(){return We}},{key:"EVENT_KEY",get:function(){return Oe}},{key:"DefaultType",get:function(){return He}}]),i}();g.fn[Ae]=Xe._jQueryInterface,g.fn[Ae].Constructor=Xe,g.fn[Ae].noConflict=function(){return g.fn[Ae]=ke,Xe._jQueryInterface};var $e="popover",Ge="bs.popover",Je="."+Ge,Ze=g.fn[$e],tn="bs-popover",en=new RegExp("(^|\\s)"+tn+"\\S+","g"),nn=l({},Xe.Default,{placement:"right",trigger:"click",content:"",template:''}),on=l({},Xe.DefaultType,{content:"(string|element|function)"}),rn="fade",sn="show",an=".popover-header",ln=".popover-body",cn={HIDE:"hide"+Je,HIDDEN:"hidden"+Je,SHOW:"show"+Je,SHOWN:"shown"+Je,INSERTED:"inserted"+Je,CLICK:"click"+Je,FOCUSIN:"focusin"+Je,FOCUSOUT:"focusout"+Je,MOUSEENTER:"mouseenter"+Je,MOUSELEAVE:"mouseleave"+Je},hn=function(t){function i(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),(t.prototype.constructor=t).__proto__=e}(i,t);var e=i.prototype;return e.isWithContent=function(){return this.getTitle()||this._getContent()},e.addAttachmentClass=function(t){g(this.getTipElement()).addClass(tn+"-"+t)},e.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},e.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(an),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(ln),e),t.removeClass(rn+" "+sn)},e._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},e._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(en);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t'); -document.write(''); -document.write(''); -document.write(''); -document.write(''); +document.write(''); +document.write(''); +document.write(''); +document.write(''); +document.write(''); +document.write('
'); function GenerateAuthorization(path, method, params) { let key = "admin"; @@ -46,9 +47,9 @@ function AjaxError(response) { if (errCode === 401) { // 跳转到登录页 if (window.frames.length !== parent.frames.length) { - parent.window.open("/login", '_self'); - } else { - window.open("/login", '_self'); + parent.window.open("/login",'_self'); + }else{ + window.open("/login",'_self'); } return; } @@ -107,7 +108,6 @@ function AjaxMultipartForm(method, url, params, beforeSendFunction, successFunct }); } - function AjaxFormNoAsync(method, url, params, beforeSendFunction, successFunction, errorFunction) { let authorizationData = GenerateAuthorization(url, method, params); diff --git a/assets/bootstrap/js/index.min.js b/web/static/admin/js/index.min.js old mode 100755 new mode 100644 similarity index 99% rename from assets/bootstrap/js/index.min.js rename to web/static/admin/js/index.min.js index 6fde593..df8930e --- a/assets/bootstrap/js/index.min.js +++ b/web/static/admin/js/index.min.js @@ -3,7 +3,7 @@ $("body").on('click','[data-stopPropagation]',function (e) { e.stopPropagation(); }); - + // 滚动条 if($('.lyear-scroll')[0]) { $('.lyear-scroll').each(function(){ @@ -13,26 +13,26 @@ }); }); } - + // 侧边栏 $(document).on('click', '.lyear-aside-toggler', function() { $('.lyear-layout-sidebar').toggleClass('lyear-aside-open'); $("body").toggleClass('lyear-layout-sidebar-close'); - + if ($('.lyear-mask-modal').length == 0) { $('
').prependTo('body'); } else { $( '.lyear-mask-modal' ).remove(); } }); - + // 遮罩层 $(document).on('click', '.lyear-mask-modal', function() { $( this ).remove(); $('.lyear-layout-sidebar').toggleClass('lyear-aside-open'); $('body').toggleClass('lyear-layout-sidebar-close'); }); - + // 侧边栏导航 $(document).on('click', '.nav-item-has-subnav > a', function() { $subnavToggle = jQuery( this ); @@ -44,7 +44,7 @@ $navHasSubnav.siblings().find('.nav-subnav:visible').slideUp(500).parent().removeClass('open'); $subnav.slideToggle( 300, function() { $navHasSubnav.toggleClass( 'open' ); - + // 新增滚动条处理 var scrollHeight = 0; pervTotal = $topHasSubNav.prevAll().length, @@ -53,7 +53,7 @@ thisScroll = $scrollBox.scrollTop(), thisSubHeight = $(this).outerHeight(), footHeight = 121; - + if (footHeight + innerHeight - boxHeight >= (pervTotal * 48)) { scrollHeight = pervTotal * 48; } @@ -73,12 +73,12 @@ } }); }); - + // 读取cookie中的主题设置 var the_logo_bg = $.cookie('the_logo_bg'), the_header_bg = $.cookie('the_header_bg'), the_sidebar_bg = $.cookie('the_sidebar_bg'); - + if (the_logo_bg) $('body').attr('data-logobg', the_logo_bg); if (the_header_bg) $('body').attr('data-headerbg', the_header_bg); if (the_sidebar_bg) $('body').attr('data-sidebarbg', the_sidebar_bg); @@ -98,7 +98,7 @@ $this.val() == the_sidebar_bg && $this.prop("checked", true); } }); - + // 设置主题配色 setTheme = function(input_name, data_name) { $("input[name='"+input_name+"']").click(function(){ @@ -109,7 +109,7 @@ setTheme('sidebar_bg', 'data-sidebarbg'); setTheme('logo_bg', 'data-logobg'); setTheme('header_bg', 'data-headerbg'); - + // 选项卡 $('#iframe-content').multitabs({ iframe : true, @@ -136,4 +136,4 @@ $.cookie('_nav_url_', $(this).attr('href'), {expires: date}); $.cookie('_nav_title_', $(this).text(), {expires: date}); }); -}); \ No newline at end of file +}); diff --git a/web/static/admin/js/jquery.cookie.min.js b/web/static/admin/js/jquery.cookie.min.js new file mode 100644 index 0000000..36d6b65 --- /dev/null +++ b/web/static/admin/js/jquery.cookie.min.js @@ -0,0 +1,2 @@ +/*! jquery.cookie v1.4.1 | MIT */ +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?a(require("jquery")):a(jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}}); diff --git a/web/static/admin/js/jquery.min.js b/web/static/admin/js/jquery.min.js new file mode 100644 index 0000000..a1c07fd --- /dev/null +++ b/web/static/admin/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0t[n]-t[o]-1&&(t.reach[h]="end"),e&&(f.dispatchEvent(c("ps-scroll-"+h)),e<0?f.dispatchEvent(c("ps-scroll-"+u)):e>0&&f.dispatchEvent(c("ps-scroll-"+d)),r&&a(t,h)),t.reach[h]&&(e||l)&&f.dispatchEvent(c("ps-"+h+"-reach-"+t.reach[h]))}function u(t){return parseInt(t,10)||0}function d(t){return r(t,"input,[contenteditable]")||r(t,"select,[contenteditable]")||r(t,"textarea,[contenteditable]")||r(t,"button,[contenteditable]")}function f(e){var i=t(e);return u(i.width)+u(i.paddingLeft)+u(i.paddingRight)+u(i.borderLeftWidth)+u(i.borderRightWidth)}function p(t,e){return t.settings.minScrollbarLength&&(e=Math.max(e,t.settings.minScrollbarLength)),t.settings.maxScrollbarLength&&(e=Math.min(e,t.settings.maxScrollbarLength)),e}function b(t,i){var r={width:i.railXWidth},l=Math.floor(t.scrollTop);i.isRtl?r.left=i.negativeScrollAdjustment+t.scrollLeft+i.containerWidth-i.contentWidth:r.left=t.scrollLeft,i.isScrollbarXUsingBottom?r.bottom=i.scrollbarXBottom-l:r.top=i.scrollbarXTop+l,e(i.scrollbarXRail,r);var n={top:l,height:i.railYHeight};i.isScrollbarYUsingRight?i.isRtl?n.right=i.contentWidth-(i.negativeScrollAdjustment+t.scrollLeft)-i.scrollbarYRight-i.scrollbarYOuterWidth:n.right=i.scrollbarYRight-t.scrollLeft:i.isRtl?n.left=i.negativeScrollAdjustment+t.scrollLeft+2*i.containerWidth-i.contentWidth-i.scrollbarYLeft-i.scrollbarYOuterWidth:n.left=i.scrollbarYLeft+t.scrollLeft,e(i.scrollbarYRail,n),e(i.scrollbarX,{left:i.scrollbarXLeft,width:i.scrollbarXWidth-i.railBorderXWidth}),e(i.scrollbarY,{top:i.scrollbarYTop,height:i.scrollbarYHeight-i.railBorderYWidth})}function g(t,e){function i(e){b[d]=g+Y*(e[a]-v),o(t,f),R(t),e.stopPropagation(),e.preventDefault()}function r(){s(t,f),t[p].classList.remove(m.state.clicking),t.event.unbind(t.ownerDocument,"mousemove",i)}var l=e[0],n=e[1],a=e[2],c=e[3],h=e[4],u=e[5],d=e[6],f=e[7],p=e[8],b=t.element,g=null,v=null,Y=null;t.event.bind(t[h],"mousedown",function(e){g=b[d],v=e[a],Y=(t[n]-t[l])/(t[c]-t[u]),t.event.bind(t.ownerDocument,"mousemove",i),t.event.once(t.ownerDocument,"mouseup",r),t[p].classList.add(m.state.clicking),e.stopPropagation(),e.preventDefault()})}var v="undefined"!=typeof Element&&(Element.prototype.matches||Element.prototype.webkitMatchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector),m={main:"ps",element:{thumb:function(t){return"ps__thumb-"+t},rail:function(t){return"ps__rail-"+t},consuming:"ps__child--consume"},state:{focus:"ps--focus",clicking:"ps--clicking",active:function(t){return"ps--active-"+t},scrolling:function(t){return"ps--scrolling-"+t}}},Y={x:null,y:null},X=function(t){this.element=t,this.handlers={}},w={isEmpty:{configurable:!0}};X.prototype.bind=function(t,e){void 0===this.handlers[t]&&(this.handlers[t]=[]),this.handlers[t].push(e),this.element.addEventListener(t,e,!1)},X.prototype.unbind=function(t,e){var i=this;this.handlers[t]=this.handlers[t].filter(function(r){return!(!e||r===e)||(i.element.removeEventListener(t,r,!1),!1)})},X.prototype.unbindAll=function(){var t=this;for(var e in t.handlers)t.unbind(e)},w.isEmpty.get=function(){var t=this;return Object.keys(this.handlers).every(function(e){return 0===t.handlers[e].length})},Object.defineProperties(X.prototype,w);var y=function(){this.eventElements=[]};y.prototype.eventElement=function(t){var e=this.eventElements.filter(function(e){return e.element===t})[0];return e||(e=new X(t),this.eventElements.push(e)),e},y.prototype.bind=function(t,e,i){this.eventElement(t).bind(e,i)},y.prototype.unbind=function(t,e,i){var r=this.eventElement(t);r.unbind(e,i),r.isEmpty&&this.eventElements.splice(this.eventElements.indexOf(r),1)},y.prototype.unbindAll=function(){this.eventElements.forEach(function(t){return t.unbindAll()}),this.eventElements=[]},y.prototype.once=function(t,e,i){var r=this.eventElement(t),l=function(t){r.unbind(e,l),i(t)};r.bind(e,l)};var W=function(t,e,i,r,l){void 0===r&&(r=!0),void 0===l&&(l=!1);var n;if("top"===e)n=["contentHeight","containerHeight","scrollTop","y","up","down"];else{if("left"!==e)throw new Error("A proper axis should be provided");n=["contentWidth","containerWidth","scrollLeft","x","left","right"]}h(t,i,n,r,l)},L={isWebKit:"undefined"!=typeof document&&"WebkitAppearance"in document.documentElement.style,supportsTouch:"undefined"!=typeof window&&("ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch),supportsIePointer:"undefined"!=typeof navigator&&navigator.msMaxTouchPoints,isChrome:"undefined"!=typeof navigator&&/Chrome/i.test(navigator&&navigator.userAgent)},R=function(t){var e=t.element,i=Math.floor(e.scrollTop);t.containerWidth=e.clientWidth,t.containerHeight=e.clientHeight,t.contentWidth=e.scrollWidth,t.contentHeight=e.scrollHeight,e.contains(t.scrollbarXRail)||(n(e,m.element.rail("x")).forEach(function(t){return l(t)}),e.appendChild(t.scrollbarXRail)),e.contains(t.scrollbarYRail)||(n(e,m.element.rail("y")).forEach(function(t){return l(t)}),e.appendChild(t.scrollbarYRail)),!t.settings.suppressScrollX&&t.containerWidth+t.settings.scrollXMarginOffset=t.railXWidth-t.scrollbarXWidth&&(t.scrollbarXLeft=t.railXWidth-t.scrollbarXWidth),t.scrollbarYTop>=t.railYHeight-t.scrollbarYHeight&&(t.scrollbarYTop=t.railYHeight-t.scrollbarYHeight),b(e,t),t.scrollbarXActive?e.classList.add(m.state.active("x")):(e.classList.remove(m.state.active("x")),t.scrollbarXWidth=0,t.scrollbarXLeft=0,e.scrollLeft=0),t.scrollbarYActive?e.classList.add(m.state.active("y")):(e.classList.remove(m.state.active("y")),t.scrollbarYHeight=0,t.scrollbarYTop=0,e.scrollTop=0)},T={"click-rail":function(t){t.event.bind(t.scrollbarY,"mousedown",function(t){return t.stopPropagation()}),t.event.bind(t.scrollbarYRail,"mousedown",function(e){var i=e.pageY-window.pageYOffset-t.scrollbarYRail.getBoundingClientRect().top>t.scrollbarYTop?1:-1;t.element.scrollTop+=i*t.containerHeight,R(t),e.stopPropagation()}),t.event.bind(t.scrollbarX,"mousedown",function(t){return t.stopPropagation()}),t.event.bind(t.scrollbarXRail,"mousedown",function(e){var i=e.pageX-window.pageXOffset-t.scrollbarXRail.getBoundingClientRect().left>t.scrollbarXLeft?1:-1;t.element.scrollLeft+=i*t.containerWidth,R(t),e.stopPropagation()})},"drag-thumb":function(t){g(t,["containerWidth","contentWidth","pageX","railXWidth","scrollbarX","scrollbarXWidth","scrollLeft","x","scrollbarXRail"]),g(t,["containerHeight","contentHeight","pageY","railYHeight","scrollbarY","scrollbarYHeight","scrollTop","y","scrollbarYRail"])},keyboard:function(t){function e(e,r){var l=Math.floor(i.scrollTop);if(0===e){if(!t.scrollbarYActive)return!1;if(0===l&&r>0||l>=t.contentHeight-t.containerHeight&&r<0)return!t.settings.wheelPropagation}var n=i.scrollLeft;if(0===r){if(!t.scrollbarXActive)return!1;if(0===n&&e<0||n>=t.contentWidth-t.containerWidth&&e>0)return!t.settings.wheelPropagation}return!0}var i=t.element,l=function(){return r(i,":hover")},n=function(){return r(t.scrollbarX,":focus")||r(t.scrollbarY,":focus")};t.event.bind(t.ownerDocument,"keydown",function(r){if(!(r.isDefaultPrevented&&r.isDefaultPrevented()||r.defaultPrevented)&&(l()||n())){var o=document.activeElement?document.activeElement:t.ownerDocument.activeElement;if(o){if("IFRAME"===o.tagName)o=o.contentDocument.activeElement;else for(;o.shadowRoot;)o=o.shadowRoot.activeElement;if(d(o))return}var s=0,a=0;switch(r.which){case 37:s=r.metaKey?-t.contentWidth:r.altKey?-t.containerWidth:-30;break;case 38:a=r.metaKey?t.contentHeight:r.altKey?t.containerHeight:30;break;case 39:s=r.metaKey?t.contentWidth:r.altKey?t.containerWidth:30;break;case 40:a=r.metaKey?-t.contentHeight:r.altKey?-t.containerHeight:-30;break;case 32:a=r.shiftKey?t.containerHeight:-t.containerHeight;break;case 33:a=t.containerHeight;break;case 34:a=-t.containerHeight;break;case 36:a=t.contentHeight;break;case 35:a=-t.contentHeight;break;default:return}t.settings.suppressScrollX&&0!==s||t.settings.suppressScrollY&&0!==a||(i.scrollTop-=a,i.scrollLeft+=s,R(t),e(s,a)&&r.preventDefault())}})},wheel:function(e){function i(t,i){var r=Math.floor(o.scrollTop),l=0===o.scrollTop,n=r+o.offsetHeight===o.scrollHeight,s=0===o.scrollLeft,a=o.scrollLeft+o.offsetWidth===o.scrollWidth;return!(Math.abs(i)>Math.abs(t)?l||n:s||a)||!e.settings.wheelPropagation}function r(t){var e=t.deltaX,i=-1*t.deltaY;return void 0!==e&&void 0!==i||(e=-1*t.wheelDeltaX/6,i=t.wheelDeltaY/6),t.deltaMode&&1===t.deltaMode&&(e*=10,i*=10),e!==e&&i!==i&&(e=0,i=t.wheelDelta),t.shiftKey?[-i,-e]:[e,i]}function l(e,i,r){if(!L.isWebKit&&o.querySelector("select:focus"))return!0;if(!o.contains(e))return!1;for(var l=e;l&&l!==o;){if(l.classList.contains(m.element.consuming))return!0;var n=t(l);if([n.overflow,n.overflowX,n.overflowY].join("").match(/(scroll|auto)/)){var s=l.scrollHeight-l.clientHeight;if(s>0&&!(0===l.scrollTop&&r>0||l.scrollTop===s&&r<0))return!0;var a=l.scrollWidth-l.clientWidth;if(a>0&&!(0===l.scrollLeft&&i<0||l.scrollLeft===a&&i>0))return!0}l=l.parentNode}return!1}function n(t){var n=r(t),s=n[0],a=n[1];if(!l(t.target,s,a)){var c=!1;e.settings.useBothWheelAxes?e.scrollbarYActive&&!e.scrollbarXActive?(a?o.scrollTop-=a*e.settings.wheelSpeed:o.scrollTop+=s*e.settings.wheelSpeed,c=!0):e.scrollbarXActive&&!e.scrollbarYActive&&(s?o.scrollLeft+=s*e.settings.wheelSpeed:o.scrollLeft-=a*e.settings.wheelSpeed,c=!0):(o.scrollTop-=a*e.settings.wheelSpeed,o.scrollLeft+=s*e.settings.wheelSpeed),R(e),(c=c||i(s,a))&&!t.ctrlKey&&(t.stopPropagation(),t.preventDefault())}}var o=e.element;void 0!==window.onwheel?e.event.bind(o,"wheel",n):void 0!==window.onmousewheel&&e.event.bind(o,"mousewheel",n)},touch:function(e){function i(t,i){var r=Math.floor(h.scrollTop),l=h.scrollLeft,n=Math.abs(t),o=Math.abs(i);if(o>n){if(i<0&&r===e.contentHeight-e.containerHeight||i>0&&0===r)return 0===window.scrollY&&i>0&&L.isChrome}else if(n>o&&(t<0&&l===e.contentWidth-e.containerWidth||t>0&&0===l))return!0;return!0}function r(t,i){h.scrollTop-=i,h.scrollLeft-=t,R(e)}function l(t){return t.targetTouches?t.targetTouches[0]:t}function n(t){return!(t.pointerType&&"pen"===t.pointerType&&0===t.buttons||(!t.targetTouches||1!==t.targetTouches.length)&&(!t.pointerType||"mouse"===t.pointerType||t.pointerType===t.MSPOINTER_TYPE_MOUSE))}function o(t){if(n(t)){var e=l(t);u.pageX=e.pageX,u.pageY=e.pageY,d=(new Date).getTime(),null!==p&&clearInterval(p)}}function s(e,i,r){if(!h.contains(e))return!1;for(var l=e;l&&l!==h;){if(l.classList.contains(m.element.consuming))return!0;var n=t(l);if([n.overflow,n.overflowX,n.overflowY].join("").match(/(scroll|auto)/)){var o=l.scrollHeight-l.clientHeight;if(o>0&&!(0===l.scrollTop&&r>0||l.scrollTop===o&&r<0))return!0;var s=l.scrollLeft-l.clientWidth;if(s>0&&!(0===l.scrollLeft&&i<0||l.scrollLeft===s&&i>0))return!0}l=l.parentNode}return!1}function a(t){if(n(t)){var e=l(t),o={pageX:e.pageX,pageY:e.pageY},a=o.pageX-u.pageX,c=o.pageY-u.pageY;if(s(t.target,a,c))return;r(a,c),u=o;var h=(new Date).getTime(),p=h-d;p>0&&(f.x=a/p,f.y=c/p,d=h),i(a,c)&&t.preventDefault()}}function c(){e.settings.swipeEasing&&(clearInterval(p),p=setInterval(function(){e.isInitialized?clearInterval(p):f.x||f.y?Math.abs(f.x)<.01&&Math.abs(f.y)<.01?clearInterval(p):(r(30*f.x,30*f.y),f.x*=.8,f.y*=.8):clearInterval(p)},10))}if(L.supportsTouch||L.supportsIePointer){var h=e.element,u={},d=0,f={},p=null;L.supportsTouch?(e.event.bind(h,"touchstart",o),e.event.bind(h,"touchmove",a),e.event.bind(h,"touchend",c)):L.supportsIePointer&&(window.PointerEvent?(e.event.bind(h,"pointerdown",o),e.event.bind(h,"pointermove",a),e.event.bind(h,"pointerup",c)):window.MSPointerEvent&&(e.event.bind(h,"MSPointerDown",o),e.event.bind(h,"MSPointerMove",a),e.event.bind(h,"MSPointerUp",c)))}}},H=function(r,l){var n=this;if(void 0===l&&(l={}),"string"==typeof r&&(r=document.querySelector(r)),!r||!r.nodeName)throw new Error("no element is specified to initialize PerfectScrollbar");this.element=r,r.classList.add(m.main),this.settings={handlers:["click-rail","drag-thumb","keyboard","wheel","touch"],maxScrollbarLength:null,minScrollbarLength:null,scrollingThreshold:1e3,scrollXMarginOffset:0,scrollYMarginOffset:0,suppressScrollX:!1,suppressScrollY:!1,swipeEasing:!0,useBothWheelAxes:!1,wheelPropagation:!0,wheelSpeed:1};for(var o in l)n.settings[o]=l[o];this.containerWidth=null,this.containerHeight=null,this.contentWidth=null,this.contentHeight=null;var s=function(){return r.classList.add(m.state.focus)},a=function(){return r.classList.remove(m.state.focus)};this.isRtl="rtl"===t(r).direction,this.isNegativeScroll=function(){var t=r.scrollLeft,e=null;return r.scrollLeft=-1,e=r.scrollLeft<0,r.scrollLeft=t,e}(),this.negativeScrollAdjustment=this.isNegativeScroll?r.scrollWidth-r.clientWidth:0,this.event=new y,this.ownerDocument=r.ownerDocument||document,this.scrollbarXRail=i(m.element.rail("x")),r.appendChild(this.scrollbarXRail),this.scrollbarX=i(m.element.thumb("x")),this.scrollbarXRail.appendChild(this.scrollbarX),this.scrollbarX.setAttribute("tabindex",0),this.event.bind(this.scrollbarX,"focus",s),this.event.bind(this.scrollbarX,"blur",a),this.scrollbarXActive=null,this.scrollbarXWidth=null,this.scrollbarXLeft=null;var c=t(this.scrollbarXRail);this.scrollbarXBottom=parseInt(c.bottom,10),isNaN(this.scrollbarXBottom)?(this.isScrollbarXUsingBottom=!1,this.scrollbarXTop=u(c.top)):this.isScrollbarXUsingBottom=!0,this.railBorderXWidth=u(c.borderLeftWidth)+u(c.borderRightWidth),e(this.scrollbarXRail,{display:"block"}),this.railXMarginWidth=u(c.marginLeft)+u(c.marginRight),e(this.scrollbarXRail,{display:""}),this.railXWidth=null,this.railXRatio=null,this.scrollbarYRail=i(m.element.rail("y")),r.appendChild(this.scrollbarYRail),this.scrollbarY=i(m.element.thumb("y")),this.scrollbarYRail.appendChild(this.scrollbarY),this.scrollbarY.setAttribute("tabindex",0),this.event.bind(this.scrollbarY,"focus",s),this.event.bind(this.scrollbarY,"blur",a),this.scrollbarYActive=null,this.scrollbarYHeight=null,this.scrollbarYTop=null;var h=t(this.scrollbarYRail);this.scrollbarYRight=parseInt(h.right,10),isNaN(this.scrollbarYRight)?(this.isScrollbarYUsingRight=!1,this.scrollbarYLeft=u(h.left)):this.isScrollbarYUsingRight=!0,this.scrollbarYOuterWidth=this.isRtl?f(this.scrollbarY):null,this.railBorderYWidth=u(h.borderTopWidth)+u(h.borderBottomWidth),e(this.scrollbarYRail,{display:"block"}),this.railYMarginHeight=u(h.marginTop)+u(h.marginBottom),e(this.scrollbarYRail,{display:""}),this.railYHeight=null,this.railYRatio=null,this.reach={x:r.scrollLeft<=0?"start":r.scrollLeft>=this.contentWidth-this.containerWidth?"end":null,y:r.scrollTop<=0?"start":r.scrollTop>=this.contentHeight-this.containerHeight?"end":null},this.isAlive=!0,this.settings.handlers.forEach(function(t){return T[t](n)}),this.lastScrollTop=Math.floor(r.scrollTop),this.lastScrollLeft=r.scrollLeft,this.event.bind(this.element,"scroll",function(t){return n.onScroll(t)}),R(this)};return H.prototype.update=function(){this.isAlive&&(this.negativeScrollAdjustment=this.isNegativeScroll?this.element.scrollWidth-this.element.clientWidth:0,e(this.scrollbarXRail,{display:"block"}),e(this.scrollbarYRail,{display:"block"}),this.railXMarginWidth=u(t(this.scrollbarXRail).marginLeft)+u(t(this.scrollbarXRail).marginRight),this.railYMarginHeight=u(t(this.scrollbarYRail).marginTop)+u(t(this.scrollbarYRail).marginBottom),e(this.scrollbarXRail,{display:"none"}),e(this.scrollbarYRail,{display:"none"}),R(this),W(this,"top",0,!1,!0),W(this,"left",0,!1,!0),e(this.scrollbarXRail,{display:""}),e(this.scrollbarYRail,{display:""}))},H.prototype.onScroll=function(t){this.isAlive&&(R(this),W(this,"top",this.element.scrollTop-this.lastScrollTop),W(this,"left",this.element.scrollLeft-this.lastScrollLeft),this.lastScrollTop=Math.floor(this.element.scrollTop),this.lastScrollLeft=this.element.scrollLeft)},H.prototype.destroy=function(){this.isAlive&&(this.event.unbindAll(),l(this.scrollbarX),l(this.scrollbarY),l(this.scrollbarXRail),l(this.scrollbarYRail),this.removePsClasses(),this.element=null,this.scrollbarX=null,this.scrollbarY=null,this.scrollbarXRail=null,this.scrollbarYRail=null,this.isAlive=!1)},H.prototype.removePsClasses=function(){this.element.className=this.element.className.split(" ").filter(function(t){return!t.match(/^ps([-_].+|)$/)}).join(" ")},H}); diff --git a/assets/bootstrap/js/popper.min.js b/web/static/admin/js/popper.min.js old mode 100755 new mode 100644 similarity index 99% rename from assets/bootstrap/js/popper.min.js rename to web/static/admin/js/popper.min.js index 67a84f5..30e740c --- a/assets/bootstrap/js/popper.min.js +++ b/web/static/admin/js/popper.min.js @@ -1,4 +1,4 @@ /* Copyright (C) Federico Zivolo 2019 Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). - */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function r(e){return 11===e?pe:10===e?se:pe||se}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),le({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=fe({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},le(n,m,$(v)),le(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ge.FLIP:p=[n,i];break;case ge.CLOCKWISE:p=G(n);break;case ge.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u),E=!!t.flipVariationsByContent&&(w&&'start'===r&&c||w&&'end'===r&&h||!w&&'start'===r&&u||!w&&'end'===r&&g),v=y||E;(m||b||v)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),v&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=fe({},e.offsets.popper,C(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport',flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=D(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!me),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=B('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=fe({},E,e.attributes),e.styles=fe({},m,e.styles),e.arrowStyles=fe({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return V(e.instance.popper,e.styles),j(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&V(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),V(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ue}); \ No newline at end of file + */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function r(e){return 11===e?pe:10===e?se:pe||se}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),le({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=fe({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},le(n,m,$(v)),le(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ge.FLIP:p=[n,i];break;case ge.CLOCKWISE:p=G(n);break;case ge.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u),E=!!t.flipVariationsByContent&&(w&&'start'===r&&c||w&&'end'===r&&h||!w&&'start'===r&&u||!w&&'end'===r&&g),v=y||E;(m||b||v)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),v&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=fe({},e.offsets.popper,C(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport',flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=D(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!me),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=B('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=fe({},E,e.attributes),e.styles=fe({},m,e.styles),e.arrowStyles=fe({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return V(e.instance.popper,e.styles),j(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&V(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),V(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ue}); diff --git a/web/static/index/css/bootstrap.css b/web/static/index/css/bootstrap.css new file mode 100644 index 0000000..1ee6246 --- /dev/null +++ b/web/static/index/css/bootstrap.css @@ -0,0 +1 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-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:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}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{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{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-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:before,:after{background:transparent!important;color:#000!important;box-shadow:none!important;text-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/glyphicons-halflings-regular.eot);src:url(fonts/glyphicons/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(fonts/glyphicons/glyphicons-halflings-regular.woff) format('woff'),url(fonts/glyphicons/glyphicons-halflings-regular.ttf) format('truetype'),url(fonts/glyphicons/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:400;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-door:before{content:"\1f6aa"}.glyphicon-key:before{content:"\1F511"}.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:transparent}body{font-family:Arimo,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:1.42857143;color:#2c2e2f;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#373e4a;text-decoration:none}a:hover,a:focus{color:#16191e;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:0}.img-thumbnail{padding:7px;line-height:1.42857143;background-color:#fff;border:1px solid #e1e1e1;border-radius:0;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;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:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:18px;margin-bottom:9px}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:9px;margin-bottom:9px}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:33px}h2,.h2{font-size:27px}h3,.h3{font-size:23px}h4,.h4{font-size:17px}h5,.h5{font-size:13px}h6,.h6{font-size:12px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:14px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:19.5px}}small,.small{font-size:92%}mark,.mark{background-color:#ffba00;padding:.2em}.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:#9d9d9d}.text-primary{color:#2c2e2f}a.text-primary:hover{color:#131415}.text-success{color:#fff}a.text-success:hover{color:#e6e6e6}.text-info{color:#fff}a.text-info:hover{color:#e6e6e6}.text-warning{color:#fff}a.text-warning:hover{color:#e6e6e6}.text-danger{color:#fff}a.text-danger:hover{color:#e6e6e6}.bg-primary{color:#fff;background-color:#2c2e2f}a.bg-primary:hover{background-color:#131415}.bg-success{background-color:#8dc63f}a.bg-success:hover{background-color:#72a230}.bg-info{background-color:#40bbea}a.bg-info:hover{background-color:#18a8df}.bg-warning{background-color:#ffba00}a.bg-warning:hover{background-color:#cc9500}.bg-danger{background-color:#cc3f44}a.bg-danger:hover{background-color:#ab2d32}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:9px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:18px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;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:9px 18px;margin:0 0 18px;font-size:16.25px;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;border-right:5px solid #eee;border-left:0;text-align:right}.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:18px;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:0}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:0;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #e4e4e4;border-radius:0}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{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-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-left:15px;padding-right: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:#9d9d9d;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:18px}.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 #eee}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #eee}.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 #eee}.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 #eee}.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 #eee}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.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:#8dc63f}.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:#80b636}.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:#40bbea}.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:#29b3e7}.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:#ffba00}.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:#e6a700}.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:#cc3f44}.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:#bf3338}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #eee}.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{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:18px;font-size:19.5px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}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:13px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:32px;padding:6px 12px;font-size:13px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #e4e4e4;border-radius:0;-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,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:rgba(104,184,40,.5);outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(104,184,40,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(104,184,40,.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.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:32px}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:45px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:18px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;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-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:0}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:0}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}.input-lg{height:45px;padding:10px 16px;font-size:17px;line-height:1.33;border-radius:0}select.input-lg{height:45px;line-height:45px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:45px;padding:10px 16px;font-size:17px;line-height:1.33;border-radius:0}select.form-group-lg .form-control{height:45px;line-height:45px}textarea.form-group-lg .form-control,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:32px;height:32px;line-height:32px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:45px;height:45px;line-height:45px}.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:#fff}.has-success .form-control{border-color:#fff;-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:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #fff}.has-success .input-group-addon{color:#fff;border-color:#fff;background-color:#8dc63f}.has-success .form-control-feedback{color:#fff}.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:#fff}.has-warning .form-control{border-color:#fff;-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:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #fff}.has-warning .input-group-addon{color:#fff;border-color:#fff;background-color:#ffba00}.has-warning .form-control-feedback{color:#fff}.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:#fff}.has-error .form-control{border-color:#fff;-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:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #fff}.has-error .input-group-addon{color:#fff;border-color:#fff;background-color:#cc3f44}.has-error .form-control-feedback{color:#fff}.has-feedback label~.form-control-feedback{top:23px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#6a6e71}@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{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:25px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:13px;line-height:1.42857143;border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.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{outline:0;background-image:none;-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{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.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:#2c2e2f;border-color:#202122}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#131415;border-color:#020202}.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:#2c2e2f;border-color:#202122}.btn-primary .badge{color:#2c2e2f;background-color:#fff}.btn-success{color:#fff;background-color:#8dc63f;border-color:#80b636}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#72a230;border-color:#5f8628}.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:#8dc63f;border-color:#80b636}.btn-success .badge{color:#8dc63f;background-color:#fff}.btn-info{color:#fff;background-color:#40bbea;border-color:#29b3e7}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#18a8df;border-color:#1590be}.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:#40bbea;border-color:#29b3e7}.btn-info .badge{color:#40bbea;background-color:#fff}.btn-warning{color:#fff;background-color:#ffba00;border-color:#e6a700}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#cc9500;border-color:#a87b00}.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:#ffba00;border-color:#e6a700}.btn-warning .badge{color:#ffba00;background-color:#fff}.btn-danger{color:#fff;background-color:#cc3f44;border-color:#bf3338}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#ab2d32;border-color:#8e262a}.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:#cc3f44;border-color:#bf3338}.btn-danger .badge{color:#cc3f44;background-color:#fff}.btn-link{color:#373e4a;font-weight:400;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:#16191e;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:17px;line-height:1.33;border-radius:0}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:0}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:0}.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-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.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}.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;list-style:none;font-size:13px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid #ddd;border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#2c2e2f}.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;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-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>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right: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:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:0;border-top-left-radius:0}.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-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;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-left:0;padding-right: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:45px;padding:10px 16px;font-size:17px;line-height:1.33;border-radius:0}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}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:0}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:13px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #e4e4e4;border-radius:0}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:0}.input-group-addon.input-lg{padding:10px 16px;font-size:17px;border-radius:0}.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-bottom-right-radius:0;border-top-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-bottom-left-radius:0;border-top-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{margin-bottom:0;padding-left: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;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#373e4a}.nav .nav-divider{height:1px;margin:8px 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: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;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.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:0}.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: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:0}.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:#2c2e2f}.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{text-align:center;margin-bottom:5px}.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:0}.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: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-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:65px;margin-bottom:18px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:0}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;visibility:visible!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right: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;padding:23.5px 15px;font-size:17px;line-height:18px;height:65px}.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;margin-right:15px;padding:9px 10px;margin-top:15.5px;margin-bottom:15.5px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0}.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:11.75px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:18px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;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:18px}.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:23.5px;padding-bottom:23.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 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);margin-top:16.5px;margin-bottom:16.5px}@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;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:16.5px;margin-bottom:16.5px}.navbar-btn.btn-sm{margin-top:17.5px;margin-bottom:17.5px}.navbar-btn.btn-xs{margin-top:21.5px;margin-bottom:21.5px}.navbar-text{margin-top:23.5px;margin-bottom:23.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right: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:#fff;border-color:#eee}.navbar-default .navbar-brand{color:#2c2e2f}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#131415;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#979898}.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:#f5f5f5}.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:#eee}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#f5f5f5;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#979898}.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:#f5f5f5}.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:#979898}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#979898}.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:#fff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#bfbfbf}.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{background-color:#080808;color:#fff}@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:#bfbfbf}.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:#bfbfbf}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#bfbfbf}.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:18px;list-style:none;background-color:#f5f5f5;border-radius:0}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#373e4a;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#16191e;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;background-color:#2c2e2f;border-color:#2c2e2f;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:17px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.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-bottom-left-radius:0;border-top-left-radius:0}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pager{padding-left:0;margin:18px 0;list-style:none;text-align:center}.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:0}.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;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;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:#2c2e2f}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#131415}.label-success{background-color:#8dc63f}.label-success[href]:hover,.label-success[href]:focus{background-color:#72a230}.label-info{background-color:#40bbea}.label-info[href]:hover,.label-info[href]:focus{background-color:#18a8df}.label-warning{background-color:#ffba00}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#cc9500}.label-danger{background-color:#cc3f44}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#ab2d32}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;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:#373e4a;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:20px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:0}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:58.5px}}.thumbnail{display:block;padding:7px;margin-bottom:18px;line-height:1.42857143;background-color:#fff;border:1px solid #e1e1e1;border-radius:0;-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-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#373e4a}.thumbnail .caption{padding:9px;color:#2c2e2f}.alert{padding:15px;margin-bottom:18px;border:1px solid transparent;border-radius:0}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.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{background-color:#8dc63f;border-color:#8dc63f;color:#fff}.alert-success hr{border-top-color:#80b636}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#40bbea;border-color:#40bbea;color:#fff}.alert-info hr{border-top-color:#29b3e7}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#ffba00;border-color:#ffba00;color:#fff}.alert-warning hr{border-top-color:#e6a700}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#cc3f44;border-color:#cc3f44;color:#fff}.alert-danger hr{border-top-color:#bf3338}.alert-danger .alert-link{color:#e6e6e6}@-webkit-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{overflow:hidden;height:18px;margin-bottom:18px;background-color:#eee;border-radius:0;-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:18px;color:#fff;text-align:center;background-color:#2c2e2f;-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);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:#8dc63f}.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:#40bbea}.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:#ffba00}.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:#cc3f44}.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{zoom:1;overflow:hidden}.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{margin-bottom:20px;padding-left:0}.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-right-radius:0;border-top-left-radius:0}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}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{text-decoration:none;color:#555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777;cursor:not-allowed}.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:#2c2e2f;border-color:#2c2e2f}.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:#909597}.list-group-item-success{color:#fff;background-color:#8dc63f}a.list-group-item-success{color:#fff}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#fff;background-color:#80b636}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#fff;border-color:#fff}.list-group-item-info{color:#fff;background-color:#40bbea}a.list-group-item-info{color:#fff}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#fff;background-color:#29b3e7}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#fff;border-color:#fff}.list-group-item-warning{color:#fff;background-color:#ffba00}a.list-group-item-warning{color:#fff}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#fff;background-color:#e6a700}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#fff;border-color:#fff}.list-group-item-danger{color:#fff;background-color:#cc3f44}a.list-group-item-danger{color:#fff}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#fff;background-color:#bf3338}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#fff;border-color:#fff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:0;-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-right-radius:-1px;border-top-left-radius:-1px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:15px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:-1px;border-bottom-left-radius:-1px}.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-right-radius:-1px;border-top-left-radius:-1px}.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:-1px;border-bottom-left-radius:-1px}.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-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:-1px;border-top-left-radius:-1px}.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:-1px;border-top-right-radius:-1px}.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:-1px}.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:-1px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:-1px;border-bottom-left-radius:-1px}.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-left-radius:-1px;border-bottom-right-radius:-1px}.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:-1px}.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:-1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #eee}.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{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:0}.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:#2c2e2f}.panel-primary>.panel-heading{color:#fff;background-color:#2c2e2f;border-color:#2c2e2f}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#2c2e2f}.panel-primary>.panel-heading .badge{color:#2c2e2f;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#2c2e2f}.panel-success{border-color:#8dc63f}.panel-success>.panel-heading{color:#fff;background-color:#8dc63f;border-color:#8dc63f}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#8dc63f}.panel-success>.panel-heading .badge{color:#8dc63f;background-color:#fff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#8dc63f}.panel-info{border-color:#40bbea}.panel-info>.panel-heading{color:#fff;background-color:#40bbea;border-color:#40bbea}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#40bbea}.panel-info>.panel-heading .badge{color:#40bbea;background-color:#fff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#40bbea}.panel-warning{border-color:#ffba00}.panel-warning>.panel-heading{color:#fff;background-color:#ffba00;border-color:#ffba00}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ffba00}.panel-warning>.panel-heading .badge{color:#ffba00;background-color:#fff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ffba00}.panel-danger{border-color:#cc3f44}.panel-danger>.panel-heading{color:#fff;background-color:#cc3f44;border-color:#cc3f44}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#cc3f44}.panel-danger>.panel-heading .badge{color:#cc3f44;background-color:#fff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#cc3f44}.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;left:0;bottom:0;height:100%;width: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:0;-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:0}.well-sm{padding:9px;border-radius:0}.close{float:right;font-size:19.5px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.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;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.43px}.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-left:5px;margin-bottom:0}.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;visibility:visible;font-family:Arimo,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:0}.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{bottom:0;right:5px;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:Arimo,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;line-height:1.42857143;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:0;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:13px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:-1px -1px 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{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;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{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-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;-moz-transition:-moz-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;-moz-perspective:1000;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left: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;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.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:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;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:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.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;line-height:1;font-family:serif}.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%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:transparent}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;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{left:20%;right: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{content:" ";display:table}.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-left:auto;margin-right: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}} \ No newline at end of file diff --git a/web/static/index/css/fonts/elusive/css/animation.css b/web/static/index/css/fonts/elusive/css/animation.css new file mode 100644 index 0000000..88cca8a --- /dev/null +++ b/web/static/index/css/fonts/elusive/css/animation.css @@ -0,0 +1 @@ + .animate-spin {-moz-animation: spin 2s infinite linear;-o-animation: spin 2s infinite linear;-webkit-animation: spin 2s infinite linear;animation: spin 2s infinite linear;display: inline-block;}@-moz-keyframes spin {0% {-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-webkit-transform: rotate(0deg);transform: rotate(0deg);}100% {-moz-transform: rotate(359deg);-o-transform: rotate(359deg);-webkit-transform: rotate(359deg);transform: rotate(359deg);}}@-webkit-keyframes spin {0% {-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-webkit-transform: rotate(0deg);transform: rotate(0deg);}100% {-moz-transform: rotate(359deg);-o-transform: rotate(359deg);-webkit-transform: rotate(359deg);transform: rotate(359deg);}}@-o-keyframes spin {0% {-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-webkit-transform: rotate(0deg);transform: rotate(0deg);}100% {-moz-transform: rotate(359deg);-o-transform: rotate(359deg);-webkit-transform: rotate(359deg);transform: rotate(359deg);}}@-ms-keyframes spin {0% {-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-webkit-transform: rotate(0deg);transform: rotate(0deg);}100% {-moz-transform: rotate(359deg);-o-transform: rotate(359deg);-webkit-transform: rotate(359deg);transform: rotate(359deg);}}@keyframes spin {0% {-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-webkit-transform: rotate(0deg);transform: rotate(0deg);}100% {-moz-transform: rotate(359deg);-o-transform: rotate(359deg);-webkit-transform: rotate(359deg);transform: rotate(359deg);}} diff --git a/web/static/index/css/fonts/elusive/css/elusive-codes.css b/web/static/index/css/fonts/elusive/css/elusive-codes.css new file mode 100644 index 0000000..c8fb3d7 --- /dev/null +++ b/web/static/index/css/fonts/elusive/css/elusive-codes.css @@ -0,0 +1 @@ + .el-glass:before {content: '\e800';}.el-music:before {content: '\e801';}.el-search:before {content: '\e802';}.el-search-circled:before {content: '\e803';}.el-mail:before {content: '\e804';}.el-mail-circled:before {content: '\e805';}.el-heart:before {content: '\e806';}.el-heart-circled:before {content: '\e807';}.el-heart-empty:before {content: '\e808';}.el-star:before {content: '\e809';}.el-star-circled:before {content: '\e80a';}.el-star-empty:before {content: '\e80b';}.el-user:before {content: '\e80c';}.el-group:before {content: '\e80d';}.el-group-circled:before {content: '\e80e';}.el-torso:before {content: '\e80f';}.el-video:before {content: '\e810';}.el-video-circled:before {content: '\e811';}.el-video-alt:before {content: '\e812';}.el-videocam:before {content: '\e813';}.el-video-chat:before {content: '\e814';}.el-picture:before {content: '\e815';}.el-camera:before {content: '\e816';}.el-photo:before {content: '\e817';}.el-photo-circled:before {content: '\e818';}.el-th-large:before {content: '\e819';}.el-th:before {content: '\e81a';}.el-th-list:before {content: '\e81b';}.el-view-mode:before {content: '\e81c';}.el-ok:before {content: '\e81d';}.el-ok-circled:before {content: '\e81e';}.el-ok-circled2:before {content: '\e81f';}.el-cancel:before {content: '\e820';}.el-cancel-circled:before {content: '\e821';}.el-cancel-circled2:before {content: '\e822';}.el-plus:before {content: '\e823';}.el-plus-circled:before {content: '\e824';}.el-minus:before {content: '\e825';}.el-minus-circled:before {content: '\e826';}.el-help:before {content: '\e827';}.el-help-circled:before {content: '\e828';}.el-info-circled:before {content: '\e829';}.el-home:before {content: '\e82a';}.el-home-circled:before {content: '\e82b';}.el-website:before {content: '\e82c';}.el-website-circled:before {content: '\e82d';}.el-attach:before {content: '\e82e';}.el-attach-circled:before {content: '\e82f';}.el-lock:before {content: '\e830';}.el-lock-circled:before {content: '\e831';}.el-lock-open:before {content: '\e832';}.el-lock-open-alt:before {content: '\e833';}.el-eye:before {content: '\e834';}.el-eye-off:before {content: '\e835';}.el-tag:before {content: '\e836';}.el-tags:before {content: '\e837';}.el-bookmark:before {content: '\e838';}.el-bookmark-empty:before {content: '\e839';}.el-flag:before {content: '\e83a';}.el-flag-circled:before {content: '\e83b';}.el-thumbs-up:before {content: '\e83c';}.el-thumbs-down:before {content: '\e83d';}.el-download:before {content: '\e83e';}.el-download-alt:before {content: '\e83f';}.el-upload:before {content: '\e840';}.el-share:before {content: '\e841';}.el-quote:before {content: '\e842';}.el-quote-circled:before {content: '\e843';}.el-export:before {content: '\e844';}.el-pencil:before {content: '\e845';}.el-pencil-circled:before {content: '\e846';}.el-edit:before {content: '\e847';}.el-edit-circled:before {content: '\e848';}.el-edit-alt:before {content: '\e849';}.el-print:before {content: '\e84a';}.el-retweet:before {content: '\e84b';}.el-comment:before {content: '\e84c';}.el-comment-alt:before {content: '\e84d';}.el-bell:before {content: '\e84e';}.el-warning:before {content: '\e84f';}.el-exclamation:before {content: '\e850';}.el-error:before {content: '\e851';}.el-error-alt:before {content: '\e852';}.el-location:before {content: '\e853';}.el-location-circled:before {content: '\e854';}.el-compass:before {content: '\e855';}.el-compass-circled:before {content: '\e856';}.el-trash:before {content: '\e857';}.el-trash-circled:before {content: '\e858';}.el-doc:before {content: '\e859';}.el-doc-circled:before {content: '\e85a';}.el-doc-new:before {content: '\e85b';}.el-doc-new-circled:before {content: '\e85c';}.el-folder:before {content: '\e85d';}.el-folder-circled:before {content: '\e85e';}.el-folder-close:before {content: '\e85f';}.el-folder-open:before {content: '\e860';}.el-rss:before {content: '\e861';}.el-phone:before {content: '\e862';}.el-phone-circled:before {content: '\e863';}.el-cog:before {content: '\e864';}.el-cog-circled:before {content: '\e865';}.el-cogs:before {content: '\e866';}.el-wrench:before {content: '\e867';}.el-wrench-circled:before {content: '\e868';}.el-basket:before {content: '\e869';}.el-basket-circled:before {content: '\e86a';}.el-calendar:before {content: '\e86b';}.el-calendar-circled:before {content: '\e86c';}.el-mic:before {content: '\e86d';}.el-mic-circled:before {content: '\e86e';}.el-volume-off:before {content: '\e86f';}.el-volume-down:before {content: '\e870';}.el-volume:before {content: '\e871';}.el-volume-up:before {content: '\e872';}.el-headphones:before {content: '\e873';}.el-clock:before {content: '\e874';}.el-clock-circled:before {content: '\e875';}.el-lightbulb:before {content: '\e876';}.el-lightbulb-alt:before {content: '\e877';}.el-block:before {content: '\e878';}.el-resize-full:before {content: '\e879';}.el-resize-full-alt:before {content: '\e87a';}.el-resize-small:before {content: '\e87b';}.el-resize-vertical:before {content: '\e87c';}.el-resize-horizontal:before {content: '\e87d';}.el-move:before {content: '\e87e';}.el-zoom-in:before {content: '\e87f';}.el-zoom-out:before {content: '\e880';}.el-down-open:before {content: '\e881';}.el-left-open:before {content: '\e882';}.el-right-open:before {content: '\e883';}.el-up-open:before {content: '\e884';}.el-down:before {content: '\e885';}.el-left:before {content: '\e886';}.el-right:before {content: '\e887';}.el-up:before {content: '\e888';}.el-down-circled:before {content: '\e889';}.el-left-circled:before {content: '\e88a';}.el-right-circled:before {content: '\e88b';}.el-up-circled:before {content: '\e88c';}.el-down-hand:before {content: '\e88d';}.el-left-hand:before {content: '\e88e';}.el-right-hand:before {content: '\e88f';}.el-up-hand:before {content: '\e890';}.el-cw:before {content: '\e891';}.el-cw-circled:before {content: '\e892';}.el-arrows-cw:before {content: '\e893';}.el-shuffle:before {content: '\e894';}.el-play:before {content: '\e895';}.el-play-circled:before {content: '\e896';}.el-play-circled2:before {content: '\e897';}.el-stop:before {content: '\e898';}.el-stop-circled:before {content: '\e899';}.el-pause:before {content: '\e89a';}.el-pause-circled:before {content: '\e89b';}.el-record:before {content: '\e89c';}.el-eject:before {content: '\e89d';}.el-backward:before {content: '\e89e';}.el-backward-circled:before {content: '\e89f';}.el-fast-backward:before {content: '\e8a0';}.el-fast-forward:before {content: '\e8a1';}.el-forward:before {content: '\e8a2';}.el-forward-circled:before {content: '\e8a3';}.el-step-backward:before {content: '\e8a4';}.el-step-forward:before {content: '\e8a5';}.el-target:before {content: '\e8a6';}.el-signal:before {content: '\e8a7';}.el-desktop:before {content: '\e8a8';}.el-desktop-circled:before {content: '\e8a9';}.el-laptop:before {content: '\e8aa';}.el-laptop-circled:before {content: '\e8ab';}.el-network:before {content: '\e8ac';}.el-inbox:before {content: '\e8ad';}.el-inbox-circled:before {content: '\e8ae';}.el-inbox-alt:before {content: '\e8af';}.el-globe:before {content: '\e8b0';}.el-globe-alt:before {content: '\e8b1';}.el-cloud:before {content: '\e8b2';}.el-cloud-circled:before {content: '\e8b3';}.el-flight:before {content: '\e8b4';}.el-leaf:before {content: '\e8b5';}.el-font:before {content: '\e8b6';}.el-fontsize:before {content: '\e8b7';}.el-bold:before {content: '\e8b8';}.el-italic:before {content: '\e8b9';}.el-text-height:before {content: '\e8ba';}.el-text-width:before {content: '\e8bb';}.el-align-left:before {content: '\e8bc';}.el-align-center:before {content: '\e8bd';}.el-align-right:before {content: '\e8be';}.el-align-justify:before {content: '\e8bf';}.el-list:before {content: '\e8c0';}.el-indent-left:before {content: '\e8c1';}.el-indent-right:before {content: '\e8c2';}.el-briefcase:before {content: '\e8c3';}.el-off:before {content: '\e8c4';}.el-road:before {content: '\e8c5';}.el-qrcode:before {content: '\e8c6';}.el-barcode:before {content: '\e8c7';}.el-braille:before {content: '\e8c8';}.el-book:before {content: '\e8c9';}.el-adjust:before {content: '\e8ca';}.el-tint:before {content: '\e8cb';}.el-check:before {content: '\e8cc';}.el-check-empty:before {content: '\e8cd';}.el-asterisk:before {content: '\e8ce';}.el-gift:before {content: '\e8cf';}.el-fire:before {content: '\e8d0';}.el-magnet:before {content: '\e8d1';}.el-chart:before {content: '\e8d2';}.el-chart-circled:before {content: '\e8d3';}.el-credit-card:before {content: '\e8d4';}.el-megaphone:before {content: '\e8d5';}.el-clipboard:before {content: '\e8d6';}.el-hdd:before {content: '\e8d7';}.el-key:before {content: '\e8d8';}.el-certificate:before {content: '\e8d9';}.el-tasks:before {content: '\e8da';}.el-filter:before {content: '\e8db';}.el-gauge:before {content: '\e8dc';}.el-smiley:before {content: '\e8dd';}.el-smiley-circled:before {content: '\e8de';}.el-address-book:before {content: '\e8df';}.el-address-book-alt:before {content: '\e8e0';}.el-asl:before {content: '\e8e1';}.el-glasses:before {content: '\e8e2';}.el-hearing-impaired:before {content: '\e8e3';}.el-iphone-home:before {content: '\e8e4';}.el-person:before {content: '\e8e5';}.el-adult:before {content: '\e8e6';}.el-child:before {content: '\e8e7';}.el-blind:before {content: '\e8e8';}.el-guidedog:before {content: '\e8e9';}.el-accessibility:before {content: '\e8ea';}.el-universal-access:before {content: '\e8eb';}.el-male:before {content: '\e8ec';}.el-female:before {content: '\e8ed';}.el-behance:before {content: '\e8ee';}.el-blogger:before {content: '\e8ef';}.el-cc:before {content: '\e8f0';}.el-css:before {content: '\e8f1';}.el-delicious:before {content: '\e8f2';}.el-deviantart:before {content: '\e8f3';}.el-digg:before {content: '\e8f4';}.el-dribbble:before {content: '\e8f5';}.el-facebook:before {content: '\e8f6';}.el-flickr:before {content: '\e8f7';}.el-foursquare:before {content: '\e8f8';}.el-friendfeed:before {content: '\e8f9';}.el-friendfeed-rect:before {content: '\e8fa';}.el-github:before {content: '\e8fb';}.el-github-text:before {content: '\e8fc';}.el-googleplus:before {content: '\e8fd';}.el-instagram:before {content: '\e8fe';}.el-linkedin:before {content: '\e8ff';}.el-path:before {content: '\e900';}.el-picasa:before {content: '\e901';}.el-pinterest:before {content: '\e902';}.el-reddit:before {content: '\e903';}.el-skype:before {content: '\e904';}.el-slideshare:before {content: '\e905';}.el-stackoverflow:before {content: '\e906';}.el-stumbleupon:before {content: '\e907';}.el-twitter:before {content: '\e908';}.el-tumblr:before {content: '\e909';}.el-vimeo:before {content: '\e90a';}.el-vkontakte:before {content: '\e90b';}.el-w3c:before {content: '\e90c';}.el-wordpress:before {content: '\e90d';}.el-youtube:before {content: '\e90e';} diff --git a/web/static/index/css/fonts/elusive/css/elusive-embedded.css b/web/static/index/css/fonts/elusive/css/elusive-embedded.css new file mode 100644 index 0000000..8b8f001 --- /dev/null +++ b/web/static/index/css/fonts/elusive/css/elusive-embedded.css @@ -0,0 +1 @@ +@font-face {font-family: 'elusive';src: url('../font/elusive.eot?60734608');src: url('../font/elusive.eot?60734608#iefix') format('embedded-opentype'), url('../font/elusive.svg?60734608#elusive') format('svg');font-weight: normal;font-style: normal;}@font-face {font-family: 'elusive';src: url('data:application/octet-stream;base64,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') format('woff'), url('data:application/octet-stream;base64,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AQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9Af4B/wIAAgECAgIDAgQCBQIGAgcCCAIJAgoCCwIMAg0CDgIPAhAFZ2xhc3MFbXVzaWMGc2VhcmNoDnNlYXJjaC1jaXJjbGVkBG1haWwMbWFpbC1jaXJjbGVkBWhlYXJ0DWhlYXJ0LWNpcmNsZWQLaGVhcnQtZW1wdHkEc3RhcgxzdGFyLWNpcmNsZWQKc3Rhci1lbXB0eQR1c2VyBWdyb3VwDWdyb3VwLWNpcmNsZWQFdG9yc28FdmlkZW8NdmlkZW8tY2lyY2xlZAl2aWRlby1hbHQIdmlkZW9jYW0KdmlkZW8tY2hhdAdwaWN0dXJlBmNhbWVyYQVwaG90bw1waG90by1jaXJjbGVkCHRoLWxhcmdlAnRoB3RoLWxpc3QJdmlldy1tb2RlAm9rCm9rLWNpcmNsZWQLb2stY2lyY2xlZDIGY2FuY2VsDmNhbmNlbC1jaXJjbGVkD2NhbmNlbC1jaXJjbGVkMgRwbHVzDHBsdXMtY2lyY2xlZAVtaW51cw1taW51cy1jaXJjbGVkBGhlbHAMaGVscC1jaXJjbGVkDGluZm8tY2lyY2xlZARob21lDGhvbWUtY2lyY2xlZAd3ZWJzaXRlD3dlYnNpdGUtY2lyY2xlZAZhdHRhY2gOYXR0YWNoLWNpcmNsZWQEbG9jawxsb2NrLWNpcmNsZWQJbG9jay1vcGVuDWxvY2stb3Blbi1hbHQDZXllB2V5ZS1vZmYDdGFnBHRhZ3MIYm9va21hcmsOYm9va21hcmstZW1wdHkEZmxhZwxmbGFnLWNpcmNsZWQJdGh1bWJzLXVwC3RodW1icy1kb3duCGRvd25sb2FkDGRvd25sb2FkLWFsdAZ1cGxvYWQFc2hhcmUFcXVvdGUNcXVvdGUtY2lyY2xlZAZleHBvcnQGcGVuY2lsDnBlbmNpbC1jaXJjbGVkBGVkaXQMZWRpdC1jaXJjbGVkCGVkaXQtYWx0BXByaW50B3JldHdlZXQHY29tbWVudAtjb21tZW50LWFsdARiZWxsB3dhcm5pbmcLZXhjbGFtYXRpb24FZXJyb3IJZXJyb3ItYWx0CGxvY2F0aW9uEGxvY2F0aW9uLWNpcmNsZWQHY29tcGFzcw9jb21wYXNzLWNpcmNsZWQFdHJhc2gNdHJhc2gtY2lyY2xlZANkb2MLZG9jLWNpcmNsZWQHZG9jLW5ldw9kb2MtbmV3LWNpcmNsZWQGZm9sZGVyDmZvbGRlci1jaXJjbGVkDGZvbGRlci1jbG9zZQtmb2xkZXItb3BlbgNyc3MFcGhvbmUNcGhvbmUtY2lyY2xlZANjb2cLY29nLWNpcmNsZWQEY29ncwZ3cmVuY2gOd3JlbmNoLWNpcmNsZWQGYmFza2V0DmJhc2tldC1jaXJjbGVkCGNhbGVuZGFyEGNhbGVuZGFyLWNpcmNsZWQDbWljC21pYy1jaXJjbGVkCnZvbHVtZS1vZmYLdm9sdW1lLWRvd24Gdm9sdW1lCXZvbHVtZS11cApoZWFkcGhvbmVzBWNsb2NrDWNsb2NrLWNpcmNsZWQJbGlnaHRidWxiDWxpZ2h0YnVsYi1hbHQFYmxvY2sLcmVzaXplLWZ1bGwPcmVzaXplLWZ1bGwtYWx0DHJlc2l6ZS1zbWFsbA9yZXNpemUtdmVydGljYWwRcmVzaXplLWhvcml6b250YWwEbW92ZQd6b29tLWluCHpvb20tb3V0CWRvd24tb3BlbglsZWZ0LW9wZW4KcmlnaHQtb3Blbgd1cC1vcGVuBGRvd24EbGVmdAVyaWdodAJ1cAxkb3duLWNpcmNsZWQMbGVmdC1jaXJjbGVkDXJpZ2h0LWNpcmNsZWQKdXAtY2lyY2xlZAlkb3duLWhhbmQJbGVmdC1oYW5kCnJpZ2h0LWhhbmQHdXAtaGFuZAJjdwpjdy1jaXJjbGVkCWFycm93cy1jdwdzaHVmZmxlBHBsYXkMcGxheS1jaXJjbGVkDXBsYXktY2lyY2xlZDIEc3RvcAxzdG9wLWNpcmNsZWQFcGF1c2UNcGF1c2UtY2lyY2xlZAZyZWNvcmQFZWplY3QIYmFja3dhcmQQYmFja3dhcmQtY2lyY2xlZA1mYXN0LWJhY2t3YXJkDGZhc3QtZm9yd2FyZAdmb3J3YXJkD2ZvcndhcmQtY2lyY2xlZA1zdGVwLWJhY2t3YXJkDHN0ZXAtZm9yd2FyZAZ0YXJnZXQGc2lnbmFsB2Rlc2t0b3APZGVza3RvcC1jaXJjbGVkBmxhcHRvcA5sYXB0b3AtY2lyY2xlZAduZXR3b3JrBWluYm94DWluYm94LWNpcmNsZWQJaW5ib3gtYWx0BWdsb2JlCWdsb2JlLWFsdAVjbG91ZA1jbG91ZC1jaXJjbGVkBmZsaWdodARsZWFmBGZvbnQIZm9udHNpemUEYm9sZAZpdGFsaWMLdGV4dC1oZWlnaHQKdGV4dC13aWR0aAphbGlnbi1sZWZ0DGFsaWduLWNlbnRlcgthbGlnbi1yaWdodA1hbGlnbi1qdXN0aWZ5BGxpc3QLaW5kZW50LWxlZnQMaW5kZW50LXJpZ2h0CWJyaWVmY2FzZQNvZmYEcm9hZAZxcmNvZGUHYmFyY29kZQdicmFpbGxlBGJvb2sGYWRqdXN0BHRpbnQFY2hlY2sLY2hlY2stZW1wdHkIYXN0ZXJpc2sEZ2lmdARmaXJlBm1hZ25ldAVjaGFydA1jaGFydC1jaXJjbGVkC2NyZWRpdC1jYXJkCW1lZ2FwaG9uZQljbGlwYm9hcmQDaGRkA2tleQtjZXJ0aWZpY2F0ZQV0YXNrcwZmaWx0ZXIFZ2F1Z2UGc21pbGV5DnNtaWxleS1jaXJjbGVkDGFkZHJlc3MtYm9vaxBhZGRyZXNzLWJvb2stYWx0A2FzbAdnbGFzc2VzEGhl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ILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKxAAAqsQAFQrEACCqxAAVCsQAIKrEABUK5AAAACSqxAAVCuQAAAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbEADCq4Af+FsASNsQIARAA=') format('truetype');}[class^="el-"]:before, [class*=" el-"]:before {font-family: "elusive";font-style: normal;font-weight: normal;speak: none;display: inline-block;text-decoration: inherit;width: 1em;margin-right: .2em;text-align: center;font-variant: normal;text-transform: none;line-height: 1em;margin-left: .2em;}.el-glass:before {content: '\e800';}.el-music:before {content: '\e801';}.el-search:before {content: '\e802';}.el-search-circled:before {content: '\e803';}.el-mail:before {content: '\e804';}.el-mail-circled:before {content: '\e805';}.el-heart:before {content: '\e806';}.el-heart-circled:before {content: '\e807';}.el-heart-empty:before {content: '\e808';}.el-star:before {content: '\e809';}.el-star-circled:before {content: '\e80a';}.el-star-empty:before {content: '\e80b';}.el-user:before {content: '\e80c';}.el-group:before {content: '\e80d';}.el-group-circled:before {content: '\e80e';}.el-torso:before {content: '\e80f';}.el-video:before {content: '\e810';}.el-video-circled:before {content: '\e811';}.el-video-alt:before {content: '\e812';}.el-videocam:before {content: '\e813';}.el-video-chat:before {content: '\e814';}.el-picture:before {content: '\e815';}.el-camera:before {content: '\e816';}.el-photo:before {content: '\e817';}.el-photo-circled:before {content: '\e818';}.el-th-large:before {content: '\e819';}.el-th:before {content: '\e81a';}.el-th-list:before {content: '\e81b';}.el-view-mode:before {content: '\e81c';}.el-ok:before {content: '\e81d';}.el-ok-circled:before {content: '\e81e';}.el-ok-circled2:before {content: '\e81f';}.el-cancel:before {content: '\e820';}.el-cancel-circled:before {content: '\e821';}.el-cancel-circled2:before {content: '\e822';}.el-plus:before {content: '\e823';}.el-plus-circled:before {content: '\e824';}.el-minus:before {content: '\e825';}.el-minus-circled:before {content: '\e826';}.el-help:before {content: '\e827';}.el-help-circled:before {content: '\e828';}.el-info-circled:before {content: '\e829';}.el-home:before {content: '\e82a';}.el-home-circled:before {content: '\e82b';}.el-website:before {content: '\e82c';}.el-website-circled:before {content: '\e82d';}.el-attach:before {content: '\e82e';}.el-attach-circled:before {content: '\e82f';}.el-lock:before {content: '\e830';}.el-lock-circled:before {content: '\e831';}.el-lock-open:before {content: '\e832';}.el-lock-open-alt:before {content: '\e833';}.el-eye:before {content: '\e834';}.el-eye-off:before {content: '\e835';}.el-tag:before {content: '\e836';}.el-tags:before {content: '\e837';}.el-bookmark:before {content: '\e838';}.el-bookmark-empty:before {content: '\e839';}.el-flag:before {content: '\e83a';}.el-flag-circled:before {content: '\e83b';}.el-thumbs-up:before {content: '\e83c';}.el-thumbs-down:before {content: '\e83d';}.el-download:before {content: '\e83e';}.el-download-alt:before {content: '\e83f';}.el-upload:before {content: '\e840';}.el-share:before {content: '\e841';}.el-quote:before {content: '\e842';}.el-quote-circled:before {content: '\e843';}.el-export:before {content: '\e844';}.el-pencil:before {content: '\e845';}.el-pencil-circled:before {content: '\e846';}.el-edit:before {content: '\e847';}.el-edit-circled:before {content: '\e848';}.el-edit-alt:before {content: '\e849';}.el-print:before {content: '\e84a';}.el-retweet:before {content: '\e84b';}.el-comment:before {content: '\e84c';}.el-comment-alt:before {content: '\e84d';}.el-bell:before {content: '\e84e';}.el-warning:before {content: '\e84f';}.el-exclamation:before {content: '\e850';}.el-error:before {content: '\e851';}.el-error-alt:before {content: '\e852';}.el-location:before {content: '\e853';}.el-location-circled:before {content: '\e854';}.el-compass:before {content: '\e855';}.el-compass-circled:before {content: '\e856';}.el-trash:before {content: '\e857';}.el-trash-circled:before {content: '\e858';}.el-doc:before {content: '\e859';}.el-doc-circled:before {content: '\e85a';}.el-doc-new:before {content: '\e85b';}.el-doc-new-circled:before {content: '\e85c';}.el-folder:before {content: '\e85d';}.el-folder-circled:before {content: '\e85e';}.el-folder-close:before {content: '\e85f';}.el-folder-open:before {content: '\e860';}.el-rss:before {content: '\e861';}.el-phone:before {content: '\e862';}.el-phone-circled:before {content: '\e863';}.el-cog:before {content: '\e864';}.el-cog-circled:before {content: '\e865';}.el-cogs:before {content: '\e866';}.el-wrench:before {content: '\e867';}.el-wrench-circled:before {content: '\e868';}.el-basket:before {content: '\e869';}.el-basket-circled:before {content: '\e86a';}.el-calendar:before {content: '\e86b';}.el-calendar-circled:before {content: '\e86c';}.el-mic:before {content: '\e86d';}.el-mic-circled:before {content: '\e86e';}.el-volume-off:before {content: '\e86f';}.el-volume-down:before {content: '\e870';}.el-volume:before {content: '\e871';}.el-volume-up:before {content: '\e872';}.el-headphones:before {content: '\e873';}.el-clock:before {content: '\e874';}.el-clock-circled:before {content: '\e875';}.el-lightbulb:before {content: '\e876';}.el-lightbulb-alt:before {content: '\e877';}.el-block:before {content: '\e878';}.el-resize-full:before {content: '\e879';}.el-resize-full-alt:before {content: '\e87a';}.el-resize-small:before {content: '\e87b';}.el-resize-vertical:before {content: '\e87c';}.el-resize-horizontal:before {content: '\e87d';}.el-move:before {content: '\e87e';}.el-zoom-in:before {content: '\e87f';}.el-zoom-out:before {content: '\e880';}.el-down-open:before {content: '\e881';}.el-left-open:before {content: '\e882';}.el-right-open:before {content: '\e883';}.el-up-open:before {content: '\e884';}.el-down:before {content: '\e885';}.el-left:before {content: '\e886';}.el-right:before {content: '\e887';}.el-up:before {content: '\e888';}.el-down-circled:before {content: '\e889';}.el-left-circled:before {content: '\e88a';}.el-right-circled:before {content: '\e88b';}.el-up-circled:before {content: '\e88c';}.el-down-hand:before {content: '\e88d';}.el-left-hand:before {content: '\e88e';}.el-right-hand:before {content: '\e88f';}.el-up-hand:before {content: '\e890';}.el-cw:before {content: '\e891';}.el-cw-circled:before {content: '\e892';}.el-arrows-cw:before {content: '\e893';}.el-shuffle:before {content: '\e894';}.el-play:before {content: '\e895';}.el-play-circled:before {content: '\e896';}.el-play-circled2:before {content: '\e897';}.el-stop:before {content: '\e898';}.el-stop-circled:before {content: '\e899';}.el-pause:before {content: '\e89a';}.el-pause-circled:before {content: '\e89b';}.el-record:before {content: '\e89c';}.el-eject:before {content: '\e89d';}.el-backward:before {content: '\e89e';}.el-backward-circled:before {content: '\e89f';}.el-fast-backward:before {content: '\e8a0';}.el-fast-forward:before {content: '\e8a1';}.el-forward:before {content: '\e8a2';}.el-forward-circled:before {content: '\e8a3';}.el-step-backward:before {content: '\e8a4';}.el-step-forward:before {content: '\e8a5';}.el-target:before {content: '\e8a6';}.el-signal:before {content: '\e8a7';}.el-desktop:before {content: '\e8a8';}.el-desktop-circled:before {content: '\e8a9';}.el-laptop:before {content: '\e8aa';}.el-laptop-circled:before {content: '\e8ab';}.el-network:before {content: '\e8ac';}.el-inbox:before {content: '\e8ad';}.el-inbox-circled:before {content: '\e8ae';}.el-inbox-alt:before {content: '\e8af';}.el-globe:before {content: '\e8b0';}.el-globe-alt:before {content: '\e8b1';}.el-cloud:before {content: '\e8b2';}.el-cloud-circled:before {content: '\e8b3';}.el-flight:before {content: '\e8b4';}.el-leaf:before {content: '\e8b5';}.el-font:before {content: '\e8b6';}.el-fontsize:before {content: '\e8b7';}.el-bold:before {content: '\e8b8';}.el-italic:before {content: '\e8b9';}.el-text-height:before {content: '\e8ba';}.el-text-width:before {content: '\e8bb';}.el-align-left:before {content: '\e8bc';}.el-align-center:before {content: '\e8bd';}.el-align-right:before {content: '\e8be';}.el-align-justify:before {content: '\e8bf';}.el-list:before {content: '\e8c0';}.el-indent-left:before {content: '\e8c1';}.el-indent-right:before {content: '\e8c2';}.el-briefcase:before {content: '\e8c3';}.el-off:before {content: '\e8c4';}.el-road:before {content: '\e8c5';}.el-qrcode:before {content: '\e8c6';}.el-barcode:before {content: '\e8c7';}.el-braille:before {content: '\e8c8';}.el-book:before {content: '\e8c9';}.el-adjust:before {content: '\e8ca';}.el-tint:before {content: '\e8cb';}.el-check:before {content: '\e8cc';}.el-check-empty:before {content: '\e8cd';}.el-asterisk:before {content: '\e8ce';}.el-gift:before {content: '\e8cf';}.el-fire:before {content: '\e8d0';}.el-magnet:before {content: '\e8d1';}.el-chart:before {content: '\e8d2';}.el-chart-circled:before {content: '\e8d3';}.el-credit-card:before {content: '\e8d4';}.el-megaphone:before {content: '\e8d5';}.el-clipboard:before {content: '\e8d6';}.el-hdd:before {content: '\e8d7';}.el-key:before {content: '\e8d8';}.el-certificate:before {content: '\e8d9';}.el-tasks:before {content: '\e8da';}.el-filter:before {content: '\e8db';}.el-gauge:before {content: '\e8dc';}.el-smiley:before {content: '\e8dd';}.el-smiley-circled:before {content: '\e8de';}.el-address-book:before {content: '\e8df';}.el-address-book-alt:before {content: '\e8e0';}.el-asl:before {content: '\e8e1';}.el-glasses:before {content: '\e8e2';}.el-hearing-impaired:before {content: '\e8e3';}.el-iphone-home:before {content: '\e8e4';}.el-person:before {content: '\e8e5';}.el-adult:before {content: '\e8e6';}.el-child:before {content: '\e8e7';}.el-blind:before {content: '\e8e8';}.el-guidedog:before {content: '\e8e9';}.el-accessibility:before {content: '\e8ea';}.el-universal-access:before {content: '\e8eb';}.el-male:before {content: '\e8ec';}.el-female:before {content: '\e8ed';}.el-behance:before {content: '\e8ee';}.el-blogger:before {content: '\e8ef';}.el-cc:before {content: '\e8f0';}.el-css:before {content: '\e8f1';}.el-delicious:before {content: '\e8f2';}.el-deviantart:before {content: '\e8f3';}.el-digg:before {content: '\e8f4';}.el-dribbble:before {content: '\e8f5';}.el-facebook:before {content: '\e8f6';}.el-flickr:before {content: '\e8f7';}.el-foursquare:before {content: '\e8f8';}.el-friendfeed:before {content: '\e8f9';}.el-friendfeed-rect:before {content: '\e8fa';}.el-github:before {content: '\e8fb';}.el-github-text:before {content: '\e8fc';}.el-googleplus:before {content: '\e8fd';}.el-instagram:before {content: '\e8fe';}.el-linkedin:before {content: '\e8ff';}.el-path:before {content: '\e900';}.el-picasa:before {content: '\e901';}.el-pinterest:before {content: '\e902';}.el-reddit:before {content: '\e903';}.el-skype:before {content: '\e904';}.el-slideshare:before {content: '\e905';}.el-stackoverflow:before {content: '\e906';}.el-stumbleupon:before {content: '\e907';}.el-twitter:before {content: '\e908';}.el-tumblr:before {content: '\e909';}.el-vimeo:before {content: '\e90a';}.el-vkontakte:before {content: '\e90b';}.el-w3c:before {content: '\e90c';}.el-wordpress:before {content: '\e90d';}.el-youtube:before {content: '\e90e';} diff --git a/web/static/index/css/fonts/elusive/css/elusive-ie7-codes.css b/web/static/index/css/fonts/elusive/css/elusive-ie7-codes.css new file mode 100644 index 0000000..04d6810 --- /dev/null +++ b/web/static/index/css/fonts/elusive/css/elusive-ie7-codes.css @@ -0,0 +1 @@ + .el-glass {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-music {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-search {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-search-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-mail {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-mail-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-heart {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-heart-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-heart-empty {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-star {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-star-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-star-empty {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-user {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-group {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-group-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-torso {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-video {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-video-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-video-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-videocam {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-video-chat {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-picture {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-camera {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-photo {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-photo-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-th-large {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-th {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-th-list {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-view-mode {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-ok {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-ok-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-ok-circled2 {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cancel {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cancel-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cancel-circled2 {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-plus {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-plus-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-minus {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-minus-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-help {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-help-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-info-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-home {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-home-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-website {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-website-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-attach {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-attach-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-lock {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-lock-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-lock-open {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-lock-open-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-eye {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-eye-off {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-tag {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-tags {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-bookmark {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-bookmark-empty {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-flag {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-flag-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-thumbs-up {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-thumbs-down {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-download {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-download-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-upload {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-share {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-quote {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-quote-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-export {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-pencil {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-pencil-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-edit {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-edit-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-edit-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-print {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-retweet {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-comment {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-comment-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-bell {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-warning {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-exclamation {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-error {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-error-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-location {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-location-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-compass {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-compass-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-trash {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-trash-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-doc {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-doc-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-doc-new {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-doc-new-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-folder {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-folder-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-folder-close {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-folder-open {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-rss {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-phone {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-phone-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cog {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cog-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cogs {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-wrench {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-wrench-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-basket {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-basket-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-calendar {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-calendar-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-mic {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-mic-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-volume-off {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-volume-down {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-volume {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-volume-up {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-headphones {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-clock {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-clock-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-lightbulb {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-lightbulb-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-block {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-resize-full {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-resize-full-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-resize-small {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-resize-vertical {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-resize-horizontal {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-move {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-zoom-in {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-zoom-out {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-down-open {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-left-open {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-right-open {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-up-open {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-down {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-left {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-right {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-up {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-down-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-left-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-right-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-up-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-down-hand {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-left-hand {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-right-hand {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-up-hand {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cw {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cw-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-arrows-cw {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-shuffle {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-play {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-play-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-play-circled2 {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-stop {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-stop-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-pause {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-pause-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-record {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-eject {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-backward {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-backward-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-fast-backward {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-fast-forward {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-forward {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-forward-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-step-backward {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-step-forward {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-target {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-signal {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-desktop {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-desktop-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-laptop {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-laptop-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-network {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-inbox {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-inbox-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-inbox-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-globe {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-globe-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cloud {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cloud-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-flight {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-leaf {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-font {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-fontsize {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-bold {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-italic {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-text-height {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-text-width {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-align-left {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-align-center {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-align-right {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-align-justify {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-list {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-indent-left {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-indent-right {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-briefcase {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-off {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-road {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-qrcode {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-barcode {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-braille {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-book {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-adjust {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-tint {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-check {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-check-empty {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-asterisk {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-gift {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-fire {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-magnet {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-chart {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-chart-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-credit-card {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-megaphone {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-clipboard {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-hdd {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-key {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-certificate {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-tasks {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-filter {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-gauge {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-smiley {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-smiley-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-address-book {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-address-book-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-asl {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-glasses {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-hearing-impaired {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-iphone-home {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-person {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-adult {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-child {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-blind {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-guidedog {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-accessibility {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-universal-access {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-male {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-female {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-behance {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-blogger {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cc {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-css {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-delicious {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-deviantart {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-digg {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-dribbble {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-facebook {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-flickr {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-foursquare {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-friendfeed {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-friendfeed-rect {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-github {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-github-text {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-googleplus {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-instagram {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-linkedin {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-path {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-picasa {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-pinterest {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-reddit {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-skype {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-slideshare {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-stackoverflow {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-stumbleupon {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-twitter {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-tumblr {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-vimeo {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-vkontakte {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-w3c {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-wordpress {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-youtube {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} diff --git a/web/static/index/css/fonts/elusive/css/elusive-ie7.css b/web/static/index/css/fonts/elusive/css/elusive-ie7.css new file mode 100644 index 0000000..532319f --- /dev/null +++ b/web/static/index/css/fonts/elusive/css/elusive-ie7.css @@ -0,0 +1 @@ +[class^="el-"], [class*=" el-"] {font-family: 'elusive';font-style: normal;font-weight: normal;line-height: 1em;}.el-glass {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-music {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-search {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-search-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-mail {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-mail-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-heart {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-heart-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-heart-empty {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-star {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-star-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-star-empty {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-user {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-group {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-group-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-torso {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-video {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-video-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-video-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-videocam {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-video-chat {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-picture {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-camera {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-photo {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-photo-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-th-large {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-th {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-th-list {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-view-mode {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-ok {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-ok-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-ok-circled2 {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cancel {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cancel-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cancel-circled2 {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-plus {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-plus-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-minus {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-minus-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-help {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-help-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-info-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-home {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-home-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-website {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-website-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-attach {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-attach-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-lock {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-lock-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-lock-open {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-lock-open-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-eye {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-eye-off {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-tag {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-tags {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-bookmark {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-bookmark-empty {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-flag {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-flag-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-thumbs-up {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-thumbs-down {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-download {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-download-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-upload {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-share {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-quote {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-quote-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-export {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-pencil {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-pencil-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-edit {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-edit-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-edit-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-print {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-retweet {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-comment {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-comment-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-bell {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-warning {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-exclamation {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-error {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-error-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-location {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-location-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-compass {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-compass-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-trash {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-trash-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-doc {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-doc-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-doc-new {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-doc-new-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-folder {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-folder-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-folder-close {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-folder-open {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-rss {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-phone {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-phone-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cog {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cog-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cogs {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-wrench {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-wrench-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-basket {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-basket-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-calendar {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-calendar-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-mic {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-mic-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-volume-off {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-volume-down {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-volume {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-volume-up {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-headphones {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-clock {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-clock-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-lightbulb {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-lightbulb-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-block {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-resize-full {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-resize-full-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-resize-small {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-resize-vertical {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-resize-horizontal {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-move {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-zoom-in {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-zoom-out {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-down-open {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-left-open {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-right-open {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-up-open {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-down {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-left {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-right {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-up {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-down-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-left-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-right-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-up-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-down-hand {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-left-hand {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-right-hand {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-up-hand {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cw {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cw-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-arrows-cw {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-shuffle {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-play {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-play-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-play-circled2 {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-stop {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-stop-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-pause {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-pause-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-record {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-eject {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-backward {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-backward-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-fast-backward {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-fast-forward {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-forward {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-forward-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-step-backward {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-step-forward {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-target {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-signal {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-desktop {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-desktop-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-laptop {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-laptop-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-network {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-inbox {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-inbox-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-inbox-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-globe {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-globe-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cloud {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cloud-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-flight {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-leaf {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-font {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-fontsize {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-bold {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-italic {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-text-height {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-text-width {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-align-left {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-align-center {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-align-right {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-align-justify {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-list {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-indent-left {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-indent-right {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-briefcase {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-off {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-road {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-qrcode {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-barcode {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-braille {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-book {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-adjust {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-tint {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-check {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-check-empty {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-asterisk {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-gift {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-fire {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-magnet {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-chart {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-chart-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-credit-card {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-megaphone {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-clipboard {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-hdd {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-key {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-certificate {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-tasks {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-filter {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-gauge {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-smiley {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-smiley-circled {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-address-book {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-address-book-alt {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-asl {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-glasses {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-hearing-impaired {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-iphone-home {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-person {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-adult {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-child {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-blind {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-guidedog {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-accessibility {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-universal-access {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-male {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-female {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-behance {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-blogger {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-cc {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-css {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-delicious {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-deviantart {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-digg {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-dribbble {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-facebook {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-flickr {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-foursquare {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-friendfeed {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-friendfeed-rect {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-github {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-github-text {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-googleplus {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-instagram {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-linkedin {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-path {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-picasa {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-pinterest {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-reddit {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-skype {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-slideshare {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-stackoverflow {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-stumbleupon {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-twitter {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-tumblr {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-vimeo {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-vkontakte {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-w3c {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-wordpress {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');}.el-youtube {*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} diff --git a/web/static/index/css/fonts/elusive/css/elusive.css b/web/static/index/css/fonts/elusive/css/elusive.css new file mode 100644 index 0000000..d5bf5bd --- /dev/null +++ b/web/static/index/css/fonts/elusive/css/elusive.css @@ -0,0 +1 @@ +@font-face {font-family: 'elusive';src: url('../font/elusive.eot?63825465');src: url('../font/elusive.eot?63825465#iefix') format('embedded-opentype'), url('../font/elusive.woff?63825465') format('woff'), url('../font/elusive.ttf?63825465') format('truetype'), url('../font/elusive.svg?63825465#elusive') format('svg');font-weight: normal;font-style: normal;}[class^="el-"]:before, [class*=" el-"]:before {font-family: "elusive";font-style: normal;font-weight: normal;speak: none;display: inline-block;text-decoration: inherit;width: 1em;margin-right: .2em;text-align: center;font-variant: normal;text-transform: none;line-height: 1em;margin-left: .2em;}.el-glass:before {content: '\e800';}.el-music:before {content: '\e801';}.el-search:before {content: '\e802';}.el-search-circled:before {content: '\e803';}.el-mail:before {content: '\e804';}.el-mail-circled:before {content: '\e805';}.el-heart:before {content: '\e806';}.el-heart-circled:before {content: '\e807';}.el-heart-empty:before {content: '\e808';}.el-star:before {content: '\e809';}.el-star-circled:before {content: '\e80a';}.el-star-empty:before {content: '\e80b';}.el-user:before {content: '\e80c';}.el-group:before {content: '\e80d';}.el-group-circled:before {content: '\e80e';}.el-torso:before {content: '\e80f';}.el-video:before {content: '\e810';}.el-video-circled:before {content: '\e811';}.el-video-alt:before {content: '\e812';}.el-videocam:before {content: '\e813';}.el-video-chat:before {content: '\e814';}.el-picture:before {content: '\e815';}.el-camera:before {content: '\e816';}.el-photo:before {content: '\e817';}.el-photo-circled:before {content: '\e818';}.el-th-large:before {content: '\e819';}.el-th:before {content: '\e81a';}.el-th-list:before {content: '\e81b';}.el-view-mode:before {content: '\e81c';}.el-ok:before {content: '\e81d';}.el-ok-circled:before {content: '\e81e';}.el-ok-circled2:before {content: '\e81f';}.el-cancel:before {content: '\e820';}.el-cancel-circled:before {content: '\e821';}.el-cancel-circled2:before {content: '\e822';}.el-plus:before {content: '\e823';}.el-plus-circled:before {content: '\e824';}.el-minus:before {content: '\e825';}.el-minus-circled:before {content: '\e826';}.el-help:before {content: '\e827';}.el-help-circled:before {content: '\e828';}.el-info-circled:before {content: '\e829';}.el-home:before {content: '\e82a';}.el-home-circled:before {content: '\e82b';}.el-website:before {content: '\e82c';}.el-website-circled:before {content: '\e82d';}.el-attach:before {content: '\e82e';}.el-attach-circled:before {content: '\e82f';}.el-lock:before {content: '\e830';}.el-lock-circled:before {content: '\e831';}.el-lock-open:before {content: '\e832';}.el-lock-open-alt:before {content: '\e833';}.el-eye:before {content: '\e834';}.el-eye-off:before {content: '\e835';}.el-tag:before {content: '\e836';}.el-tags:before {content: '\e837';}.el-bookmark:before {content: '\e838';}.el-bookmark-empty:before {content: '\e839';}.el-flag:before {content: '\e83a';}.el-flag-circled:before {content: '\e83b';}.el-thumbs-up:before {content: '\e83c';}.el-thumbs-down:before {content: '\e83d';}.el-download:before {content: '\e83e';}.el-download-alt:before {content: '\e83f';}.el-upload:before {content: '\e840';}.el-share:before {content: '\e841';}.el-quote:before {content: '\e842';}.el-quote-circled:before {content: '\e843';}.el-export:before {content: '\e844';}.el-pencil:before {content: '\e845';}.el-pencil-circled:before {content: '\e846';}.el-edit:before {content: '\e847';}.el-edit-circled:before {content: '\e848';}.el-edit-alt:before {content: '\e849';}.el-print:before {content: '\e84a';}.el-retweet:before {content: '\e84b';}.el-comment:before {content: '\e84c';}.el-comment-alt:before {content: '\e84d';}.el-bell:before {content: '\e84e';}.el-warning:before {content: '\e84f';}.el-exclamation:before {content: '\e850';}.el-error:before {content: '\e851';}.el-error-alt:before {content: '\e852';}.el-location:before {content: '\e853';}.el-location-circled:before {content: '\e854';}.el-compass:before {content: '\e855';}.el-compass-circled:before {content: '\e856';}.el-trash:before {content: '\e857';}.el-trash-circled:before {content: '\e858';}.el-doc:before {content: '\e859';}.el-doc-circled:before {content: '\e85a';}.el-doc-new:before {content: '\e85b';}.el-doc-new-circled:before {content: '\e85c';}.el-folder:before {content: '\e85d';}.el-folder-circled:before {content: '\e85e';}.el-folder-close:before {content: '\e85f';}.el-folder-open:before {content: '\e860';}.el-rss:before {content: '\e861';}.el-phone:before {content: '\e862';}.el-phone-circled:before {content: '\e863';}.el-cog:before {content: '\e864';}.el-cog-circled:before {content: '\e865';}.el-cogs:before {content: '\e866';}.el-wrench:before {content: '\e867';}.el-wrench-circled:before {content: '\e868';}.el-basket:before {content: '\e869';}.el-basket-circled:before {content: '\e86a';}.el-calendar:before {content: '\e86b';}.el-calendar-circled:before {content: '\e86c';}.el-mic:before {content: '\e86d';}.el-mic-circled:before {content: '\e86e';}.el-volume-off:before {content: '\e86f';}.el-volume-down:before {content: '\e870';}.el-volume:before {content: '\e871';}.el-volume-up:before {content: '\e872';}.el-headphones:before {content: '\e873';}.el-clock:before {content: '\e874';}.el-clock-circled:before {content: '\e875';}.el-lightbulb:before {content: '\e876';}.el-lightbulb-alt:before {content: '\e877';}.el-block:before {content: '\e878';}.el-resize-full:before {content: '\e879';}.el-resize-full-alt:before {content: '\e87a';}.el-resize-small:before {content: '\e87b';}.el-resize-vertical:before {content: '\e87c';}.el-resize-horizontal:before {content: '\e87d';}.el-move:before {content: '\e87e';}.el-zoom-in:before {content: '\e87f';}.el-zoom-out:before {content: '\e880';}.el-down-open:before {content: '\e881';}.el-left-open:before {content: '\e882';}.el-right-open:before {content: '\e883';}.el-up-open:before {content: '\e884';}.el-down:before {content: '\e885';}.el-left:before {content: '\e886';}.el-right:before {content: '\e887';}.el-up:before {content: '\e888';}.el-down-circled:before {content: '\e889';}.el-left-circled:before {content: '\e88a';}.el-right-circled:before {content: '\e88b';}.el-up-circled:before {content: '\e88c';}.el-down-hand:before {content: '\e88d';}.el-left-hand:before {content: '\e88e';}.el-right-hand:before {content: '\e88f';}.el-up-hand:before {content: '\e890';}.el-cw:before {content: '\e891';}.el-cw-circled:before {content: '\e892';}.el-arrows-cw:before {content: '\e893';}.el-shuffle:before {content: '\e894';}.el-play:before {content: '\e895';}.el-play-circled:before {content: '\e896';}.el-play-circled2:before {content: '\e897';}.el-stop:before {content: '\e898';}.el-stop-circled:before {content: '\e899';}.el-pause:before {content: '\e89a';}.el-pause-circled:before {content: '\e89b';}.el-record:before {content: '\e89c';}.el-eject:before {content: '\e89d';}.el-backward:before {content: '\e89e';}.el-backward-circled:before {content: '\e89f';}.el-fast-backward:before {content: '\e8a0';}.el-fast-forward:before {content: '\e8a1';}.el-forward:before {content: '\e8a2';}.el-forward-circled:before {content: '\e8a3';}.el-step-backward:before {content: '\e8a4';}.el-step-forward:before {content: '\e8a5';}.el-target:before {content: '\e8a6';}.el-signal:before {content: '\e8a7';}.el-desktop:before {content: '\e8a8';}.el-desktop-circled:before {content: '\e8a9';}.el-laptop:before {content: '\e8aa';}.el-laptop-circled:before {content: '\e8ab';}.el-network:before {content: '\e8ac';}.el-inbox:before {content: '\e8ad';}.el-inbox-circled:before {content: '\e8ae';}.el-inbox-alt:before {content: '\e8af';}.el-globe:before {content: '\e8b0';}.el-globe-alt:before {content: '\e8b1';}.el-cloud:before {content: '\e8b2';}.el-cloud-circled:before {content: '\e8b3';}.el-flight:before {content: '\e8b4';}.el-leaf:before {content: '\e8b5';}.el-font:before {content: '\e8b6';}.el-fontsize:before {content: '\e8b7';}.el-bold:before {content: '\e8b8';}.el-italic:before {content: '\e8b9';}.el-text-height:before {content: '\e8ba';}.el-text-width:before {content: '\e8bb';}.el-align-left:before {content: '\e8bc';}.el-align-center:before {content: '\e8bd';}.el-align-right:before {content: '\e8be';}.el-align-justify:before {content: '\e8bf';}.el-list:before {content: '\e8c0';}.el-indent-left:before {content: '\e8c1';}.el-indent-right:before {content: '\e8c2';}.el-briefcase:before {content: '\e8c3';}.el-off:before {content: '\e8c4';}.el-road:before {content: '\e8c5';}.el-qrcode:before {content: '\e8c6';}.el-barcode:before {content: '\e8c7';}.el-braille:before {content: '\e8c8';}.el-book:before {content: '\e8c9';}.el-adjust:before {content: '\e8ca';}.el-tint:before {content: '\e8cb';}.el-check:before {content: '\e8cc';}.el-check-empty:before {content: '\e8cd';}.el-asterisk:before {content: '\e8ce';}.el-gift:before {content: '\e8cf';}.el-fire:before {content: '\e8d0';}.el-magnet:before {content: '\e8d1';}.el-chart:before {content: '\e8d2';}.el-chart-circled:before {content: '\e8d3';}.el-credit-card:before {content: '\e8d4';}.el-megaphone:before {content: '\e8d5';}.el-clipboard:before {content: '\e8d6';}.el-hdd:before {content: '\e8d7';}.el-key:before {content: '\e8d8';}.el-certificate:before {content: '\e8d9';}.el-tasks:before {content: '\e8da';}.el-filter:before {content: '\e8db';}.el-gauge:before {content: '\e8dc';}.el-smiley:before {content: '\e8dd';}.el-smiley-circled:before {content: '\e8de';}.el-address-book:before {content: '\e8df';}.el-address-book-alt:before {content: '\e8e0';}.el-asl:before {content: '\e8e1';}.el-glasses:before {content: '\e8e2';}.el-hearing-impaired:before {content: '\e8e3';}.el-iphone-home:before {content: '\e8e4';}.el-person:before {content: '\e8e5';}.el-adult:before {content: '\e8e6';}.el-child:before {content: '\e8e7';}.el-blind:before {content: '\e8e8';}.el-guidedog:before {content: '\e8e9';}.el-accessibility:before {content: '\e8ea';}.el-universal-access:before {content: '\e8eb';}.el-male:before {content: '\e8ec';}.el-female:before {content: '\e8ed';}.el-behance:before {content: '\e8ee';}.el-blogger:before {content: '\e8ef';}.el-cc:before {content: '\e8f0';}.el-css:before {content: '\e8f1';}.el-delicious:before {content: '\e8f2';}.el-deviantart:before {content: '\e8f3';}.el-digg:before {content: '\e8f4';}.el-dribbble:before {content: '\e8f5';}.el-facebook:before {content: '\e8f6';}.el-flickr:before {content: '\e8f7';}.el-foursquare:before {content: '\e8f8';}.el-friendfeed:before {content: '\e8f9';}.el-friendfeed-rect:before {content: '\e8fa';}.el-github:before {content: '\e8fb';}.el-github-text:before {content: '\e8fc';}.el-googleplus:before {content: '\e8fd';}.el-instagram:before {content: '\e8fe';}.el-linkedin:before {content: '\e8ff';}.el-path:before {content: '\e900';}.el-picasa:before {content: '\e901';}.el-pinterest:before {content: '\e902';}.el-reddit:before {content: '\e903';}.el-skype:before {content: '\e904';}.el-slideshare:before {content: '\e905';}.el-stackoverflow:before {content: '\e906';}.el-stumbleupon:before {content: '\e907';}.el-twitter:before {content: '\e908';}.el-tumblr:before {content: '\e909';}.el-vimeo:before {content: '\e90a';}.el-vkontakte:before {content: '\e90b';}.el-w3c:before {content: '\e90c';}.el-wordpress:before {content: '\e90d';}.el-youtube:before {content: '\e90e';} diff --git a/web/static/index/css/fonts/elusive/font/elusive.eot b/web/static/index/css/fonts/elusive/font/elusive.eot new file mode 100644 index 0000000..63ff690 Binary files /dev/null and b/web/static/index/css/fonts/elusive/font/elusive.eot differ diff --git a/web/static/index/css/fonts/elusive/font/elusive.svg b/web/static/index/css/fonts/elusive/font/elusive.svg new file mode 100644 index 0000000..50b6d09 --- /dev/null +++ b/web/static/index/css/fonts/elusive/font/elusive.svg @@ -0,0 +1,282 @@ + + + +Copyright (C) 2014 by original authors @ fontello.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/static/index/css/fonts/elusive/font/elusive.ttf b/web/static/index/css/fonts/elusive/font/elusive.ttf new file mode 100644 index 0000000..be67793 Binary files /dev/null and b/web/static/index/css/fonts/elusive/font/elusive.ttf differ diff --git a/web/static/index/css/fonts/elusive/font/elusive.woff b/web/static/index/css/fonts/elusive/font/elusive.woff new file mode 100644 index 0000000..63a78fd Binary files /dev/null and b/web/static/index/css/fonts/elusive/font/elusive.woff differ diff --git a/web/static/index/css/fonts/fontawesome/css/font-awesome.css b/web/static/index/css/fonts/fontawesome/css/font-awesome.css new file mode 100755 index 0000000..5591b43 --- /dev/null +++ b/web/static/index/css/fonts/fontawesome/css/font-awesome.css @@ -0,0 +1,1681 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.2.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.2.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; +} + +[class*="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; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.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: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.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; +} +@-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 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + 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 { + 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: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.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:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.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 { + 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: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-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.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"; +} diff --git a/web/static/index/css/fonts/fontawesome/css/font-awesome.min.css b/web/static/index/css/fonts/fontawesome/css/font-awesome.min.css new file mode 100755 index 0000000..ec53d4d --- /dev/null +++ b/web/static/index/css/fonts/fontawesome/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.2.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.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.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}.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}@-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{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{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{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:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.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{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: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-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.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"} \ No newline at end of file diff --git a/web/static/index/css/fonts/fontawesome/fonts/FontAwesome.otf b/web/static/index/css/fonts/fontawesome/fonts/FontAwesome.otf new file mode 100755 index 0000000..fa2e7a4 Binary files /dev/null and b/web/static/index/css/fonts/fontawesome/fonts/FontAwesome.otf differ diff --git a/web/static/index/css/fonts/fontawesome/fonts/fontawesome-webfont.eot b/web/static/index/css/fonts/fontawesome/fonts/fontawesome-webfont.eot new file mode 100755 index 0000000..e1e1b4c Binary files /dev/null and b/web/static/index/css/fonts/fontawesome/fonts/fontawesome-webfont.eot differ diff --git a/web/static/index/css/fonts/fontawesome/fonts/fontawesome-webfont.svg b/web/static/index/css/fonts/fontawesome/fonts/fontawesome-webfont.svg new file mode 100755 index 0000000..d907b25 --- /dev/null +++ b/web/static/index/css/fonts/fontawesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,520 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/static/index/css/fonts/fontawesome/fonts/fontawesome-webfont.ttf b/web/static/index/css/fonts/fontawesome/fonts/fontawesome-webfont.ttf new file mode 100755 index 0000000..9cf4217 Binary files /dev/null and b/web/static/index/css/fonts/fontawesome/fonts/fontawesome-webfont.ttf differ diff --git a/web/static/index/css/fonts/fontawesome/fonts/fontawesome-webfont.woff b/web/static/index/css/fonts/fontawesome/fonts/fontawesome-webfont.woff new file mode 100755 index 0000000..5d80539 Binary files /dev/null and b/web/static/index/css/fonts/fontawesome/fonts/fontawesome-webfont.woff differ diff --git a/web/static/index/css/fonts/glyphicons/glyphicons-halflings-regular.eot b/web/static/index/css/fonts/glyphicons/glyphicons-halflings-regular.eot new file mode 100755 index 0000000..4a4ca86 Binary files /dev/null and b/web/static/index/css/fonts/glyphicons/glyphicons-halflings-regular.eot differ diff --git a/web/static/index/css/fonts/glyphicons/glyphicons-halflings-regular.svg b/web/static/index/css/fonts/glyphicons/glyphicons-halflings-regular.svg new file mode 100755 index 0000000..e3e2dc7 --- /dev/null +++ b/web/static/index/css/fonts/glyphicons/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/static/index/css/fonts/glyphicons/glyphicons-halflings-regular.ttf b/web/static/index/css/fonts/glyphicons/glyphicons-halflings-regular.ttf new file mode 100755 index 0000000..67fa00b Binary files /dev/null and b/web/static/index/css/fonts/glyphicons/glyphicons-halflings-regular.ttf differ diff --git a/web/static/index/css/fonts/glyphicons/glyphicons-halflings-regular.woff b/web/static/index/css/fonts/glyphicons/glyphicons-halflings-regular.woff new file mode 100755 index 0000000..8c54182 Binary files /dev/null and b/web/static/index/css/fonts/glyphicons/glyphicons-halflings-regular.woff differ diff --git a/web/static/index/css/fonts/linecons/css/animation.css b/web/static/index/css/fonts/linecons/css/animation.css new file mode 100644 index 0000000..ac5a956 --- /dev/null +++ b/web/static/index/css/fonts/linecons/css/animation.css @@ -0,0 +1,85 @@ +/* + Animation example, for spinners +*/ +.animate-spin { + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + -webkit-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; + display: inline-block; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -moz-transform: rotate(359deg); + -o-transform: rotate(359deg); + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -moz-transform: rotate(359deg); + -o-transform: rotate(359deg); + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -moz-transform: rotate(359deg); + -o-transform: rotate(359deg); + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -moz-transform: rotate(359deg); + -o-transform: rotate(359deg); + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -moz-transform: rotate(359deg); + -o-transform: rotate(359deg); + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/web/static/index/css/fonts/linecons/css/linecons-codes.css b/web/static/index/css/fonts/linecons/css/linecons-codes.css new file mode 100644 index 0000000..b9f0801 --- /dev/null +++ b/web/static/index/css/fonts/linecons/css/linecons-codes.css @@ -0,0 +1,49 @@ + +.linecons-music:before { content: '\e800'; } /* '' */ +.linecons-search:before { content: '\e801'; } /* '' */ +.linecons-mail:before { content: '\e802'; } /* '' */ +.linecons-heart:before { content: '\e803'; } /* '' */ +.linecons-star:before { content: '\e804'; } /* '' */ +.linecons-user:before { content: '\e805'; } /* '' */ +.linecons-videocam:before { content: '\e806'; } /* '' */ +.linecons-camera:before { content: '\e807'; } /* '' */ +.linecons-photo:before { content: '\e808'; } /* '' */ +.linecons-attach:before { content: '\e809'; } /* '' */ +.linecons-lock:before { content: '\e80a'; } /* '' */ +.linecons-eye:before { content: '\e80b'; } /* '' */ +.linecons-tag:before { content: '\e80c'; } /* '' */ +.linecons-thumbs-up:before { content: '\e80d'; } /* '' */ +.linecons-pencil:before { content: '\e80e'; } /* '' */ +.linecons-comment:before { content: '\e80f'; } /* '' */ +.linecons-location:before { content: '\e810'; } /* '' */ +.linecons-cup:before { content: '\e811'; } /* '' */ +.linecons-trash:before { content: '\e812'; } /* '' */ +.linecons-doc:before { content: '\e813'; } /* '' */ +.linecons-note:before { content: '\e814'; } /* '' */ +.linecons-cog:before { content: '\e815'; } /* '' */ +.linecons-params:before { content: '\e816'; } /* '' */ +.linecons-calendar:before { content: '\e817'; } /* '' */ +.linecons-sound:before { content: '\e818'; } /* '' */ +.linecons-clock:before { content: '\e819'; } /* '' */ +.linecons-lightbulb:before { content: '\e81a'; } /* '' */ +.linecons-tv:before { content: '\e81b'; } /* '' */ +.linecons-desktop:before { content: '\e81c'; } /* '' */ +.linecons-mobile:before { content: '\e81d'; } /* '' */ +.linecons-cd:before { content: '\e81e'; } /* '' */ +.linecons-inbox:before { content: '\e81f'; } /* '' */ +.linecons-globe:before { content: '\e820'; } /* '' */ +.linecons-cloud:before { content: '\e821'; } /* '' */ +.linecons-paper-plane:before { content: '\e822'; } /* '' */ +.linecons-fire:before { content: '\e823'; } /* '' */ +.linecons-graduation-cap:before { content: '\e824'; } /* '' */ +.linecons-megaphone:before { content: '\e825'; } /* '' */ +.linecons-database:before { content: '\e826'; } /* '' */ +.linecons-key:before { content: '\e827'; } /* '' */ +.linecons-beaker:before { content: '\e828'; } /* '' */ +.linecons-truck:before { content: '\e829'; } /* '' */ +.linecons-money:before { content: '\e82a'; } /* '' */ +.linecons-food:before { content: '\e82b'; } /* '' */ +.linecons-shop:before { content: '\e82c'; } /* '' */ +.linecons-diamond:before { content: '\e82d'; } /* '' */ +.linecons-t-shirt:before { content: '\e82e'; } /* '' */ +.linecons-wallet:before { content: '\e82f'; } /* '' */ \ No newline at end of file diff --git a/web/static/index/css/fonts/linecons/css/linecons-embedded.css b/web/static/index/css/fonts/linecons/css/linecons-embedded.css new file mode 100644 index 0000000..3c53953 --- /dev/null +++ b/web/static/index/css/fonts/linecons/css/linecons-embedded.css @@ -0,0 +1,102 @@ +@font-face { + font-family: 'linecons'; + src: url('../font/linecons.eot?62319065'); + src: url('../font/linecons.eot?62319065#iefix') format('embedded-opentype'), + url('../font/linecons.svg?62319065#linecons') format('svg'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'linecons'; + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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') format('truetype'); +} +/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ +/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ +/* +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: 'linecons'; + src: url('../font/linecons.svg?62319065#linecons') format('svg'); + } +} +*/ + + [class^="linecons-"]:before, [class*=" linecons-"]:before { + font-family: "linecons"; + font-style: normal; + font-weight: normal; + speak: none; + + display: inline-block; + text-decoration: inherit; + width: 1em; + margin-right: .2em; + text-align: center; + /* opacity: .8; */ + + /* For safety - reset parent styles, that can break glyph codes*/ + font-variant: normal; + text-transform: none; + + /* fix buttons height, for twitter bootstrap */ + line-height: 1em; + + /* Animation center compensation - margins should be symmetric */ + /* remove if not needed */ + margin-left: .2em; + + /* you can be more comfortable with increased icons size */ + /* font-size: 120%; */ + + /* Uncomment for 3D effect */ + /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ +} +.linecons-music:before { content: '\e800'; } /* '' */ +.linecons-search:before { content: '\e801'; } /* '' */ +.linecons-mail:before { content: '\e802'; } /* '' */ +.linecons-heart:before { content: '\e803'; } /* '' */ +.linecons-star:before { content: '\e804'; } /* '' */ +.linecons-user:before { content: '\e805'; } /* '' */ +.linecons-videocam:before { content: '\e806'; } /* '' */ +.linecons-camera:before { content: '\e807'; } /* '' */ +.linecons-photo:before { content: '\e808'; } /* '' */ +.linecons-attach:before { content: '\e809'; } /* '' */ +.linecons-lock:before { content: '\e80a'; } /* '' */ +.linecons-eye:before { content: '\e80b'; } /* '' */ +.linecons-tag:before { content: '\e80c'; } /* '' */ +.linecons-thumbs-up:before { content: '\e80d'; } /* '' */ +.linecons-pencil:before { content: '\e80e'; } /* '' */ +.linecons-comment:before { content: '\e80f'; } /* '' */ +.linecons-location:before { content: '\e810'; } /* '' */ +.linecons-cup:before { content: '\e811'; } /* '' */ +.linecons-trash:before { content: '\e812'; } /* '' */ +.linecons-doc:before { content: '\e813'; } /* '' */ +.linecons-note:before { content: '\e814'; } /* '' */ +.linecons-cog:before { content: '\e815'; } /* '' */ +.linecons-params:before { content: '\e816'; } /* '' */ +.linecons-calendar:before { content: '\e817'; } /* '' */ +.linecons-sound:before { content: '\e818'; } /* '' */ +.linecons-clock:before { content: '\e819'; } /* '' */ +.linecons-lightbulb:before { content: '\e81a'; } /* '' */ +.linecons-tv:before { content: '\e81b'; } /* '' */ +.linecons-desktop:before { content: '\e81c'; } /* '' */ +.linecons-mobile:before { content: '\e81d'; } /* '' */ +.linecons-cd:before { content: '\e81e'; } /* '' */ +.linecons-inbox:before { content: '\e81f'; } /* '' */ +.linecons-globe:before { content: '\e820'; } /* '' */ +.linecons-cloud:before { content: '\e821'; } /* '' */ +.linecons-paper-plane:before { content: '\e822'; } /* '' */ +.linecons-fire:before { content: '\e823'; } /* '' */ +.linecons-graduation-cap:before { content: '\e824'; } /* '' */ +.linecons-megaphone:before { content: '\e825'; } /* '' */ +.linecons-database:before { content: '\e826'; } /* '' */ +.linecons-key:before { content: '\e827'; } /* '' */ +.linecons-beaker:before { content: '\e828'; } /* '' */ +.linecons-truck:before { content: '\e829'; } /* '' */ +.linecons-money:before { content: '\e82a'; } /* '' */ +.linecons-food:before { content: '\e82b'; } /* '' */ +.linecons-shop:before { content: '\e82c'; } /* '' */ +.linecons-diamond:before { content: '\e82d'; } /* '' */ +.linecons-t-shirt:before { content: '\e82e'; } /* '' */ +.linecons-wallet:before { content: '\e82f'; } /* '' */ \ No newline at end of file diff --git a/web/static/index/css/fonts/linecons/css/linecons-ie7-codes.css b/web/static/index/css/fonts/linecons/css/linecons-ie7-codes.css new file mode 100644 index 0000000..825710b --- /dev/null +++ b/web/static/index/css/fonts/linecons/css/linecons-ie7-codes.css @@ -0,0 +1,49 @@ + +.linecons-music { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-mail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-heart { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-star { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-user { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-videocam { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-camera { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-photo { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-attach { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-tag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-thumbs-up { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-pencil { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-comment { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-location { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-cup { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-doc { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-note { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-params { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-calendar { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-sound { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-lightbulb { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-tv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-desktop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-mobile { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-cd { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-inbox { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-globe { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-paper-plane { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-fire { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-graduation-cap { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-megaphone { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-database { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-key { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-beaker { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-truck { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-money { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-food { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-shop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-diamond { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-t-shirt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-wallet { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/web/static/index/css/fonts/linecons/css/linecons-ie7.css b/web/static/index/css/fonts/linecons/css/linecons-ie7.css new file mode 100644 index 0000000..673d900 --- /dev/null +++ b/web/static/index/css/fonts/linecons/css/linecons-ie7.css @@ -0,0 +1,60 @@ +[class^="linecons-"], [class*=" linecons-"] { + font-family: 'linecons'; + font-style: normal; + font-weight: normal; + + /* fix buttons height */ + line-height: 1em; + + /* you can be more comfortable with increased icons size */ + /* font-size: 120%; */ +} + +.linecons-music { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-mail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-heart { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-star { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-user { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-videocam { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-camera { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-photo { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-attach { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-tag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-thumbs-up { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-pencil { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-comment { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-location { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-cup { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-doc { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-note { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-params { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-calendar { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-sound { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-lightbulb { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-tv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-desktop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-mobile { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-cd { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-inbox { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-globe { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-paper-plane { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-fire { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-graduation-cap { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-megaphone { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-database { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-key { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-beaker { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-truck { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-money { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-food { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-shop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-diamond { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-t-shirt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.linecons-wallet { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/web/static/index/css/fonts/linecons/css/linecons.css b/web/static/index/css/fonts/linecons/css/linecons.css new file mode 100644 index 0000000..91a0af3 --- /dev/null +++ b/web/static/index/css/fonts/linecons/css/linecons.css @@ -0,0 +1,100 @@ +@font-face { + font-family: 'linecons'; + src: url('../font/linecons.eot?24293614'); + src: url('../font/linecons.eot?24293614#iefix') format('embedded-opentype'), + url('../font/linecons.woff?24293614') format('woff'), + url('../font/linecons.ttf?24293614') format('truetype'), + url('../font/linecons.svg?24293614#linecons') format('svg'); + font-weight: normal; + font-style: normal; +} +/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ +/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ +/* +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: 'linecons'; + src: url('../font/linecons.svg?24293614#linecons') format('svg'); + } +} +*/ + + [class^="linecons-"]:before, [class*=" linecons-"]:before { + font-family: "linecons"; + font-style: normal; + font-weight: normal; + speak: none; + + display: inline-block; + text-decoration: inherit; + width: 1em; + margin-right: .2em; + text-align: center; + /* opacity: .8; */ + + /* For safety - reset parent styles, that can break glyph codes*/ + font-variant: normal; + text-transform: none; + + /* fix buttons height, for twitter bootstrap */ + line-height: 1em; + + /* Animation center compensation - margins should be symmetric */ + /* remove if not needed */ + margin-left: .2em; + + /* you can be more comfortable with increased icons size */ + /* font-size: 120%; */ + + /* Uncomment for 3D effect */ + /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ +} + +.linecons-music:before { content: '\e800'; } /* '' */ +.linecons-search:before { content: '\e801'; } /* '' */ +.linecons-mail:before { content: '\e802'; } /* '' */ +.linecons-heart:before { content: '\e803'; } /* '' */ +.linecons-star:before { content: '\e804'; } /* '' */ +.linecons-user:before { content: '\e805'; } /* '' */ +.linecons-videocam:before { content: '\e806'; } /* '' */ +.linecons-camera:before { content: '\e807'; } /* '' */ +.linecons-photo:before { content: '\e808'; } /* '' */ +.linecons-attach:before { content: '\e809'; } /* '' */ +.linecons-lock:before { content: '\e80a'; } /* '' */ +.linecons-eye:before { content: '\e80b'; } /* '' */ +.linecons-tag:before { content: '\e80c'; } /* '' */ +.linecons-thumbs-up:before { content: '\e80d'; } /* '' */ +.linecons-pencil:before { content: '\e80e'; } /* '' */ +.linecons-comment:before { content: '\e80f'; } /* '' */ +.linecons-location:before { content: '\e810'; } /* '' */ +.linecons-cup:before { content: '\e811'; } /* '' */ +.linecons-trash:before { content: '\e812'; } /* '' */ +.linecons-doc:before { content: '\e813'; } /* '' */ +.linecons-note:before { content: '\e814'; } /* '' */ +.linecons-cog:before { content: '\e815'; } /* '' */ +.linecons-params:before { content: '\e816'; } /* '' */ +.linecons-calendar:before { content: '\e817'; } /* '' */ +.linecons-sound:before { content: '\e818'; } /* '' */ +.linecons-clock:before { content: '\e819'; } /* '' */ +.linecons-lightbulb:before { content: '\e81a'; } /* '' */ +.linecons-tv:before { content: '\e81b'; } /* '' */ +.linecons-desktop:before { content: '\e81c'; } /* '' */ +.linecons-mobile:before { content: '\e81d'; } /* '' */ +.linecons-cd:before { content: '\e81e'; } /* '' */ +.linecons-inbox:before { content: '\e81f'; } /* '' */ +.linecons-globe:before { content: '\e820'; } /* '' */ +.linecons-cloud:before { content: '\e821'; } /* '' */ +.linecons-paper-plane:before { content: '\e822'; } /* '' */ +.linecons-fire:before { content: '\e823'; } /* '' */ +.linecons-graduation-cap:before { content: '\e824'; } /* '' */ +.linecons-megaphone:before { content: '\e825'; } /* '' */ +.linecons-database:before { content: '\e826'; } /* '' */ +.linecons-key:before { content: '\e827'; } /* '' */ +.linecons-beaker:before { content: '\e828'; } /* '' */ +.linecons-truck:before { content: '\e829'; } /* '' */ +.linecons-money:before { content: '\e82a'; } /* '' */ +.linecons-food:before { content: '\e82b'; } /* '' */ +.linecons-shop:before { content: '\e82c'; } /* '' */ +.linecons-diamond:before { content: '\e82d'; } /* '' */ +.linecons-t-shirt:before { content: '\e82e'; } /* '' */ +.linecons-wallet:before { content: '\e82f'; } /* '' */ \ No newline at end of file diff --git a/web/static/index/css/fonts/linecons/font/linecons.eot b/web/static/index/css/fonts/linecons/font/linecons.eot new file mode 100644 index 0000000..7a6e012 Binary files /dev/null and b/web/static/index/css/fonts/linecons/font/linecons.eot differ diff --git a/web/static/index/css/fonts/linecons/font/linecons.svg b/web/static/index/css/fonts/linecons/font/linecons.svg new file mode 100644 index 0000000..983ca40 --- /dev/null +++ b/web/static/index/css/fonts/linecons/font/linecons.svg @@ -0,0 +1,59 @@ + + + +Copyright (C) 2014 by original authors @ fontello.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/static/index/css/fonts/linecons/font/linecons.ttf b/web/static/index/css/fonts/linecons/font/linecons.ttf new file mode 100644 index 0000000..27b0577 Binary files /dev/null and b/web/static/index/css/fonts/linecons/font/linecons.ttf differ diff --git a/web/static/index/css/fonts/linecons/font/linecons.woff b/web/static/index/css/fonts/linecons/font/linecons.woff new file mode 100644 index 0000000..0a98766 Binary files /dev/null and b/web/static/index/css/fonts/linecons/font/linecons.woff differ diff --git a/web/static/index/css/fonts/meteocons/css/animation.css b/web/static/index/css/fonts/meteocons/css/animation.css new file mode 100644 index 0000000..ac5a956 --- /dev/null +++ b/web/static/index/css/fonts/meteocons/css/animation.css @@ -0,0 +1,85 @@ +/* + Animation example, for spinners +*/ +.animate-spin { + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + -webkit-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; + display: inline-block; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -moz-transform: rotate(359deg); + -o-transform: rotate(359deg); + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -moz-transform: rotate(359deg); + -o-transform: rotate(359deg); + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -moz-transform: rotate(359deg); + -o-transform: rotate(359deg); + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -moz-transform: rotate(359deg); + -o-transform: rotate(359deg); + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -moz-transform: rotate(359deg); + -o-transform: rotate(359deg); + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/web/static/index/css/fonts/meteocons/css/meteocons-codes.css b/web/static/index/css/fonts/meteocons/css/meteocons-codes.css new file mode 100644 index 0000000..d852291 --- /dev/null +++ b/web/static/index/css/fonts/meteocons/css/meteocons-codes.css @@ -0,0 +1,48 @@ + +.meteocons-windy-rain-inv:before { content: '\e800'; } /* '' */ +.meteocons-snow-inv:before { content: '\e801'; } /* '' */ +.meteocons-snow-heavy-inv:before { content: '\e802'; } /* '' */ +.meteocons-hail-inv:before { content: '\e803'; } /* '' */ +.meteocons-clouds-inv:before { content: '\e804'; } /* '' */ +.meteocons-clouds-flash-inv:before { content: '\e805'; } /* '' */ +.meteocons-temperature:before { content: '\e806'; } /* '' */ +.meteocons-compass:before { content: '\e807'; } /* '' */ +.meteocons-na:before { content: '\e808'; } /* '' */ +.meteocons-celcius:before { content: '\e809'; } /* '' */ +.meteocons-fahrenheit:before { content: '\e80a'; } /* '' */ +.meteocons-clouds-flash-alt:before { content: '\e80b'; } /* '' */ +.meteocons-sun-inv:before { content: '\e80c'; } /* '' */ +.meteocons-moon-inv:before { content: '\e80d'; } /* '' */ +.meteocons-cloud-sun-inv:before { content: '\e80e'; } /* '' */ +.meteocons-cloud-moon-inv:before { content: '\e80f'; } /* '' */ +.meteocons-cloud-inv:before { content: '\e810'; } /* '' */ +.meteocons-cloud-flash-inv:before { content: '\e811'; } /* '' */ +.meteocons-drizzle-inv:before { content: '\e812'; } /* '' */ +.meteocons-rain-inv:before { content: '\e813'; } /* '' */ +.meteocons-windy-inv:before { content: '\e814'; } /* '' */ +.meteocons-sunrise:before { content: '\e815'; } /* '' */ +.meteocons-sun:before { content: '\e816'; } /* '' */ +.meteocons-moon:before { content: '\e817'; } /* '' */ +.meteocons-eclipse:before { content: '\e818'; } /* '' */ +.meteocons-mist:before { content: '\e819'; } /* '' */ +.meteocons-wind:before { content: '\e81a'; } /* '' */ +.meteocons-snowflake:before { content: '\e81b'; } /* '' */ +.meteocons-cloud-sun:before { content: '\e81c'; } /* '' */ +.meteocons-cloud-moon:before { content: '\e81d'; } /* '' */ +.meteocons-fog-sun:before { content: '\e81e'; } /* '' */ +.meteocons-fog-moon:before { content: '\e81f'; } /* '' */ +.meteocons-fog-cloud:before { content: '\e820'; } /* '' */ +.meteocons-fog:before { content: '\e821'; } /* '' */ +.meteocons-cloud:before { content: '\e822'; } /* '' */ +.meteocons-cloud-flash:before { content: '\e823'; } /* '' */ +.meteocons-cloud-flash-alt:before { content: '\e824'; } /* '' */ +.meteocons-drizzle:before { content: '\e825'; } /* '' */ +.meteocons-rain:before { content: '\e826'; } /* '' */ +.meteocons-windy:before { content: '\e827'; } /* '' */ +.meteocons-windy-rain:before { content: '\e828'; } /* '' */ +.meteocons-snow:before { content: '\e829'; } /* '' */ +.meteocons-snow-alt:before { content: '\e82a'; } /* '' */ +.meteocons-snow-heavy:before { content: '\e82b'; } /* '' */ +.meteocons-hail:before { content: '\e82c'; } /* '' */ +.meteocons-clouds:before { content: '\e82d'; } /* '' */ +.meteocons-clouds-flash:before { content: '\e82e'; } /* '' */ \ No newline at end of file diff --git a/web/static/index/css/fonts/meteocons/css/meteocons-embedded.css b/web/static/index/css/fonts/meteocons/css/meteocons-embedded.css new file mode 100644 index 0000000..7f9d2ba --- /dev/null +++ b/web/static/index/css/fonts/meteocons/css/meteocons-embedded.css @@ -0,0 +1,101 @@ +@font-face { + font-family: 'meteocons'; + src: url('../font/meteocons.eot?22250229'); + src: url('../font/meteocons.eot?22250229#iefix') format('embedded-opentype'), + url('../font/meteocons.svg?22250229#meteocons') format('svg'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'meteocons'; + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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') format('truetype'); +} +/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ +/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ +/* +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: 'meteocons'; + src: url('../font/meteocons.svg?22250229#meteocons') format('svg'); + } +} +*/ + + [class^="meteocons-"]:before, [class*=" meteocons-"]:before { + font-family: "meteocons"; + font-style: normal; + font-weight: normal; + speak: none; + + display: inline-block; + text-decoration: inherit; + width: 1em; + margin-right: .2em; + text-align: center; + /* opacity: .8; */ + + /* For safety - reset parent styles, that can break glyph codes*/ + font-variant: normal; + text-transform: none; + + /* fix buttons height, for twitter bootstrap */ + line-height: 1em; + + /* Animation center compensation - margins should be symmetric */ + /* remove if not needed */ + margin-left: .2em; + + /* you can be more comfortable with increased icons size */ + /* font-size: 120%; */ + + /* Uncomment for 3D effect */ + /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ +} +.meteocons-windy-rain-inv:before { content: '\e800'; } /* '' */ +.meteocons-snow-inv:before { content: '\e801'; } /* '' */ +.meteocons-snow-heavy-inv:before { content: '\e802'; } /* '' */ +.meteocons-hail-inv:before { content: '\e803'; } /* '' */ +.meteocons-clouds-inv:before { content: '\e804'; } /* '' */ +.meteocons-clouds-flash-inv:before { content: '\e805'; } /* '' */ +.meteocons-temperature:before { content: '\e806'; } /* '' */ +.meteocons-compass:before { content: '\e807'; } /* '' */ +.meteocons-na:before { content: '\e808'; } /* '' */ +.meteocons-celcius:before { content: '\e809'; } /* '' */ +.meteocons-fahrenheit:before { content: '\e80a'; } /* '' */ +.meteocons-clouds-flash-alt:before { content: '\e80b'; } /* '' */ +.meteocons-sun-inv:before { content: '\e80c'; } /* '' */ +.meteocons-moon-inv:before { content: '\e80d'; } /* '' */ +.meteocons-cloud-sun-inv:before { content: '\e80e'; } /* '' */ +.meteocons-cloud-moon-inv:before { content: '\e80f'; } /* '' */ +.meteocons-cloud-inv:before { content: '\e810'; } /* '' */ +.meteocons-cloud-flash-inv:before { content: '\e811'; } /* '' */ +.meteocons-drizzle-inv:before { content: '\e812'; } /* '' */ +.meteocons-rain-inv:before { content: '\e813'; } /* '' */ +.meteocons-windy-inv:before { content: '\e814'; } /* '' */ +.meteocons-sunrise:before { content: '\e815'; } /* '' */ +.meteocons-sun:before { content: '\e816'; } /* '' */ +.meteocons-moon:before { content: '\e817'; } /* '' */ +.meteocons-eclipse:before { content: '\e818'; } /* '' */ +.meteocons-mist:before { content: '\e819'; } /* '' */ +.meteocons-wind:before { content: '\e81a'; } /* '' */ +.meteocons-snowflake:before { content: '\e81b'; } /* '' */ +.meteocons-cloud-sun:before { content: '\e81c'; } /* '' */ +.meteocons-cloud-moon:before { content: '\e81d'; } /* '' */ +.meteocons-fog-sun:before { content: '\e81e'; } /* '' */ +.meteocons-fog-moon:before { content: '\e81f'; } /* '' */ +.meteocons-fog-cloud:before { content: '\e820'; } /* '' */ +.meteocons-fog:before { content: '\e821'; } /* '' */ +.meteocons-cloud:before { content: '\e822'; } /* '' */ +.meteocons-cloud-flash:before { content: '\e823'; } /* '' */ +.meteocons-cloud-flash-alt:before { content: '\e824'; } /* '' */ +.meteocons-drizzle:before { content: '\e825'; } /* '' */ +.meteocons-rain:before { content: '\e826'; } /* '' */ +.meteocons-windy:before { content: '\e827'; } /* '' */ +.meteocons-windy-rain:before { content: '\e828'; } /* '' */ +.meteocons-snow:before { content: '\e829'; } /* '' */ +.meteocons-snow-alt:before { content: '\e82a'; } /* '' */ +.meteocons-snow-heavy:before { content: '\e82b'; } /* '' */ +.meteocons-hail:before { content: '\e82c'; } /* '' */ +.meteocons-clouds:before { content: '\e82d'; } /* '' */ +.meteocons-clouds-flash:before { content: '\e82e'; } /* '' */ \ No newline at end of file diff --git a/web/static/index/css/fonts/meteocons/css/meteocons-ie7-codes.css b/web/static/index/css/fonts/meteocons/css/meteocons-ie7-codes.css new file mode 100644 index 0000000..0c823e4 --- /dev/null +++ b/web/static/index/css/fonts/meteocons/css/meteocons-ie7-codes.css @@ -0,0 +1,48 @@ + +.meteocons-windy-rain-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-snow-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-snow-heavy-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-hail-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-clouds-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-clouds-flash-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-temperature { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-compass { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-na { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-celcius { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-fahrenheit { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-clouds-flash-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-sun-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-moon-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-sun-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-moon-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-flash-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-drizzle-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-rain-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-windy-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-sunrise { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-sun { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-moon { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-eclipse { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-mist { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-wind { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-snowflake { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-sun { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-moon { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-fog-sun { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-fog-moon { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-fog-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-fog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-flash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-flash-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-drizzle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-rain { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-windy { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-windy-rain { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-snow { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-snow-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-snow-heavy { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-hail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-clouds { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-clouds-flash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/web/static/index/css/fonts/meteocons/css/meteocons-ie7.css b/web/static/index/css/fonts/meteocons/css/meteocons-ie7.css new file mode 100644 index 0000000..187db28 --- /dev/null +++ b/web/static/index/css/fonts/meteocons/css/meteocons-ie7.css @@ -0,0 +1,59 @@ +[class^="meteocons-"], [class*=" meteocons-"] { + font-family: 'meteocons'; + font-style: normal; + font-weight: normal; + + /* fix buttons height */ + line-height: 1em; + + /* you can be more comfortable with increased icons size */ + /* font-size: 120%; */ +} + +.meteocons-windy-rain-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-snow-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-snow-heavy-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-hail-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-clouds-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-clouds-flash-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-temperature { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-compass { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-na { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-celcius { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-fahrenheit { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-clouds-flash-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-sun-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-moon-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-sun-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-moon-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-flash-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-drizzle-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-rain-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-windy-inv { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-sunrise { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-sun { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-moon { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-eclipse { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-mist { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-wind { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-snowflake { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-sun { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-moon { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-fog-sun { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-fog-moon { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-fog-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-fog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-flash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-cloud-flash-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-drizzle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-rain { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-windy { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-windy-rain { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-snow { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-snow-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-snow-heavy { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-hail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-clouds { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.meteocons-clouds-flash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/web/static/index/css/fonts/meteocons/css/meteocons.css b/web/static/index/css/fonts/meteocons/css/meteocons.css new file mode 100644 index 0000000..a014233 --- /dev/null +++ b/web/static/index/css/fonts/meteocons/css/meteocons.css @@ -0,0 +1,99 @@ +@font-face { + font-family: 'meteocons'; + src: url('../font/meteocons.eot?24967826'); + src: url('../font/meteocons.eot?24967826#iefix') format('embedded-opentype'), + url('../font/meteocons.woff?24967826') format('woff'), + url('../font/meteocons.ttf?24967826') format('truetype'), + url('../font/meteocons.svg?24967826#meteocons') format('svg'); + font-weight: normal; + font-style: normal; +} +/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ +/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ +/* +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: 'meteocons'; + src: url('../font/meteocons.svg?24967826#meteocons') format('svg'); + } +} +*/ + + [class^="meteocons-"]:before, [class*=" meteocons-"]:before { + font-family: "meteocons"; + font-style: normal; + font-weight: normal; + speak: none; + + display: inline-block; + text-decoration: inherit; + width: 1em; + margin-right: .2em; + text-align: center; + /* opacity: .8; */ + + /* For safety - reset parent styles, that can break glyph codes*/ + font-variant: normal; + text-transform: none; + + /* fix buttons height, for twitter bootstrap */ + line-height: 1em; + + /* Animation center compensation - margins should be symmetric */ + /* remove if not needed */ + margin-left: .2em; + + /* you can be more comfortable with increased icons size */ + /* font-size: 120%; */ + + /* Uncomment for 3D effect */ + /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ +} + +.meteocons-windy-rain-inv:before { content: '\e800'; } /* '' */ +.meteocons-snow-inv:before { content: '\e801'; } /* '' */ +.meteocons-snow-heavy-inv:before { content: '\e802'; } /* '' */ +.meteocons-hail-inv:before { content: '\e803'; } /* '' */ +.meteocons-clouds-inv:before { content: '\e804'; } /* '' */ +.meteocons-clouds-flash-inv:before { content: '\e805'; } /* '' */ +.meteocons-temperature:before { content: '\e806'; } /* '' */ +.meteocons-compass:before { content: '\e807'; } /* '' */ +.meteocons-na:before { content: '\e808'; } /* '' */ +.meteocons-celcius:before { content: '\e809'; } /* '' */ +.meteocons-fahrenheit:before { content: '\e80a'; } /* '' */ +.meteocons-clouds-flash-alt:before { content: '\e80b'; } /* '' */ +.meteocons-sun-inv:before { content: '\e80c'; } /* '' */ +.meteocons-moon-inv:before { content: '\e80d'; } /* '' */ +.meteocons-cloud-sun-inv:before { content: '\e80e'; } /* '' */ +.meteocons-cloud-moon-inv:before { content: '\e80f'; } /* '' */ +.meteocons-cloud-inv:before { content: '\e810'; } /* '' */ +.meteocons-cloud-flash-inv:before { content: '\e811'; } /* '' */ +.meteocons-drizzle-inv:before { content: '\e812'; } /* '' */ +.meteocons-rain-inv:before { content: '\e813'; } /* '' */ +.meteocons-windy-inv:before { content: '\e814'; } /* '' */ +.meteocons-sunrise:before { content: '\e815'; } /* '' */ +.meteocons-sun:before { content: '\e816'; } /* '' */ +.meteocons-moon:before { content: '\e817'; } /* '' */ +.meteocons-eclipse:before { content: '\e818'; } /* '' */ +.meteocons-mist:before { content: '\e819'; } /* '' */ +.meteocons-wind:before { content: '\e81a'; } /* '' */ +.meteocons-snowflake:before { content: '\e81b'; } /* '' */ +.meteocons-cloud-sun:before { content: '\e81c'; } /* '' */ +.meteocons-cloud-moon:before { content: '\e81d'; } /* '' */ +.meteocons-fog-sun:before { content: '\e81e'; } /* '' */ +.meteocons-fog-moon:before { content: '\e81f'; } /* '' */ +.meteocons-fog-cloud:before { content: '\e820'; } /* '' */ +.meteocons-fog:before { content: '\e821'; } /* '' */ +.meteocons-cloud:before { content: '\e822'; } /* '' */ +.meteocons-cloud-flash:before { content: '\e823'; } /* '' */ +.meteocons-cloud-flash-alt:before { content: '\e824'; } /* '' */ +.meteocons-drizzle:before { content: '\e825'; } /* '' */ +.meteocons-rain:before { content: '\e826'; } /* '' */ +.meteocons-windy:before { content: '\e827'; } /* '' */ +.meteocons-windy-rain:before { content: '\e828'; } /* '' */ +.meteocons-snow:before { content: '\e829'; } /* '' */ +.meteocons-snow-alt:before { content: '\e82a'; } /* '' */ +.meteocons-snow-heavy:before { content: '\e82b'; } /* '' */ +.meteocons-hail:before { content: '\e82c'; } /* '' */ +.meteocons-clouds:before { content: '\e82d'; } /* '' */ +.meteocons-clouds-flash:before { content: '\e82e'; } /* '' */ \ No newline at end of file diff --git a/web/static/index/css/fonts/meteocons/font/meteocons.eot b/web/static/index/css/fonts/meteocons/font/meteocons.eot new file mode 100644 index 0000000..11d3990 Binary files /dev/null and b/web/static/index/css/fonts/meteocons/font/meteocons.eot differ diff --git a/web/static/index/css/fonts/meteocons/font/meteocons.svg b/web/static/index/css/fonts/meteocons/font/meteocons.svg new file mode 100644 index 0000000..2f135fa --- /dev/null +++ b/web/static/index/css/fonts/meteocons/font/meteocons.svg @@ -0,0 +1,58 @@ + + + +Copyright (C) 2014 by original authors @ fontello.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/static/index/css/fonts/meteocons/font/meteocons.ttf b/web/static/index/css/fonts/meteocons/font/meteocons.ttf new file mode 100644 index 0000000..bd863a8 Binary files /dev/null and b/web/static/index/css/fonts/meteocons/font/meteocons.ttf differ diff --git a/web/static/index/css/fonts/meteocons/font/meteocons.woff b/web/static/index/css/fonts/meteocons/font/meteocons.woff new file mode 100644 index 0000000..be4974a Binary files /dev/null and b/web/static/index/css/fonts/meteocons/font/meteocons.woff differ diff --git a/web/static/index/css/hclonely.css b/web/static/index/css/hclonely.css new file mode 100644 index 0000000..a826876 --- /dev/null +++ b/web/static/index/css/hclonely.css @@ -0,0 +1 @@ +.sousuo{padding: 25px 0 35px 0;max-width: 717px;margin: 0 auto;}.search{position: relative;width: 100%;margin: 0 auto;}.search-box{position: relative;}.search-icon{position: absolute;left: 3px;top: 5px;width: 40px;height: 40px;overflow: hidden;border-radius: 25px;cursor: pointer;opacity: 0;}.search-input{width: 100%;height: 50px;line-height: 50px;font-size: 16px;color: #999;border: none;outline: none;padding-left: 45px;border: 1px solid #e6e6e6;border-radius: 10px;}.search-input:focus{outline: none;border: 1px solid #2188ff;-webkit-box-shadow: 0 0 5px 0px rgba(71, 158, 245, 0.5);box-shadow: 0 0 5px 0px rgba(71, 158, 245, 0.5);}input::-webkit-input-placeholder{font-size: 12px;letter-spacing: 1px;color: #ccc;}.search-btn{position: absolute;right: 0;top: 0;width: 50px;line-height: 48px;background: transparent;border: none;font-size: 25px;color: #ddd;font-weight: bold;outline: none;padding: 0 10px;}.search-btn:hover{color: #6b7184 }.search-btn i {margin: 0 }.search-hot-text{position: absolute;z-index: 100;width: 100%;border-radius: 0 0 10px 10px;background: #FFF;box-shadow: 0px 4px 5px 0px #cccccc94;overflow: hidden;}.search-hot-text ul{margin: 0;padding: 5px 0;}.search-hot-text ul li{border-top: 1px solid #f2f2f2;line-height: 30px;font-size: 14px;padding: 0px 25px;color: #777;cursor: pointer;}.search-hot-text ul li.current{background: #f1f1f1;color: #2196f3;}.search-hot-text ul li:hover{background: #f1f1f1;color: #2196f3;cursor: pointer;}.search-hot-text ul li span{display: inline-block;width: 20px;height: 20px;font-size: 12px;line-height: 20px;text-align: center;background: #e5e5e5;margin-right: 10px;border-radius: 10px;color: #999;}.search-engine{position: absolute;top: 60px;left: 0;width: 100%;background: #FFF;padding: 15px 0 0 15px;border-radius: 5px;box-shadow: 0px 5px 20px 0px #d8d7d7;transition: all 0.3s;-moz-transition: all 0.3s;-webkit-transition: all 0.3s;-o-transition: all 0.3s;display: none;z-index: 999 }.search-engine-head{overflow: hidden;margin-bottom: 10px;padding-right: 15px;}.search-engine-tit{float: left;margin: 0;font-size: 14px;color: #999;}.search-engine-tool{float: right;font-size: 12px;color: #999;}.search-engine-tool > span{float: right;display: inline-block;width: 25px;height: 15px;background-position: 0px 0px;cursor: pointer }.search-engine-tool > span.off{background-position: -30px 0px }.search-engine ul::before{content: '';width: 0px;height: 0px;position: absolute;top: -15px;border-top: 8px solid transparent;border-right: 8px solid transparent;border-bottom: 8px solid #fff;border-left: 8px solid transparent;}.search-engine-list::after{content: '';width: 90px;height: 20px;position: absolute;top: -20px;left: 1px;}.search-engine-list li{float: left;width: 30%;line-height: 30px;font-size: 14px;padding: 5px 10px 5px 10px;margin: 0 10px 10px 0;background: #f9f9f9;color: #999;cursor: pointer;padding: 0;}.search-engine-list li span{width: 25px;height: 25px;border-radius: 15px;float: left;margin-right: 5px;margin-top: 2.5px;}body.night .board {background: #2c2e2f;box-shadow: 0px 0px 6px #00000061;}body.night .board a {color: #d6d6d6;}body.night .tpwidget_title_hook, body.night .tpwidget_text_hook {color: #fdfdfd;}body.night .sidebar-menu {border-right: #7f8080 1px solid;}body.night .user-info-navbar {background-color: #232323 !important;}body.night .dropdown-menu {background-color: #232323 !important;border: 1px solid #888686 !important;}body.night .user-info-navbar .user-info-menu>li>a {border-bottom: 1px solid #232323 !important;border-right: 1px solid #232323 !important;border-left: 1px solid #232323 !important;}body.night .user-info-navbar .user-info-menu>li>a, .user-info-navbar .user-info-menu>li>a {height: 76px !important;}body.night .user-info-navbar .user-info-menu>li>a:hover {border-right: 1px solid #888686 !important;border-left: 1px solid #888686 !important;}body.night .user-info-navbar .user-info-menu>li {border: 1px solid #232323 !important;}body.night .user-info-navbar .user-info-menu>li .dropdown-menu.languages li.active a {background-color: #232323 !important;color: #979898 !important;}body.night, body.night #body {background-color: #2c2e2f !important;color: #a9a9a9 !important;}body.night .text-gray {color: #f8f8f8;}body.night .xe-widget.xe-conversations {background: #2c2e2f;}body.night .box2 {border: 1px solid #3f4142;}body.night .xe-comment a {color: #d8d8d8;}body.night .xe-comment p {color: #979898 !important;}body.night .box2:hover {box-shadow: 0 26px 40px -24px rgb(255, 255, 255);-webkit-box-shadow: 0 26px 40px -24px rgba(130, 130, 130, 0.13);-moz-box-shadow: 0 26px 40px -24px rgba(0, 36, 100, 0.3);-webkit-transition: all 0.3s cubic-bezier(0.25, 0.1, 0.14, 1.43);-moz-transition: all 0.3s ease;-o-transition: all 0.3s ease;transition: all 0.3s ease-out;background-color: #232323 !important;}body.night .tpwthwidt .front_37Zqj25, body.night .tpwthwidt .widget_ctONpAN {background: #535656;color: red !important;}body.night .tpwthwidt .weakText_3SLbaEo {color: rgb(253, 253, 253);}body.night .tpwthwidt .baseText_31obwQ4 {color: #cccccc;}body.night footer.main-footer {border-top: 1px solid #414344b5;background-color: #2c2e2f;}body.night .footer-text a {color: #a9a9a9;}body.night .footer-text a:hover, body.night footer-text a:focus {color: #ffffff;text-decoration: none }body.night .panel {background: #2c2e2f;}body.night blockquote {border-left: 5px solid #000;}body.night .respond a {color: #cecece;}body.night .respond .textarea {background-color: #2b2b2b;margin-top: 50px;border-radius: 15px;padding: 10px;}body.night .submit {color: #a5a5a5;background-color: #0000008f;border: 0px;border-radius: 5px;padding: 5px 10px;font-size: 15px;float: right;margin-top: 10px;}body.night #search button i {color: #b1b1b1;}body.night #search-text {background-color: #464646;color: #bdbdbd;}body.night .search-type input:checked+label, .search-type input:hover+label {background-color: #969696;}body.night .s-type-list {display: none;position: absolute;top: 31px;padding: 9pt 0;width: 20pc;background: #535656;border-radius: 4px;box-shadow: 0 0 6px rgba(0, 0, 0, .16);}body.night .xe-comment-entry img {filter: brightness(95%);}body.night .search-input {border: 1px solid #424242;border-radius: 10px;background-color: #424242;}body.night .search-engine {background: #424242;box-shadow: 0px 5px 20px 0px #2c2e2f;}body.night .search-engine-list li {background: #424242;}.go-up{right: 10px !important;position: fixed !important;bottom: 20px !important;height: 20px;}body.night .go-up a {background-color: rgb(88 88 88) !important;padding: 15px 20px !important;border-radius: 50% !important;}body.night .go-up a:hover {background-color: rgb(123 123 123) !important;}.footer-inner #busuanzi_container_site_pv, .footer-inner #busuanzi_container_site_uv {font-weight: bold;}.footer-inner #busuanzi_value_site_pv, .footer-inner #busuanzi_value_site_uv {color: #373e4a;}.main-menu #busuanzi_value_site_pv, .main-menu #busuanzi_value_site_uv {float: right;}.sidebar-menu .main-menu a>i{width: 16px;} diff --git a/web/static/index/css/nav.css b/web/static/index/css/nav.css new file mode 100644 index 0000000..dc9e730 --- /dev/null +++ b/web/static/index/css/nav.css @@ -0,0 +1 @@ +.box2 {height: 86px;cursor: pointer;border-radius: 4px;padding: 0px 30px 0px 30px;background-color: #fff;border-radius: 4px;border: 1px solid #e4ecf3;margin: 20px 0 0 0;-webkit-transition: all 0.3s ease;-moz-transition: all 0.3s ease;-o-transition: all 0.3s ease;transition: all 0.3s ease;}.box2:hover {transform: translateY(-6px);-webkit-transform: translateY(-6px);-moz-transform: translateY(-6px);box-shadow: 0 26px 40px -24px rgba(0, 36, 100, 0.3);-webkit-box-shadow: 0 26px 40px -24px rgba(0, 36, 100, 0.3);-moz-box-shadow: 0 26px 40px -24px rgba(0, 36, 100, 0.3);-webkit-transition: all 0.3s ease;-moz-transition: all 0.3s ease;-o-transition: all 0.3s ease;transition: all 0.3s ease;}.xe-comment-entry img {float: left;display: block;margin-right: 10px;}.xe-comment {transform: translateY(-50%);position: absolute;margin-left: 50px;top: 50%;}.xe-comment p {margin-bottom: 0px;margin-right: 15px;}.overflowClip_1 {overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 1;-webkit-box-orient: vertical;}.overflowClip_2 {overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;}.submit-tag{margin-top: 50px;}.img-circle {padding: 7px 0;} diff --git a/web/static/index/css/xenon-components.css b/web/static/index/css/xenon-components.css new file mode 100644 index 0000000..4c3a13f --- /dev/null +++ b/web/static/index/css/xenon-components.css @@ -0,0 +1 @@ +.transall, .gallery-env .album-images .album-image .image-checkbox .cbr-replaced, .login-page .login-form .form-group .control-label, .login-page .login-form .form-group .form-control, .lockscreen-page .lockcreen-form .form-group .input-group .form-control, .xe-widget.xe-single-news .xe-image .xe-gradient, .xe-widget.xe-weather .xe-current-day .xe-forecast .xe-forecast-entry time, .xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-temp, .sidebar-user-info .user-links li a {-webkit-transition: all 220ms ease-in-out;-moz-transition: all 220ms ease-in-out;-o-transition: all 220ms ease-in-out;transition: all 220ms ease-in-out }.clearfix:before, .clearfix:after, .mailbox-env:before, .mailbox-env:after, .mailbox-env .mail-env .mail-table .mail-pagination .next-prev:before, .mailbox-env .mail-env .mail-table .mail-pagination .next-prev:after, .mailbox-env .mail-single .mail-single-header:before, .mailbox-env .mail-single .mail-single-header:after, .mailbox-env .mail-single .mail-single-info:before, .mailbox-env .mail-single .mail-single-info:after, .invoice-env:before, .invoice-env:after, .invoice-env .invoice-header:before, .invoice-env .invoice-header:after, .invoice-env .invoice-details:before, .invoice-env .invoice-details:after, .invoice-env .invoice-details .invoice-client-info:before, .invoice-env .invoice-details .invoice-client-info:after, .invoice-env .invoice-details .invoice-payment-info:before, .invoice-env .invoice-details .invoice-payment-info:after, .invoice-env .invoice-totals:before, .invoice-env .invoice-totals:after, .gallery-env:before, .gallery-env:after, .gallery-env .album-header:before, .gallery-env .album-header:after, .gallery-env .album-images .album-image:before, .gallery-env .album-images .album-image:after, .calendar-env:before, .calendar-env:after, .profile-env:before, .profile-env:after, .profile-env .user-timeline-stories .timeline-story header:before, .profile-env .user-timeline-stories .timeline-story header:after, .profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info:before, .profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info:after, .profile-env .user-timeline-stories .timeline-story .story-album:before, .profile-env .user-timeline-stories .timeline-story .story-album:after, .timeline-centered:before, .timeline-centered:after, .timeline-centered .timeline-entry .timeline-entry-inner:before, .timeline-centered .timeline-entry .timeline-entry-inner:after, .notes-env .notes-list:before, .notes-env .notes-list:after, .lockscreen-page .lockcreen-form:before, .lockscreen-page .lockcreen-form:after, .xe-widget.xe-weather:before, .xe-widget.xe-weather:after, .xe-widget.xe-weather .xe-current-day .xe-now:before, .xe-widget.xe-weather .xe-current-day .xe-now:after, .xe-widget.xe-map-stats:before, .xe-widget.xe-map-stats:after {content: " ";display: table }.clearfix:after, .mailbox-env:after, .mailbox-env .mail-env .mail-table .mail-pagination .next-prev:after, .mailbox-env .mail-single .mail-single-header:after, .mailbox-env .mail-single .mail-single-info:after, .invoice-env:after, .invoice-env .invoice-header:after, .invoice-env .invoice-details:after, .invoice-env .invoice-details .invoice-client-info:after, .invoice-env .invoice-details .invoice-payment-info:after, .invoice-env .invoice-totals:after, .gallery-env:after, .gallery-env .album-header:after, .gallery-env .album-images .album-image:after, .calendar-env:after, .profile-env:after, .profile-env .user-timeline-stories .timeline-story header:after, .profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info:after, .profile-env .user-timeline-stories .timeline-story .story-album:after, .timeline-centered:after, .timeline-centered .timeline-entry .timeline-entry-inner:after, .notes-env .notes-list:after, .lockscreen-page .lockcreen-form:after, .xe-widget.xe-weather:after, .xe-widget.xe-weather .xe-current-day .xe-now:after, .xe-widget.xe-map-stats:after {clear: both }.mailbox-env .mailbox-sidebar .mailbox-list {margin-top: 30px }@media screen and (max-width:768px) {.mailbox-env .mailbox-sidebar .mailbox-list {margin-top: 10px }}.mailbox-env .mailbox-sidebar .mailbox-list li {border-bottom: 1px solid #ddd }.mailbox-env .mailbox-sidebar .mailbox-list li a {display: block;color: #979898;padding: 10px 10px }.mailbox-env .mailbox-sidebar .mailbox-list li a:hover {color: #717272 }.mailbox-env .mailbox-sidebar .mailbox-list li a .badge {margin-top: 0 }.mailbox-env .mailbox-sidebar .mailbox-list li.active>a {color: #2c2e2f;font-weight: 700 }.mailbox-env .mailbox-sidebar .mailbox-list li:last-child {border-bottom: 0 }.mailbox-env .mailbox-sidebar .mailbox-list li.list-header {font-size: 10px;padding: 10px 10px;font-weight: 700;color: #979898;text-transform: uppercase }.mailbox-env .mail-env {background: #FFF;padding: 15px 0;margin-bottom: 30px }.mailbox-env .mail-env .mail-table {color: #979898;margin-bottom: 0 }.mailbox-env .mail-env .mail-table>thead>tr>td, .mailbox-env .mail-env .mail-table>tfoot>tr>td, .mailbox-env .mail-env .mail-table>thead>tr>th, .mailbox-env .mail-env .mail-table>tfoot>tr>th {color: #717272;font-weight: 400;padding-left: 10px;padding-right: 10px;padding-top: 0;padding-bottom: 15px }.mailbox-env .mail-env .mail-table>thead>tr>td:after, .mailbox-env .mail-env .mail-table>tfoot>tr>td:after, .mailbox-env .mail-env .mail-table>thead>tr>th:after, .mailbox-env .mail-env .mail-table>tfoot>tr>th:after {display: none }.mailbox-env .mail-env .mail-table>tfoot>tr>td, .mailbox-env .mail-env .mail-table>tfoot>tr>th {border-bottom: 0;padding-top: 15px;padding-bottom: 0 }.mailbox-env .mail-env .mail-table>tbody>tr>td, .mailbox-env .mail-env .mail-table>tbody>tr>th {padding-left: 10px;padding-right: 10px;vertical-align: middle }.mailbox-env .mail-env .mail-table>tbody>tr a:hover {color: #646565 }.mailbox-env .mail-env .mail-table>tbody>tr.unread .col-name {font-weight: 700 }.mailbox-env .mail-env .mail-table>tbody>tr.unread .col-name a {color: #646565 }.mailbox-env .mail-env .mail-table>tbody>tr.highlighted {background-color: rgba(255, 255, 204, .35) }.mailbox-env .mail-env .mail-table .col-cb, .mailbox-env .mail-env .mail-table .col-options {width: 2% }.mailbox-env .mail-env .mail-table .col-cb {padding-left: 30px }@media screen and (max-width:550px) {.mailbox-env .mail-env .mail-table .col-cb {padding-left: 15px }}.mailbox-env .mail-env .mail-table .col-subject a {display: block;max-width: 250px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap }@media screen and (max-width:768px) {.mailbox-env .mail-env .mail-table .col-subject a {max-width: 150px }}@media screen and (max-width:550px) {.mailbox-env .mail-env .mail-table .col-subject {padding-right: 15px }}.mailbox-env .mail-env .mail-table .col-options {text-align: right }.mailbox-env .mail-env .mail-table .col-time {width: 12%;text-align: right;padding-right: 30px;white-space: nowrap }@media screen and (max-width:550px) {.mailbox-env .mail-env .mail-table .col-time {display: none;padding-right: 15px }}.mailbox-env .mail-env .mail-table .col-header-options {padding-right: 30px }@media screen and (max-width:550px) {.mailbox-env .mail-env .mail-table .col-header-options {padding-right: 15px }}.mailbox-env .mail-env .mail-table a {color: #979898 }.mailbox-env .mail-env .mail-table .btn {margin-bottom: 0 }.mailbox-env .mail-env .mail-table .checkbox {margin: 0 }.mailbox-env .mail-env .mail-table .mail-select-options {float: left;position: relative;top: 2px }@media screen and (max-width:450px) {.mailbox-env .mail-env .mail-table .mail-select-options {display: none }}.mailbox-env .mail-env .mail-table .mail-pagination {float: right;margin-right: -10px }.mailbox-env .mail-env .mail-table .mail-pagination .next-prev {position: relative;display: inline-block;margin-bottom: -5px;margin-left: 10px }.mailbox-env .mail-env .mail-table .mail-pagination .next-prev a {position: relative;display: block;float: left;color: #575858;font-size: 14px }.mailbox-env .mail-env .mail-table .mail-pagination .next-prev a i {margin: 0 8px }.mailbox-env .mail-env .mail-table .mail-pagination .next-prev a:hover {background: rgba(221, 221, 221, .25) }.mailbox-env .mail-env .mail-table .mail-pagination .next-prev a:first-child {margin-right: 9px }.mailbox-env .mail-env .mail-table .mail-pagination .next-prev a:first-child:after {display: block;height: 10px;width: 1px;background: #ddd;position: absolute;top: 50%;margin-top: -5px;right: -5px;content: '' }.mailbox-env .mail-env .mail-table .star {position: relative;display: inline-block;font-size: 15px;margin-top: -3px }.mailbox-env .mail-env .mail-table .star.starred {color: #ffba00!important }.mailbox-env .mail-compose {background: #fff;padding: 30px;margin-bottom: 30px }.mailbox-env .mail-compose .compose-message-editor {margin-bottom: 20px }.mailbox-env .mail-compose .compose-message-editor textarea {min-height: 150px }.mailbox-env .mail-compose .form-group {position: relative }.mailbox-env .mail-compose .form-group label {position: absolute;left: 0;top: 0;z-index: 5;line-height: 48px;padding: 0 15px;font-weight: 700;color: #717272;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none }.mailbox-env .mail-compose .form-group input, .mailbox-env .mail-compose .form-group textarea {position: relative;z-index: 1 }.mailbox-env .mail-compose .form-group input.form-control {height: 48px;padding-left: 80px }.mailbox-env .mail-compose .form-group .field-options {position: absolute;right: 0;top: 0;z-index: 4;padding: 14px 15px }.mailbox-env .mail-compose .form-group .field-options a {display: block;background: #ccc;color: #fff;font-size: 10px;float: left;margin-left: 5px;padding: 3px 5px }.mailbox-env .mail-compose .form-group .field-options a:hover {background-color: #999 }.mailbox-env .mail-header {border-bottom: 1px solid #ddd;margin-bottom: 20px;padding-bottom: 20px }.mailbox-env .mail-header h3 {margin: 0 }.mailbox-env .mail-header h3 i {font-size: 17px }@media screen and (max-width:768px) {.mailbox-env .mail-header h3 {margin-bottom: 20px }}.mailbox-env .mail-single {background: #fff;padding: 30px;margin-bottom: 30px }.mailbox-env .mail-single .mail-single-header {border-bottom: 2px solid #f0f0f0;padding-bottom: 20px;margin-bottom: 20px }.mailbox-env .mail-single .mail-single-header>h2 {float: left;margin: 0;font-size: 23px }@media screen and (max-width:768px) {.mailbox-env .mail-single .mail-single-header>h2 {float: none;margin-bottom: 20px;font-size: 19px }.mailbox-env .mail-single .mail-single-header>h2 .go-back {font-size: 11px }}.mailbox-env .mail-single .mail-single-header>h2 .go-back {display: block;color: #bdbebe;font-size: 13px;margin-top: 10px;margin-left: -5px }.mailbox-env .mail-single .mail-single-header>h2 .go-back i {color: #b1b1b1 }.mailbox-env .mail-single .mail-single-header>h2 .label, .mailbox-env .mail-single .mail-single-header>h2 .badge {margin-left: 10px }.mailbox-env .mail-single .mail-single-header .mail-single-header-options {float: right }@media screen and (max-width:768px) {.mailbox-env .mail-single .mail-single-header .mail-single-header-options {float: none }}.mailbox-env .mail-single .mail-single-info {border-bottom: 1px solid #f0f0f0;padding-bottom: 20px;margin-bottom: 20px }.mailbox-env .mail-single .mail-single-info .mail-single-info-user {float: left }.mailbox-env .mail-single .mail-single-info .mail-single-info-user>a {display: block;color: #979898;text-decoration: none }.mailbox-env .mail-single .mail-single-info .mail-single-info-user>a strong, .mailbox-env .mail-single .mail-single-info .mail-single-info-user>a span {color: #717272;font-weight: 700 }.mailbox-env .mail-single .mail-single-info .mail-single-info-user>a img {float: left;margin-right: 10px }.mailbox-env .mail-single .mail-single-info .mail-single-info-user>a em {font-style: normal;display: block;color: #CCC;padding-top: 2px }.mailbox-env .mail-single .mail-single-info .mail-single-info-user.open>a {text-decoration: none }.mailbox-env .mail-single .mail-single-info .mail-single-info-user .dropdown-menu {width: 100%;margin-top: 10px }.mailbox-env .mail-single .mail-single-info .mail-single-info-user .dropdown-menu:before {content: '';position: absolute;display: block;background: inherit;width: 10px;height: 10px;top: -5px;left: 4%;-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);-o-transform: rotate(45deg);-ms-transform: rotate(45deg);transform: rotate(45deg);z-index: 1 }.mailbox-env .mail-single .mail-single-info .mail-single-info-user .dropdown-menu li {position: relative;z-index: 2 }.mailbox-env .mail-single .mail-single-info .mail-single-info-user .dropdown-menu li i {display: inline-block;margin-right: 2px }.mailbox-env .mail-single .mail-single-info .mail-single-info-options {float: right;padding-top: 10px }.mailbox-env .mail-single .mail-single-info .mail-single-info-options a {color: #979898;display: inline-block;margin-left: 5px }.mailbox-env .mail-single .mail-single-info .mail-single-info-options a i {font-size: 16px }.mailbox-env .mail-single .mail-single-info .mail-single-info-options a.starred {color: #ffba00 }.mailbox-env .mail-single .mail-single-body {border-bottom: 1px solid #f0f0f0;padding-bottom: 20px;margin-bottom: 20px }.mailbox-env .mail-single .mail-single-body p {color: #7d7f7f }.mailbox-env .mail-single .mail-single-attachments h3 {margin: 0;margin-bottom: 20px;font-size: 22px }.mailbox-env .mail-single .mail-single-attachments h3 i {font-size: 17px;position: relative;top: -2px;display: inline-block }.mailbox-env .mail-single .mail-single-attachments ul li {margin-bottom: 20px }.mailbox-env .mail-single .mail-single-attachments ul li .thumb {position: relative;display: block }.mailbox-env .mail-single .mail-single-attachments ul li .thumb:before {content: '';display: block;position: absolute;background: linear-gradient(to bottom, #fff 0, #7c38bc 100%);zoom: 1;-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-ms-filter: alpha(Opacity=0);filter: alpha(opacity=0);left: 8px;right: 8px;top: 8px;bottom: 8px;z-index: 1;-webkit-transition: all 100ms ease-in-out;-moz-transition: all 100ms ease-in-out;-o-transition: all 100ms ease-in-out;transition: all 100ms ease-in-out }.mailbox-env .mail-single .mail-single-attachments ul li .thumb:after {display: block;position: absolute;color: #fff;content: '\f06e';font-family: fontawesome;left: 50%;top: 50%;font-size: 22px;z-index: 2;margin-left: -12px;margin-top: -13px;-webkit-transform: scale(0);-moz-transform: scale(0);-o-transform: scale(0);-ms-transform: scale(0);transform: scale(0);-webkit-transition: all 200ms ease-in-out;-moz-transition: all 200ms ease-in-out;-o-transition: all 200ms ease-in-out;transition: all 200ms ease-in-out }.mailbox-env .mail-single .mail-single-attachments ul li .thumb:hover:before {zoom: 1;-webkit-opacity: .4;-moz-opacity: .4;opacity: .4;-ms-filter: alpha(Opacity=40);filter: alpha(opacity=40) }.mailbox-env .mail-single .mail-single-attachments ul li .thumb:hover:after {-webkit-transform: scale(1);-moz-transform: scale(1);-o-transform: scale(1);-ms-transform: scale(1);transform: scale(1) }.mailbox-env .mail-single .mail-single-attachments ul li .img-thumbnail {border-width: 2px }.mailbox-env .mail-single .mail-single-attachments ul li .name {display: block;margin-top: 12px;color: #717272;font-weight: 700 }.mailbox-env .mail-single .mail-single-attachments ul li .name span {float: right;font-size: 11px;color: #ddd;font-weight: 400 }.mailbox-env .mail-single .mail-single-attachments ul li .links {display: block;margin-top: 5px;color: #a4a5a5;font-size: 11px }.mailbox-env .mail-single .mail-single-attachments ul li .links a {color: #979898 }.mailbox-env .mail-single .mail-single-attachments ul li .links a:hover {color: #646565 }.mailbox-env .mail-single .mail-single-attachments ul.list-inline li {margin-right: 20px }.mailbox-env .mail-single .mail-single-reply {border: 1px solid #e4e4e4;padding: 15px 20px;min-height: 70px;color: #979898 }.mailbox-env .mail-single .mail-single-reply a {font-weight: 700;color: #717272;text-decoration: none }.mailbox-env .mail-single .mail-single-reply a:hover {color: #575858 }.mailbox-env .mailbox-right {float: right!important }@media screen and (max-width:768px) {.mailbox-env .mailbox-right {float: none!important }}.mailbox-env .mailbox-left {float: left!important }@media screen and (max-width:768px) {.mailbox-env .mailbox-left {float: none!important }}.invoice-env {padding: 15px 0 }@media print {.invoice-env {padding: 0 }}.invoice-env .invoice-header {border-bottom: 1px solid #f5f5f5;padding-bottom: 20px }.invoice-env .invoice-header .invoice-logo {float: left }.invoice-env .invoice-header .invoice-logo .logo {display: block;margin-bottom: 20px }.invoice-env .invoice-header .invoice-logo ul li {color: #979898;font-size: 14px }.invoice-env .invoice-header .invoice-logo ul li strong {color: #717272 }.invoice-env .invoice-header .invoice-logo ul li+li {margin-top: 2px }.invoice-env .invoice-header .invoice-options {float: right;width: 180px }@media screen and (max-width:480px) {.invoice-env .invoice-header .invoice-logo, .invoice-env .invoice-header .invoice-options {float: none }.invoice-env .invoice-header .invoice-options {width: auto;margin-bottom: 30px }}.invoice-env .invoice-details {padding-top: 30px;padding-bottom: 10px }.invoice-env .invoice-details .invoice-client-info, .invoice-env .invoice-details .invoice-payment-info {font-size: 14px;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box }.invoice-env .invoice-details .invoice-client-info>strong, .invoice-env .invoice-details .invoice-payment-info>strong {display: block;margin-bottom: 5px;color: #646565 }.invoice-env .invoice-details .invoice-client-info strong, .invoice-env .invoice-details .invoice-payment-info strong {color: #717272 }.invoice-env .invoice-details .invoice-client-info {float: left;width: 60% }.invoice-env .invoice-details .invoice-client-info ul {float: left;margin-right: 20px }@media print {.invoice-env .invoice-details .invoice-client-info {width: 50% }}.invoice-env .invoice-details .invoice-payment-info {float: right;width: 30% }@media print {.invoice-env .invoice-details .invoice-payment-info {width: 50%;text-align: right }}@media screen and (max-width:480px) {.invoice-env .invoice-details .invoice-client-info, .invoice-env .invoice-details .invoice-payment-info {float: none;width: 100% }.invoice-env .invoice-details .invoice-payment-info {margin-top: 15px }}.invoice-env .table {margin-top: 15px;margin-bottom: 15px }.invoice-env .invoice-totals {margin-top: 30px }.invoice-env .invoice-totals .invoice-bill-info {float: left;padding-left: 15px }.invoice-env .invoice-totals .invoice-subtotals-totals {float: right;text-align: right;padding-right: 15px }.invoice-env .invoice-totals .invoice-subtotals-totals span {display: block }.invoice-env .invoice-totals .invoice-subtotals-totals span strong {color: #717272;display: inline-block;min-width: 50px }.invoice-env .invoice-totals .invoice-subtotals-totals hr {margin: 8px 0 }@media screen and (max-width:480px) {.invoice-env .invoice-totals .invoice-bill-info, .invoice-env .invoice-totals .invoice-subtotals-totals {float: none;padding: 0 }.invoice-env .invoice-totals .invoice-subtotals-totals {margin-bottom: 30px }}@media print {.invoice-env .invoice-totals .invoice-bill-info, .invoice-env .invoice-totals .invoice-subtotals-totals {padding: 0 }}.search-env form {position: relative;margin-bottom: 30px }.search-env form .form-control {padding-right: 50px }.search-env form button[type=submit] {position: absolute;right: 0;top: 0;line-height: 45px;padding: 0 15px;font-size: 16px;color: #979898;outline: 0 }.search-env .nav.tabs-vertical {width: 200px }@media screen and (max-width:768px) {.search-env .nav.tabs-vertical {width: 50px;min-width: 50px }}.search-env .nav.tabs-vertical>li>a {background: 0 0;font-size: 14px;text-align: left }.search-env .nav.tabs-vertical>li>a:after {display: block;content: '';height: 1px;margin-top: 5px;background-color: #ddd;position: absolute;left: 15px;right: 15px;bottom: 0 }.search-env .nav.tabs-vertical>li.active>a {font-weight: 700;color: #2c2e2f }.search-env .nav.tabs-vertical>li.active>a:after {display: none }.search-env .nav.tabs-vertical>li:last-child>a:after {display: none }.search-env .tab-content .tab-pane h2 {margin: 0;font-size: 24px;border-bottom: 1px solid #f5f5f5;padding-bottom: 30px;margin-top: -10px;margin-bottom: 30px }.search-env .tab-content .tab-pane h2 small {display: block;padding-top: 10px;color: #999;font-size: 13px }.search-env .tab-content .tab-pane .results li {border-bottom: 1px solid #f5f5f5;padding-bottom: 30px;margin-bottom: 30px }.search-env .tab-content .tab-pane .results li h3 {margin: 0;margin-bottom: 15px }.search-env .tab-content .tab-pane .results li p {color: #b1b1b1 }.search-env .tab-content .tab-pane .results li .link {color: #68b828 }.search-env .tab-content .tab-pane .results li .link:hover {color: #508e1f }.search-env .tab-content .tab-pane .results li+li {margin-bottom: 30px }.search-env .tab-content .tab-pane .pagination {margin: 0 }.gallery-env {margin-bottom: 20px }@media screen and (max-width:768px) {.gallery-env .gallery-sidebar {margin-top: 30px }}.gallery-env .gallery-sidebar ul {margin: 20px 0 }.gallery-env .gallery-sidebar ul li a {display: block;padding: 10px 5px;border-bottom: 1px solid #ddd;color: #7d7f7f }.gallery-env .gallery-sidebar ul li a i {display: inline-block;margin-right: 2px }.gallery-env .gallery-sidebar ul li a:hover {color: #575858 }.gallery-env .gallery-sidebar ul li.active>a {color: #2c2e2f;font-weight: 700 }.gallery-env .gallery-sidebar ul li:last-child>a {border-bottom: 0 }.gallery-env .album-header {padding: 25px 30px;background: #fff;margin-bottom: 20px }.gallery-env .album-header h2 {margin: 0;padding: 0;float: left;color: #2c2e2f;font-size: 24px }.gallery-env .album-header .album-options {float: right;padding: 0;margin: 0;margin-top: 5px }.gallery-env .album-header .album-options .cbr-replaced {margin-bottom: 0;margin-right: 5px }.gallery-env .album-header .album-options li {color: #646565 }.gallery-env .album-header .album-options li a {color: #646565 }.gallery-env .album-header .album-options li a:hover {color: #2c2e2f }.gallery-env .album-header .album-options li label {-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none }.gallery-env .album-header .album-options li+li {margin-left: 10px }@media screen and (max-width:768px) {.gallery-env .album-header {padding: 15px 20px }.gallery-env .album-header h2, .gallery-env .album-header .album-options {float: none }.gallery-env .album-header h2 {text-align: center;padding: 10px 0 }.gallery-env .album-header .album-options {margin-top: 10px }}.gallery-env .album-sorting-info {display: none }.gallery-env .album-sorting-info .album-sorting-info-inner {border: 2px dashed #b7b7b7;padding: 15px 10px;font-size: 14px;margin-bottom: 20px }.gallery-env .album-images .album-image {position: relative;padding: 10px;background: #fff;margin-bottom: 20px }.gallery-env .album-images .album-image .thumb {position: relative;display: block;margin-bottom: 10px;z-index: 2 }.gallery-env .album-images .album-image .thumb img {display: block;margin: 0;line-height: 1;width: 100% }.gallery-env .album-images .album-image .thumb:hover~.image-checkbox .cbr-replaced {zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100) }.gallery-env .album-images .album-image .name {float: left;width: 75% }.gallery-env .album-images .album-image .name span {color: #2c2e2f;font-weight: 700 }.gallery-env .album-images .album-image .name em {font-style: normal;color: #979898;font-size: 11px;display: block }@media screen and (min-width:768px) {.gallery-env .album-images .album-image .name span, .gallery-env .album-images .album-image .name em {max-width: 100%;display: inline-block;overflow: hidden;text-overflow: ellipsis;white-space: nowrap }}.gallery-env .album-images .album-image .image-options {float: right;width: 25%;text-align: right;white-space: nowrap }.gallery-env .album-images .album-image .image-options a {font-size: 10px;color: #5d6264 }.gallery-env .album-images .album-image .image-options a:hover {color: #2c2e2f }.gallery-env .album-images .album-image .image-checkbox {position: absolute;right: 17px;top: 15px;z-index: 5 }.gallery-env .album-images .album-image .image-checkbox .cbr-replaced {zoom: 1;-webkit-opacity: .5;-moz-opacity: .5;opacity: .5;-ms-filter: alpha(Opacity=50);filter: alpha(opacity=50) }.gallery-env .album-images .album-image .image-checkbox .cbr-replaced:hover, .gallery-env .album-images .album-image .image-checkbox .cbr-replaced.cbr-checked {zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100) }.gallery-env .album-images .ui-sortable-handle .album-image {-webkit-box-shadow: 0 0 0 1px rgba(104, 184, 40, .2);-moz-box-shadow: 0 0 0 1px rgba(104, 184, 40, .2);box-shadow: 0 0 0 1px rgba(104, 184, 40, .2);-webkit-animation: glowAnimation 1s ease-in-out alternate infinite;-moz-animation: glowAnimation 1s ease-in-out alternate infinite;-o-animation: glowAnimation 1s ease-in-out alternate infinite;animation: glowAnimation 1s ease-in-out alternate infinite;margin-bottom: 0 }.gallery-env .album-images .ui-sortable-handle {margin-bottom: 20px }.gallery-env .album-images .ui-sortable-placeholder {visibility: visible!important;background: rgba(204, 204, 204, .1);border: 1px dashed #c4c4c4;margin: 0!important }.gallery-env .gallery-right {float: right!important }@media screen and (max-width:768px) {.gallery-env .gallery-right {float: none!important }}.gallery-env .gallery-left {float: left!important }@media screen and (max-width:768px) {.gallery-env .gallery-left {float: none!important }}lesshat-selector {-lh-property: 0 }@-webkit-keyframes glowAnimation {0% {box-shadow: rgba(104, 184, 40, .2) 0 0 0 1px }100% {box-shadow: rgba(104, 184, 40, .8) 0 0 3px 1px }}@-moz-keyframes glowAnimation {0% {box-shadow: rgba(104, 184, 40, .2) 0 0 0 1px }100% {box-shadow: rgba(104, 184, 40, .8) 0 0 3px 1px }}@-o-keyframes glowAnimation {0% {box-shadow: rgba(104, 184, 40, .2) 0 0 0 1px }100% {box-shadow: rgba(104, 184, 40, .8) 0 0 3px 1px }}@keyframes glowAnimation {0% {box-shadow: rgba(104, 184, 40, .2) 0 0 0 1px }100% {box-shadow: rgba(104, 184, 40, .8) 0 0 3px 1px }}.modal-gallery-image {margin: -31px;margin-bottom: 0;border-bottom: 5px solid #f5f5f5;position: relative }.modal-gallery-image img {display: block;width: 100% }.modal-gallery-top-controls {position: absolute;right: 15px;top: 0;border: 0 }.page-error {background: #fff;width: 700px;padding: 50px;margin-bottom: 20px }@media screen and (max-width:991px) {.page-error {width: 90% }.main-content .page-error {width: 100% }}.page-error.centered {margin-left: auto;margin-right: auto }.page-error .error-symbol {font-size: 48px;line-height: 1 }.page-error .error-symbol i {line-height: 1 }.page-error h2 {font-size: 35px;margin-bottom: 20px }.page-error h2 small {display: block;padding-top: 10px;color: #bcbcbc;font-size: 50% }.page-error-env>.page-error {margin-top: 50px }.page-error-search {width: 700px }@media screen and (max-width:991px) {.page-error-search {width: 90% }.main-content .page-error-search {width: 100% }}.page-error-search.centered {margin-left: auto;margin-right: auto }.page-error-search form {position: relative }.page-error-search form button[type=submit] {display: block;position: absolute;right: 0;top: 0;line-height: 32px;padding: 0 10px;font-size: 12px;color: #a4a5a5 }.page-error-search form.form-half {width: 45%;margin-left: auto;margin-right: auto }.page-error-search form .input-lg+button[type=submit] {line-height: 45px;padding: 0 15px }.page-error-search .go-back {display: block;text-align: center;color: #abacac;margin: 15px 0 }.page-error-search .go-back:hover {color: #979898 }.calendar-env {position: relative;margin-bottom: 30px }.calendar-env .calendar-sidebar form {margin-bottom: 20px }.calendar-env .calendar-sidebar form .form-control {padding: 20px 15px;height: 37px;width: 100% }@media screen and (max-width:768px) {.calendar-env .calendar-sidebar {margin-top: 30px }.calendar-env .calendar-sidebar form {margin-bottom: 0 }}.calendar-env .calendar-sidebar .calendar-list {margin: 0;margin-bottom: 30px }@media screen and (max-width:768px) {.calendar-env .calendar-sidebar .calendar-list {margin-top: 10px }}.calendar-env .calendar-sidebar .calendar-list li a {display: block;color: #979898;padding-bottom: 7px }.calendar-env .calendar-sidebar .calendar-list li a:hover {color: #717272 }.calendar-env .calendar-sidebar .calendar-list li a .badge {margin-top: 0;display: block;text-align: left;font-size: 12px;padding: 7px 10px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap }.calendar-env .calendar-sidebar .calendar-list li.list-header {font-size: 10px;padding: 10px 0;font-weight: 700;color: #979898;border-bottom: 0;text-transform: uppercase }.calendar-env .calendar-sidebar .calendar-list li.ui-draggable-dragging .badge {zoom: 1;-webkit-opacity: .6;-moz-opacity: .6;opacity: .6;-ms-filter: alpha(Opacity=60);filter: alpha(opacity=60) }.calendar-env .calendar-sidebar .calendar-list li.ui-draggable-handle .badge {cursor: move }.calendar-env .calendar-main {position: relative;background: #fff;padding: 30px;z-index: 5 }.calendar-env .calendar-main .fc .fc-popover, .calendar-env .calendar-main .fc .fc-row, .calendar-env .calendar-main .fc hr, .calendar-env .calendar-main .fc tbody, .calendar-env .calendar-main .fc td, .calendar-env .calendar-main .fc th, .calendar-env .calendar-main .fc thead {border-color: #eee }.calendar-env .calendar-main .fc .fc-toolbar {padding-bottom: 15px }.calendar-env .calendar-main .fc .fc-toolbar .fc-left h2 {font-size: 24px }.calendar-env .calendar-main .fc .fc-toolbar .fc-left h2:before {content: '\f133';font-family: fontawesome;display: inline-block;margin-right: 10px }.calendar-env .calendar-main .fc .fc-toolbar .fc-right {margin-top: 5px }.calendar-env .calendar-main .fc .fc-toolbar .fc-right>.fc-button-group:last-child {margin-right: -15px }@media screen and (max-width:768px) {.calendar-env .calendar-main .fc .fc-toolbar .fc-left, .calendar-env .calendar-main .fc .fc-toolbar .fc-right {float: none;width: 100% }.calendar-env .calendar-main .fc .fc-toolbar .fc-left:before, .calendar-env .calendar-main .fc .fc-toolbar .fc-right:before, .calendar-env .calendar-main .fc .fc-toolbar .fc-left:after, .calendar-env .calendar-main .fc .fc-toolbar .fc-right:after {content: " ";display: table }.calendar-env .calendar-main .fc .fc-toolbar .fc-left:after, .calendar-env .calendar-main .fc .fc-toolbar .fc-right:after {clear: both }.calendar-env .calendar-main .fc .fc-toolbar .fc-left:before, .calendar-env .calendar-main .fc .fc-toolbar .fc-right:before, .calendar-env .calendar-main .fc .fc-toolbar .fc-left:after, .calendar-env .calendar-main .fc .fc-toolbar .fc-right:after {content: " ";display: table }.calendar-env .calendar-main .fc .fc-toolbar .fc-left:after, .calendar-env .calendar-main .fc .fc-toolbar .fc-right:after {clear: both }.calendar-env .calendar-main .fc .fc-toolbar .fc-left h2 {text-align: center;width: 100%;float: none }.calendar-env .calendar-main .fc .fc-toolbar .fc-right {position: relative;margin-top: 10px;text-align: center;top: 12px }.calendar-env .calendar-main .fc .fc-toolbar .fc-right .fc-button-group {display: inline-block;float: none }}.calendar-env .calendar-main .fc .fc-toolbar .fc-button-group {background: 0 0;border: 0 }.calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-month-button.fc-state-active, .calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-basicWeek-button.fc-state-active, .calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-agendaWeek-button.fc-state-active, .calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-agendaDay-button.fc-state-active, .calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-basicDay-button.fc-state-active {color: #2c2e2f }.calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-month-button:after {content: '';display: block;position: absolute;right: -1px;top: 25%;bottom: 25%;width: 1px;background: #eee }.calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-month-button+.fc-agendaWeek-button:after {content: '';display: block;position: absolute;right: -1px;top: 25%;bottom: 25%;width: 1px;background: #eee }.calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-month-button+.fc-basicWeek-button:after {content: '';display: block;position: absolute;right: -1px;top: 25%;bottom: 25%;width: 1px;background: #eee }.calendar-env .calendar-main .fc .fc-toolbar .fc-button {border: 0;background: 0 0;padding: 0 10px;margin: 0;height: auto;position: relative;outline: 0;color: #979898;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.calendar-env .calendar-main .fc .fc-toolbar .fc-button .fc-icon {font-size: 13px;font-family: fontawesome }.calendar-env .calendar-main .fc .fc-toolbar .fc-button.fc-next-button:hover, .calendar-env .calendar-main .fc .fc-toolbar .fc-button.fc-prev-button:hover {color: #2c2e2f }.calendar-env .calendar-main .fc .fc-toolbar .fc-button.fc-prev-button:after {content: '';display: block;position: absolute;right: -1px;top: 25%;bottom: 25%;width: 1px;background: #eee }.calendar-env .calendar-main .fc .fc-view-container>.fc-basic-view>table>thead>tr>td.fc-widget-header {border: 0;border-bottom: 1px solid #eee }.calendar-env .calendar-main .fc .fc-view-container>.fc-basic-view>table>thead>tr>td .fc-day-header {border: 0;padding-bottom: 10px;color: #717272;font-weight: 400 }.calendar-env .calendar-main .fc .fc-view-container>.fc-basic-view>table>tbody>tr>.fc-widget-content {border: 0;border-bottom: 1px solid #eee }.calendar-env .calendar-main .fc .fc-view-container>.fc-basic-view>table>tbody>tr>.fc-widget-content .fc-day-number {padding-top: 10px;padding-right: 10px;color: #949494 }.calendar-env .calendar-main .fc .fc-popover {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.calendar-env .calendar-main .fc .fc-popover .fc-header {padding: 5px }.calendar-env .calendar-main .fc .fc-popover .fc-body .fc-event-container a {margin-left: 2px;margin-right: 2px }.calendar-env .calendar-main .fc .fc-today {background-color: #fafafa;color: #2c2e2f }.calendar-env .calendar-main .fc .fc-event {background: #68b828;border: 0;-webkit-border-radius: 0;-webkit-background-clip: padding-box;-moz-border-radius: 0;-moz-background-clip: padding;border-radius: 0;background-clip: padding-box;padding: 1px 3px }.calendar-env .calendar-main .fc .fc-event.event-color-primary {background-color: #2c2e2f }.calendar-env .calendar-main .fc .fc-event.event-color-success {background-color: #8dc63f }.calendar-env .calendar-main .fc .fc-event.event-color-danger {background-color: #cc3f44 }.calendar-env .calendar-main .fc .fc-event.event-color-warning {background-color: #ffba00 }.calendar-env .calendar-main .fc .fc-event.event-color-info {background-color: #40bbea }.calendar-env .calendar-main .fc .fc-event.event-color-red {background-color: #d5080f }.calendar-env .calendar-main .fc .fc-event.event-color-blue {background-color: #0e62c7 }.calendar-env .calendar-main .fc .fc-event.event-color-purple {background-color: #7c38bc }.calendar-env .calendar-main .fc .fc-event.event-color-gray {background-color: #959595 }.calendar-env .calendar-main .fc .fc-event.event-color-black {background-color: #222 }.calendar-env .calendar-right {float: right!important }@media screen and (max-width:768px) {.calendar-env .calendar-right {float: none!important }}.calendar-env .calendar-left {float: left!important }@media screen and (max-width:768px) {.calendar-env .calendar-left {float: none!important }}.profile-env {margin-bottom: 30px }.profile-env .user-info-sidebar hr {border-top-color: #e1e1e1;margin: 10px 0 }.profile-env .user-info-sidebar .user-img {display: block;margin-bottom: 10px;text-align: center }.profile-env .user-info-sidebar .user-img img {display: inline-block }.profile-env .user-info-sidebar .user-img img.img-thumbnail {padding: 4px;border: 0 }.profile-env .user-info-sidebar .user-name {display: block;font-size: 19px;text-align: center }.profile-env .user-info-sidebar .user-title {display: block;color: #999;text-align: center;font-size: 12px;margin-bottom: 20px }.profile-env .user-info-sidebar .user-title strong, .profile-env .user-info-sidebar .user-title a {color: #7d7f7f }.profile-env .user-info-sidebar .user-status {position: relative;display: inline-block;background: #FFF;top: -2px;margin-left: 5px;width: 6px;height: 6px;-webkit-border-radius: 50%;-webkit-background-clip: padding-box;-moz-border-radius: 50%;-moz-background-clip: padding;border-radius: 50%;background-clip: padding-box }.profile-env .user-info-sidebar .user-status.is-online {background-color: #8dc63f }.profile-env .user-info-sidebar .user-status.is-idle {background-color: #ffba00 }.profile-env .user-info-sidebar .user-status.is-busy {background-color: #d5080f }.profile-env .user-info-sidebar .user-status.is-offline {background-color: #CCC }.profile-env .user-info-sidebar .user-info-list {display: table;margin: 0 auto }.profile-env .user-info-sidebar .user-info-list li {margin: 10px 0;color: #979898 }.profile-env .user-info-sidebar .user-info-list li i {color: #7d7f7f;display: inline-block;margin-right: 5px }.profile-env .user-info-sidebar .user-info-list li a, .profile-env .user-info-sidebar .user-info-list li strong {color: #717272 }.profile-env .user-info-sidebar .user-info-list li a:hover {color: #4b4b4b }.profile-env .user-info-sidebar .user-friends-count {display: table;margin: 20px auto }.profile-env .user-info-sidebar .user-friends-count li {position: relative;display: table-cell;color: #b1b1b1;font-size: 12px;padding: 0 20px }.profile-env .user-info-sidebar .user-friends-count li span {display: block;font-size: 23px;color: #646565 }.profile-env .user-info-sidebar .user-friends-count li:first-child {padding-left: 0 }.profile-env .user-info-sidebar .user-friends-count li:last-child {padding-right: 0 }.profile-env .user-info-sidebar .user-friends-count li+li:after {display: block;content: '';position: absolute;left: 0;top: 15%;bottom: 15%;width: 1px;background: #ddd }.profile-env .profile-post-form {position: relative;background: #fff;border: 1px solid #e4e4e4;padding: 20px;margin-bottom: 30px }.profile-env .profile-post-form:after {content: '';display: block;position: absolute;left: -7.4px;top: 25px;width: 0;height: 0;border-style: solid;border-width: 7px 8.4px 7px 0;border-color: transparent #fff transparent transparent }@media screen and (max-width:767px) {.profile-env .profile-post-form {margin-top: 30px;margin-bottom: 20px }.profile-env .profile-post-form:after {display: none }}.profile-env .profile-post-form textarea {position: relative;resize: none;z-index: 1;border-bottom: 1px solid #eee }.profile-env .profile-post-form textarea::-moz-placeholder {color: #bdbebe;opacity: 1 }.profile-env .profile-post-form textarea:-ms-input-placeholder {color: #bdbebe }.profile-env .profile-post-form textarea::-webkit-input-placeholder {color: #bdbebe }.profile-env .profile-post-form textarea::-webkit-input-placeholder {color: #bdbebe }.profile-env .profile-post-form textarea:-moz-placeholder {color: #bdbebe }.profile-env .profile-post-form textarea::-moz-placeholder {color: #bdbebe }.profile-env .profile-post-form textarea:-ms-input-placeholder {color: #bdbebe }.profile-env .profile-post-form textarea:focus~.post-story-button {zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100) }.profile-env .profile-post-form .form-action-buttons {margin: 0;margin-top: 15px }.profile-env .profile-post-form .form-action-buttons li button {color: #979898;font-size: 15px }.profile-env .profile-post-form .form-action-buttons li button:hover {color: #515557 }.profile-env .profile-post-form .form-action-buttons li button:active {color: #68b828 }.profile-env .profile-post-form .post-story-button {float: right;margin-top: -17px;padding-left: 20px;padding-right: 20px;-webkit-transition: opacity 150ms linear;-moz-transition: opacity 150ms linear;-o-transition: opacity 150ms linear;transition: opacity 150ms linear;zoom: 1;-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-ms-filter: alpha(Opacity=0);filter: alpha(opacity=0) }.profile-env .profile-post-form .post-story-button:active, .profile-env .profile-post-form .post-story-button:focus {zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100) }.profile-env .block-icon {position: absolute;right: 20px;top: 20px;color: #cacbcb }.profile-env .user-timeline-stories .timeline-story {position: relative;background: #fff;padding: 20px;margin-bottom: 30px }@media screen and (max-width:767px) {.profile-env .user-timeline-stories .timeline-story {margin-bottom: 20px }}.profile-env .user-timeline-stories .timeline-story header {color: #979898;font-size: 14px;margin-bottom: 10px }.profile-env .user-timeline-stories .timeline-story header .user-img {margin-right: 20px;float: left }.profile-env .user-timeline-stories .timeline-story header .user-img img {width: 48px }.profile-env .user-timeline-stories .timeline-story header .user-details {display: block;padding-top: 5px }.profile-env .user-timeline-stories .timeline-story header a {color: #646565 }.profile-env .user-timeline-stories .timeline-story header a:hover {color: #4b4b4b }.profile-env .user-timeline-stories .timeline-story header time {display: block;font-size: 12px;color: #b1b1b1 }.profile-env .user-timeline-stories .timeline-story .story-content {display: block;padding-left: 70px }@media screen and (max-width:767px) {.profile-env .user-timeline-stories .timeline-story .story-content {padding-left: 0 }}.profile-env .user-timeline-stories .timeline-story .story-content p {font-size: 14px }@media screen and (max-width:767px) {.profile-env .user-timeline-stories .timeline-story>.story-content {margin-top: 20px }}.profile-env .user-timeline-stories .timeline-story .story-audio-item {background: #f8f8f8;padding: 30px;margin: 10px -20px;margin-top: 20px }.profile-env .user-timeline-stories .timeline-story .story-audio-item .story-content {margin-left: -13px }.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info {padding-bottom: 15px }.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info .artist-info, .profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info .track-length {color: #979898 }.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info .artist-info {float: left }.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info .track-length {float: right }.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline {width: 100%;display: table }.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline .play-pause, .profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline .track-timeline, .profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline .track-volume {display: table-cell;vertical-align: middle }.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline .play-pause {width: 75px }.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline .track-volume {width: 30px;text-align: right }.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline .track-timeline .track-timeline-empty {display: block;height: 2px;background: #dedede;position: relative }.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline .track-timeline .track-timeline-empty .track-fill {position: absolute;left: 0;top: 0;bottom: 0;background: #2c2e2f }.profile-env .user-timeline-stories .timeline-story .story-options-links {padding-top: 10px }.profile-env .user-timeline-stories .timeline-story .story-options-links a {display: inline-block;color: #979898;margin-right: 30px }.profile-env .user-timeline-stories .timeline-story .story-options-links a span {display: inline-block;zoom: 1;-webkit-opacity: .9;-moz-opacity: .9;opacity: .9;-ms-filter: alpha(Opacity=90);filter: alpha(opacity=90) }.profile-env .user-timeline-stories .timeline-story .story-options-links a:hover {color: #575858 }.profile-env .user-timeline-stories .timeline-story .story-options-links a.liked {color: #ed3434 }.profile-env .user-timeline-stories .timeline-story .story-comments {border-top: 1px solid #eee;margin-top: 20px;padding-top: 10px }.profile-env .user-timeline-stories .timeline-story .story-comments .story-comment {margin-top: 10px }.profile-env .user-timeline-stories .timeline-story .story-comments .story-comment .comment-user-img {display: block;float: left }.profile-env .user-timeline-stories .timeline-story .story-comments .story-comment .comment-user-img img {width: 32px }.profile-env .user-timeline-stories .timeline-story .story-comments .story-comment .story-comment-content {margin-left: 50px;padding-bottom: 5px;padding-left: 2px;border-bottom: 1px solid #eee }.profile-env .user-timeline-stories .timeline-story .story-comments .story-comment .story-comment-content .story-comment-user-name {display: block;font-size: 14px;color: #575858;margin-bottom: 5px }.profile-env .user-timeline-stories .timeline-story .story-comments .story-comment .story-comment-content .story-comment-user-name time {display: inline-block;margin-left: 5px;font-size: 11px;color: #ddd }.profile-env .user-timeline-stories .timeline-story .story-comments .story-comment .story-comment-content p {font-size: 13px }.profile-env .user-timeline-stories .timeline-story .story-comments li:last-child .story-comment .story-comment-content {border-bottom: 0 }.profile-env .user-timeline-stories .timeline-story .story-comment-form {margin-top: 20px }.profile-env .user-timeline-stories .timeline-story .story-comment-form textarea {border: 1px solid #eee;padding: 10px;max-height: 100px;margin-bottom: 10px }.profile-env .user-timeline-stories .timeline-story .story-checkin {margin-bottom: 10px;border: 1px solid #eee;padding: 10px }.profile-env .user-timeline-stories .timeline-story .story-album {border: 1px solid #eee;padding: 10px;margin-bottom: 20px }.profile-env .user-timeline-stories .timeline-story .story-album .col-1, .profile-env .user-timeline-stories .timeline-story .story-album .col-2 {display: block;float: left;width: 50% }.profile-env .user-timeline-stories .timeline-story .story-album .col-1 {padding-right: 6px }.profile-env .user-timeline-stories .timeline-story .story-album .col-2 {padding-left: 6px }@media screen and (max-width:767px) {.profile-env .user-timeline-stories .timeline-story .story-album {padding-bottom: 0 }.profile-env .user-timeline-stories .timeline-story .story-album .col-1, .profile-env .user-timeline-stories .timeline-story .story-album .col-2 {padding: 0;width: 100%;float: none;margin-bottom: 10px }}.profile-env .user-timeline-stories .timeline-story:last-child {margin-bottom: 0 }.page-body .main-content .cbp_tmtimeline:before {background: #fff;width: 5px;margin-left: -6px }.page-body .main-content .cbp_tmtimeline>li .cbp_tmtime>span {color: #575858;font-size: 15px }.page-body .main-content .cbp_tmtimeline>li .cbp_tmtime>span:first-child {font-weight: 700;margin-bottom: 2px }.page-body .main-content .cbp_tmtimeline>li .cbp_tmtime>span:last-child {color: #979898;zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80);font-size: 12px }.page-body .main-content .cbp_tmtimeline>li .cbp_tmtime>span.large {font-size: 17px }.page-body .main-content .cbp_tmtimeline>li .cbp_tmtime>span.hidden+span {margin-top: 8px }.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon {background: #fff;color: #979898;-webkit-box-shadow: 0 0 0 3px #fff;-moz-box-shadow: 0 0 0 3px #fff;box-shadow: 0 0 0 3px #fff }.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-primary {background-color: #2c2e2f;color: #fff }.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-success {background-color: #8dc63f;color: #fff }.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-info {background-color: #40bbea;color: #fff }.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-danger {background-color: #cc3f44;color: #fff }.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-warning {background-color: #ffba00;color: #fff }.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-red {background-color: #d5080f;color: #fff }.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-purple {background-color: #7c38bc;color: #fff }.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-secondary {background-color: #68b828;color: #fff }.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-gray {background-color: #ddd;color: #777 }.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel {background: #fff;color: #737881;margin-bottom: 30px;padding: 20px;-webkit-border-radius: 0;-webkit-background-clip: padding-box;-moz-border-radius: 0;-moz-background-clip: padding;border-radius: 0;background-clip: padding-box }.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel h2, .page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel p {color: #737881;font-size: 13px;margin: 0;line-height: 1.42857143 }.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel p+p {margin-top: 10px }.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel h2 {font-size: 15px }.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel h2 a {color: #303641 }.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel h2 span {zoom: 1;-webkit-opacity: .6;-moz-opacity: .6;opacity: .6;-ms-filter: alpha(Opacity=60);filter: alpha(opacity=60) }.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel blockquote {font-size: 14px;padding-top: 4px;padding-bottom: 4px }.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel:after {border-right-color: #fff }.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel.empty {background: 0;padding: 9px 0;margin-bottom: 70px }.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel.empty:after {visibility: hidden }@media screen and (max-width:47.2em) {.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel:after {border-right-color: transparent;border-bottom-color: #fff;left: 10px }.page-body .main-content .cbp_tmtimeline>li .large {font-weight: 700;font-size: 16px!important }.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel.empty {background: #fff;padding: 1.7em }.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel.empty:after {visibility: visible }}.timeline-centered {position: relative;margin-bottom: 20px }@media screen and (max-width:768px) {.timeline-centered {margin-top: 60px!important }}.timeline-centered:before {content: '';position: absolute;display: block;width: 4px;background: #fff;left: 50%;top: 20px;bottom: 20px;margin-left: -4px }.timeline-centered .timeline-entry {position: relative;width: 50%;float: right;margin-bottom: 70px;clear: both }.timeline-centered .timeline-entry:before, .timeline-centered .timeline-entry:after {content: " ";display: table }.timeline-centered .timeline-entry:after {clear: both }.timeline-centered .timeline-entry:before, .timeline-centered .timeline-entry:after {content: " ";display: table }.timeline-centered .timeline-entry:after {clear: both }.timeline-centered .timeline-entry.begin {margin-bottom: 0 }.timeline-centered .timeline-entry.left-aligned {float: left }.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner {margin-left: 0;margin-right: -18px }.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-time {left: auto;right: -120px;text-align: left }.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-icon {float: right }.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-label {margin-left: 0;margin-right: 70px }.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-label:after {left: auto;right: 0;margin-left: 0;margin-right: -9px;-webkit-transform: rotate(180deg);-moz-transform: rotate(180deg);-o-transform: rotate(180deg);-ms-transform: rotate(180deg);transform: rotate(180deg) }.timeline-centered .timeline-entry .timeline-entry-inner {position: relative;margin-left: -22px }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-time {position: absolute;left: -100px;text-align: right;padding: 10px;padding-top: 2px;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-time>span {display: block;color: #979898 }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-time>span:first-child {font-size: 15px;font-weight: 700;color: #717272 }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-time>span:last-child {font-size: 12px }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon {background: #fff;color: #737881;display: block;width: 40px;height: 40px;-webkit-border-radius: 20px;-webkit-background-clip: padding-box;-moz-border-radius: 20px;-moz-background-clip: padding;border-radius: 20px;background-clip: padding-box;text-align: center;-webkit-box-shadow: 0 0 0 5px #fff;-moz-box-shadow: 0 0 0 5px #fff;box-shadow: 0 0 0 5px #fff;line-height: 40px;font-size: 16px;float: left }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-primary {background-color: #2c2e2f;color: #fff }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-success {background-color: #8dc63f;color: #fff }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-info {background-color: #40bbea;color: #fff }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-danger {background-color: #cc3f44;color: #fff }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-warning {background-color: #ffba00;color: #fff }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-red {background-color: #d5080f;color: #fff }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-purple {background-color: #7c38bc;color: #fff }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-secondary {background-color: #68b828;color: #fff }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label {position: relative;background: #fff;padding: 1.7em;margin-left: 70px }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label:after {content: '';display: block;position: absolute;width: 0;height: 0;border-style: solid;border-width: 9px 9px 9px 0;border-color: transparent #fff transparent transparent;left: 0;top: 10px;margin-left: -9px }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label h2, .timeline-centered .timeline-entry .timeline-entry-inner .timeline-label p {color: #737881;font-size: 13px;margin: 0;line-height: 1.42857143 }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label p+p {margin-top: 10px }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label h2 {font-size: 15px;margin-bottom: 10px }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label h2 a {color: #303641 }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label h2 span {zoom: 1;-webkit-opacity: .6;-moz-opacity: .6;opacity: .6;-ms-filter: alpha(Opacity=60);filter: alpha(opacity=60) }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label blockquote {font-size: 14px;padding-top: 4px;padding-bottom: 4px;color: #979898 }@media screen and (max-width:47.2em) {.timeline-centered {margin-top: 20px }.timeline-centered:before {left: 22px }.timeline-centered .timeline-entry, .timeline-centered .timeline-entry.left-aligned {width: 100%;float: none }.timeline-centered .timeline-entry .timeline-entry-inner, .timeline-centered .timeline-entry.left-aligned .timeline-entry-inner {margin-left: 0;margin-right: 0 }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-time, .timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-time {left: 60px;right: auto;top: -30px;width: auto }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-time span, .timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-time span {display: inline-block }.timeline-centered .timeline-entry .timeline-entry-inner .timeline-time span+span, .timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-time span+span {margin-left: 10px }.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-icon {float: left }.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-label {margin-left: 70px;margin-right: 0 }.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-label:after {left: 0;right: auto;margin-left: -9px;margin-right: 0;-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }}.draggable-portlets .sorted {min-height: 100px }.draggable-portlets .sorted .ui-sortable-placeholder {background: rgba(255, 255, 204, .7);border: 1px dashed #ddd;visibility: visible!important }.draggable-portlets .sorted>.panel {-webkit-transition: opacity 200ms ease-in-out, transform 200ms ease-in-out;-o-transition: opacity 200ms ease-in-out, transform 200ms ease-in-out;transition: opacity 200ms ease-in-out, transform 200ms ease-in-out;-webkit-transition: opacity 200ms ease-in-out, -webkit-transform 200ms ease-in-out;-moz-transition: opacity 200ms ease-in-out, -moz-transform 200ms ease-in-out;-o-transition: opacity 200ms ease-in-out, -o-transform 200ms ease-in-out;transition: opacity 200ms ease-in-out, -webkit-transform 200ms ease-in-out, -moz-transform 200ms ease-in-out, -o-transform 200ms ease-in-out, transform 200ms ease-in-out }.draggable-portlets .sorted>.panel .panel-heading {cursor: pointer }.draggable-portlets.dragging .sorted>.panel {-webkit-transform: scale(.97);-moz-transform: scale(.97);-o-transform: scale(.97);-ms-transform: scale(.97);transform: scale(.97);zoom: 1;-webkit-opacity: .5;-moz-opacity: .5;opacity: .5;-ms-filter: alpha(Opacity=50);filter: alpha(opacity=50) }.draggable-portlets.dragging .sorted>.panel.ui-sortable-helper {-webkit-transform: scale(1.03);-moz-transform: scale(1.03);-o-transform: scale(1.03);-ms-transform: scale(1.03);transform: scale(1.03);zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100) }.notes-env {position: relative;margin-bottom: 30px }.notes-env .notes-header {margin-bottom: 10px }.notes-env .notes-list {position: relative }.notes-env .notes-list .write-pad, .notes-env .notes-list .list-of-notes {-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box }.notes-env .notes-list .list-of-notes {float: left;width: 26%;list-style: none;margin: 0;padding: 0;padding-bottom: 20px }.notes-env .notes-list .list-of-notes li {position: relative;padding-right: 10px;padding-bottom: 10px }.notes-env .notes-list .list-of-notes li a {display: block;border: 1px solid #e0e0e0;background: #fff;padding: 10px 15px }.notes-env .notes-list .list-of-notes li a strong, .notes-env .notes-list .list-of-notes li a span {display: block }.notes-env .notes-list .list-of-notes li a strong+strong, .notes-env .notes-list .list-of-notes li a span+strong, .notes-env .notes-list .list-of-notes li a strong+span, .notes-env .notes-list .list-of-notes li a span+span {padding-top: 8px }.notes-env .notes-list .list-of-notes li a strong {word-break: break-all;background: #f5f5f5;margin: -15px;margin-top: -10px;margin-bottom: 0;padding: 8px 10px;border-bottom: 1px solid #e0e0e0;font-size: 12px }@media screen and (max-width:768px) {.notes-env .notes-list .list-of-notes li a strong {margin-bottom: -10px;border-bottom: 0 }}.notes-env .notes-list .list-of-notes li a span {overflow: hidden;text-overflow: ellipsis;white-space: nowrap;font-size: 12px }.notes-env .notes-list .list-of-notes li a em {float: right }.notes-env .notes-list .list-of-notes li a:hover {background: #f5f5f5!important;border-color: #d3d3d3 }.notes-env .notes-list .list-of-notes li a:hover span, .notes-env .notes-list .list-of-notes li a:hover strong {color: #737881 }.notes-env .notes-list .list-of-notes li .note-close {position: absolute;right: 11px;top: 1px;border: none;background: 0 0;outline: 0;background: #f5f5f5;border: 1px solid #e0e0e0;border-top: 0;border-right: 0;zoom: 1;-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-ms-filter: alpha(Opacity=0);filter: alpha(opacity=0) }.notes-env .notes-list .list-of-notes li:hover .note-close {zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100) }.notes-env .notes-list .list-of-notes li .content {display: none }.notes-env .notes-list .list-of-notes li.current a {background: #fff }.notes-env .notes-list .list-of-notes li+.no-notes {display: none }.notes-env .notes-list .write-pad {float: right;width: 74%;background: #fff;position: relative }.notes-env .notes-list .write-pad:after {display: block;content: '';position: absolute;left: 95px;top: 0;bottom: 0;background: #f9d4d1;width: 1px }.notes-env .notes-list .write-pad textarea {background: 0 0;border: none;background: url(../images/notes-lines.png) left top;background-attachment: local;min-height: 780px;font: 14px/52px Arimo, "Helvetica Neue", Helvetica, Arial, sans-serif, serif;border: 1px solid #ddd;max-height: 1500px;padding-left: 125px;padding-right: 50px }.notes-env .notes-list .write-pad textarea::-webkit-scrollbar {width: 5px }.notes-env .notes-list .write-pad textarea::-webkit-scrollbar-track {width: 5px;background-color: #e0e0e0 }.notes-env .notes-list .write-pad textarea::-webkit-scrollbar-thumb {background-color: #bdbdbd }.notes-env+footer.main {border-top: 0;padding-top: 10px }@media (max-width:992px) {.notes-env .notes-list .list-of-notes {width: 35% }.notes-env .notes-list .write-pad {width: 65% }.notes-env .notes-list .write-pad textarea {padding-left: 50px }.notes-env .notes-list .write-pad:after {left: 35px }}@media (max-width:768px) {body .notes-env .notes-list .list-of-notes, body .notes-env .notes-list .write-pad {width: 100%;float: none }body .notes-env .notes-list .list-of-notes {padding-bottom: 10px }body .notes-env .notes-list .list-of-notes li {padding: 0;padding-top: 10px;padding-bottom: 0 }body .notes-env .notes-list .list-of-notes li a span {display: none }body .notes-env .notes-list .list-of-notes li .note-close {right: 1px;top: 11px }body .notes-env .notes-list .write-pad textarea {min-height: 400px;max-height: 600px }}.tocify {border: 1px solid #ddd;background: #fff;-webkit-border-radius: 0;-webkit-background-clip: padding-box;-moz-border-radius: 0;-moz-background-clip: padding;border-radius: 0;background-clip: padding-box }.tocify.fixed {position: fixed;top: 15px }.navbar.horizontal-menu+.page-container .tocify.fixed {top: 110px }@media (max-width:991px) {.tocify {top: 0;position: relative!important;margin-bottom: 30px }.tocify .tocify-item.active>a:before, .tocify .tocify-item.active>a:after {display: none!important }}.tocify li {border-top: 1px solid #f0f0f0 }.tocify li a {color: #979898 }.tocify li a:hover {background: #fff;color: #2c2e2f }.tocify>ul:first-child>li {border-top: 0 }.tocify>ul ul li a {padding-left: 30px }.tocify>ul ul {background: #fff }.tocify>ul ul ul li a {padding-left: 40px }.tocify>ul:last-child {border-bottom: 0 }.tocify .tocify-item.active>a {position: relative;background: #f6f6f6;color: #2c2e2f }.tocify .tocify-item.active>a:after {content: '';display: block;position: absolute;top: 14px;right: -1px;width: 0;height: 0;border-color: transparent #eee transparent transparent;border-style: solid;border-width: 6px }.tocify .tocify-item.active>a:before {content: '';display: block;position: absolute;top: 13px;right: -1px;margin-left: -2px;width: 0;height: 0;border-color: transparent #ddd transparent transparent;border-style: solid;border-width: 7px }.tocify-extend-page {display: none!important }.google-map-env {background: #e5e5e5;margin-bottom: 30px }.google-map-env~.main-footer {display: none!important }.google-map-env.fill {margin: -30px }.google-map-env.fill .map-toolbar>.row {margin-left: 0;margin-right: 0 }.google-map-env .map-toolbar {padding: 20px 15px;background: #fff }.google-map-env .map-toolbar+.gmap {border-top: 1px solid #ccc }.google-map-env .gmap+.map-toolbar {border-top: 1px solid 0 }.google-map-env .full-page-google-map {border-top: 1px solid #ddd }.google-map-env .full-page-google-map>div {width: 100%;height: 500px }.jvectormap-label {position: absolute;display: none;background: #2c2e2f;color: #fff;font-family: sans-serif, Verdana;font-size: smaller;padding: 3px 7px;z-index: 1000!important;-webkit-border-radius: 0;-webkit-background-clip: padding-box;-moz-border-radius: 0;-moz-background-clip: padding;border-radius: 0;background-clip: padding-box }.jvectormap-zoomin, .jvectormap-zoomout {position: absolute;left: 10px;border: 1px solid #e7e7e7;background: #fafafa;padding: 3px;color: #979898;width: 28px;height: 28px;cursor: pointer;line-height: 19px;text-align: center;-webkit-border-radius: 0;-webkit-background-clip: padding-box;-moz-border-radius: 0;-moz-background-clip: padding;border-radius: 0;background-clip: padding-box }.jvectormap-zoomin:hover, .jvectormap-zoomout:hover {background-color: #f2f2f2 }.jvectormap-zoomin:active, .jvectormap-zoomout:active {-webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, .1);-moz-box-shadow: inset 0 0 5px rgba(0, 0, 0, .1);box-shadow: inset 0 0 5px rgba(0, 0, 0, .1) }.jvectormap-zoomin {top: 10px }.jvectormap-zoomout {top: 37px }.xenon-loading-bar {position: fixed;left: 0;top: 0;right: 0;background: rgba(44, 46, 47, .3);height: 3px;z-index: 10000;top: 0;zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100);-webkit-transition: all 220ms ease-in-out;-moz-transition: all 220ms ease-in-out;-o-transition: all 220ms ease-in-out;transition: all 220ms ease-in-out }.xenon-loading-bar span {display: block;position: absolute;left: 0;top: 0;bottom: 0;width: 0;background: #68b828 }.xenon-loading-bar.progress-is-hidden {top: -3px;zoom: 1;-webkit-opacity: .5;-moz-opacity: .5;opacity: .5;-ms-filter: alpha(Opacity=50);filter: alpha(opacity=50);visibility: hidden }.toast-title {font-weight: 700;margin-bottom: 5px }.toast-message {-ms-word-wrap: break-word;word-wrap: break-word }.toast-message a, .toast-message label {color: #fff }.toast-message a:hover {color: #ccc;text-decoration: none }.toast-close-button {position: relative;right: -.3em;top: -.3em;float: right;font-size: 20px;font-weight: 700;color: #fff;zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.toast-close-button:hover, .toast-close-button:focus {text-decoration: none;cursor: pointer;zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100) }button.toast-close-button {padding: 0;cursor: pointer;background: 0 0;border: 0;-webkit-appearance: none }.toast-top-full-width {top: 0;right: 0;width: 100%;margin-top: 15px }.toast-top-full-width .toast {margin-bottom: 15px!important }.toast-bottom-full-width {bottom: 0;right: 0;width: 100% }.toast-top-left {top: 12px;left: 12px }.toast-top-right {top: 12px;right: 12px }.toast-bottom-right {right: 12px;bottom: 12px }.toast-bottom-left {bottom: 12px;left: 12px }#toast-container {position: fixed;z-index: 999999 }#toast-container * {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box }#toast-container>div {margin: 0 0 6px;padding: 12px 15px;width: 300px;margin-bottom: 10px;-moz-border-radius: 0;-webkit-border-radius: 0;border-radius: 0;background-position: 15px center;background-repeat: no-repeat;color: #fff;zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }#toast-container>div i {margin-right: 6px }#toast-container>:hover {zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100);cursor: pointer }#toast-container.toast-top-full-width>div, #toast-container.toast-bottom-full-width>div {width: 96%;margin: auto }.toast {background-color: #030303 }.toast-success {background-color: #8dc63f }.toast-error {background-color: #cc3f44 }.toast-info {background-color: #40bbea }.toast-warning {background-color: #ffba00 }.toast-default>div {background-color: rgba(44, 46, 47, .8) }@media all and (max-width:240px) {#toast-container>div {padding: 8px 8px 8px 50px;width: 11em }#toast-container .toast-close-button {right: -.2em;top: -.2em }}@media all and (min-width:241px) and (max-width:480px) {#toast-container>div {padding: 8px 8px 8px 50px;width: 18em }#toast-container .toast-close-button {right: -.2em;top: -.2em }}@media all and (min-width:481px) and (max-width:768px) {#toast-container>div {padding: 15px 15px 15px 50px;width: 25em }}.uk-nestable-item .uk-nestable-handle {padding: 5px 8px;background: #eee }.uk-nestable-item .uk-nestable-handle:hover, .uk-nestable-item .uk-nestable-handle:active {background: #e1e1e1 }.uk-nestable-item [data-nestable-action=toggle] {padding: 0 5px;padding-right: 0;display: none }.uk-nestable-item .list-label {display: inline-block;line-height: 1;padding: 5px 8px }.uk-parent>.uk-nestable-item [data-nestable-action=toggle] {display: inline-block!important }.login-page {background: #2c2e2f;color: #fff;padding-top: 150px }.login-page .errors-container {margin-bottom: 20px;padding: 0 30px }.login-page .login-form {position: relative;padding: 30px;margin-bottom: 20px }.login-page .login-form.fade-in-effect {zoom: 1;-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-ms-filter: alpha(Opacity=0);filter: alpha(opacity=0);-webkit-transition: all 800ms cubic-bezier(0.39, .575, .565, 1);-moz-transition: all 800ms cubic-bezier(0.39, .575, .565, 1);-o-transition: all 800ms cubic-bezier(0.39, .575, .565, 1);transition: all 800ms cubic-bezier(0.39, .575, .565, 1) }@media screen and (max-width:768px) {.login-page .login-form.fade-in-effect {left: 0 }}.login-page .login-form.fade-in-effect .form-group {position: relative;zoom: 1;-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-ms-filter: alpha(Opacity=0);filter: alpha(opacity=0);-webkit-transition: all 500ms ease-out;-moz-transition: all 500ms ease-out;-o-transition: all 500ms ease-out;transition: all 500ms ease-out;-webkit-transition-delay: 150ms;-moz-transition-delay: 150ms;-o-transition-delay: 150ms;transition-delay: 150ms }.login-page .login-form.fade-in-effect+.external-login {zoom: 1;-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-ms-filter: alpha(Opacity=0);filter: alpha(opacity=0);-webkit-transition: all 500ms cubic-bezier(0.39, .575, .565, 1);-moz-transition: all 500ms cubic-bezier(0.39, .575, .565, 1);-o-transition: all 500ms cubic-bezier(0.39, .575, .565, 1);transition: all 500ms cubic-bezier(0.39, .575, .565, 1);-webkit-transition-delay: 100ms;-moz-transition-delay: 100ms;-o-transition-delay: 100ms;transition-delay: 100ms }.login-page .login-form.fade-in-effect.in {left: 0;zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100) }.login-page .login-form.fade-in-effect.in .form-group {top: 0;zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100) }.login-page .login-form.fade-in-effect.in+.external-login {zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100) }.login-page .login-form .login-header {margin-bottom: 40px }.login-page .login-form .login-header .logo {display: block }.login-page .login-form .login-header .logo img {vertical-align: baseline }.login-page .login-form .login-header .logo span {padding-left: 3px;color: rgba(151, 152, 152, .6);font-size: 15px;vertical-align: baseline }.login-page .login-form .login-header p {color: #979898;font-size: 13px;margin: 0;margin-top: 10px }.login-page .login-form .form-group {position: relative;margin-bottom: 20px }.login-page .login-form .form-group .control-label {line-height: 40px;position: absolute;left: 0;top: 0;bottom: 0;right: 0;padding: 0 13px;color: #979898;cursor: text }.login-page .login-form .form-group .form-control {height: 40px }.login-page .login-form .form-group .form-control::-moz-placeholder {color: rgba(151, 152, 152, .5);opacity: 1 }.login-page .login-form .form-group .form-control:-ms-input-placeholder {color: rgba(151, 152, 152, .5) }.login-page .login-form .form-group .form-control::-webkit-input-placeholder {color: rgba(151, 152, 152, .5) }.login-page .login-form .form-group .form-control::-webkit-input-placeholder {color: rgba(151, 152, 152, .5) }.login-page .login-form .form-group .form-control:-moz-placeholder {color: rgba(151, 152, 152, .5) }.login-page .login-form .form-group .form-control::-moz-placeholder {color: rgba(151, 152, 152, .5) }.login-page .login-form .form-group .form-control:-ms-input-placeholder {color: rgba(151, 152, 152, .5) }.login-page .login-form .form-group .form-control:-webkit-autofill {-webkit-box-shadow: 0 0 0 1000px #fff inset;-webkit-text-fill-color: #979898;border: 1px solid #e4e4e4 }.login-page .login-form .form-group .form-control.input-dark {background: #313334;border: 1px solid transparent;color: #fff }.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: rgba(255, 255, 255, .5);opacity: 1 }.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder {color: rgba(255, 255, 255, .5) }.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: rgba(255, 255, 255, .5) }.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.login-page .login-form .form-group .form-control.input-dark:-webkit-autofill {-webkit-box-shadow: 0 0 0 1000px #313334 inset;-webkit-text-fill-color: #fff;border: 0 }.login-page .login-form .form-group .form-control.error {border-color: rgba(204, 63, 68, .5) }.login-page .login-form .form-group label.error {position: absolute;top: 0;right: 0;bottom: 0;padding-right: 12px;font-size: 12px;line-height: 40px;color: rgba(255, 255, 255, .7) }.login-page .login-form .form-group.validate-has-error .form-control {border-color: rgba(204, 63, 68, .5) }.login-page .login-form .form-group.is-focused .control-label {zoom: 1;-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-ms-filter: alpha(Opacity=0);filter: alpha(opacity=0);visibility: hidden }.login-page .login-form .form-group .btn {padding-top: 11.11px;padding-bottom: 11.11px }.login-page .login-form .form-group .btn i {margin-right: 5px }.login-page .login-form .form-group .btn.btn-dark {border-color: rgba(55, 57, 58, .9);background-color: #2c2e2f;color: #fff }.login-page .login-form .form-group .btn.btn-dark:hover {background-color: rgba(55, 57, 58, .3) }.login-page .login-form .login-footer {margin-top: 45px }.login-page .login-form .login-footer a {color: #979898 }.login-page .login-form .login-footer a:hover {color: #bdbebe }.login-page .login-form .login-footer .info-links {font-size: 11px;margin-top: 5px;color: rgba(151, 152, 152, .7) }.login-page .login-form .login-footer .info-links a {color: rgba(151, 152, 152, .7) }.login-page .login-form .login-footer .info-links a:hover {color: #979898 }.login-page .external-login {position: relative;margin-bottom: 30px;padding: 0 30px }.login-page .external-login a {display: block;color: #fff;background: #2c2e2f;padding: 13px 20px;font-size: 15px;margin-bottom: 10px }.login-page .external-login a i {margin-right: 5px }.login-page .external-login a:hover {background: #454849 }.login-page .external-login a.facebook {background-color: #3b5998 }.login-page .external-login a.facebook:hover {background-color: #2d4373 }.login-page .external-login a.twitter {background-color: #55acee }.login-page .external-login a.twitter:hover {background-color: #2795e9 }.login-page .external-login a.gplus {background-color: #dd4b39 }.login-page .external-login a.gplus:hover {background-color: #c23321 }.login-page.login-light {background: #eee }.login-page.login-light .errors-container, .login-page.login-light .external-login {padding: 0 }.login-page.login-light .form-group label.error {color: rgba(151, 152, 152, .8) }.login-page.login-light .login-form {background: #fff;color: #979898 }.login-page.login-light .login-form .login-footer a {color: #68b828 }.login-page.login-light .login-form .login-footer a:hover {color: #508e1f }.login-page.login-light .login-form .login-footer .info-links a {color: rgba(151, 152, 152, .7) }.login-page.login-light .login-form .login-footer .info-links a:hover {color: #979898 }@media screen and (max-width:768px) {.login-page {padding-top: 0 }.login-page .login-form, .login-page .errors-container, .login-page .external-login {padding-left: 10px;padding-right: 10px }.login-page .errors-container {margin-top: 20px }.login-page.login-light .login-form {padding-left: 30px;padding-right: 30px }.login-page.login-light .errors-container, .login-page.login-light .external-login {padding-left: 0;padding-right: 0 }.login-page .row {margin: 0 }}.login-container {max-width: 960px;margin: 0 auto }.lockscreen-page {background: #2c2e2f;color: #fff;padding-top: 250px }@media screen and (max-width:768px) {.lockscreen-page {padding-top: 30px }.lockscreen-page .row {margin: 0 auto }}.lockscreen-page .lockcreen-form .user-thumb {float: left;width: 25% }.lockscreen-page .lockcreen-form .user-thumb img {-webkit-box-shadow: 0 0 0 6px rgba(255, 255, 255, .05);-moz-box-shadow: 0 0 0 6px rgba(255, 255, 255, .05);box-shadow: 0 0 0 6px rgba(255, 255, 255, .05) }.lockscreen-page .lockcreen-form .form-group {position: relative;float: left;width: 75%;padding-left: 30px }.lockscreen-page .lockcreen-form .form-group h3 {margin: 0 }.lockscreen-page .lockcreen-form .form-group p {color: #979898;font-size: 13px;margin: 0;margin-top: 10px }.lockscreen-page .lockcreen-form .form-group .input-group {position: relative;margin-top: 20px }.lockscreen-page .lockcreen-form .form-group .input-group .form-control {background: 0 0;border: 1px solid #3e4142;color: #fff;height: 40px }.lockscreen-page .lockcreen-form .form-group .input-group .form-control.error {border-color: rgba(204, 63, 68, .5) }.lockscreen-page .lockcreen-form .form-group .input-group label.error {position: absolute;top: 100%;left: 0;padding-top: 10px;color: rgba(255, 255, 255, .6);font-size: 12px }.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn {padding-left: 10px }.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn {border: 1px solid #3e4142;padding: 10px 20px }.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover, .lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus {background-color: rgba(62, 65, 66, .3) }.lockscreen-page .lockcreen-form.fade-in-effect .user-thumb {position: relative;zoom: 1;-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-ms-filter: alpha(Opacity=0);filter: alpha(opacity=0);-webkit-transition: all 800ms ease-in-out;-moz-transition: all 800ms ease-in-out;-o-transition: all 800ms ease-in-out;transition: all 800ms ease-in-out }.lockscreen-page .lockcreen-form.fade-in-effect .form-group {zoom: 1;-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-ms-filter: alpha(Opacity=0);filter: alpha(opacity=0);-webkit-transition: all 500ms ease-in-out;-moz-transition: all 500ms ease-in-out;-o-transition: all 500ms ease-in-out;transition: all 500ms ease-in-out }.lockscreen-page .lockcreen-form.fade-in-effect .form-group .input-group {zoom: 1;-webkit-opacity: .5;-moz-opacity: .5;opacity: .5;-ms-filter: alpha(Opacity=50);filter: alpha(opacity=50);-webkit-transition: all 800ms ease-in-out;-moz-transition: all 800ms ease-in-out;-o-transition: all 800ms ease-in-out;transition: all 800ms ease-in-out }.lockscreen-page .lockcreen-form.fade-in-effect.in .user-thumb {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg);zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100);left: 0 }.lockscreen-page .lockcreen-form.fade-in-effect.in .form-group {top: 0;zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100) }.lockscreen-page .lockcreen-form.fade-in-effect.in .form-group .input-group {top: 0;zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100) }@media screen and (max-width:768px) {.lockscreen-page .lockcreen-form .user-thumb, .lockscreen-page .lockcreen-form .form-group {float: none;width: 100% }.lockscreen-page .lockcreen-form .user-thumb {text-align: center;margin-bottom: 30px }.lockscreen-page .lockcreen-form .user-thumb a {display: inline-block }.lockscreen-page .lockcreen-form .form-group {padding-left: 0;text-align: center }}.xe-widget {position: relative }.xe-widget.xe-counter, .xe-widget.xe-counter-block .xe-upper, .xe-widget.xe-progress-counter .xe-upper {background: #fff;padding: 28px;line-height: 1;display: table;width: 100%;margin-bottom: 20px }.xe-widget.xe-counter .xe-icon, .xe-widget.xe-counter .xe-label, .xe-widget.xe-counter-block .xe-upper .xe-icon, .xe-widget.xe-counter-block .xe-upper .xe-label, .xe-widget.xe-progress-counter .xe-upper .xe-icon, .xe-widget.xe-progress-counter .xe-upper .xe-label {display: table-cell;vertical-align: middle;padding: 18px }.xe-widget.xe-counter .xe-icon, .xe-widget.xe-counter-block .xe-upper .xe-icon, .xe-widget.xe-progress-counter .xe-upper .xe-icon {width: 1% }.xe-widget.xe-counter .xe-icon i, .xe-widget.xe-counter-block .xe-upper .xe-icon i, .xe-widget.xe-progress-counter .xe-upper .xe-icon i {display: block;background: #68b828;color: #fff;text-align: center;font-size: 25px;line-height: 50px;width: 50px;height: 50px;-webkit-border-radius: 50%;-webkit-background-clip: padding-box;-moz-border-radius: 50%;-moz-background-clip: padding;border-radius: 50%;background-clip: padding-box }.xe-widget.xe-counter .xe-icon+.xe-label, .xe-widget.xe-counter-block .xe-upper .xe-icon+.xe-label, .xe-widget.xe-progress-counter .xe-upper .xe-icon+.xe-label {padding-left: 0 }.xe-widget.xe-counter .xe-label .num, .xe-widget.xe-counter-block .xe-upper .xe-label .num, .xe-widget.xe-progress-counter .xe-upper .xe-label .num {display: block;font-size: 28px;font-weight: 400;color: #3e3f3f }.xe-widget.xe-counter .xe-label span, .xe-widget.xe-counter-block .xe-upper .xe-label span, .xe-widget.xe-progress-counter .xe-upper .xe-label span {display: block;font-style: normal;font-size: 10px;text-transform: uppercase;color: #979898;margin-top: 5px }.xe-widget.xe-counter .xe-label+.xe-icon, .xe-widget.xe-counter-block .xe-upper .xe-label+.xe-icon, .xe-widget.xe-progress-counter .xe-upper .xe-label+.xe-icon {padding-left: 0 }.xe-widget.xe-counter.xe-counter-primary .xe-icon i, .xe-widget.xe-counter-block .xe-upper.xe-counter-primary .xe-icon i, .xe-widget.xe-progress-counter .xe-upper.xe-counter-primary .xe-icon i {background-color: #2c2e2f;color: #fff }.xe-widget.xe-counter.xe-counter-success .xe-icon i, .xe-widget.xe-counter-block .xe-upper.xe-counter-success .xe-icon i, .xe-widget.xe-progress-counter .xe-upper.xe-counter-success .xe-icon i {background-color: #8dc63f;color: #fff }.xe-widget.xe-counter.xe-counter-warning .xe-icon i, .xe-widget.xe-counter-block .xe-upper.xe-counter-warning .xe-icon i, .xe-widget.xe-progress-counter .xe-upper.xe-counter-warning .xe-icon i {background-color: #ffba00;color: #fff }.xe-widget.xe-counter.xe-counter-info .xe-icon i, .xe-widget.xe-counter-block .xe-upper.xe-counter-info .xe-icon i, .xe-widget.xe-progress-counter .xe-upper.xe-counter-info .xe-icon i {background-color: #40bbea;color: #fff }.xe-widget.xe-counter.xe-counter-danger .xe-icon i, .xe-widget.xe-counter-block .xe-upper.xe-counter-danger .xe-icon i, .xe-widget.xe-progress-counter .xe-upper.xe-counter-danger .xe-icon i {background-color: #cc3f44;color: #fff }.xe-widget.xe-counter.xe-counter-blue .xe-icon i, .xe-widget.xe-counter-block .xe-upper.xe-counter-blue .xe-icon i, .xe-widget.xe-progress-counter .xe-upper.xe-counter-blue .xe-icon i {background-color: #0e62c7;color: #fff }.xe-widget.xe-counter.xe-counter-red .xe-icon i, .xe-widget.xe-counter-block .xe-upper.xe-counter-red .xe-icon i, .xe-widget.xe-progress-counter .xe-upper.xe-counter-red .xe-icon i {background-color: #d5080f;color: #fff }.xe-widget.xe-counter.xe-counter-purple .xe-icon i, .xe-widget.xe-counter-block .xe-upper.xe-counter-purple .xe-icon i, .xe-widget.xe-progress-counter .xe-upper.xe-counter-purple .xe-icon i {background-color: #7c38bc;color: #fff }.xe-widget.xe-counter.xe-counter-orange .xe-icon i, .xe-widget.xe-counter-block .xe-upper.xe-counter-orange .xe-icon i, .xe-widget.xe-progress-counter .xe-upper.xe-counter-orange .xe-icon i {background-color: #f7aa47;color: #fff }.xe-widget.xe-counter.xe-counter-yellow .xe-icon i, .xe-widget.xe-counter-block .xe-upper.xe-counter-yellow .xe-icon i, .xe-widget.xe-progress-counter .xe-upper.xe-counter-yellow .xe-icon i {background-color: #fcd036;color: #fff }.xe-widget.xe-counter.xe-counter-turquoise .xe-icon i, .xe-widget.xe-counter-block .xe-upper.xe-counter-turquoise .xe-icon i, .xe-widget.xe-progress-counter .xe-upper.xe-counter-turquoise .xe-icon i {background-color: #00b19d;color: #fff }.xe-widget.xe-counter.xe-counter-white .xe-icon i, .xe-widget.xe-counter-block .xe-upper.xe-counter-white .xe-icon i, .xe-widget.xe-progress-counter .xe-upper.xe-counter-white .xe-icon i {background-color: #fff;color: #4b4b4b }.xe-widget.xe-counter.xe-counter-white .xe-icon i, .xe-widget.xe-counter-block .xe-upper.xe-counter-white .xe-icon i, .xe-widget.xe-progress-counter .xe-upper.xe-counter-white .xe-icon i {border: 1px solid #ddd }.xe-widget.xe-counter.xe-counter-gray .xe-icon i, .xe-widget.xe-counter-block .xe-upper.xe-counter-gray .xe-icon i, .xe-widget.xe-progress-counter .xe-upper.xe-counter-gray .xe-icon i {background-color: #eee;color: #555 }.xe-widget.xe-counter.xe-counter-pink .xe-icon i, .xe-widget.xe-counter-block .xe-upper.xe-counter-pink .xe-icon i, .xe-widget.xe-progress-counter .xe-upper.xe-counter-pink .xe-icon i {background-color: #ff6264;color: #fff }.xe-widget.xe-counter-block, .xe-widget.xe-progress-counter {color: #fff;background: #68b828;margin-bottom: 20px }.xe-widget.xe-counter-block .xe-upper, .xe-widget.xe-progress-counter .xe-upper {margin: 0;border-spacing: 0;border: 0;background: #68b828 }.xe-widget.xe-counter-block .xe-upper .xe-icon, .xe-widget.xe-counter-block .xe-upper .xe-label, .xe-widget.xe-progress-counter .xe-upper .xe-icon, .xe-widget.xe-progress-counter .xe-upper .xe-label {padding-bottom: 0 }.xe-widget.xe-counter-block .xe-upper .xe-icon, .xe-widget.xe-progress-counter .xe-upper .xe-icon {text-align: center }.xe-widget.xe-counter-block .xe-upper .xe-icon i, .xe-widget.xe-progress-counter .xe-upper .xe-icon i {background: #68b828;font-size: 32px }.xe-widget.xe-counter-block .xe-upper .xe-label .num, .xe-widget.xe-progress-counter .xe-upper .xe-label .num {color: #fff }.xe-widget.xe-counter-block .xe-upper .xe-label span, .xe-widget.xe-progress-counter .xe-upper .xe-label span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block .xe-lower, .xe-widget.xe-progress-counter .xe-lower {padding: 15px 30px }.xe-widget.xe-counter-block .xe-lower .border, .xe-widget.xe-progress-counter .xe-lower .border {height: 1px;background: rgba(255, 255, 255, .5);margin-bottom: 10px }.xe-widget.xe-counter-block .xe-lower span, .xe-widget.xe-counter-block .xe-lower strong, .xe-widget.xe-progress-counter .xe-lower span, .xe-widget.xe-progress-counter .xe-lower strong {font-size: 10px;text-transform: uppercase;display: block }.xe-widget.xe-counter-block .xe-lower span, .xe-widget.xe-progress-counter .xe-lower span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block .xe-lower strong, .xe-widget.xe-progress-counter .xe-lower strong {font-weight: 400 }.xe-widget.xe-counter-block.xe-counter-block-primary, .xe-widget.xe-progress-counter.xe-counter-block-primary {background: #2c2e2f }.xe-widget.xe-counter-block.xe-counter-block-primary .xe-upper, .xe-widget.xe-progress-counter.xe-counter-block-primary .xe-upper {background: #2c2e2f }.xe-widget.xe-counter-block.xe-counter-block-primary .xe-upper .xe-icon i, .xe-widget.xe-progress-counter.xe-counter-block-primary .xe-upper .xe-icon i {background-color: #2c2e2f;color: #fff }.xe-widget.xe-counter-block.xe-counter-block-primary .xe-upper .xe-label .num, .xe-widget.xe-progress-counter.xe-counter-block-primary .xe-upper .xe-label .num {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-primary .xe-upper .xe-label span, .xe-widget.xe-progress-counter.xe-counter-block-primary .xe-upper .xe-label span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-primary .xe-lower .border, .xe-widget.xe-progress-counter.xe-counter-block-primary .xe-lower .border {background: rgba(255, 255, 255, .5) }.xe-widget.xe-counter-block.xe-counter-block-primary .xe-lower span, .xe-widget.xe-progress-counter.xe-counter-block-primary .xe-lower span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-primary .xe-lower strong, .xe-widget.xe-progress-counter.xe-counter-block-primary .xe-lower strong {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-success, .xe-widget.xe-progress-counter.xe-counter-block-success {background: #8dc63f }.xe-widget.xe-counter-block.xe-counter-block-success .xe-upper, .xe-widget.xe-progress-counter.xe-counter-block-success .xe-upper {background: #8dc63f }.xe-widget.xe-counter-block.xe-counter-block-success .xe-upper .xe-icon i, .xe-widget.xe-progress-counter.xe-counter-block-success .xe-upper .xe-icon i {background-color: #8dc63f;color: #fff }.xe-widget.xe-counter-block.xe-counter-block-success .xe-upper .xe-label .num, .xe-widget.xe-progress-counter.xe-counter-block-success .xe-upper .xe-label .num {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-success .xe-upper .xe-label span, .xe-widget.xe-progress-counter.xe-counter-block-success .xe-upper .xe-label span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-success .xe-lower .border, .xe-widget.xe-progress-counter.xe-counter-block-success .xe-lower .border {background: rgba(255, 255, 255, .5) }.xe-widget.xe-counter-block.xe-counter-block-success .xe-lower span, .xe-widget.xe-progress-counter.xe-counter-block-success .xe-lower span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-success .xe-lower strong, .xe-widget.xe-progress-counter.xe-counter-block-success .xe-lower strong {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-warning, .xe-widget.xe-progress-counter.xe-counter-block-warning {background: #ffba00 }.xe-widget.xe-counter-block.xe-counter-block-warning .xe-upper, .xe-widget.xe-progress-counter.xe-counter-block-warning .xe-upper {background: #ffba00 }.xe-widget.xe-counter-block.xe-counter-block-warning .xe-upper .xe-icon i, .xe-widget.xe-progress-counter.xe-counter-block-warning .xe-upper .xe-icon i {background-color: #ffba00;color: #fff }.xe-widget.xe-counter-block.xe-counter-block-warning .xe-upper .xe-label .num, .xe-widget.xe-progress-counter.xe-counter-block-warning .xe-upper .xe-label .num {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-warning .xe-upper .xe-label span, .xe-widget.xe-progress-counter.xe-counter-block-warning .xe-upper .xe-label span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-warning .xe-lower .border, .xe-widget.xe-progress-counter.xe-counter-block-warning .xe-lower .border {background: rgba(255, 255, 255, .5) }.xe-widget.xe-counter-block.xe-counter-block-warning .xe-lower span, .xe-widget.xe-progress-counter.xe-counter-block-warning .xe-lower span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-warning .xe-lower strong, .xe-widget.xe-progress-counter.xe-counter-block-warning .xe-lower strong {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-danger, .xe-widget.xe-progress-counter.xe-counter-block-danger {background: #cc3f44 }.xe-widget.xe-counter-block.xe-counter-block-danger .xe-upper, .xe-widget.xe-progress-counter.xe-counter-block-danger .xe-upper {background: #cc3f44 }.xe-widget.xe-counter-block.xe-counter-block-danger .xe-upper .xe-icon i, .xe-widget.xe-progress-counter.xe-counter-block-danger .xe-upper .xe-icon i {background-color: #cc3f44;color: #fff }.xe-widget.xe-counter-block.xe-counter-block-danger .xe-upper .xe-label .num, .xe-widget.xe-progress-counter.xe-counter-block-danger .xe-upper .xe-label .num {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-danger .xe-upper .xe-label span, .xe-widget.xe-progress-counter.xe-counter-block-danger .xe-upper .xe-label span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-danger .xe-lower .border, .xe-widget.xe-progress-counter.xe-counter-block-danger .xe-lower .border {background: rgba(255, 255, 255, .5) }.xe-widget.xe-counter-block.xe-counter-block-danger .xe-lower span, .xe-widget.xe-progress-counter.xe-counter-block-danger .xe-lower span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-danger .xe-lower strong, .xe-widget.xe-progress-counter.xe-counter-block-danger .xe-lower strong {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-info, .xe-widget.xe-progress-counter.xe-counter-block-info {background: #40bbea }.xe-widget.xe-counter-block.xe-counter-block-info .xe-upper, .xe-widget.xe-progress-counter.xe-counter-block-info .xe-upper {background: #40bbea }.xe-widget.xe-counter-block.xe-counter-block-info .xe-upper .xe-icon i, .xe-widget.xe-progress-counter.xe-counter-block-info .xe-upper .xe-icon i {background-color: #40bbea;color: #fff }.xe-widget.xe-counter-block.xe-counter-block-info .xe-upper .xe-label .num, .xe-widget.xe-progress-counter.xe-counter-block-info .xe-upper .xe-label .num {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-info .xe-upper .xe-label span, .xe-widget.xe-progress-counter.xe-counter-block-info .xe-upper .xe-label span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-info .xe-lower .border, .xe-widget.xe-progress-counter.xe-counter-block-info .xe-lower .border {background: rgba(255, 255, 255, .5) }.xe-widget.xe-counter-block.xe-counter-block-info .xe-lower span, .xe-widget.xe-progress-counter.xe-counter-block-info .xe-lower span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-info .xe-lower strong, .xe-widget.xe-progress-counter.xe-counter-block-info .xe-lower strong {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-purple, .xe-widget.xe-progress-counter.xe-counter-block-purple {background: #7c38bc }.xe-widget.xe-counter-block.xe-counter-block-purple .xe-upper, .xe-widget.xe-progress-counter.xe-counter-block-purple .xe-upper {background: #7c38bc }.xe-widget.xe-counter-block.xe-counter-block-purple .xe-upper .xe-icon i, .xe-widget.xe-progress-counter.xe-counter-block-purple .xe-upper .xe-icon i {background-color: #7c38bc;color: #fff }.xe-widget.xe-counter-block.xe-counter-block-purple .xe-upper .xe-label .num, .xe-widget.xe-progress-counter.xe-counter-block-purple .xe-upper .xe-label .num {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-purple .xe-upper .xe-label span, .xe-widget.xe-progress-counter.xe-counter-block-purple .xe-upper .xe-label span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-purple .xe-lower .border, .xe-widget.xe-progress-counter.xe-counter-block-purple .xe-lower .border {background: rgba(255, 255, 255, .5) }.xe-widget.xe-counter-block.xe-counter-block-purple .xe-lower span, .xe-widget.xe-progress-counter.xe-counter-block-purple .xe-lower span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-purple .xe-lower strong, .xe-widget.xe-progress-counter.xe-counter-block-purple .xe-lower strong {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-blue, .xe-widget.xe-progress-counter.xe-counter-block-blue {background: #0e62c7 }.xe-widget.xe-counter-block.xe-counter-block-blue .xe-upper, .xe-widget.xe-progress-counter.xe-counter-block-blue .xe-upper {background: #0e62c7 }.xe-widget.xe-counter-block.xe-counter-block-blue .xe-upper .xe-icon i, .xe-widget.xe-progress-counter.xe-counter-block-blue .xe-upper .xe-icon i {background-color: #0e62c7;color: #fff }.xe-widget.xe-counter-block.xe-counter-block-blue .xe-upper .xe-label .num, .xe-widget.xe-progress-counter.xe-counter-block-blue .xe-upper .xe-label .num {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-blue .xe-upper .xe-label span, .xe-widget.xe-progress-counter.xe-counter-block-blue .xe-upper .xe-label span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-blue .xe-lower .border, .xe-widget.xe-progress-counter.xe-counter-block-blue .xe-lower .border {background: rgba(255, 255, 255, .5) }.xe-widget.xe-counter-block.xe-counter-block-blue .xe-lower span, .xe-widget.xe-progress-counter.xe-counter-block-blue .xe-lower span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-blue .xe-lower strong, .xe-widget.xe-progress-counter.xe-counter-block-blue .xe-lower strong {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-red, .xe-widget.xe-progress-counter.xe-counter-block-red {background: #d5080f }.xe-widget.xe-counter-block.xe-counter-block-red .xe-upper, .xe-widget.xe-progress-counter.xe-counter-block-red .xe-upper {background: #d5080f }.xe-widget.xe-counter-block.xe-counter-block-red .xe-upper .xe-icon i, .xe-widget.xe-progress-counter.xe-counter-block-red .xe-upper .xe-icon i {background-color: #d5080f;color: #fff }.xe-widget.xe-counter-block.xe-counter-block-red .xe-upper .xe-label .num, .xe-widget.xe-progress-counter.xe-counter-block-red .xe-upper .xe-label .num {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-red .xe-upper .xe-label span, .xe-widget.xe-progress-counter.xe-counter-block-red .xe-upper .xe-label span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-red .xe-lower .border, .xe-widget.xe-progress-counter.xe-counter-block-red .xe-lower .border {background: rgba(255, 255, 255, .5) }.xe-widget.xe-counter-block.xe-counter-block-red .xe-lower span, .xe-widget.xe-progress-counter.xe-counter-block-red .xe-lower span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-red .xe-lower strong, .xe-widget.xe-progress-counter.xe-counter-block-red .xe-lower strong {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-orange, .xe-widget.xe-progress-counter.xe-counter-block-orange {background: #f7aa47 }.xe-widget.xe-counter-block.xe-counter-block-orange .xe-upper, .xe-widget.xe-progress-counter.xe-counter-block-orange .xe-upper {background: #f7aa47 }.xe-widget.xe-counter-block.xe-counter-block-orange .xe-upper .xe-icon i, .xe-widget.xe-progress-counter.xe-counter-block-orange .xe-upper .xe-icon i {background-color: #f7aa47;color: #fff }.xe-widget.xe-counter-block.xe-counter-block-orange .xe-upper .xe-label .num, .xe-widget.xe-progress-counter.xe-counter-block-orange .xe-upper .xe-label .num {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-orange .xe-upper .xe-label span, .xe-widget.xe-progress-counter.xe-counter-block-orange .xe-upper .xe-label span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-orange .xe-lower .border, .xe-widget.xe-progress-counter.xe-counter-block-orange .xe-lower .border {background: rgba(255, 255, 255, .5) }.xe-widget.xe-counter-block.xe-counter-block-orange .xe-lower span, .xe-widget.xe-progress-counter.xe-counter-block-orange .xe-lower span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-orange .xe-lower strong, .xe-widget.xe-progress-counter.xe-counter-block-orange .xe-lower strong {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-turquoise, .xe-widget.xe-progress-counter.xe-counter-block-turquoise {background: #00b19d }.xe-widget.xe-counter-block.xe-counter-block-turquoise .xe-upper, .xe-widget.xe-progress-counter.xe-counter-block-turquoise .xe-upper {background: #00b19d }.xe-widget.xe-counter-block.xe-counter-block-turquoise .xe-upper .xe-icon i, .xe-widget.xe-progress-counter.xe-counter-block-turquoise .xe-upper .xe-icon i {background-color: #00b19d;color: #fff }.xe-widget.xe-counter-block.xe-counter-block-turquoise .xe-upper .xe-label .num, .xe-widget.xe-progress-counter.xe-counter-block-turquoise .xe-upper .xe-label .num {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-turquoise .xe-upper .xe-label span, .xe-widget.xe-progress-counter.xe-counter-block-turquoise .xe-upper .xe-label span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-turquoise .xe-lower .border, .xe-widget.xe-progress-counter.xe-counter-block-turquoise .xe-lower .border {background: rgba(255, 255, 255, .5) }.xe-widget.xe-counter-block.xe-counter-block-turquoise .xe-lower span, .xe-widget.xe-progress-counter.xe-counter-block-turquoise .xe-lower span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-turquoise .xe-lower strong, .xe-widget.xe-progress-counter.xe-counter-block-turquoise .xe-lower strong {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-pink, .xe-widget.xe-progress-counter.xe-counter-block-pink {background: #ff6264 }.xe-widget.xe-counter-block.xe-counter-block-pink .xe-upper, .xe-widget.xe-progress-counter.xe-counter-block-pink .xe-upper {background: #ff6264 }.xe-widget.xe-counter-block.xe-counter-block-pink .xe-upper .xe-icon i, .xe-widget.xe-progress-counter.xe-counter-block-pink .xe-upper .xe-icon i {background-color: #ff6264;color: #fff }.xe-widget.xe-counter-block.xe-counter-block-pink .xe-upper .xe-label .num, .xe-widget.xe-progress-counter.xe-counter-block-pink .xe-upper .xe-label .num {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-pink .xe-upper .xe-label span, .xe-widget.xe-progress-counter.xe-counter-block-pink .xe-upper .xe-label span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-pink .xe-lower .border, .xe-widget.xe-progress-counter.xe-counter-block-pink .xe-lower .border {background: rgba(255, 255, 255, .5) }.xe-widget.xe-counter-block.xe-counter-block-pink .xe-lower span, .xe-widget.xe-progress-counter.xe-counter-block-pink .xe-lower span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-pink .xe-lower strong, .xe-widget.xe-progress-counter.xe-counter-block-pink .xe-lower strong {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-yellow, .xe-widget.xe-progress-counter.xe-counter-block-yellow {background: #fcd036 }.xe-widget.xe-counter-block.xe-counter-block-yellow .xe-upper, .xe-widget.xe-progress-counter.xe-counter-block-yellow .xe-upper {background: #fcd036 }.xe-widget.xe-counter-block.xe-counter-block-yellow .xe-upper .xe-icon i, .xe-widget.xe-progress-counter.xe-counter-block-yellow .xe-upper .xe-icon i {background-color: #fcd036;color: #fff }.xe-widget.xe-counter-block.xe-counter-block-yellow .xe-upper .xe-label .num, .xe-widget.xe-progress-counter.xe-counter-block-yellow .xe-upper .xe-label .num {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-yellow .xe-upper .xe-label span, .xe-widget.xe-progress-counter.xe-counter-block-yellow .xe-upper .xe-label span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-yellow .xe-lower .border, .xe-widget.xe-progress-counter.xe-counter-block-yellow .xe-lower .border {background: rgba(255, 255, 255, .5) }.xe-widget.xe-counter-block.xe-counter-block-yellow .xe-lower span, .xe-widget.xe-progress-counter.xe-counter-block-yellow .xe-lower span {color: rgba(255, 255, 255, .7) }.xe-widget.xe-counter-block.xe-counter-block-yellow .xe-lower strong, .xe-widget.xe-progress-counter.xe-counter-block-yellow .xe-lower strong {color: #fff }.xe-widget.xe-counter-block.xe-counter-block-gray, .xe-widget.xe-progress-counter.xe-counter-block-gray {background: #d5d5d5 }.xe-widget.xe-counter-block.xe-counter-block-gray .xe-upper, .xe-widget.xe-progress-counter.xe-counter-block-gray .xe-upper {background: #d5d5d5 }.xe-widget.xe-counter-block.xe-counter-block-gray .xe-upper .xe-icon i, .xe-widget.xe-progress-counter.xe-counter-block-gray .xe-upper .xe-icon i {background-color: #d5d5d5;color: #666 }.xe-widget.xe-counter-block.xe-counter-block-gray .xe-upper .xe-label .num, .xe-widget.xe-progress-counter.xe-counter-block-gray .xe-upper .xe-label .num {color: #666 }.xe-widget.xe-counter-block.xe-counter-block-gray .xe-upper .xe-label span, .xe-widget.xe-progress-counter.xe-counter-block-gray .xe-upper .xe-label span {color: rgba(102, 102, 102, .7) }.xe-widget.xe-counter-block.xe-counter-block-gray .xe-lower .border, .xe-widget.xe-progress-counter.xe-counter-block-gray .xe-lower .border {background: rgba(102, 102, 102, .5) }.xe-widget.xe-counter-block.xe-counter-block-gray .xe-lower span, .xe-widget.xe-progress-counter.xe-counter-block-gray .xe-lower span {color: rgba(102, 102, 102, .7) }.xe-widget.xe-counter-block.xe-counter-block-gray .xe-lower strong, .xe-widget.xe-progress-counter.xe-counter-block-gray .xe-lower strong {color: #666 }.xe-widget.xe-counter-block.xe-counter-block-white, .xe-widget.xe-progress-counter.xe-counter-block-white {background: #fff }.xe-widget.xe-counter-block.xe-counter-block-white .xe-upper, .xe-widget.xe-progress-counter.xe-counter-block-white .xe-upper {background: #fff }.xe-widget.xe-counter-block.xe-counter-block-white .xe-upper .xe-icon i, .xe-widget.xe-progress-counter.xe-counter-block-white .xe-upper .xe-icon i {background-color: #fff;color: #4b4b4b }.xe-widget.xe-counter-block.xe-counter-block-white .xe-upper .xe-label .num, .xe-widget.xe-progress-counter.xe-counter-block-white .xe-upper .xe-label .num {color: #4b4b4b }.xe-widget.xe-counter-block.xe-counter-block-white .xe-upper .xe-label span, .xe-widget.xe-progress-counter.xe-counter-block-white .xe-upper .xe-label span {color: rgba(75, 75, 75, .7) }.xe-widget.xe-counter-block.xe-counter-block-white .xe-lower .border, .xe-widget.xe-progress-counter.xe-counter-block-white .xe-lower .border {background: rgba(75, 75, 75, .5) }.xe-widget.xe-counter-block.xe-counter-block-white .xe-lower span, .xe-widget.xe-progress-counter.xe-counter-block-white .xe-lower span {color: rgba(75, 75, 75, .7) }.xe-widget.xe-counter-block.xe-counter-block-white .xe-lower strong, .xe-widget.xe-progress-counter.xe-counter-block-white .xe-lower strong {color: #4b4b4b }.xe-widget.xe-progress-counter {position: relative;color: #fff;background: #68b828;margin-bottom: 20px;overflow: hidden }.xe-widget.xe-progress-counter .xe-background {position: absolute;left: -40%;bottom: -10%;color: #fff;font-size: 150px;zoom: 1;-webkit-opacity: .1;-moz-opacity: .1;opacity: .1;-ms-filter: alpha(Opacity=10);filter: alpha(opacity=10) }.xe-widget.xe-progress-counter .xe-background i {line-height: 1;display: block }.xe-widget.xe-progress-counter .xe-upper .xe-icon i {font-size: 28px;background: 0 0 }.xe-widget.xe-progress-counter .xe-upper .xe-label span {padding: 0;padding-bottom: 5px }.xe-widget.xe-progress-counter .xe-upper .xe-label .num {font-size: 20px }.xe-widget.xe-progress-counter .xe-progress {height: 2px;position: relative;background: rgba(0, 0, 0, .1);margin: 0 30px;margin-top: 10px }.xe-widget.xe-progress-counter .xe-progress .xe-progress-fill {position: absolute;display: block;left: 0;top: 0;bottom: 0;background: #fff }.xe-widget.xe-progress-counter.xe-progress-counter-primary {background-color: #2c2e2f }.xe-widget.xe-progress-counter.xe-progress-counter-primary .xe-background {color: #fff }.xe-widget.xe-progress-counter.xe-progress-counter-primary .xe-upper {background-color: transparent }.xe-widget.xe-progress-counter.xe-progress-counter-success {background-color: #8dc63f }.xe-widget.xe-progress-counter.xe-progress-counter-success .xe-background {color: #fff }.xe-widget.xe-progress-counter.xe-progress-counter-success .xe-upper {background-color: transparent }.xe-widget.xe-progress-counter.xe-progress-counter-info {background-color: #40bbea }.xe-widget.xe-progress-counter.xe-progress-counter-info .xe-background {color: #fff }.xe-widget.xe-progress-counter.xe-progress-counter-info .xe-upper {background-color: transparent }.xe-widget.xe-progress-counter.xe-progress-counter-danger {background-color: #cc3f44 }.xe-widget.xe-progress-counter.xe-progress-counter-danger .xe-background {color: #fff }.xe-widget.xe-progress-counter.xe-progress-counter-danger .xe-upper {background-color: transparent }.xe-widget.xe-progress-counter.xe-progress-counter-warning {background-color: #ffba00 }.xe-widget.xe-progress-counter.xe-progress-counter-warning .xe-background {color: #fff }.xe-widget.xe-progress-counter.xe-progress-counter-warning .xe-upper {background-color: transparent }.xe-widget.xe-progress-counter.xe-progress-counter-pink {background-color: #ff6264 }.xe-widget.xe-progress-counter.xe-progress-counter-pink .xe-background {color: #fff }.xe-widget.xe-progress-counter.xe-progress-counter-pink .xe-upper {background-color: transparent }.xe-widget.xe-progress-counter.xe-progress-counter-turquoise {background-color: #00b19d }.xe-widget.xe-progress-counter.xe-progress-counter-turquoise .xe-background {color: #fff }.xe-widget.xe-progress-counter.xe-progress-counter-turquoise .xe-upper {background-color: transparent }.xe-widget.xe-progress-counter.xe-progress-counter-red {background-color: #d5080f }.xe-widget.xe-progress-counter.xe-progress-counter-red .xe-background {color: #fff }.xe-widget.xe-progress-counter.xe-progress-counter-red .xe-upper {background-color: transparent }.xe-widget.xe-progress-counter.xe-progress-counter-orange {background-color: #f7aa47 }.xe-widget.xe-progress-counter.xe-progress-counter-orange .xe-background {color: #fff }.xe-widget.xe-progress-counter.xe-progress-counter-orange .xe-upper {background-color: transparent }.xe-widget.xe-progress-counter.xe-progress-counter-yellow {background-color: #fcd036 }.xe-widget.xe-progress-counter.xe-progress-counter-yellow .xe-background {color: #fff }.xe-widget.xe-progress-counter.xe-progress-counter-yellow .xe-upper {background-color: transparent }.xe-widget.xe-progress-counter.xe-progress-counter-purple {background-color: #7c38bc }.xe-widget.xe-progress-counter.xe-progress-counter-purple .xe-background {color: #fff }.xe-widget.xe-progress-counter.xe-progress-counter-purple .xe-upper {background-color: transparent }.xe-widget.xe-vertical-counter {background: #68b828;padding: 20px;padding-top: 40px;margin-bottom: 20px;color: #fff }.xe-widget.xe-vertical-counter .xe-icon {font-size: 75px;text-align: center;padding-bottom: 15px }.xe-widget.xe-vertical-counter .xe-icon i {display: block;line-height: 1.4 }.xe-widget.xe-vertical-counter .xe-label {padding-top: 15px;text-align: center }.xe-widget.xe-vertical-counter .xe-label .num {display: block;font-weight: 400;font-size: 23px }.xe-widget.xe-vertical-counter .xe-label span {display: block;padding-top: 5px;text-transform: uppercase;font-size: 12px;color: rgba(255, 255, 255, .95) }.xe-widget.xe-vertical-counter.xe-vertical-counter-primary {background: #2c2e2f;color: #fff }.xe-widget.xe-vertical-counter.xe-vertical-counter-primary .xe-label span {color: rgba(255, 255, 255, .95) }.xe-widget.xe-vertical-counter.xe-vertical-counter-success {background: #8dc63f;color: #fff }.xe-widget.xe-vertical-counter.xe-vertical-counter-success .xe-label span {color: rgba(255, 255, 255, .95) }.xe-widget.xe-vertical-counter.xe-vertical-counter-danger {background: #cc3f44;color: #fff }.xe-widget.xe-vertical-counter.xe-vertical-counter-danger .xe-label span {color: rgba(255, 255, 255, .95) }.xe-widget.xe-vertical-counter.xe-vertical-counter-warning {background: #ffba00;color: #fff }.xe-widget.xe-vertical-counter.xe-vertical-counter-warning .xe-label span {color: rgba(255, 255, 255, .95) }.xe-widget.xe-vertical-counter.xe-vertical-counter-info {background: #40bbea;color: #fff }.xe-widget.xe-vertical-counter.xe-vertical-counter-info .xe-label span {color: rgba(255, 255, 255, .95) }.xe-widget.xe-vertical-counter.xe-vertical-counter-purple {background: #7c38bc;color: #fff }.xe-widget.xe-vertical-counter.xe-vertical-counter-purple .xe-label span {color: rgba(255, 255, 255, .95) }.xe-widget.xe-vertical-counter.xe-vertical-counter-orange {background: #f7aa47;color: #fff }.xe-widget.xe-vertical-counter.xe-vertical-counter-orange .xe-label span {color: rgba(255, 255, 255, .95) }.xe-widget.xe-vertical-counter.xe-vertical-counter-red {background: #d5080f;color: #fff }.xe-widget.xe-vertical-counter.xe-vertical-counter-red .xe-label span {color: rgba(255, 255, 255, .95) }.xe-widget.xe-vertical-counter.xe-vertical-counter-blue {background: #0e62c7;color: #fff }.xe-widget.xe-vertical-counter.xe-vertical-counter-blue .xe-label span {color: rgba(255, 255, 255, .95) }.xe-widget.xe-vertical-counter.xe-vertical-counter-turquoise {background: #00b19d;color: #fff }.xe-widget.xe-vertical-counter.xe-vertical-counter-turquoise .xe-label span {color: rgba(255, 255, 255, .95) }.xe-widget.xe-vertical-counter.xe-vertical-counter-pink {background: #ff6264;color: #fff }.xe-widget.xe-vertical-counter.xe-vertical-counter-pink .xe-label span {color: rgba(255, 255, 255, .95) }.xe-widget.xe-vertical-counter.xe-vertical-counter-yellow {background: #fcd036;color: #fff }.xe-widget.xe-vertical-counter.xe-vertical-counter-yellow .xe-label span {color: rgba(255, 255, 255, .95) }.xe-widget.xe-vertical-counter.xe-vertical-counter-gray {background: #d5d5d5;color: #555 }.xe-widget.xe-vertical-counter.xe-vertical-counter-gray .xe-label span {color: rgba(85, 85, 85, .95) }.xe-widget.xe-vertical-counter.xe-vertical-counter-white {background: #fff;color: #4b4b4b }.xe-widget.xe-vertical-counter.xe-vertical-counter-white .xe-label span {color: rgba(75, 75, 75, .95) }.xe-widget.xe-todo-list {background: #fff;padding: 25px 30px;margin-bottom: 20px }.xe-widget.xe-todo-list .xe-header {display: table;width: 100%;border-bottom: 1px solid #eee;margin-bottom: 15px }.xe-widget.xe-todo-list .xe-header .xe-icon, .xe-widget.xe-todo-list .xe-header .xe-label {display: table-cell;vertical-align: top;padding-bottom: 20px }.xe-widget.xe-todo-list .xe-header .xe-icon {width: 1% }.xe-widget.xe-todo-list .xe-header .xe-icon i {display: block;line-height: 1;font-size: 28px }.xe-widget.xe-todo-list .xe-header .xe-label {padding-left: 15px }.xe-widget.xe-todo-list .xe-header .xe-label span, .xe-widget.xe-todo-list .xe-header .xe-label strong {display: block;line-height: 1.1 }.xe-widget.xe-todo-list .xe-header .xe-label span {font-size: 12px;zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-todo-list .xe-header .xe-label strong {font-size: 15px }.xe-widget.xe-todo-list .xe-body {padding-top: 5px;padding-bottom: 10px }.xe-widget.xe-todo-list .xe-body label {-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none }.xe-widget.xe-todo-list .xe-body label>span {position: relative;display: inline-block;color: #7d7f7f }.xe-widget.xe-todo-list .xe-body li {margin: 2px 0 }.xe-widget.xe-todo-list .xe-body li.done label>span {zoom: 1;-webkit-opacity: .5;-moz-opacity: .5;opacity: .5;-ms-filter: alpha(Opacity=50);filter: alpha(opacity=50) }.xe-widget.xe-todo-list .xe-body li.done label>span:after {display: block;position: absolute;left: 0;right: 0;top: 9px;height: 1px;background: #8a8b8b;content: '' }.xe-widget.xe-todo-list.xe-todo-list-primary {background: #2c2e2f;color: #fff }.xe-widget.xe-todo-list.xe-todo-list-primary .xe-header {border-bottom: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-primary .xe-body .cbr-replaced .cbr-state {border: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-primary .xe-body label>span {color: #fff }.xe-widget.xe-todo-list.xe-todo-list-primary .xe-body li.done label>span {zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-todo-list.xe-todo-list-primary .xe-body li.done label>span:after {background: rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control {background: 0 0;border: 1px solid rgba(255, 255, 255, .7);color: #fff }.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9);opacity: 1 }.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control:-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-success {background: #8dc63f;color: #fff }.xe-widget.xe-todo-list.xe-todo-list-success .xe-header {border-bottom: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-success .xe-body .cbr-replaced .cbr-state {border: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-success .xe-body label>span {color: #fff }.xe-widget.xe-todo-list.xe-todo-list-success .xe-body li.done label>span {zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-todo-list.xe-todo-list-success .xe-body li.done label>span:after {background: rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control {background: 0 0;border: 1px solid rgba(255, 255, 255, .7);color: #fff }.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9);opacity: 1 }.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control:-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-warning {background: #ffba00;color: #fff }.xe-widget.xe-todo-list.xe-todo-list-warning .xe-header {border-bottom: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-warning .xe-body .cbr-replaced .cbr-state {border: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-warning .xe-body label>span {color: #fff }.xe-widget.xe-todo-list.xe-todo-list-warning .xe-body li.done label>span {zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-todo-list.xe-todo-list-warning .xe-body li.done label>span:after {background: rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control {background: 0 0;border: 1px solid rgba(255, 255, 255, .7);color: #fff }.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9);opacity: 1 }.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control:-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-danger {background: #cc3f44;color: #fff }.xe-widget.xe-todo-list.xe-todo-list-danger .xe-header {border-bottom: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-danger .xe-body .cbr-replaced .cbr-state {border: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-danger .xe-body label>span {color: #fff }.xe-widget.xe-todo-list.xe-todo-list-danger .xe-body li.done label>span {zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-todo-list.xe-todo-list-danger .xe-body li.done label>span:after {background: rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control {background: 0 0;border: 1px solid rgba(255, 255, 255, .7);color: #fff }.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9);opacity: 1 }.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control:-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-info {background: #40bbea;color: #fff }.xe-widget.xe-todo-list.xe-todo-list-info .xe-header {border-bottom: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-info .xe-body .cbr-replaced .cbr-state {border: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-info .xe-body label>span {color: #fff }.xe-widget.xe-todo-list.xe-todo-list-info .xe-body li.done label>span {zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-todo-list.xe-todo-list-info .xe-body li.done label>span:after {background: rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control {background: 0 0;border: 1px solid rgba(255, 255, 255, .7);color: #fff }.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9);opacity: 1 }.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control:-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-secondary {background: #68b828;color: #fff }.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-header {border-bottom: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-body .cbr-replaced .cbr-state {border: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-body label>span {color: #fff }.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-body li.done label>span {zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-body li.done label>span:after {background: rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control {background: 0 0;border: 1px solid rgba(255, 255, 255, .7);color: #fff }.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9);opacity: 1 }.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control:-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-turquoise {background: #00b19d;color: #fff }.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-header {border-bottom: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-body .cbr-replaced .cbr-state {border: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-body label>span {color: #fff }.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-body li.done label>span {zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-body li.done label>span:after {background: rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control {background: 0 0;border: 1px solid rgba(255, 255, 255, .7);color: #fff }.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9);opacity: 1 }.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control:-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-pink {background: #ff6264;color: #fff }.xe-widget.xe-todo-list.xe-todo-list-pink .xe-header {border-bottom: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-pink .xe-body .cbr-replaced .cbr-state {border: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-pink .xe-body label>span {color: #fff }.xe-widget.xe-todo-list.xe-todo-list-pink .xe-body li.done label>span {zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-todo-list.xe-todo-list-pink .xe-body li.done label>span:after {background: rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control {background: 0 0;border: 1px solid rgba(255, 255, 255, .7);color: #fff }.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9);opacity: 1 }.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control:-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-red {background: #d5080f;color: #fff }.xe-widget.xe-todo-list.xe-todo-list-red .xe-header {border-bottom: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-red .xe-body .cbr-replaced .cbr-state {border: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-red .xe-body label>span {color: #fff }.xe-widget.xe-todo-list.xe-todo-list-red .xe-body li.done label>span {zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-todo-list.xe-todo-list-red .xe-body li.done label>span:after {background: rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control {background: 0 0;border: 1px solid rgba(255, 255, 255, .7);color: #fff }.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9);opacity: 1 }.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control:-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-blue {background: #0e62c7;color: #fff }.xe-widget.xe-todo-list.xe-todo-list-blue .xe-header {border-bottom: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-blue .xe-body .cbr-replaced .cbr-state {border: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-blue .xe-body label>span {color: #fff }.xe-widget.xe-todo-list.xe-todo-list-blue .xe-body li.done label>span {zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-todo-list.xe-todo-list-blue .xe-body li.done label>span:after {background: rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control {background: 0 0;border: 1px solid rgba(255, 255, 255, .7);color: #fff }.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9);opacity: 1 }.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control:-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-purple {background: #7c38bc;color: #fff }.xe-widget.xe-todo-list.xe-todo-list-purple .xe-header {border-bottom: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-purple .xe-body .cbr-replaced .cbr-state {border: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-purple .xe-body label>span {color: #fff }.xe-widget.xe-todo-list.xe-todo-list-purple .xe-body li.done label>span {zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-todo-list.xe-todo-list-purple .xe-body li.done label>span:after {background: rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control {background: 0 0;border: 1px solid rgba(255, 255, 255, .7);color: #fff }.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9);opacity: 1 }.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control:-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-yellow {background: #fcd036;color: #fff }.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-header {border-bottom: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-body .cbr-replaced .cbr-state {border: 1px solid rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-body label>span {color: #fff }.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-body li.done label>span {zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-body li.done label>span:after {background: rgba(255, 255, 255, .7) }.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control {background: 0 0;border: 1px solid rgba(255, 255, 255, .7);color: #fff }.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9);opacity: 1 }.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control:-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control::-moz-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .9) }.xe-widget.xe-status-update {background: #55acee;color: #fff;margin-bottom: 20px;padding: 30px;padding-bottom: 20px }.xe-widget.xe-status-update .xe-header {display: table;width: 100% }.xe-widget.xe-status-update .xe-header .xe-icon, .xe-widget.xe-status-update .xe-header .xe-nav {display: table-cell;vertical-align: top;color: #fff;padding-bottom: 20px }.xe-widget.xe-status-update .xe-header .xe-icon i {font-size: 48px }.xe-widget.xe-status-update .xe-header .xe-nav {text-align: right }.xe-widget.xe-status-update .xe-header .xe-nav a {position: relative;margin-right: -10px;margin-top: -10px;color: #fff;padding: 0 8px;display: inline-block;line-height: 32px }.xe-widget.xe-status-update .xe-header .xe-nav a:hover {background: rgba(255, 255, 255, .1) }.xe-widget.xe-status-update .xe-header .xe-nav a+a {margin-left: 10px }.xe-widget.xe-status-update .xe-body li {display: none!important }.xe-widget.xe-status-update .xe-body li .status-date {display: block;font-size: 16px;zoom: 1;-webkit-opacity: .5;-moz-opacity: .5;opacity: .5;-ms-filter: alpha(Opacity=50);filter: alpha(opacity=50);padding-bottom: 10px }.xe-widget.xe-status-update .xe-body li p {font-size: 14px;color: #fff;zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-status-update .xe-body li.active {display: block!important }.xe-widget.xe-status-update .xe-footer {text-transform: uppercase;font-size: 11px;padding-top: 15px }.xe-widget.xe-status-update .xe-footer a {color: #fff;zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-status-update .xe-footer a:hover {zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100) }.xe-widget.xe-status-update.xe-status-update-facebook {background-color: #3b5998 }.xe-widget.xe-status-update.xe-status-update-google-plus {background-color: #dd4b39 }.xe-widget.xe-single-news {margin-bottom: 20px;position: relative }.xe-widget.xe-single-news .xe-image img {display: block;width: 100% }.xe-widget.xe-single-news .xe-image .xe-gradient {position: absolute;left: 0;right: 0;top: 0;bottom: 0;background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMTAwJSIgeDI9IjAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0icmdiKDAsIDAsIDApIiBzdG9wLW9wYWNpdHk9IjAuMDUiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjbGVzc2hhdC1nZW5lcmF0ZWQpIiAvPjwvc3ZnPg==);background-image: -webkit-linear-gradient(bottom, #000 0, rgba(0, 0, 0, .05) 100%);background-image: -moz-linear-gradient(bottom, #000 0, rgba(0, 0, 0, .05) 100%);background-image: -o-linear-gradient(bottom, #000 0, rgba(0, 0, 0, .05) 100%);background-image: linear-gradient(to top, #000 0, rgba(0, 0, 0, .05) 100%) }.xe-widget.xe-single-news .xe-details {position: absolute;bottom: 0;left: 0;right: 0;padding: 20px }.xe-widget.xe-single-news .xe-details .category {font-size: 11px;text-transform: uppercase;margin-bottom: 10px }.xe-widget.xe-single-news .xe-details .category a {color: #fff;zoom: 1;-webkit-opacity: .5;-moz-opacity: .5;opacity: .5;-ms-filter: alpha(Opacity=50);filter: alpha(opacity=50) }.xe-widget.xe-single-news .xe-details .category a:hover {zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100) }.xe-widget.xe-single-news .xe-details h3 {margin: 0;padding: 0;margin-bottom: 10px;font-size: 19px }.xe-widget.xe-single-news .xe-details h3 a {color: #fff;zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.xe-widget.xe-single-news .xe-details h3 a:hover {zoom: 1;-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-ms-filter: alpha(Opacity=100);filter: alpha(opacity=100) }.xe-widget.xe-single-news .xe-details time {position: relative;display: block;color: #fff;font-size: 13px;margin-bottom: -20px;-webkit-transition: all 350ms cubic-bezier(0.175, .885, .32, 1.275);-moz-transition: all 350ms cubic-bezier(0.175, .885, .32, 1.275);-o-transition: all 350ms cubic-bezier(0.175, .885, .32, 1.275);transition: all 350ms cubic-bezier(0.175, .885, .32, 1.275);zoom: 1;-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-ms-filter: alpha(Opacity=0);filter: alpha(opacity=0) }.xe-widget.xe-single-news:hover .xe-details time {margin-bottom: 0;zoom: 1;-webkit-opacity: .7;-moz-opacity: .7;opacity: .7;-ms-filter: alpha(Opacity=70);filter: alpha(opacity=70) }.xe-widget.xe-conversations {position: relative;background: #fff;margin-bottom: 0px;padding: 15px }.xe-widget.xe-conversations .xe-bg-icon {position: absolute;right: 20px;top: 20px }.xe-widget.xe-conversations .xe-bg-icon i {font-size: 80px;display: block;line-height: 1;zoom: 1;-webkit-opacity: .1;-moz-opacity: .1;opacity: .1;-ms-filter: alpha(Opacity=10);filter: alpha(opacity=10) }.xe-widget.xe-conversations .xe-header {display: table;width: 100%;border-bottom: 1px solid #eee }.xe-widget.xe-conversations .xe-header .xe-icon, .xe-widget.xe-conversations .xe-header .xe-label {display: table-cell;vertical-align: middle;padding-bottom: 20px }.xe-widget.xe-conversations .xe-header .xe-icon {width: 1% }.xe-widget.xe-conversations .xe-header .xe-icon i {display: block;line-height: 1;font-size: 37px }.xe-widget.xe-conversations .xe-header .xe-label {padding-left: 10px }.xe-widget.xe-conversations .xe-header .xe-label h3 {display: block;margin: 0;padding: 0 }.xe-widget.xe-conversations .xe-header .xe-label h3 small {padding-top: 5px;font-size: 13px;display: block;zoom: 1;-webkit-opacity: .5;-moz-opacity: .5;opacity: .5;-ms-filter: alpha(Opacity=50);filter: alpha(opacity=50) }.xe-widget.xe-conversations .xe-body {border-bottom: 1px solid #eee }.xe-widget.xe-conversations .xe-body .xe-user-img {float: left;display: block;padding-right: 10px }.xe-widget.xe-conversations .xe-body .xe-comment-entry {display: table;width: 100% }.xe-widget.xe-conversations .xe-body .xe-comment-entry .xe-user-img, .xe-widget.xe-conversations .xe-body .xe-comment-entry .xe-comment {display: table-cell;vertical-align: top;padding-top: 10px;padding-bottom: 10px }.xe-widget.xe-conversations .xe-body .xe-comment-entry .xe-user-img img {display: block }.xe-widget.xe-conversations .xe-body .xe-comment-entry .xe-comment {width: 99%;padding-left: 10px }.xe-widget.xe-conversations .xe-body .xe-comment-entry .xe-comment .xe-user-name {display: block;margin-bottom: 5px }.xe-widget.xe-conversations .xe-body .xe-comment-entry .xe-comment .xe-user-name:hover strong {color: #7d7f7f }.xe-widget.xe-conversations .xe-body .xe-comment-entry .xe-comment p {font-size: 12px }.xe-widget.xe-conversations .xe-body ul>li {margin: 10px 0;border-bottom: 1px solid #eee }.xe-widget.xe-conversations .xe-body ul>li:last-child {border-bottom: 0 }.xe-widget.xe-conversations .xe-footer a {margin-top: 20px;display: block;font-size: 11px;color: #7d7f7f;text-align: center;text-transform: uppercase }.xe-widget.xe-conversations .xe-footer a:hover {color: #646565 }.xe-widget.xe-weather {position: relative;background: #459ec4;color: #fff;overflow: hidden;margin-bottom: 20px }.xe-widget.xe-weather .xe-background {position: absolute;z-index: 1;top: 0;left: 0;right: 0 }.xe-widget.xe-weather .xe-background img {display: block;line-height: 1;width: 100%;position: relative }.xe-widget.xe-weather .xe-background.xe-background-animated {left: -10%;top: -20% }.xe-widget.xe-weather .xe-background.xe-background-animated img {width: 120%;-webkit-animation: weatherBgMove 10s infinite linear;-moz-animation: weatherBgMove 10s infinite linear;-o-animation: weatherBgMove 10s infinite linear;animation: weatherBgMove 10s infinite linear;-webkit-animation-direction: alternate;-moz-animation-direction: alternate;-o-animation-direction: alternate;animation-direction: alternate }.xe-widget.xe-weather .xe-background.xe-background-animated lesshat-selector {-lh-property: 0 }@-webkit-keyframes weatherBgMove {0% {left: 0 }50% {left: 10% }100% {left: 0 }}@-moz-keyframes weatherBgMove {0% {left: 0 }50% {left: 10% }100% {left: 0 }}@-o-keyframes weatherBgMove {0% {left: 0 }50% {left: 10% }100% {left: 0 }}@keyframes weatherBgMove {0% {left: 0 }50% {left: 10% }100% {left: 0 }}@media screen and (max-width:768px) {.xe-widget.xe-weather .xe-background {top: auto;bottom: 0 }.xe-widget.xe-weather .xe-background.xe-background-animated {top: auto;bottom: 0 }}.xe-widget.xe-weather .xe-current-day {position: absolute;z-index: 2;right: 35%;top: 0;left: 0;bottom: 0;padding: 30px }.xe-widget.xe-weather .xe-current-day .xe-now {margin-bottom: 20px }.xe-widget.xe-weather .xe-current-day .xe-now .xe-temperature {display: table;float: left }.xe-widget.xe-weather .xe-current-day .xe-now .xe-temperature .xe-icon, .xe-widget.xe-weather .xe-current-day .xe-now .xe-temperature .xe-label {display: table-cell;vertical-align: middle }.xe-widget.xe-weather .xe-current-day .xe-now .xe-temperature .xe-icon i {display: block;line-height: 1;font-size: 35px }.xe-widget.xe-weather .xe-current-day .xe-now .xe-temperature .xe-label {padding-left: 10px;line-height: 1;text-transform: uppercase;color: rgba(255, 255, 255, .8);font-size: 11px }.xe-widget.xe-weather .xe-current-day .xe-now .xe-temperature .xe-label strong {display: block;padding-top: 2px;font-size: 23px;line-height: 1;color: #fff;font-weight: 400 }.xe-widget.xe-weather .xe-current-day .xe-now .xe-location {float: right;text-align: right }.xe-widget.xe-weather .xe-current-day .xe-now .xe-location h4 {margin: 0;padding-bottom: 5px;color: rgba(255, 255, 255, .95) }.xe-widget.xe-weather .xe-current-day .xe-now .xe-location time {color: rgba(255, 255, 255, .8);font-size: 12px }.xe-widget.xe-weather .xe-current-day .xe-forecast {position: absolute;bottom: 0;left: 0;right: 0;padding: 0 30px;padding-bottom: 30px }.xe-widget.xe-weather .xe-current-day .xe-forecast ul {list-style: none;padding: 0;margin: 0;display: table;width: 100% }.xe-widget.xe-weather .xe-current-day .xe-forecast ul>li {position: relative;display: table-cell;vertical-align: middle;width: 1% }.xe-widget.xe-weather .xe-current-day .xe-forecast ul>li:after {content: '';display: block;width: 1px;top: 32px;left: 0;bottom: 0;background: rgba(255, 255, 255, .25);position: absolute }.xe-widget.xe-weather .xe-current-day .xe-forecast ul>li:first-child:after {display: none }.xe-widget.xe-weather .xe-current-day .xe-forecast .xe-forecast-entry {text-align: center }.xe-widget.xe-weather .xe-current-day .xe-forecast .xe-forecast-entry time {display: inline-block;background: rgba(0, 0, 0, .15);padding: 5px 5px;line-height: 1;color: rgba(255, 255, 255, .7);font-size: 11px }.xe-widget.xe-weather .xe-current-day .xe-forecast .xe-forecast-entry .xe-icon i {display: block;line-height: 42px;font-size: 20px }.xe-widget.xe-weather .xe-current-day .xe-forecast .xe-forecast-entry .xe-temp {display: block;font-weight: 400;font-size: 14px;color: rgba(255, 255, 255, .85) }.xe-widget.xe-weather .xe-current-day .xe-forecast .xe-forecast-entry:hover time, .xe-widget.xe-weather .xe-current-day .xe-forecast .xe-forecast-entry:hover .xe-temp {color: #fff }@media screen and (max-width:768px) {.xe-widget.xe-weather .xe-current-day {position: relative;width: 100% }.xe-widget.xe-weather .xe-current-day .xe-forecast {position: relative;margin-top: 90px;padding: 0 }}.xe-widget.xe-weather .xe-weekdays {float: right;position: relative;z-index: 2;background: rgba(0, 0, 0, .05);padding: 15px 30px;width: 35% }.xe-widget.xe-weather .xe-weekdays ul>li {position: relative }.xe-widget.xe-weather .xe-weekdays ul>li:after {content: '';display: block;position: absolute;right: 0;left: 0;bottom: 0;height: 1px;background: rgba(255, 255, 255, .25) }.xe-widget.xe-weather .xe-weekdays ul>li:last-child:after {display: none }.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast {display: table;width: 100%;cursor: default }.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-temp, .xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-day, .xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-icon {display: table-cell;vertical-align: middle;padding: 15px 0 }.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-temp {width: 20%;font-size: 14px;color: rgba(255, 255, 255, .5) }.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-icon {text-align: right;font-size: 20px }.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-icon i {display: block;line-height: 1 }.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast:hover .xe-temp {color: rgba(255, 255, 255, .95) }@media screen and (max-width:768px) {.xe-widget.xe-weather .xe-weekdays {float: none;width: 100% }.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-temp {width: 10% }}.xe-widget.xe-map-stats {background: #385868;color: #fff;margin-bottom: 20px;display: table;width: 100% }.xe-widget.xe-map-stats .xe-map, .xe-widget.xe-map-stats .xe-details {display: table-cell;vertical-align: top }.xe-widget.xe-map-stats .xe-map {width: 65%;position: relative }.xe-widget.xe-map-stats .xe-map>div {position: absolute;top: 20px;bottom: 20px;left: 20px;right: 20px }.xe-widget.xe-map-stats .xe-map>div .jvectormap-zoomin, .xe-widget.xe-map-stats .xe-map>div .jvectormap-zoomout {width: 22px;height: 22px;line-height: 20px;padding: 0;border: 0 }.xe-widget.xe-map-stats .xe-map>div .jvectormap-zoomin.jvectormap-zoomout, .xe-widget.xe-map-stats .xe-map>div .jvectormap-zoomout.jvectormap-zoomout {top: 32px;border-top: 1px solid rgba(204, 204, 204, .8) }.xe-widget.xe-map-stats .xe-details {width: 35%;background: rgba(0, 0, 0, .3);padding: 30px }.xe-widget.xe-map-stats .xe-details>.xe-label h3 {margin: 0 }.xe-widget.xe-map-stats .xe-details>.xe-label p {margin: 0;padding-top: 5px;color: rgba(255, 255, 255, .8) }.xe-widget.xe-map-stats .xe-details ul {margin-top: 20px }.xe-widget.xe-map-stats .xe-details ul li {position: relative;padding: 10px 5px;border-top: 1px solid rgba(255, 255, 255, .1) }.xe-widget.xe-map-stats .xe-details .xe-map-data {display: block }.xe-widget.xe-map-stats .xe-details .xe-map-data .label {display: inline-block;text-align: center;min-width: 30px;margin-right: 5px;vertical-align: middle }.xe-widget.xe-map-stats .xe-details .xe-map-data .xe-label {font-size: 14px }@media screen and (max-width:768px) {.xe-widget.xe-map-stats {display: block }.xe-widget.xe-map-stats .xe-map {min-height: 300px }.xe-widget.xe-map-stats .xe-map, .xe-widget.xe-map-stats .xe-details {width: 100%;display: block }}.sidebar-user-info {background-color: #27292a;border-bottom: 1px solid #323435 }@media screen and (max-width:768px) {.sidebar-user-info {display: none }.sidebar-user-info.mobile-is-visible {display: block }}.sidebar-user-info .user-profile {display: block;padding: 30px 45px }@media screen and (max-width:768px) {.sidebar-user-info .user-profile {padding-top: 20px;padding-bottom: 20px }}.sidebar-user-info .user-profile img {margin-right: 20px }.sidebar-user-info .user-profile span {display: inline-block;color: #979898;vertical-align: middle }.sidebar-user-info .user-profile span strong {display: block;font-size: 21px;color: #fff;font-weight: 300 }.sidebar-user-info .user-links {display: table;width: 100%;table-layout: fixed;border-top: 1px solid #323435;margin: 0 }.sidebar-user-info .user-links li {display: table-cell }.sidebar-user-info .user-links li.logout-link {width: 20% }.sidebar-user-info .user-links li a {display: block;text-align: center;color: #979898;padding: 10px }.sidebar-user-info .user-links li a:hover {color: #fff;background-color: rgba(50, 52, 53, .25) }.sidebar-user-info .user-links li.active a {color: #fff;background-color: rgba(50, 52, 53, .25) }.sidebar-user-info .user-links li+li a {border-left: 1px solid #323435 }.sidebar-user-info+.main-menu {margin-top: 10px }@media screen and (min-width:768px) {.sidebar-menu.collapsed .sidebar-user-info+.main-menu {margin-top: 0 }.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner {position: relative }.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-profile {padding: 15px 0;text-align: center }.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-profile img {max-width: 32px;height: auto!important;margin: 0 }.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-profile span {text-align: left;position: absolute;left: 100%;top: 0;background-color: #27292a;display: block;width: 280px;height: 62px;padding: 10px 20px }.right-sidebar .sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-profile span {left: auto;right: 100% }.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-profile span strong {font-size: 17px }.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-links {position: absolute;left: 100%;width: 280px;background-color: #27292a;top: 62px }.right-sidebar .sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-links {left: auto;right: 100% }.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-profile span, .sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-links {display: none }.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner:hover .user-profile span {display: block }.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner:hover .user-links {display: table }}.members-table thead tr th {text-transform: uppercase;color: #a4a5a5;font-weight: 400;background-color: #f6f6f6 }.members-table thead tr th:after {display: none }.table-hover.members-table tbody tr:hover {background-color: #f8f8f8 }.members-table tbody tr td {padding: 10px }.members-table tbody tr td .name {display: block;font-size: 14px;color: #2c2e2f;font-weight: 700 }.members-table tbody tr td .name+span {font-size: 12px;color: #9d9d9d }.members-table tbody tr td .email {color: #9d9d9d;cursor: default }.members-table tbody tr td .email:hover {color: #848484 }.members-table tbody tr td.user-cb {width: 1% }.members-table tbody tr td.user-image {width: 1% }@media screen and (max-width:768px) {.members-table tbody tr td.user-image {display: none }}.members-table tbody tr td.user-image img {width: 100%;min-width: 42px;height: auto!important }.members-table tbody tr td.user-id {color: #9d9d9d;white-space: nowrap;width: 15% }.members-table tbody tr td.action-links {width: 20%;white-space: nowrap }@media screen and (max-width:768px) {.members-table tbody tr td.action-links {width: 25% }}.members-table tbody tr td.action-links a {display: block;font-size: 11px }.members-table tbody tr td.action-links a:hover {zoom: 1;-webkit-opacity: .8;-moz-opacity: .8;opacity: .8;-ms-filter: alpha(Opacity=80);filter: alpha(opacity=80) }.members-table tbody tr td.action-links a.edit {color: #8dc63f }.members-table tbody tr td.action-links a.delete {color: #cc3f44 }.members-table tbody tr td.action-links a+a {margin-top: 5px }.members-table-actions {position: relative;margin-top: 5px }@media screen and (max-width:768px) {.members-table-actions {text-align: center;margin-bottom: 20px }}.members-table-actions .selected-items, .members-table-actions .selected-actions {display: inline-block }.members-table-actions .selected-items span {font-weight: 700;color: #2c2e2f }.members-table-actions .selected-items+.selected-actions {margin-left: 30px }.members-table-actions .selected-actions .edit {color: #8dc63f }.members-table-actions .selected-actions .delete {color: #cc3f44 }.member-form-add-header .user-img, .member-form-add-header .user-name {display: inline-block;vertical-align: middle }@media screen and (max-width:768px) {.member-form-add-header .user-img {margin-top: 20px }}.member-form-add-header .user-name {padding-left: 20px }.member-form-add-header .user-name a {display: block;font-size: 23px }.member-form-add-header .user-name span {display: block;color: #9d9d9d }.member-form-add-header+.member-form-inputs {margin-top: 20px }.member-form-inputs .row:before {display: block;margin: 0 15px;height: 1px;background: #eaeaea;margin-bottom: 20px }.member-form-inputs .row+.row {margin-top: 20px }.member-form-inputs .control-label {font-size: 14px;line-height: 30px } diff --git a/web/static/index/css/xenon-core.css b/web/static/index/css/xenon-core.css new file mode 100644 index 0000000..130207b --- /dev/null +++ b/web/static/index/css/xenon-core.css @@ -0,0 +1 @@ +.ps-container .ps-scrollbar-x-rail {position: absolute;bottom: 3px;height: 5px;zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-webkit-transition: background-color .2s linear, opacity .2s linear;-moz-transition: background-color .2s linear, opacity .2s linear;-o-transition: background-color .2s linear, opacity .2s linear;transition: background-color .2s linear, opacity .2s linear }.ps-container:hover .ps-scrollbar-x-rail, .ps-container.hover .ps-scrollbar-x-rail {zoom: 1;filter: alpha(opacity=60);-webkit-opacity: .6;-moz-opacity: .6;opacity: .6 }.ps-container .ps-scrollbar-x-rail:hover, .ps-container .ps-scrollbar-x-rail.hover {background-color: rgba(255, 255, 255, .5) }.ps-container .ps-scrollbar-x-rail.in-scrolling {background-color: rgba(255, 255, 255, .9) }.ps-container .ps-scrollbar-y-rail {position: absolute;right: 2px;width: 5px;zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-webkit-transition: background-color .2s linear, opacity .2s linear;-moz-transition: background-color .2s linear, opacity .2s linear;-o-transition: background-color .2s linear, opacity .2s linear;transition: background-color .2s linear, opacity .2s linear }.ps-container:hover .ps-scrollbar-y-rail, .ps-container.hover .ps-scrollbar-y-rail {zoom: 1;filter: alpha(opacity=60);-webkit-opacity: .6;-moz-opacity: .6;opacity: .6 }.ps-container .ps-scrollbar-y-rail:hover, .ps-container .ps-scrollbar-y-rail.hover {background-color: rgba(255, 255, 255, .5) }.ps-container .ps-scrollbar-y-rail.in-scrolling {background-color: #eee;zoom: 1;filter: alpha(opacity=90);-webkit-opacity: .9;-moz-opacity: .9;opacity: .9 }.ps-container .ps-scrollbar-x {position: absolute;bottom: 0;height: 5px;background-color: #aaa;-o-transition: background-color .2s linear;-webkit-transition: background-color .2s linear;-moz-transition: background-color .2s linear;transition: background-color .2s linear }.ps-container.ie6 .ps-scrollbar-x {font-size: 0 }.ps-container .ps-scrollbar-x-rail:hover .ps-scrollbar-x, .ps-container .ps-scrollbar-x-rail.hover .ps-scrollbar-x {background-color: #999 }.ps-container .ps-scrollbar-y {position: absolute;right: 0;width: 5px;background-color: #aaa;-webkit-transition: background-color .2s linear;-moz-transition: background-color .2s linear;-o-transition: background-color .2s linear;transition: background-color .2s linear }.ps-container.ie6 .ps-scrollbar-y {font-size: 0 }.ps-container .ps-scrollbar-y-rail:hover .ps-scrollbar-y, .ps-container .ps-scrollbar-y-rail.hover .ps-scrollbar-y {background-color: #FAFAFA }.ps-container.ie .ps-scrollbar-x, .ps-container.ie .ps-scrollbar-y {visibility: hidden }.ps-container.ie:hover .ps-scrollbar-x, .ps-container.ie:hover .ps-scrollbar-y, .ps-container.ie.hover .ps-scrollbar-x, .ps-container.ie.hover .ps-scrollbar-y {visibility: visible }.cbp_tmtimeline {margin: 30px 0 0 0;padding: 0;list-style: none;position: relative }.cbp_tmtimeline:before {content: '';position: absolute;top: 0;bottom: 0;width: 10px;background: #afdcf8;left: 20%;margin-left: -10px }.cbp_tmtimeline>li {position: relative }.cbp_tmtimeline>li .cbp_tmtime {display: block;width: 25%;padding-right: 100px;position: absolute }.cbp_tmtimeline>li .cbp_tmtime span {display: block;text-align: right }.cbp_tmtimeline>li .cbp_tmtime span:first-child {font-size: .9em;color: #bdd0db }.cbp_tmtimeline>li .cbp_tmtime span:last-child {font-size: 2.9em;color: #3594cb }.cbp_tmtimeline>li:nth-child(odd) .cbp_tmtime span:last-child {color: #6cbfee }.cbp_tmtimeline>li .cbp_tmlabel {margin: 0 0 15px 25%;background: #3594cb;color: #fff;padding: 2em;font-size: 1.2em;font-weight: 300;line-height: 1.4;position: relative;border-radius: 5px }.cbp_tmtimeline>li:nth-child(odd) .cbp_tmlabel {background: #6cbfee }.cbp_tmtimeline>li .cbp_tmlabel h2 {margin-top: 0;padding: 0 0 10px 0;border-bottom: 1px solid rgba(255, 255, 255, .4) }.cbp_tmtimeline>li .cbp_tmlabel:after {right: 100%;border: solid transparent;content: " ";height: 0;width: 0;position: absolute;pointer-events: none;border-right-color: #3594cb;border-width: 10px;top: 10px }.cbp_tmtimeline>li:nth-child(odd) .cbp_tmlabel:after {border-right-color: #6cbfee }.cbp_tmtimeline>li .cbp_tmicon {width: 40px;height: 40px;speak: none;font-style: normal;font-weight: 400;font-variant: normal;text-transform: none;font-size: 1.4em;line-height: 40px;-webkit-font-smoothing: antialiased;position: absolute;color: #fff;background: #46a4da;border-radius: 50%;box-shadow: 0 0 0 8px #afdcf8;text-align: center;left: 20%;top: 0;margin: 0 0 0 -25px }@media screen and (max-width:65.375em) {.cbp_tmtimeline>li .cbp_tmtime span:last-child {font-size: 1.5em }}@media screen and (max-width:47.2em) {.cbp_tmtimeline:before {display: none }.cbp_tmtimeline>li .cbp_tmtime {width: 100%;position: relative;padding: 0 0 20px 0 }.cbp_tmtimeline>li .cbp_tmtime span {text-align: left }.cbp_tmtimeline>li .cbp_tmlabel {margin: 0 0 30px 0;padding: 1em;font-weight: 400;font-size: 95% }.cbp_tmtimeline>li .cbp_tmlabel:after {right: auto;left: 20px;border-right-color: transparent;border-bottom-color: #3594cb;top: -20px }.cbp_tmtimeline>li:nth-child(odd) .cbp_tmlabel:after {border-right-color: transparent;border-bottom-color: #6cbfee }.cbp_tmtimeline>li .cbp_tmicon {position: relative;float: right;left: auto;margin: -55px 5px 0 0 }}.dropdown-menu>li.checkbox-row {padding: 5px 20px }.dropdown-menu li.checkbox-row {display: block;clear: both;font-weight: 400;line-height: 18px;color: #333;white-space: nowrap }.dropdown-menu li.checkbox-row label {font-weight: 400 }.dropdown-menu li.checkbox-row:hover, .dropdown-menu li.checkbox-row input:hover, .dropdown-menu li.checkbox-row label:hover {cursor: pointer }.no-touch .dropdown-menu>.checkbox-row:hover, .no-touch .dropdown-menu>.checkbox-row:active {text-decoration: none;color: #262626;background-color: #f5f5f5 }.btn-toolbar {margin-bottom: 5px }.btn-toolbar .btn-default {background-color: #68b828;color: #fff;border: 1px solid transparent }.btn-toolbar .btn-default.dropdown-toggle {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none;border-color: transparent }.btn-toolbar .btn-primary {background-color: #508e1f }.btn-toolbar .btn-group.open .dropdown-toggle {background-color: #508e1f;color: #fff }.btn-toolbar .dropdown-menu {margin-top: 0 }.btn-toolbar .dropdown-menu .checkbox-row {-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none }.btn-toolbar .dropdown-menu .checkbox-row .cbr-replaced {margin: 0;margin-right: 5px }.btn-toolbar .dropdown-menu .checkbox-row label {color: #979898;font-size: 12px;margin: 0 }.lt-ie8 .btn-toolbar {display: none }.table-responsive {border-radius: 0;border: 1px solid #eee;margin-bottom: 18px }.table-responsive>.table {margin-bottom: 0 }.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 }.table-responsive[data-pattern=priority-columns] {position: relative;width: 100%;margin-bottom: 18px;overflow-y: hidden;overflow-x: auto;-ms-overflow-style: -ms-autohiding-scrollbar;border-radius: 0;border: 1px solid #eee;-webkit-overflow-scrolling: touch }.table-responsive[data-pattern=priority-columns]>.table {margin-bottom: 0 }.table-responsive[data-pattern=priority-columns]>.table>thead>tr>th, .table-responsive[data-pattern=priority-columns]>.table>tbody>tr>th, .table-responsive[data-pattern=priority-columns]>.table>tfoot>tr>th, .table-responsive[data-pattern=priority-columns]>.table>thead>tr>td, .table-responsive[data-pattern=priority-columns]>.table>tbody>tr>td, .table-responsive[data-pattern=priority-columns]>.table>tfoot>tr>td {white-space: nowrap }.table-responsive[data-pattern=priority-columns]>.table-bordered {border: 0 }.table-responsive[data-pattern=priority-columns]>.table-bordered>thead>tr>th:first-child, .table-responsive[data-pattern=priority-columns]>.table-bordered>tbody>tr>th:first-child, .table-responsive[data-pattern=priority-columns]>.table-bordered>tfoot>tr>th:first-child, .table-responsive[data-pattern=priority-columns]>.table-bordered>thead>tr>td:first-child, .table-responsive[data-pattern=priority-columns]>.table-bordered>tbody>tr>td:first-child, .table-responsive[data-pattern=priority-columns]>.table-bordered>tfoot>tr>td:first-child {border-left: 0 }.table-responsive[data-pattern=priority-columns]>.table-bordered>thead>tr>th:last-child, .table-responsive[data-pattern=priority-columns]>.table-bordered>tbody>tr>th:last-child, .table-responsive[data-pattern=priority-columns]>.table-bordered>tfoot>tr>th:last-child, .table-responsive[data-pattern=priority-columns]>.table-bordered>thead>tr>td:last-child, .table-responsive[data-pattern=priority-columns]>.table-bordered>tbody>tr>td:last-child, .table-responsive[data-pattern=priority-columns]>.table-bordered>tfoot>tr>td:last-child {border-right: 0 }.table-responsive[data-pattern=priority-columns]>.table-bordered>tbody>tr:last-child>th, .table-responsive[data-pattern=priority-columns]>.table-bordered>tfoot>tr:last-child>th, .table-responsive[data-pattern=priority-columns]>.table-bordered>tbody>tr:last-child>td, .table-responsive[data-pattern=priority-columns]>.table-bordered>tfoot>tr:last-child>td {border-bottom: 0 }.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority], .mq.js.lt-ie10 .sticky-table-header th[data-priority], .mq.js .table-responsive[data-pattern=priority-columns] td[data-priority], .mq.js.lt-ie10 .sticky-table-header td[data-priority] {display: none }.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="1"], .lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="1"], .lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="1"], .lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="1"] {display: inline }.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="1"], .mq.js.lt-ie10 .sticky-table-header th[data-priority="1"], .mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="1"], .mq.js.lt-ie10 .sticky-table-header td[data-priority="1"] {display: table-cell }@media screen and (min-width:480px) {.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="2"], .lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="2"], .lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="2"], .lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="2"] {display: inline }.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="2"], .mq.js.lt-ie10 .sticky-table-header th[data-priority="2"], .mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="2"], .mq.js.lt-ie10 .sticky-table-header td[data-priority="2"] {display: table-cell }}@media screen and (min-width:640px) {.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="3"], .lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="3"], .lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="3"], .lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="3"] {display: inline }.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="3"], .mq.js.lt-ie10 .sticky-table-header th[data-priority="3"], .mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="3"], .mq.js.lt-ie10 .sticky-table-header td[data-priority="3"] {display: table-cell }}@media screen and (min-width:800px) {.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="4"], .lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="4"], .lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="4"], .lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="4"] {display: inline }.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="4"], .mq.js.lt-ie10 .sticky-table-header th[data-priority="4"], .mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="4"], .mq.js.lt-ie10 .sticky-table-header td[data-priority="4"] {display: table-cell }}@media screen and (min-width:960px) {.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="5"], .lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="5"], .lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="5"], .lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="5"] {display: inline }.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="5"], .mq.js.lt-ie10 .sticky-table-header th[data-priority="5"], .mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="5"], .mq.js.lt-ie10 .sticky-table-header td[data-priority="5"] {display: table-cell }}@media screen and (min-width:1120px) {.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="6"], .lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="6"], .lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="6"], .lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="6"] {display: inline }.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="6"], .mq.js.lt-ie10 .sticky-table-header th[data-priority="6"], .mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="6"], .mq.js.lt-ie10 .sticky-table-header td[data-priority="6"] {display: table-cell }}table.table-small-font {font-size: 12px;-webkit-text-size-adjust: none;line-height: 1.5em }table.focus-on tbody tr:hover {cursor: pointer }table.focus-on tbody tr.unfocused th, table.focus-on tbody tr.unfocused td {color: #777;color: rgba(0, 0, 0, .4) }table.focus-on tbody tr.focused th, table.focus-on tbody tr.focused td {background-color: #68b828;color: #fff;border-color: #63b026 }table th.col-hide, table td.col-hide {display: none }table th.col-show, table td.col-show {display: inline }.lt-ie9 table th.col-show, .lt-ie9 table td.col-show {display: table-cell }.lt-ie9 table.display-all th, .lt-ie9 table.display-all td {display: inline!important }table.display-all th, table.display-all td {display: table-cell!important }.sticky-table-header {background-color: #fff;border: none;border-radius: 0;border-top: 1px solid #eee;border-bottom: 1px solid #eee;position: absolute;top: 0;visibility: hidden;z-index: 990;overflow: hidden;min-width: 100% }.sticky-table-header.fixed-solution {min-width: 0;position: fixed }.lt-ie10 .sticky-table-header.fixed-solution {border-left: 1px solid #eee;border-right: 1px solid #eee;box-sizing: content-box;border-bottom: none }.sticky-table-header.border-radius-fix {border-bottom-left-radius: 3px;border-bottom-right-radius: 3px }.sticky-table-header>.table {margin-bottom: 0 }.sticky-table-header>.table>thead>tr>th, .sticky-table-header>.table>tbody>tr>th, .sticky-table-header>.table>tfoot>tr>th, .sticky-table-header>.table>thead>tr>td, .sticky-table-header>.table>tbody>tr>td, .sticky-table-header>.table>tfoot>tr>td {white-space: nowrap }.sticky-table-header>.table-bordered {border: 0 }.sticky-table-header>.table-bordered>thead>tr>th:first-child, .sticky-table-header>.table-bordered>tbody>tr>th:first-child, .sticky-table-header>.table-bordered>tfoot>tr>th:first-child, .sticky-table-header>.table-bordered>thead>tr>td:first-child, .sticky-table-header>.table-bordered>tbody>tr>td:first-child, .sticky-table-header>.table-bordered>tfoot>tr>td:first-child {border-left: 0 }.sticky-table-header>.table-bordered>thead>tr>th:last-child, .sticky-table-header>.table-bordered>tbody>tr>th:last-child, .sticky-table-header>.table-bordered>tfoot>tr>th:last-child, .sticky-table-header>.table-bordered>thead>tr>td:last-child, .sticky-table-header>.table-bordered>tbody>tr>td:last-child, .sticky-table-header>.table-bordered>tfoot>tr>td:last-child {border-right: 0 }.sticky-table-header>.table-bordered>tbody>tr:last-child>th, .sticky-table-header>.table-bordered>tfoot>tr:last-child>th, .sticky-table-header>.table-bordered>tbody>tr:last-child>td, .sticky-table-header>.table-bordered>tfoot>tr:last-child>td {border-bottom: 0 }.transall, .sidebar-menu .main-menu a, .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane], .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i, footer.main-footer .go-up a, .user-info-navbar .user-info-menu>li>a, .footer-sticked-chat .chat-conversations>li .chat-user, .footer-sticked-chat .chat-conversations>li.open .conversation-window, .footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li a span, .breadcrumb.auto-hidden li a, .icon-collection .fontawesome-icon-list .fa-hover .icon-str>i, .icon-collection .fontawesome-icon-list .fa-hover .icon-str>span {-webkit-transition: all 220ms ease-in-out;-moz-transition: all 220ms ease-in-out;-o-transition: all 220ms ease-in-out;transition: all 220ms ease-in-out }.clearfix:before, .clearfix:after, .page-container .main-content .page-title:before, .page-container .main-content .page-title:after, .sidebar-menu .logo-env:before, .sidebar-menu .logo-env:after, .navbar.horizontal-menu .navbar-inner:before, .navbar.horizontal-menu .navbar-inner:after, footer.main-footer .footer-inner:before, footer.main-footer .footer-inner:after, .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:before, .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:after, #chat .chat-conversation .conversation-body>li:before, #chat .chat-conversation .conversation-body>li:after, .panel .panel-heading:before, .panel .panel-heading:after, .breadcrumb.auto-hidden:before, .breadcrumb.auto-hidden:after, .dataTables_wrapper .dataTables_length:before, .dataTables_wrapper .dataTables_length:after, .dataTables_wrapper .dataTables_filter:before, .dataTables_wrapper .dataTables_filter:after, .dataTables_wrapper .DTTT_container:before, .dataTables_wrapper .DTTT_container:after, .skin-color-palette:before, .skin-color-palette:after, .icon-collection .fontawesome-icon-list:before, .icon-collection .fontawesome-icon-list:after, .icon-collection .fontawesome-icon-list .fa-hover .icon-str:before, .icon-collection .fontawesome-icon-list .fa-hover .icon-str:after, .highlights li:before, .highlights li:after, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:before, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:after {content: " ";display: table }.clearfix:after, .page-container .main-content .page-title:after, .sidebar-menu .logo-env:after, .navbar.horizontal-menu .navbar-inner:after, footer.main-footer .footer-inner:after, .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:after, #chat .chat-conversation .conversation-body>li:after, .panel .panel-heading:after, .breadcrumb.auto-hidden:after, .dataTables_wrapper .dataTables_length:after, .dataTables_wrapper .dataTables_filter:after, .dataTables_wrapper .DTTT_container:after, .skin-color-palette:after, .icon-collection .fontawesome-icon-list:after, .icon-collection .fontawesome-icon-list .fa-hover .icon-str:after, .highlights li:after, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:after {clear: both }body {background-color: #f9f9f9;}a {outline: 0!important }p {color: #979898 }html, body {height: 100%;margin: 0;padding: 0;border: none }.boxed-container {background: #f9f9f9 }.boxed-container #chat .chat-inner {position: absolute!important }.page-container {display: table;width: 100%;height: 100%;vertical-align: top;border-collapse: collapse;border-spacing: 0;table-layout: fixed }.boxed-container .page-container {max-width: 1140px;margin: 20px auto }@media screen and (max-width:768px) {.boxed-container .page-container {margin: 0 }}.page-container.container {max-width: 1140px;table-layout: auto }.page-container .main-content {display: table-cell;position: relative;z-index: 1;padding: 30px;padding-bottom: 0;vertical-align: top;word-break: break-word;width: 100%;-webkit-transition: opacity 100ms ease-in-out;-moz-transition: opacity 100ms ease-in-out;-o-transition: opacity 100ms ease-in-out;transition: opacity 100ms ease-in-out }.page-container .main-content.is-loading {zoom: 1;filter: alpha(opacity=50);-webkit-opacity: .5;-moz-opacity: .5;opacity: .5;-webkit-transition: opacity 300ms ease-in-out;-moz-transition: opacity 300ms ease-in-out;-o-transition: opacity 300ms ease-in-out;transition: opacity 300ms ease-in-out }.boxed-container .page-container .main-content {background-color: #f9f9f9 }.page-container .main-content:hover {z-index: 15 }.page-container .main-content .page-title {background: #f8f8f8;margin: -30px;margin-bottom: 30px;padding: 20px 0;-webkit-box-shadow: 0 1px 0 rgba(0, 1, 1, .08), inset 0 1px 0 #ededed;-moz-box-shadow: 0 1px 0 rgba(0, 1, 1, .08), inset 0 1px 0 #ededed;box-shadow: 0 1px 0 rgba(0, 1, 1, .08), inset 0 1px 0 #ededed }@media screen and (max-width:768px) {.page-container .main-content .page-title {padding: 15px 0 }}.page-container .main-content .page-title.full-width .title-env {width: 100%;padding-right: 30px }.page-container .main-content .page-title .title-env, .page-container .main-content .page-title .breadcrumb-env {display: block }.page-container .main-content .page-title .title-env {float: left;padding-left: 30px }.page-container .main-content .page-title .title-env .title {margin: 0;font-size: 27px }@media screen and (max-width:768px) {.page-container .main-content .page-title .title-env .title {font-size: 23px }.page-container .main-content .page-title .title-env .title+p {font-size: 12px }}@media screen and (max-width:480px) {.page-container .main-content .page-title .title-env .title {font-size: 19px }}.page-container .main-content .page-title .title-env .title+p {margin: 0;margin-top: 5px;color: #979898 }.page-container .main-content .page-title .breadcrumb-env {float: right;padding-right: 30px }@media screen and (max-width:480px) {.page-container .main-content .page-title .breadcrumb-env {clear: both;float: none;padding: 0 10px }}.page-container .main-content .page-title .breadcrumb-env .breadcrumb {margin-bottom: 0;margin-top: 8px }@media screen and (max-width:768px) {.page-container .main-content .page-title .breadcrumb-env .breadcrumb {margin-top: 4px }.page-container .main-content .page-title .breadcrumb-env .breadcrumb li a {font-size: 12px }}.sidebar-menu {display: table-cell;position: relative;width: 280px;background: #2c2e2f;z-index: 1 }.sidebar-menu .logo-env {padding: 19px 45px;border-bottom: 1px solid #313437 }.sidebar-menu .logo-env .logo {float: left }.sidebar-menu .logo-env .logo .logo-collapsed {display: none }.sidebar-menu .logo-env .settings-icon {float: right;position: relative;top: 1px }.sidebar-menu .logo-env .settings-icon a {color: #979898;line-height: 1 }.sidebar-menu .logo-env .settings-icon a i {line-height: 1;font-size: 18px }.sidebar-menu .logo-env .settings-icon a:hover {color: #fff }.sidebar-menu .main-menu {padding-left: 40px;padding-right: 40px;margin-top: 20px;margin-bottom: 20px;list-style: none }@media screen and (max-width:768px) {.sidebar-menu .main-menu {margin-top: 10px;margin-bottom: 10px }}.sidebar-menu .main-menu a {color: #979898;text-decoration: none;display: block;padding: 13px 5px;border-bottom: 1px solid #313437 }.sidebar-menu .main-menu a>i {display: inline-block;margin-right: 10px }.sidebar-menu .main-menu a>i+span {padding-right: 10px }.sidebar-menu .main-menu a>span {display: inline-block }.sidebar-menu .main-menu a>.label {margin-top: 1px }.sidebar-menu .main-menu a>.badge {font-size: 75%;line-height: 1.2 }.sidebar-menu .main-menu a:hover {color: #fff }.sidebar-menu .main-menu li.active>a {color: #fff }.sidebar-menu .main-menu li.has-sub>a:before {position: relative;display: inline-block;font-family: FontAwesome;content: '\f107';float: right;color: #6d747a;margin-left: 10px;-webkit-transform: rotate(-90deg);-moz-transform: rotate(-90deg);-o-transform: rotate(-90deg);-ms-transform: rotate(-90deg);transform: rotate(-90deg);-webkit-transition: all 150ms ease-in-out;-moz-transition: all 150ms ease-in-out;-o-transition: all 150ms ease-in-out;transition: all 150ms ease-in-out }.sidebar-menu .main-menu li.has-sub.opened>a:before, .sidebar-menu .main-menu li.has-sub.expanded>a:before {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }.sidebar-menu .main-menu>li.opened>ul {display: block }.sidebar-menu .main-menu>li.opened .opened>ul {display: block }.sidebar-menu .main-menu ul {display: none;margin: 0;padding: 0;overflow: hidden;list-style: none }.sidebar-menu .main-menu ul li {position: relative }@media screen and (min-width:768px) {.sidebar-menu .main-menu ul li.is-hidden {left: -20px;zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0 }}.sidebar-menu .main-menu ul li.is-shown {left: 0;zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-webkit-transition: all 200ms ease-in-out;-moz-transition: all 200ms ease-in-out;-o-transition: all 200ms ease-in-out;transition: all 200ms ease-in-out }.sidebar-menu .main-menu ul li.is-shown+.is-shown {-webkit-transition-delay: 80ms;-moz-transition-delay: 80ms;-o-transition-delay: 80ms;transition-delay: 80ms }.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 120ms;-moz-transition-delay: 120ms;-o-transition-delay: 120ms;transition-delay: 120ms }.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 160ms;-moz-transition-delay: 160ms;-o-transition-delay: 160ms;transition-delay: 160ms }.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 200ms;-moz-transition-delay: 200ms;-o-transition-delay: 200ms;transition-delay: 200ms }.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 240ms;-moz-transition-delay: 240ms;-o-transition-delay: 240ms;transition-delay: 240ms }.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 280ms;-moz-transition-delay: 280ms;-o-transition-delay: 280ms;transition-delay: 280ms }.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 320ms;-moz-transition-delay: 320ms;-o-transition-delay: 320ms;transition-delay: 320ms }.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 360ms;-moz-transition-delay: 360ms;-o-transition-delay: 360ms;transition-delay: 360ms }.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 400ms;-moz-transition-delay: 400ms;-o-transition-delay: 400ms;transition-delay: 400ms }.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 440ms;-moz-transition-delay: 440ms;-o-transition-delay: 440ms;transition-delay: 440ms }.sidebar-menu .main-menu ul li.hidden-item {visibility: hidden;zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-webkit-transition: all 250ms ease-in-out;-moz-transition: all 250ms ease-in-out;-o-transition: all 250ms ease-in-out;transition: all 250ms ease-in-out }.sidebar-menu .main-menu ul li a {padding-left: 35px }.sidebar-menu .main-menu ul li ul li a {padding-left: 60px }.sidebar-menu .main-menu ul li ul li ul li a {padding-left: 85px }.sidebar-menu .main-menu ul li ul li ul li ul li a {padding-left: 110px }.sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x, .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y {background-color: rgba(255, 255, 255, .6) }.sidebar-menu.fixed {height: 100% }.sidebar-menu.fixed .sidebar-menu-inner {position: fixed;left: 0;top: 0;bottom: 0;width: inherit;overflow: hidden }.page-body.right-sidebar .sidebar-menu.fixed .sidebar-menu-inner {left: auto;right: 0 }@media screen and (min-width:768px) {.sidebar-menu.collapsed {width: 80px;z-index: 10;overflow: visible }.sidebar-menu.collapsed .hidden-collapsed {display: none!important }.sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar] {color: #606161 }.sidebar-menu.collapsed+.main-content .main-footer {left: 80px }.sidebar-menu.collapsed .sidebar-menu-inner {overflow: visible;position: relative }.sidebar-menu.collapsed .logo-env {padding: 18px 0 }.sidebar-menu.collapsed .logo-env .logo-collapsed {display: block;text-align: center }.sidebar-menu.collapsed .logo-env .logo-collapsed img {display: inline-block }.sidebar-menu.collapsed .logo-env .logo-expanded, .sidebar-menu.collapsed .logo-env .settings-icon {display: none }.sidebar-menu.collapsed .logo-env .logo {float: none }.sidebar-menu.collapsed .main-menu {padding-left: 0;padding-right: 0 }.sidebar-menu.collapsed .main-menu>li {text-align: center;position: relative }.sidebar-menu.collapsed .main-menu>li.active, .sidebar-menu.collapsed .main-menu>li li.active {background-color: #252627 }.sidebar-menu.collapsed .main-menu>li>a>i {margin-right: 0;font-size: 16px }.sidebar-menu.collapsed .main-menu>li>a>span {display: none }.sidebar-menu.collapsed .main-menu>li>a>span.label {display: block;position: absolute;right: 0;top: 0 }.sidebar-menu.collapsed .main-menu>li.has-sub>a:before {display: none }.sidebar-menu.collapsed .main-menu>li.opened>ul {display: none }.sidebar-menu.collapsed .main-menu>li>ul {position: absolute;background: #2c2e2f;width: 250px;top: 0;left: 100%;text-align: left }.page-body.right-sidebar .sidebar-menu.collapsed .main-menu>li>ul {left: auto;right: 100% }.sidebar-menu.collapsed .main-menu>li>ul>li>a {padding-left: 20px }.sidebar-menu.collapsed .main-menu>li>ul>li>ul>li>a {padding-left: 35px }.sidebar-menu.collapsed .main-menu>li>ul>li>ul>li>ul>li>a {padding-left: 50px }.sidebar-menu.collapsed .main-menu>li>ul>li>ul>li>ul>li>ul>li>a {padding-left: 65px }.sidebar-menu.collapsed .main-menu>li>ul>li>ul>li>ul>li>ul>li>ul>li>a {padding-left: 80px }.sidebar-menu.collapsed .main-menu>li>ul li.has-sub>a:before {margin-right: 10px }.sidebar-menu.collapsed .main-menu>li:hover>ul {display: block }}.page-body.right-sidebar .page-container {direction: rtl }.page-body.right-sidebar .page-container>* {direction: ltr }.navbar.horizontal-menu {position: relative;height: 85px;background: #fff;margin: 0;padding: 0;z-index: 101;min-height: 0;-webkit-box-shadow: 0 0 1px rgba(0, 0, 0, .15);-moz-box-shadow: 0 0 1px rgba(0, 0, 0, .15);box-shadow: 0 0 1px rgba(0, 0, 0, .15) }.navbar.horizontal-menu.navbar-fixed-top {position: fixed;left: 0;right: 0;top: 0 }.navbar.horizontal-menu.navbar-fixed-top+.page-container {margin-top: 85px }.navbar.horizontal-menu.navbar-fixed-top+.page-container>.sidebar-menu.fixed .sidebar-menu-inner {top: 85px }.settings-pane-open .navbar.horizontal-menu.navbar-fixed-top {position: relative }.settings-pane-open .navbar.horizontal-menu.navbar-fixed-top+.page-container {margin-top: 0 }.settings-pane-open .navbar.horizontal-menu.navbar-fixed-top+.page-container>.sidebar-menu.fixed .sidebar-menu-inner {top: 0 }.settings-pane-open .navbar.horizontal-menu.navbar-minimal+.page-container {margin-top: 0!important }.navbar.horizontal-menu+.page-container>.sidebar-menu.fixed .sidebar-menu-inner {top: 85px }.navbar.horizontal-menu .navbar-inner .navbar-brand {padding: 0 30px;margin: 0;float: left;height: 85px;display: table }.navbar.horizontal-menu .navbar-inner .navbar-brand:hover a[data-toggle=settings-pane] {zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1 }.settings-pane-open .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] {zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1 }.settings-pane-open .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #2c2e2f }.navbar.horizontal-menu .navbar-inner .navbar-brand a {display: table-cell;vertical-align: middle }.navbar.horizontal-menu .navbar-inner .navbar-brand a.logo img {margin: 0 }.navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] {padding-left: 10px;zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0 }.navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {display: block;line-height: 1;font-size: 12px;color: #979898;margin-top: 1px }.navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i {color: #2c2e2f }@media screen and (min-width:768px) {.navbar.horizontal-menu .navbar-inner .navbar-nav {list-style: none;padding: 0;margin: 0 }.navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }.navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before {-webkit-transform: rotate(90deg);-moz-transform: rotate(90deg);-o-transform: rotate(90deg);-ms-transform: rotate(90deg);transform: rotate(90deg) }.navbar.horizontal-menu .navbar-inner .navbar-nav a {position: relative;display: inline-block;line-height: 1;color: #7d7f7f;z-index: 1 }.navbar.horizontal-menu .navbar-inner .navbar-nav a>i {display: inline-block;margin-right: 5px }.navbar.horizontal-menu .navbar-inner .navbar-nav a>.label.pull-right {margin-top: 0 }.navbar.horizontal-menu .navbar-inner .navbar-nav a>.title {display: inline-block }.navbar.horizontal-menu .navbar-inner .navbar-nav a>.title+.badge {margin-left: 7px }.navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a, .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a {color: #313232 }.navbar.horizontal-menu .navbar-inner .navbar-nav>li {position: relative;z-index: 1;line-height: 85px;border: 1px solid transparent;border-top: 0;border-bottom: 0 }.navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover {z-index: 2 }.navbar.horizontal-menu .navbar-inner .navbar-nav>li.active, .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover {border-color: #f3f3f3;background-color: #fafafa }.navbar.horizontal-menu .navbar-inner .navbar-nav>li.active {margin-left: -1px }.navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover {border-left-color: transparent }.navbar.horizontal-menu .navbar-inner .navbar-nav>li>a {padding: 0 15px;line-height: 85px }.navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul {position: absolute;min-width: 270px;border: 1px solid #eee;visibility: hidden;display: block;left: -1px;-webkit-border-radius: 0;-webkit-background-clip: padding-box;-moz-border-radius: 0;-moz-background-clip: padding;border-radius: 0;background-clip: padding-box;-webkit-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);-moz-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);box-shadow: 0 2px 8px rgba(0, 1, 1, .05);-webkit-transition: opacity 180ms linear, visibility 180ms linear;-moz-transition: opacity 180ms linear, visibility 180ms linear;-o-transition: opacity 180ms linear, visibility 180ms linear;transition: opacity 180ms linear, visibility 180ms linear;zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0 }.navbar.horizontal-menu .navbar-inner .navbar-nav>li.hover>ul {visibility: visible;zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1 }.navbar.horizontal-menu .navbar-inner .navbar-nav ul {position: relative;display: none;list-style: none;padding: 0;margin: 0;top: 100%;min-width: 100%;background: #fff;z-index: 2 }.navbar.horizontal-menu .navbar-inner .navbar-nav ul ul {display: block;height: 0;overflow: hidden;visibility: hidden;zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-webkit-transition: opacity 350ms linear;-moz-transition: opacity 350ms linear;-o-transition: opacity 350ms linear;transition: opacity 350ms linear }.navbar.horizontal-menu .navbar-inner .navbar-nav ul ul.is-visible {height: auto;visibility: visible;zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1 }.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li:last-child>a:after {display: none }.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li {line-height: 1;margin: 0 }.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a {position: relative;display: block;white-space: nowrap;padding: 15px 25px;color: #979898 }.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after {content: '';position: absolute;left: 25px;right: 25px;bottom: 0;background: #eee;height: 1px }.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a {color: #313232;background: #fafafa;border-top: 1px solid #eee;margin-top: -2px }.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a:after {left: 0;right: 0 }.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before {content: '\f105';font-family: FontAwesome;display: block;float: right;color: #979898;position: relative;margin-left: 10px;line-height: 1.3;-webkit-transform-origin: center center;-moz-transform-origin: center center;-o-transform-origin: center center;-ms-transform-origin: center center;transform-origin: center center }.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub:hover>a:before, .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub.expanded>a:before {-webkit-transform: rotate(90deg);-moz-transform: rotate(90deg);-o-transform: rotate(90deg);-ms-transform: rotate(90deg);transform: rotate(90deg) }.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul {background: #f6f6f6;border-top: 1px solid #eee;border-bottom: 1px solid #eee;margin-top: -1px }.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul {background: #f1f1f1;border-top-color: #e7e7e7;border-bottom-color: #e7e7e7 }.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after {background-color: #e7e7e7 }.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul {background: #ececec;border-top-color: #e2e2e2;border-bottom-color: #e2e2e2 }.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after {background-color: #e2e2e2 }}.navbar.horizontal-menu .navbar-inner .navbar-mobile-clear {display: block }.navbar.horizontal-menu .navbar-inner>.nav {list-style: none;margin: 0;padding: 0 }.navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile {display: none }.navbar.horizontal-menu .navbar-inner>.nav>li {line-height: 85px;display: inline-block }.navbar.horizontal-menu .navbar-inner>.nav>li i {font-size: 15px;color: #979898;line-height: 1 }.navbar.horizontal-menu .navbar-inner>.nav>li>a {position: relative;padding: 0 15px;margin: 0;border: 1px solid transparent;border-top: 0;border-bottom: 0;z-index: 2 }.navbar.horizontal-menu .navbar-inner>.nav>li>a:hover {background: #fafafa }.navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i {color: #717272 }.navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon {padding: 0 20px }.navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before {content: '';position: absolute;height: 2px;top: 0;left: 0;right: 0;background: #68b828;display: none }.navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:hover:before {display: block }.navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon i {margin-right: 2px }.navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon .badge {font-size: 9px;position: absolute;top: 50%;right: 10px;padding: 4px;min-width: 18px;font-weight: 400;line-height: 1;margin-top: -20px }.navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before {background-color: #7c38bc }.navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] {padding: 0 20px }.chat-open .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i {color: #717272 }.navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon {background-color: #fff;border-color: #f3f3f3;color: #717272 }.navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i {color: #717272 }.navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before {display: block }.navbar.horizontal-menu .navbar-inner>.nav>li>ul {z-index: 1;border-color: #f3f3f3 }.navbar.horizontal-menu .navbar-inner>.nav>li.search-form {padding: 0 20px }.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a {border: 1px solid transparent;border-top: 0;border-bottom: 0 }.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus {background-color: #fff }.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a {background-color: #fff;border-color: #f3f3f3 }.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>.dropdown-menu {margin-left: -1px }.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu {line-height: 1.42857143 }.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu {z-index: 1;margin-top: -1px }.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu {right: 0!important }@media screen and (min-width:767px) and (max-width:992px) {.navbar.horizontal-menu .navbar-inner .navbar-brand {padding: 0 15px }.navbar.horizontal-menu .navbar-inner .navbar-nav>li {line-height: 84px }.navbar.horizontal-menu .navbar-inner .navbar-nav>li>a {padding: 0 10px;font-size: 12px }.navbar.horizontal-menu .navbar-inner .navbar-nav>li>a>.badge {display: none }.navbar.horizontal-menu .navbar-inner>.nav>li i {font-size: 13px }.navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon {padding-left: 15px;padding-right: 15px }.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>span {display: none!important }}.navbar.horizontal-menu.click-to-expand .has-sub:hover>a:before {-webkit-transform: rotate(0deg)!important;-moz-transform: rotate(0deg)!important;-o-transform: rotate(0deg)!important;-ms-transform: rotate(0deg)!important;transform: rotate(0deg)!important }.navbar.horizontal-menu.click-to-expand .has-sub.expanded>a:before {-webkit-transform: rotate(90deg)!important;-moz-transform: rotate(90deg)!important;-o-transform: rotate(90deg)!important;-ms-transform: rotate(90deg)!important;transform: rotate(90deg)!important }@media screen and (min-width:768px) {.navbar.horizontal-menu.navbar-minimal {height: 55px }}.navbar.horizontal-menu.navbar-minimal.navbar-fixed-top+.page-container {margin-top: 55px }@media screen and (max-width:768px) {.navbar.horizontal-menu.navbar-minimal.navbar-fixed-top+.page-container {margin-top: 0 }}.navbar.horizontal-menu.navbar-minimal.navbar-fixed-top+.page-container>.sidebar-menu.fixed .sidebar-menu-inner {top: 55px }.navbar.horizontal-menu.navbar-minimal+.page-container>.sidebar-menu.fixed .sidebar-menu-inner {top: 55px }@media screen and (min-width:768px) {.navbar.horizontal-menu.navbar-minimal .navbar-inner .navbar-brand {height: 55px }.navbar.horizontal-menu.navbar-minimal .navbar-inner .navbar-nav>li {line-height: 55px }.navbar.horizontal-menu.navbar-minimal .navbar-inner .navbar-nav>li>a {line-height: 55px }}.navbar.horizontal-menu.navbar-minimal .navbar-inner>.nav>li {line-height: 55px }@media screen and (min-width:767px) and (max-width:992px) {.navbar.horizontal-menu.navbar-minimal .navbar-inner .navbar-nav>li {line-height: 54px }}@media screen and (max-width:768px) {.navbar.horizontal-menu {background: #2c2e2f;color: #fff;height: auto }.chat-open .navbar.horizontal-menu {left: -340px }.navbar.horizontal-menu.navbar-fixed-top {position: relative }.navbar.horizontal-menu.navbar-fixed-top+.page-container {margin-top: 0 }.navbar.horizontal-menu.navbar-fixed-top+.page-container>.sidebar-menu.fixed .sidebar-menu-inner {top: 0 }.settings-pane-open .navbar.horizontal-menu.navbar-fixed-top {position: relative }.settings-pane-open .navbar.horizontal-menu.navbar-fixed-top+.page-container {margin-top: 0 }.settings-pane-open .navbar.horizontal-menu.navbar-fixed-top+.page-container>.sidebar-menu.fixed .sidebar-menu-inner {top: 0 }.navbar.horizontal-menu+.page-container>.sidebar-menu.fixed .sidebar-menu-inner {top: 85px }.navbar.horizontal-menu .navbar-inner {padding: 20px 0 }.navbar.horizontal-menu .navbar-inner .navbar-brand {height: auto;padding-left: 20px }.navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] {display: none }.navbar.horizontal-menu .navbar-inner .navbar-mobile-clear {display: block;clear: both }.navbar.horizontal-menu .navbar-inner .navbar-nav {display: none;padding-left: 40px;padding-right: 40px;margin-top: 20px;margin-bottom: 20px;list-style: none;margin-bottom: 0 }.navbar.horizontal-menu .navbar-inner .navbar-nav a {color: #979898;text-decoration: none;display: block;padding: 13px 5px;border-bottom: 1px solid #313437 }.navbar.horizontal-menu .navbar-inner .navbar-nav a>i {display: inline-block;margin-right: 10px }.navbar.horizontal-menu .navbar-inner .navbar-nav a>i+span {padding-right: 10px }.navbar.horizontal-menu .navbar-inner .navbar-nav a>span {display: inline-block }.navbar.horizontal-menu .navbar-inner .navbar-nav a>.label {margin-top: 1px }.navbar.horizontal-menu .navbar-inner .navbar-nav a>.badge {font-size: 75%;line-height: 1.2 }.navbar.horizontal-menu .navbar-inner .navbar-nav a:hover {color: #fff }.navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a {color: #fff }.navbar.horizontal-menu .navbar-inner .navbar-nav li.has-sub>a:before {position: relative;display: inline-block;font-family: FontAwesome;content: '\f107';float: right;color: #6d747a;margin-left: 10px;-webkit-transform: rotate(-90deg);-moz-transform: rotate(-90deg);-o-transform: rotate(-90deg);-ms-transform: rotate(-90deg);transform: rotate(-90deg);-webkit-transition: all 150ms ease-in-out;-moz-transition: all 150ms ease-in-out;-o-transition: all 150ms ease-in-out;transition: all 150ms ease-in-out }.navbar.horizontal-menu .navbar-inner .navbar-nav li.has-sub.opened>a:before, .navbar.horizontal-menu .navbar-inner .navbar-nav li.has-sub.expanded>a:before {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }.navbar.horizontal-menu .navbar-inner .navbar-nav>li.opened>ul {display: block }.navbar.horizontal-menu .navbar-inner .navbar-nav>li.opened .opened>ul {display: block }.navbar.horizontal-menu .navbar-inner .navbar-nav ul {display: none;margin: 0;padding: 0;overflow: hidden;list-style: none }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li {position: relative }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown {left: 0;zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-webkit-transition: all 200ms ease-in-out;-moz-transition: all 200ms ease-in-out;-o-transition: all 200ms ease-in-out;transition: all 200ms ease-in-out }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown {-webkit-transition-delay: 80ms;-moz-transition-delay: 80ms;-o-transition-delay: 80ms;transition-delay: 80ms }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 120ms;-moz-transition-delay: 120ms;-o-transition-delay: 120ms;transition-delay: 120ms }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 160ms;-moz-transition-delay: 160ms;-o-transition-delay: 160ms;transition-delay: 160ms }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 200ms;-moz-transition-delay: 200ms;-o-transition-delay: 200ms;transition-delay: 200ms }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 240ms;-moz-transition-delay: 240ms;-o-transition-delay: 240ms;transition-delay: 240ms }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 280ms;-moz-transition-delay: 280ms;-o-transition-delay: 280ms;transition-delay: 280ms }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 320ms;-moz-transition-delay: 320ms;-o-transition-delay: 320ms;transition-delay: 320ms }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 360ms;-moz-transition-delay: 360ms;-o-transition-delay: 360ms;transition-delay: 360ms }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 400ms;-moz-transition-delay: 400ms;-o-transition-delay: 400ms;transition-delay: 400ms }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown {-webkit-transition-delay: 440ms;-moz-transition-delay: 440ms;-o-transition-delay: 440ms;transition-delay: 440ms }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.hidden-item {visibility: hidden;zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-webkit-transition: all 250ms ease-in-out;-moz-transition: all 250ms ease-in-out;-o-transition: all 250ms ease-in-out;transition: all 250ms ease-in-out }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li a {padding-left: 35px }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li ul li a {padding-left: 60px }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li ul li ul li a {padding-left: 85px }.navbar.horizontal-menu .navbar-inner .navbar-nav ul li ul li ul li ul li a {padding-left: 110px }.navbar.horizontal-menu .navbar-inner .navbar-nav.mobile-is-visible {display: block }.navbar.horizontal-menu .navbar-inner>.nav {display: none }.navbar.horizontal-menu .navbar-inner>.nav>li {line-height: 65px }.navbar.horizontal-menu .navbar-inner>.nav.nav-userinfo {float: none;width: 100%;display: none;background: #fff;position: relative;top: 20px;text-align: right }.navbar.horizontal-menu .navbar-inner>.nav.nav-userinfo.mobile-is-visible {display: block }.navbar.horizontal-menu .navbar-inner>.nav.nav-userinfo>.xs-left {float: left }.navbar.horizontal-menu .navbar-inner>.nav.nav-userinfo>.xs-left.open>.dropdown-menu {left: 1px }.navbar.horizontal-menu .navbar-inner>.nav.nav-userinfo .notification-icon .badge {top: 50% }.navbar.horizontal-menu .navbar-inner>.nav.nav-userinfo .user-profile>a span {display: none }.navbar.horizontal-menu .navbar-inner>.nav.nav-userinfo .user-profile.open>a {background-color: #fafafa }.navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile {display: block;float: right;padding-right: 20px }.navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a {position: relative;display: inline-block;color: #979898;line-height: 1;margin-left: 20px }.navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a i {line-height: 1;font-size: 18px;position: relative;top: 1px }.navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover, .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active, .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus {color: #fff }.navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a .badge {position: absolute;right: -3px;top: -8px;font-size: 8px;padding: 1px 2px;min-width: 14px }}@media screen and (max-width:768px) and screen and (max-width:768px) {.navbar.horizontal-menu .navbar-inner .navbar-nav {margin-top: 10px;margin-bottom: 10px }}@media screen and (max-width:768px) and screen and (min-width:768px) {.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-hidden {left: -20px;zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0 }}footer.main-footer {padding: 20px 30px;border-top: 1px solid #ddd;font-size: 12px;margin-left: -30px;margin-right: -30px;margin-top: 10px;background-color: #f9f9f9;}footer.main-footer:before, footer.main-footer:after {content: " ";display: table }footer.main-footer:after {clear: both }footer.main-footer:before, footer.main-footer:after {content: " ";display: table }footer.main-footer:after {clear: both }.page-container+footer.main-footer {margin-left: 0;margin-right: 0 }.page-container+footer.main-footer .footer-inner {max-width: 1080px;margin-left: auto;margin-right: auto }footer.main-footer .footer-text {float: left }footer.main-footer .go-up {float: right;margin-bottom: 20px }footer.main-footer .go-up a {display: inline-block;background-color: rgba(44, 46, 47, .05);padding: 2px 5px }footer.main-footer .go-up a:hover {background-color: rgba(44, 46, 47, .1) }footer.main-footer.footer-type-2 {background-color: #252729;border-top: 0;color: #fff }footer.main-footer.footer-type-2 a {color: #fff }footer.main-footer.footer-type-2 .go-up a {background-color: rgba(255, 255, 255, .05) }footer.main-footer.footer-type-2 .go-up a:hover {background-color: rgba(255, 255, 255, .1) }footer.main-footer.fixed {position: fixed;left: 0px;right: 0;bottom: 0;margin-left: 0;margin-right: 0;margin-top: 10px!important }body.chat-open .user-info-navbar a[data-toggle=chat] {color: #606161 }.user-info-navbar {background-color: #fff;min-height: 0;border: 0;padding: 0;margin: -30px;margin-bottom: 30px }.user-info-navbar .user-info-menu {margin: 0 }.user-info-navbar .user-info-menu.left-links {float: left }.user-info-navbar .user-info-menu.right-links {float: right }.user-info-navbar .user-info-menu li {line-height: 1 }.user-info-navbar .user-info-menu li a {line-height: 1 }.user-info-navbar .user-info-menu li a img {line-height: 1 }.user-info-navbar .user-info-menu>li {position: relative;margin: 0;padding: 0;border: 1px solid #fff;border-top: 0;border-bottom: 0;display: block;float: left }.user-info-navbar .user-info-menu>li.hover-line:before {content: '';position: absolute;display: block;height: 2px;top: 0;left: 0;right: 0;background: #68b828;display: none }.user-info-navbar .user-info-menu>li.hover-line:hover:before, .user-info-navbar .user-info-menu>li.hover-line.open:before {display: block }.user-info-navbar .user-info-menu>li>a {position: relative;display: block;padding: 30px 20px;color: #979898;border-bottom: 1px solid #fff;top: 1px;z-index: 5;text-decoration: none }.user-info-navbar .user-info-menu>li>a i {font-size: 15px;line-height: 1 }.user-info-navbar .user-info-menu>li>a:hover {color: #606161 }.user-info-navbar .user-info-menu>li>a .badge {font-size: 9px;position: absolute;top: 20px;right: 10px;padding: 4px;min-width: 18px;font-weight: 400;line-height: 1 }.user-info-navbar .user-info-menu>li>form {position: relative;display: block;padding: 30px 20px;padding-bottom: 26px;margin: 0;border-bottom: 1px solid #fff }.user-info-navbar .user-info-menu>li a[data-toggle=sidebar] {padding-left: 25px }.user-info-navbar .user-info-menu>li.fullscreen {position: relative;z-index: 1 }.user-info-navbar .user-info-menu>li.fullscreen:hover a {background-color: #fafafa;color: #2c2e2f }.user-info-navbar .user-info-menu>li.search-form, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form {position: relative;z-index: 5 }.user-info-navbar .user-info-menu>li.search-form .btn, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn {position: relative;padding: 0;margin: 0;height: auto;color: #979898;z-index: 2 }.user-info-navbar .user-info-menu>li.search-form .btn:hover, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:hover {color: #606161 }.user-info-navbar .user-info-menu>li.search-form .btn:active, .user-info-navbar .user-info-menu>li.search-form .btn:focus, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:active, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.user-info-navbar .user-info-menu>li.search-form .search-field, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field {position: absolute;top: 50%;right: 15px;margin-top: -15.5px;line-height: 1;height: 31px;border: 1px solid #ddd;border: 0;padding: 0 10px;width: 170px;padding-right: 30px;font-size: 12px;z-index: 1;visibility: hidden;background: #f3f3f3;zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0 }.user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder {color: #979898;opacity: 1 }.user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-moz-placeholder {color: #979898 }.user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder {color: #979898 }.user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:focus+.btn {color: #606161 }.user-info-navbar .user-info-menu>li.search-form.focused .search-field, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form.focused .search-field {visibility: visible;zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-webkit-transition: all 100ms ease-in-out;-moz-transition: all 100ms ease-in-out;-o-transition: all 100ms ease-in-out;transition: all 100ms ease-in-out }.user-info-navbar .user-info-menu>li.search-form.always-visible .search-field, .navbar.horizontal-menu .navbar-inner>.nav>li.search-form.always-visible .search-field {visibility: visible;zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1 }.user-info-navbar .user-info-menu>li.user-profile>a, .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a {text-decoration: none }.user-info-navbar .user-info-menu>li.user-profile>a>img, .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img {position: relative }.user-info-navbar .user-info-menu>li.user-profile>a>img+span, .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img+span {margin-left: 5px }.user-info-navbar .user-info-menu>li.user-profile>a span, .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span {display: inline-block }.user-info-navbar .user-info-menu>li.user-profile .userpic-32, .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile .userpic-32 {margin-top: -17px;top: 8px }.user-info-navbar .user-info-menu>li.language-switcher a>img {display: inline-block;margin-right: 5px;position: relative;top: -2px }.user-info-navbar .user-info-menu>li.open {border-left-color: #ddd;border-right-color: #ddd;z-index: 15 }.user-info-navbar .user-info-menu>li.open>a {color: #606161 }.user-info-navbar .user-info-menu>li .dropdown-menu, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu {margin: 0;padding: 0;margin-top: 0;margin-left: -1px;z-index: 3;-webkit-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);-moz-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);box-shadow: 0 2px 8px rgba(0, 1, 1, .05) }.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list {position: relative;max-height: 300px;overflow: auto }.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list.ps-scrollbar, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list.ps-scrollbar {overflow: hidden }.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li {position: relative }.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a {position: relative;display: block;padding: 20px 30px;color: #979898 }.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a .line, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a .line {display: block }.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a .line.desc, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a .line.desc {margin-top: 10px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;max-width: 100%;margin-right: 10px }.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a .line .light, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a .line .light {zoom: 1;filter: alpha(opacity=60);-webkit-opacity: .6;-moz-opacity: .6;opacity: .6 }.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a .line.small, .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a .line .small, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a .line.small, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a .line .small {font-size: 12px }.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a .line.time, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a .line.time {font-size: 11px;margin-top: 5px }.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:after {content: '';display: block;position: absolute;height: 1px;background: #ededed;bottom: 0;left: 30px;right: 30px }.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:hover {color: #606161 }.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li.active a {color: #606161 }.user-info-navbar .user-info-menu>li .dropdown-menu>.top, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top {padding: 20px 30px;padding-bottom: 0 }.user-info-navbar .user-info-menu>li .dropdown-menu>.top a, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a {color: #979898 }.user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a:hover {color: #606161 }.user-info-navbar .user-info-menu>li .dropdown-menu>.top p, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top p {margin: 0;color: #979898;padding-bottom: 15px;border-bottom: 1px solid #ededed }.user-info-navbar .user-info-menu>li .dropdown-menu>.external, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external {position: relative }.user-info-navbar .user-info-menu>li .dropdown-menu>.external:after, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external:after {content: '';display: block;position: absolute;left: 0;right: 0;top: -1px;background-color: none;height: 1px;background-color: #ededed }.user-info-navbar .user-info-menu>li .dropdown-menu>.external a, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a {display: block;padding: 20px 30px;color: #979898;background-color: #f5f5f5 }.user-info-navbar .user-info-menu>li .dropdown-menu>.external a span, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a span {float: left }.user-info-navbar .user-info-menu>li .dropdown-menu>.external a i, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a i {float: right }.user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:hover {color: #6a6b6c }.user-info-navbar .user-info-menu>li .dropdown-menu.messages, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages {width: 370px }.user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li:after {content: '';display: block;position: absolute;background-color: #ccc;top: 50%;margin-top: -2.5px;right: 30px;width: 5px;height: 5px;-webkit-border-radius: 50%;-webkit-background-clip: padding-box;-moz-border-radius: 50%;-moz-background-clip: padding;border-radius: 50%;background-clip: padding-box }.user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li.active:after {background-color: #8dc63f }.user-info-navbar .user-info-menu>li .dropdown-menu.notifications, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications {width: 370px }.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list {max-height: 276px }.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i {float: left;background: #ddd;color: #FFF;padding: 5px;line-height: 17px;width: 27px;text-align: center;-webkit-border-radius: 50%;-webkit-background-clip: padding-box;-moz-border-radius: 50%;-moz-background-clip: padding;border-radius: 50%;background-clip: padding-box }.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line {padding-left: 45px }.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-primary>a>i, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-primary>a>i {background-color: #2c2e2f }.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-success>a>i, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-success>a>i {background-color: #8dc63f }.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-danger>a>i, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-danger>a>i {background-color: #cc3f44 }.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-warning>a>i, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-warning>a>i {background-color: #ffba00 }.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-info>a>i, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-info>a>i {background-color: #40bbea }.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i {background-color: #FFF;color: #444;-webkit-box-shadow: 0 0 0 1px #eee;-moz-box-shadow: 0 0 0 1px #eee;box-shadow: 0 0 0 1px #eee }.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu {right: -1px;left: auto;width: 250px }.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li {position: relative;display: block;padding: 0;margin: 0;padding: 15px 20px;padding-bottom: 0 }.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a {display: block;color: #979898;padding: 0;padding-bottom: 15px;border-bottom: 1px solid #f0f0f0 }.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a:hover {background: 0 0 }.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a:hover {color: #606161 }.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last {background: #fafafa }.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last:after {content: '';display: block;position: absolute;height: 1px;background: #f0f0f0;top: -1px;left: 0;right: 0 }.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last>a {border-bottom: 0 }.user-info-navbar .user-info-menu>li .dropdown-menu.languages, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.languages {width: 200px }@media screen and (max-width:991px) {.user-info-navbar .user-info-menu>li .dropdown-menu.languages, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.languages {width: auto }}.user-info-navbar .user-info-menu>li .dropdown-menu.languages li a, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.languages li a {padding-top: 10px;padding-bottom: 10px;color: #777879 }.user-info-navbar .user-info-menu>li .dropdown-menu.languages li:hover a, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.languages li:hover a {background-color: #fbfbfb }.user-info-navbar .user-info-menu>li .dropdown-menu.languages li.active a, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.languages li.active a {background-color: #f6f6f6;color: #2c2e2f }.user-info-navbar .user-info-menu>li .dropdown-menu.languages li+li, .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.languages li+li {border-top: 1px solid #eee }.badge {position: relative;font-size: 9px;line-height: 12px }.badge.pull-right {margin-top: 4px;margin-left: 5px }.badge.pull-left {margin-top: 4px;margin-right: 5px }.badge.badge-default {background-color: #777 }.badge.badge-red, .badge.badge-danger {background-color: #cc3f44 }.badge.badge-blue, .badge.badge-info {background-color: #40bbea }.badge.badge-yellow, .badge.badge-warning {background-color: #ffba00 }.badge.badge-green, .badge.badge-success {background-color: #8dc63f }.badge.badge-primary {background-color: #2c2e2f }.badge.badge-secondary {background-color: #68b828 }.badge.badge-purple {background-color: #7c38bc }.badge.badge-pink {background-color: #ff6264 }.badge.badge-yellow {background-color: #fcd036 }.badge.badge-orange {background-color: #f7aa47 }.badge.badge-turquoise {background-color: #00b19d }.badge.badge-red {background-color: #d5080f }.badge.badge-blue {background-color: #0e62c7 }.badge.badge-black {background-color: #222 }.badge.badge-white {background-color: #fff;color: #333;-webkit-box-shadow: 0 0 0 1px #ddd;-moz-box-shadow: 0 0 0 1px #ddd;box-shadow: 0 0 0 1px #ddd }#chat {display: table-cell;position: relative;z-index: 100;width: 280px;background: #fff;vertical-align: top;display: none }body.chat-open #chat {display: table-cell }#chat.fixed .chat-inner {position: fixed;right: 0;width: inherit }.page-body.right-sidebar #chat.fixed .chat-inner {right: auto;left: 0 }#chat .chat-inner {overflow: auto;height: 100%;border-left: 1px solid #ddd }.page-body.right-sidebar #chat .chat-inner {border-left: 0;border-right: 1px solid #ddd }#chat .chat-inner.ps-container {overflow: hidden }#chat .chat-header {font-size: 16px;color: #979898;padding: 29px 35px;padding-bottom: 0;line-height: 1;margin: 0;position: relative }#chat .chat-header .badge {position: relative;top: -1px;margin-left: 5px;-webkit-transform: scale(1);-moz-transform: scale(1);-o-transform: scale(1);-ms-transform: scale(1);transform: scale(1);zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-webkit-transition: all 220ms ease-in-out;-moz-transition: all 220ms ease-in-out;-o-transition: all 220ms ease-in-out;transition: all 220ms ease-in-out }#chat .chat-header .badge.is-hidden {zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-webkit-transform: scale(0);-moz-transform: scale(0);-o-transform: scale(0);-ms-transform: scale(0);transform: scale(0) }#chat .chat-header .chat-close {position: absolute;right: 0;font-size: 15px;right: 25px;margin-top: 0;color: #ddd;font-weight: 400;zoom: 1;filter: alpha(opacity=80);-webkit-opacity: .8;-moz-opacity: .8;opacity: .8 }#chat .chat-header .chat-close:hover {zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1 }#chat .chat-group {margin-top: 24px }#chat .chat-group>strong, #chat .chat-group>a {display: block;padding: 6px 35px;font-weight: 400;font-size: 12px }#chat .chat-group>strong {text-transform: uppercase;color: #979898 }#chat .chat-group>a {position: relative;color: #979898;-webkit-transition: background 250ms ease-in-out;-moz-transition: background 250ms ease-in-out;-o-transition: background 250ms ease-in-out;transition: background 250ms ease-in-out }#chat .chat-group>a:hover, #chat .chat-group>a.active {color: #717272 }#chat .chat-group>a:before {content: '';display: block;position: absolute;width: 0;height: 0;border-style: solid;border-width: 4px 0 4px 4px;border-color: transparent transparent transparent #111;left: 0;top: 50%;margin-top: -4px;zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-webkit-transition: all 220ms ease-in-out;-moz-transition: all 220ms ease-in-out;-o-transition: all 220ms ease-in-out;transition: all 220ms ease-in-out }#chat .chat-group>a.active:before {zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1 }#chat .chat-group>a .badge {font-size: 9px;margin-left: 5px;-webkit-transform: scale(1);-moz-transform: scale(1);-o-transform: scale(1);-ms-transform: scale(1);transform: scale(1);zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-webkit-transition: all 220ms ease-in-out;-moz-transition: all 220ms ease-in-out;-o-transition: all 220ms ease-in-out;transition: all 220ms ease-in-out }#chat .chat-group>a .badge.is-hidden {zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-webkit-transform: scale(0);-moz-transform: scale(0);-o-transform: scale(0);-ms-transform: scale(0);transform: scale(0) }#chat .chat-group>a em {font-style: normal }#chat .user-status {display: inline-block;background: #b7b7b7;margin-right: 5px;width: 8px;height: 8px;-webkit-border-radius: 8px;-webkit-background-clip: padding-box;-moz-border-radius: 8px;-moz-background-clip: padding;border-radius: 8px;background-clip: padding-box;-webkit-transition: all 220ms ease-in-out;-moz-transition: all 220ms ease-in-out;-o-transition: all 220ms ease-in-out;transition: all 220ms ease-in-out }#chat .user-status.is-online {background-color: #8dc63f }#chat .user-status.is-offline {background-color: #b7b7b7 }#chat .user-status.is-idle {background-color: #ffba00 }#chat .user-status.is-busy {background-color: #cc3f44 }#chat .chat-conversation {position: absolute;right: 279px;width: 340px;background: #fff;border: 1px solid #dedede;top: 166px;display: none }.page-body.right-sidebar #chat .chat-conversation {right: auto;left: 279px }#chat .chat-conversation.is-open {display: block }#chat .chat-conversation .conversation-header {position: relative;padding: 20px 24px;font-size: 14px;color: #979898;border-bottom: 1px solid #ededed }#chat .chat-conversation .conversation-header small {color: rgba(151, 152, 152, .6);font-size: 12px;padding-left: 8px }#chat .chat-conversation .conversation-header .conversation-close {float: right;color: #979898;zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;position: relative;top: -2px }#chat .chat-conversation .conversation-header:after {position: absolute;display: block;content: '';width: 0;height: 0;border-style: solid;border-width: 7px 0 7px 9.1px;border-color: transparent transparent transparent #dedede;right: -9.1px;top: 50%;margin-top: -3.5px }.page-body.right-sidebar #chat .chat-conversation .conversation-header:after {right: auto;left: -8.1px;border-width: 7px 7px 9.1px 0;border-color: transparent #dedede transparent transparent }#chat .chat-conversation .conversation-body {list-style: none;margin: 0;padding: 0;overflow: auto;height: 245px }#chat .chat-conversation .conversation-body::-webkit-scrollbar {width: 5px }#chat .chat-conversation .conversation-body::-webkit-scrollbar-track {width: 5px;background-color: #fff }#chat .chat-conversation .conversation-body::-webkit-scrollbar-thumb {background-color: #dedede }#chat .chat-conversation .conversation-body>li {padding: 0 30px;margin: 0;padding-top: 15px;padding-bottom: 15px;border-bottom: 1px solid #f1f1f1;color: #979898 }#chat .chat-conversation .conversation-body>li.odd {background: rgba(250, 250, 250, .55) }#chat .chat-conversation .conversation-body>li .user {font-weight: 700;color: #7d7f7f }#chat .chat-conversation .conversation-body>li .time {float: right;color: rgba(151, 152, 152, .8);font-size: 10px;position: relative;top: 3px }#chat .chat-conversation .conversation-body>li p {padding-top: 5px }#chat .chat-conversation .conversation-body>li:last-child {border-bottom: 0 }#chat .chat-conversation .chat-textarea {padding: 20px 24px;background: #fafafa;position: relative;border-top: 1px solid #ededed;padding: 0 }#chat .chat-conversation .chat-textarea:after {content: '\f075';font-family: fontawesome;color: #979898;right: 15px;top: 10px;font-size: 15px;position: absolute }#chat .chat-conversation .chat-textarea textarea {background: #fafafa;border: 0;max-height: 100px!important;padding-right: 35px;padding-top: 10px;height: 32px;resize: none }#chat .chat-conversation .chat-textarea textarea::-moz-placeholder {color: rgba(151, 152, 152, .85);opacity: 1 }#chat .chat-conversation .chat-textarea textarea:-ms-input-placeholder {color: rgba(151, 152, 152, .85) }#chat .chat-conversation .chat-textarea textarea::-webkit-input-placeholder {color: rgba(151, 152, 152, .85) }#chat .chat-conversation .chat-textarea textarea::-webkit-input-placeholder {color: rgba(151, 152, 152, .85) }#chat .chat-conversation .chat-textarea textarea:-moz-placeholder {color: rgba(151, 152, 152, .85) }#chat .chat-conversation .chat-textarea textarea::-moz-placeholder {color: rgba(151, 152, 152, .85) }#chat .chat-conversation .chat-textarea textarea:-ms-input-placeholder {color: rgba(151, 152, 152, .85) }#chat .chat-conversation .chat-textarea textarea::-webkit-scrollbar {width: 5px }#chat .chat-conversation .chat-textarea textarea::-webkit-scrollbar-track {width: 5px;background-color: #ededed }#chat .chat-conversation .chat-textarea textarea::-webkit-scrollbar-thumb {background-color: #ccc }.chat-history {display: none }@media (max-width:767px) {.chat-visible #chat, .chat-visible #chat.fixed {display: none }.chat-visible.toggle-click #chat, .chat-visible.toggle-click #chat.fixed {display: block }#chat, #chat.fixed {position: fixed;width: auto;top: 0;left: 0;right: 0;bottom: 0;margin: 10px }#chat .chat-conversation, #chat.fixed .chat-conversation {position: fixed;width: auto;left: 0;right: 0;top: 0!important;bottom: 0;margin: 10px;overflow: auto }#chat .chat-conversation .conversation-body, #chat.fixed .chat-conversation .conversation-body {height: auto;max-height: 450px }#chat .chat-conversation::-webkit-scrollbar, #chat.fixed .chat-conversation::-webkit-scrollbar {width: 5px }#chat .chat-conversation::-webkit-scrollbar-track, #chat.fixed .chat-conversation::-webkit-scrollbar-track {width: 5px;background-color: #343a45 }#chat .chat-conversation::-webkit-scrollbar-thumb, #chat.fixed .chat-conversation::-webkit-scrollbar-thumb {background-color: #4a5262 }}.footer-sticked-chat {position: fixed;right: 30px;bottom: 0;z-index: 1000 }.chat-open .footer-sticked-chat {right: 310px }@media screen and (max-width:768px) {.chat-open .footer-sticked-chat {right: 30px }}.right-sidebar .footer-sticked-chat {left: 30px;right: auto }@media screen and (max-width:768px) {.footer-sticked-chat.mobile-is-visible .chat-conversations {display: block!important }}@media screen and (max-width:768px) {.footer-sticked-chat {left: 0;right: 0 }}.footer-sticked-chat .chat-conversations {display: block;margin: 0;padding: 0;z-index: 5;position: relative }@media screen and (max-width:768px) {.footer-sticked-chat .chat-conversations {padding: 15px 30px;background: #fff;border-top: 1px solid #e4e4e4;display: none }}.footer-sticked-chat .chat-conversations>li {display: block;position: relative;float: left;margin: 0 }@media screen and (max-width:768px) {.footer-sticked-chat .chat-conversations>li {float: none;width: 100% }}.footer-sticked-chat .chat-conversations>li .chat-user {display: block;position: relative;z-index: 5;background-color: #fff;border: 1px solid #e4e4e4;color: #888;font-size: 12px;line-height: 1;padding: 8px 10px;width: 150px;text-decoration: none;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;max-width: 100% }@media screen and (max-width:768px) {.footer-sticked-chat .chat-conversations>li .chat-user {width: 100% }}.footer-sticked-chat .chat-conversations>li .chat-user .user-status {display: inline-block;vertical-align: middle;background: #b7b7b7;margin-right: 5px;position: relative;top: -1px;width: 8px;height: 8px;-webkit-border-radius: 8px;-webkit-background-clip: padding-box;-moz-border-radius: 8px;-moz-background-clip: padding;border-radius: 8px;background-clip: padding-box;-webkit-transition: all 220ms ease-in-out;-moz-transition: all 220ms ease-in-out;-o-transition: all 220ms ease-in-out;transition: all 220ms ease-in-out }.footer-sticked-chat .chat-conversations>li .chat-user .user-status.is-online {background-color: #8dc63f }.footer-sticked-chat .chat-conversations>li .chat-user .user-status.is-offline {background-color: #b7b7b7 }.footer-sticked-chat .chat-conversations>li .chat-user .user-status.is-idle {background-color: #ffba00 }.footer-sticked-chat .chat-conversations>li .chat-user .user-status.is-busy {background-color: #cc3f44 }.footer-sticked-chat .chat-conversations>li .chat-user:hover {color: #2c2e2f }.footer-sticked-chat .chat-conversations>li .badge {position: absolute;top: 0;right: 0;z-index: 15;-webkit-transform: translate(25%, -25%);-moz-transform: translate(25%, -25%);-o-transform: translate(25%, -25%);-ms-transform: translate(25%, -25%);transform: translate(25%, -25%) }.footer-sticked-chat .chat-conversations>li .conversation-window {position: absolute;bottom: 0;left: 0;right: 0;background: #fff;border: 1px solid #fff;z-index: 20;border: 1px solid #e4e4e4;visibility: hidden;zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0 }.footer-sticked-chat .chat-conversations>li .conversation-window>.chat-user {width: 100%;border: 0;background: #f5f5f5 }.footer-sticked-chat .chat-conversations>li .conversation-window>.chat-user .close {position: absolute;right: 0;top: 50%;font-size: 15px;-webkit-transform: translate(-100%, -50%);-moz-transform: translate(-100%, -50%);-o-transform: translate(-100%, -50%);-ms-transform: translate(-100%, -50%);transform: translate(-100%, -50%) }.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages {list-style: none;margin: 0;padding: 0;border-top: 1px solid #e4e4e4;border-bottom: 1px solid #e4e4e4;max-height: 250px;overflow: hidden;position: relative }.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages.full-height {overflow: visible }.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li {display: table;width: 100%;table-layout: auto }.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li .user-info, .footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li .message-entry {display: table-cell;vertical-align: top;padding: 10px 0 }.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li .user-info {padding-left: 10px;padding-right: 10px }.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li .user-info+.message-entry {padding-left: 0 }.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li .message-entry {width: 99%;color: #666;font-size: 11px;padding-right: 10px;padding-left: 10px;word-break: break-all;white-space: normal }.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li .message-entry>p {color: #666 }.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li .message-entry>p:last-child {margin-bottom: 0 }.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li.me {background-color: #f4f4f4 }.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li.time {text-align: center;display: block;font-size: 9px;background: #f0f0f0;text-transform: uppercase;color: #888;padding: 4px 0 2px 0;line-height: 1;margin-bottom: 1px }.footer-sticked-chat .chat-conversations>li .conversation-window .chat-form .form-control {border: 0;font-size: 12px }.footer-sticked-chat .chat-conversations>li.open>a {width: 250px }@media screen and (max-width:768px) {.footer-sticked-chat .chat-conversations>li.open>a {width: 100% }}.footer-sticked-chat .chat-conversations>li.open .conversation-window {bottom: 0;visibility: visible;zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-webkit-transition-delay: 120ms;-moz-transition-delay: 120ms;-o-transition-delay: 120ms;transition-delay: 120ms }.footer-sticked-chat .chat-conversations>li.open .badge {display: none }.right-sidebar .footer-sticked-chat .chat-conversations>li.browse-more {float: right;margin-right: 0;margin-left: 10px }.footer-sticked-chat .chat-conversations>li.browse-more>a {width: auto;-webkit-transition: none;-moz-transition: none;-o-transition: none;transition: none }@media screen and (max-width:768px) {.footer-sticked-chat .chat-conversations>li.browse-more>a {background-color: #f4f4f4 }}.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list {position: absolute;bottom: 100%;right: 0;margin: 0;padding: 0;list-style: none;background-color: #fff;border: 1px solid #e4e4e4;margin-bottom: -2px;z-index: 1;display: none }.right-sidebar .footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list {right: auto;left: auto }@media screen and (max-width:768px) {.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list {position: relative;width: 100%;border-top: 0 }}.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li {display: block;text-align: right }@media screen and (max-width:768px) {.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li {text-align: left }}.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li a {display: block;font-size: 11px;font-weight: 700;padding: 5px 10px;white-space: nowrap;color: #888 }.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li a span {position: relative;left: 2px;zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0 }@media screen and (max-width:768px) {.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li a span {float: right;left: 0 }}.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li a:hover {color: #2c2e2f }.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li a:hover span {zoom: 1;filter: alpha(opacity=50);-webkit-opacity: .5;-moz-opacity: .5;opacity: .5 }.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li+li {border-top: 1px solid rgba(228, 228, 228, .15) }@media screen and (min-width:768px) {.footer-sticked-chat .chat-conversations>li.browse-more:hover>a {border-top: 0;top: 1px }}.footer-sticked-chat .chat-conversations>li.browse-more:hover .other-conversations-list {display: block }.footer-sticked-chat .chat-conversations>li+li {margin-left: 10px }@media screen and (max-width:768px) {.footer-sticked-chat .chat-conversations>li+li {margin-left: 0;margin-top: 5px }}.footer-sticked-chat .mobile-chat-toggle {position: absolute;right: 30px;bottom: 100%;border: 1px solid #e4e4e4;background-color: #fff;font-size: 12px;line-height: 1;padding: 10px 12px;text-decoration: none;z-index: 1;border-bottom: 0;display: none }.footer-sticked-chat .mobile-chat-toggle i {font-size: 14px }@media screen and (max-width:768px) {.footer-sticked-chat .mobile-chat-toggle {display: block }}.footer-sticked-chat .mobile-chat-toggle .badge {position: absolute;top: 0;left: 0;z-index: 15;-webkit-transform: translate(-25%, -25%);-moz-transform: translate(-25%, -25%);-o-transform: translate(-25%, -25%);-ms-transform: translate(-25%, -25%);transform: translate(-25%, -25%) }@media screen and (max-width:768px) {.page-container {display: block }.page-container .sidebar-menu, .page-container .main-content {display: block;width: 100%;height: auto }.page-container .sidebar-menu {position: relative }.page-container .sidebar-menu .sidebar-menu-inner {position: relative }.page-container .sidebar-menu .sidebar-menu-inner .logo-env, .page-container .sidebar-menu .sidebar-menu-inner .main-menu {padding-left: 20px;padding-right: 20px }.page-container .sidebar-menu .sidebar-menu-inner .logo-env {margin-bottom: 0;padding-top: 20px;padding-bottom: 20px }.page-container .sidebar-menu .sidebar-menu-inner .logo-env .mobile-menu-toggle {float: right }.page-container .sidebar-menu .sidebar-menu-inner .logo-env .mobile-menu-toggle a {position: relative;display: inline-block;color: #979898;line-height: 1;margin-left: 20px }.page-container .sidebar-menu .sidebar-menu-inner .logo-env .mobile-menu-toggle a i {line-height: 1;font-size: 18px;position: relative;top: 1px }.page-container .sidebar-menu .sidebar-menu-inner .logo-env .mobile-menu-toggle a:hover, .page-container .sidebar-menu .sidebar-menu-inner .logo-env .mobile-menu-toggle a:active, .page-container .sidebar-menu .sidebar-menu-inner .logo-env .mobile-menu-toggle a:focus {color: #fff }.page-container .sidebar-menu .sidebar-menu-inner .logo-env .mobile-menu-toggle a .badge {position: absolute;right: -3px;top: -8px;font-size: 8px;padding: 1px 2px;min-width: 14px }.page-container .sidebar-menu .sidebar-menu-inner .main-menu {display: none;margin-bottom: 0 }.page-container .sidebar-menu .sidebar-menu-inner .main-menu.mobile-is-visible {display: block }.page-container .sidebar-menu .sidebar-menu-inner .main-menu.mobile-is-visible.both-menus-visible {margin-top: 0;padding-top: 0 }.page-container .sidebar-menu .sidebar-menu-inner .main-menu>li:last-child>a {border-bottom: 0 }.page-container .main-content .navbar.user-info-navbar {display: none }.page-container .main-content .navbar.user-info-navbar.mobile-is-visible {display: block }.page-container .main-content .navbar.user-info-navbar .user-info-menu>li {min-height: 0!important }.page-container .main-content .navbar.user-info-navbar .user-info-menu>li>a, .page-container .main-content .navbar.user-info-navbar .user-info-menu>li>form {padding-top: 20px;padding-bottom: 20px }.page-container .main-content .navbar.user-info-navbar .user-info-menu>li.user-profile>a>span, .page-container .main-content .navbar.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>span {display: none }.page-container .main-content .navbar.user-info-navbar .user-info-menu>li a>.badge {top: 10px }.page-container .main-content .main-footer {position: relative;left: 0;right: auto;margin-left: -30px;margin-right: -30px }.page-container {position: relative }.page-container #chat {left: auto;margin: 0;width: 340px }.page-container #chat .chat-conversation {bottom: auto;position: absolute;left: 0;top: 0 }.chat-open .page-container {left: -340px }}.panel {position: relative;background: #fff;padding: 20px 30px;border: 0;margin-bottom: 30px;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.panel.panel-headerless .panel-body {padding-top: 0 }.panel .panel-heading {position: relative;padding: 0;margin: 0;background: 0 0;font-size: 17px;padding-bottom: 15px;border-bottom: 2px solid #f5f5f5 }.panel .panel-heading>.panel-title {float: left;font-size: 17px }.panel .panel-heading>.panel-title>a {color: inherit }.panel .panel-heading>.panel-options {float: right;font-size: 13px }.panel .panel-heading>.panel-options a {display: inline-block;color: #979898;margin-left: 7px;line-height: 1 }.panel .panel-heading>.panel-options a i {line-height: 1 }.panel .panel-heading>.panel-options a[data-toggle=panel] span {display: block;font-size: 16px;width: 10px;text-align: center }.panel .panel-heading>.panel-options a[data-toggle=panel] span.expand-icon {display: none;font-size: 18px }.panel .panel-heading>.panel-options a[data-toggle=remove] {font-size: 18px }.panel .panel-heading>.panel-options a:first-child {margin-left: 0 }.panel .panel-heading>.panel-options .nav-tabs {border: 0 }.panel .panel-heading>.panel-options .nav-tabs>li {border: 0 }.panel .panel-heading>.panel-options .nav-tabs>li>a {padding: 0;border: 0;margin-left: 15px;color: #979898;background: 0 0 }.panel .panel-heading>.panel-options .nav-tabs>li>a:hover {background: 0 0 }.panel .panel-heading>.panel-options .nav-tabs>li.active>a {color: #4b4b4b }.panel .panel-body {padding: 0;padding-top: 20px;color: #979898 }.panel .panel-body.no-padding {padding: 0;margin-top: -2px;margin-left: -30px;margin-right: -30px;margin-bottom: -20px }.panel .panel-body.panel-border {border-top: 1px solid #f5f5f5;padding-top: 30px }.panel .panel-body p {margin-bottom: 0 }.panel .panel-body p+p {margin-top: 15px }.panel .panel-disabled {position: absolute;left: 0;right: 0;top: 0;bottom: 0;background: rgba(255, 255, 255, .7) }.panel.collapsed .panel-heading .panel-options a[data-toggle=panel] .collapse-icon {display: none }.panel.collapsed .panel-heading .panel-options a[data-toggle=panel] .expand-icon {display: block }.panel.collapsed>.panel-body, .panel.collapsed>.table {display: none }.panel.panel-border {border: 1px solid #ccc }.panel.panel-shadow {-webkit-box-shadow: 0 1px 1px rgba(0, 1, 1, .08);-moz-box-shadow: 0 1px 1px rgba(0, 1, 1, .08);box-shadow: 0 1px 1px rgba(0, 1, 1, .08) }.panel.panel-inverted {background: #2c2e2f;color: #FFF }.panel.panel-inverted>.panel-heading {border-bottom-color: #393c3e }.panel.panel-inverted>.panel-disabled {background: rgba(44, 46, 47, .5) }.panel.panel-tabs {background: 0 0;padding-left: 0;padding-right: 0;margin-bottom: 10px;padding-top: 7px }.panel.panel-tabs>.panel-heading {border-bottom: 0 }.panel.panel-tabs>.panel-heading .nav-tabs {position: relative;margin-bottom: -21px;margin-right: -2px }.panel.panel-tabs>.panel-heading .nav-tabs>li>a {position: relative;background-color: #f5f5f5;padding: 15px 20px;margin-left: 5px;top: -6px }.panel.panel-tabs>.panel-heading .nav-tabs>li:hover>a, .panel.panel-tabs>.panel-heading .nav-tabs>li.active>a {background-color: #FFF }.panel.panel-tabs>.panel-body {background: #FFF;padding: 20px 30px }.panel.panel-flat {background: 0 0;padding-top: 0;padding-left: 0;padding-right: 0 }.panel.panel-flat .panel-heading {border-bottom-color: #ddd }.panel.panel-flat .panel-disabled {background: rgba(238, 238, 238, .6) }.panel.panel-success .panel-heading {background-color: #8dc63f;color: #fff }.panel.panel-success .panel-heading>.panel-title {color: #fff }.panel.panel-success .panel-heading>.panel-title>a {color: inherit }.panel.panel-success .panel-heading>.panel-options {color: #fff }.panel.panel-success .panel-heading>.panel-options a {color: rgba(255, 255, 255, .6) }.panel.panel-success .panel-heading>.panel-options a:hover {color: #fff }.panel.panel-success>.panel-disabled {background-color: rgba(141, 198, 63, .15) }.panel.panel-info .panel-heading {background-color: #40bbea;color: #fff }.panel.panel-info .panel-heading>.panel-title {color: #fff }.panel.panel-info .panel-heading>.panel-title>a {color: inherit }.panel.panel-info .panel-heading>.panel-options {color: #fff }.panel.panel-info .panel-heading>.panel-options a {color: rgba(255, 255, 255, .6) }.panel.panel-info .panel-heading>.panel-options a:hover {color: #fff }.panel.panel-info>.panel-disabled {background-color: rgba(64, 187, 234, .15) }.panel.panel-warning .panel-heading {background-color: #ffba00;color: #fff }.panel.panel-warning .panel-heading>.panel-title {color: #fff }.panel.panel-warning .panel-heading>.panel-title>a {color: inherit }.panel.panel-warning .panel-heading>.panel-options {color: #fff }.panel.panel-warning .panel-heading>.panel-options a {color: rgba(255, 255, 255, .6) }.panel.panel-warning .panel-heading>.panel-options a:hover {color: #fff }.panel.panel-warning>.panel-disabled {background-color: rgba(255, 186, 0, .15) }.panel.panel-danger .panel-heading {background-color: #cc3f44;color: #fff }.panel.panel-danger .panel-heading>.panel-title {color: #fff }.panel.panel-danger .panel-heading>.panel-title>a {color: inherit }.panel.panel-danger .panel-heading>.panel-options {color: #fff }.panel.panel-danger .panel-heading>.panel-options a {color: rgba(255, 255, 255, .6) }.panel.panel-danger .panel-heading>.panel-options a:hover {color: #fff }.panel.panel-danger>.panel-disabled {background-color: rgba(204, 63, 68, .15) }.panel.panel-red .panel-heading {background-color: #d5080f;color: #fff }.panel.panel-red .panel-heading>.panel-title {color: #fff }.panel.panel-red .panel-heading>.panel-title>a {color: inherit }.panel.panel-red .panel-heading>.panel-options {color: #fff }.panel.panel-red .panel-heading>.panel-options a {color: rgba(255, 255, 255, .6) }.panel.panel-red .panel-heading>.panel-options a:hover {color: #fff }.panel.panel-red>.panel-disabled {background-color: rgba(213, 8, 15, .15) }.panel.panel-black .panel-heading {background-color: #222;color: #fff }.panel.panel-black .panel-heading>.panel-title {color: #fff }.panel.panel-black .panel-heading>.panel-title>a {color: inherit }.panel.panel-black .panel-heading>.panel-options {color: #fff }.panel.panel-black .panel-heading>.panel-options a {color: rgba(255, 255, 255, .6) }.panel.panel-black .panel-heading>.panel-options a:hover {color: #fff }.panel.panel-black>.panel-disabled {background-color: rgba(34, 34, 34, .15) }.panel.panel-purple .panel-heading {background-color: #7c38bc;color: #fff }.panel.panel-purple .panel-heading>.panel-title {color: #fff }.panel.panel-purple .panel-heading>.panel-title>a {color: inherit }.panel.panel-purple .panel-heading>.panel-options {color: #fff }.panel.panel-purple .panel-heading>.panel-options a {color: rgba(255, 255, 255, .6) }.panel.panel-purple .panel-heading>.panel-options a:hover {color: #fff }.panel.panel-purple>.panel-disabled {background-color: rgba(124, 56, 188, .15) }.panel.panel-blue .panel-heading {background-color: #0e62c7;color: #fff }.panel.panel-blue .panel-heading>.panel-title {color: #fff }.panel.panel-blue .panel-heading>.panel-title>a {color: inherit }.panel.panel-blue .panel-heading>.panel-options {color: #fff }.panel.panel-blue .panel-heading>.panel-options a {color: rgba(255, 255, 255, .6) }.panel.panel-blue .panel-heading>.panel-options a:hover {color: #fff }.panel.panel-blue>.panel-disabled {background-color: rgba(14, 98, 199, .15) }.panel.panel-light-blue .panel-heading {background-color: #4fcdfc;color: #fff }.panel.panel-light-blue .panel-heading>.panel-title {color: #fff }.panel.panel-light-blue .panel-heading>.panel-title>a {color: inherit }.panel.panel-light-blue .panel-heading>.panel-options {color: #fff }.panel.panel-light-blue .panel-heading>.panel-options a {color: rgba(255, 255, 255, .6) }.panel.panel-light-blue .panel-heading>.panel-options a:hover {color: #fff }.panel.panel-light-blue>.panel-disabled {background-color: rgba(79, 205, 252, .15) }.panel.panel-gray .panel-heading {background-color: #e1e1e1;color: #717272 }.panel.panel-gray .panel-heading>.panel-title {color: #717272 }.panel.panel-gray .panel-heading>.panel-title>a {color: inherit }.panel.panel-gray .panel-heading>.panel-options {color: #717272 }.panel.panel-gray .panel-heading>.panel-options a {color: rgba(113, 114, 114, .6) }.panel.panel-gray .panel-heading>.panel-options a:hover {color: #717272 }.panel.panel-gray>.panel-disabled {background-color: rgba(225, 225, 225, .15) }.panel.panel-color .panel-heading {margin-top: -20px;margin-left: -30px;margin-right: -30px;padding: 20px 30px;border-bottom: 0 }.panel.panel-color.collapsed>.panel-heading {margin-bottom: -20px }.breadcrumb {background: 0 0 }.breadcrumb li i {margin-right: 4px }.breadcrumb li a {color: #979898 }.breadcrumb li.active>* {color: #646565 }.breadcrumb.bc-2 {background-color: #eee }.breadcrumb.bc-3 {border: 1px solid #ddd }.breadcrumb.auto-hidden li {display: block;float: left }.breadcrumb.auto-hidden li:before {display: block;float: left }.breadcrumb.auto-hidden li a {display: block;float: left;white-space: nowrap;overflow: hidden }.breadcrumb.auto-hidden li a.collapsed {width: 45px!important;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;max-width: 100% }@media screen and (max-width:768px) {body.chat-open .settings-pane {left: -340px }}.settings-pane {background: #27292a;color: #fff;display: none;position: relative;overflow: hidden;-webkit-perspective: 500px;-moz-perspective: 500px;perspective: 500px;-webkit-transform-origin: center bottom;-moz-transform-origin: center bottom;-o-transform-origin: center bottom;-ms-transform-origin: center bottom;transform-origin: center bottom }@media screen and (max-width:768px) {.settings-pane {padding: 30px }}.settings-pane .settings-pane-inner {position: relative;padding: 50px }@media screen and (max-width:768px) {.settings-pane .settings-pane-inner {padding: 0 }}.settings-pane .settings-pane-inner.with-animation {zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-webkit-transition: all 350ms cubic-bezier(0.785, .135, .15, .86);-moz-transition: all 350ms cubic-bezier(0.785, .135, .15, .86);-o-transition: all 350ms cubic-bezier(0.785, .135, .15, .86);transition: all 350ms cubic-bezier(0.785, .135, .15, .86) }.settings-pane .settings-pane-inner.with-animation.visible {zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-webkit-transition-delay: 200ms;-moz-transition-delay: 200ms;-o-transition-delay: 200ms;transition-delay: 200ms }.settings-pane .settings-pane-inner.with-animation.closing {zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-webkit-transition-delay: 0ms;-moz-transition-delay: 0ms;-o-transition-delay: 0ms;transition-delay: 0ms }.settings-pane>a[data-toggle=settings-pane] {display: block;color: #979898;position: absolute;right: 0;top: 0;padding: 10px 12px;font-size: 18px;line-height: 1;z-index: 100 }.settings-pane>a[data-toggle=settings-pane]:hover {color: #FFF }.settings-pane .user-info {display: table;width: 100%;border-spacing: 0;border-collapse: collapse }@media screen and (min-width:768px) and (max-width:992px) {.settings-pane .user-info {width: auto;margin: 0 auto;margin-bottom: 20px }}@media screen and (max-width:768px) {.settings-pane .user-info {width: auto;margin: 0 auto;margin-bottom: 20px }}.settings-pane .user-info .user-image, .settings-pane .user-info .user-details {display: table-cell;vertical-align: middle }.settings-pane .user-info .user-image {width: 130px }.settings-pane .user-info .user-image a {display: block;position: relative }.settings-pane .user-info .user-details {padding-left: 20px }.settings-pane .user-info .user-details h3 {margin: 0 }.settings-pane .user-info .user-details h3 a {color: #fff }.settings-pane .user-info .user-details h3 .user-status {position: relative;display: inline-block;background: #FFF;top: -3px;margin-left: 5px;width: 8px;height: 8px;-webkit-border-radius: 50%;-webkit-background-clip: padding-box;-moz-border-radius: 50%;-moz-background-clip: padding;border-radius: 50%;background-clip: padding-box }.settings-pane .user-info .user-details h3 .user-status.is-online {background-color: #8dc63f }.settings-pane .user-info .user-details h3 .user-status.is-idle {background-color: #ffba00 }.settings-pane .user-info .user-details h3 .user-status.is-busy {background-color: #d5080f }.settings-pane .user-info .user-details h3 .user-status.is-offline {background-color: #CCC }.settings-pane .user-info .user-details .user-title {color: rgba(255, 255, 255, .65);margin: 0;margin-top: 5px }.settings-pane .user-info .user-details .user-links {margin-top: 15px }.settings-pane .user-info .user-details .user-links a {display: inline-block }.settings-pane .user-info .user-details .user-links a+a {margin-left: 8px }.settings-pane .links-block {display: inline-block;padding-right: 85px;text-align: left }@media screen and (max-width:991px) {.settings-pane .links-block {padding-right: 40px;margin-top: 10px }}.settings-pane .links-block.left-sep {border-left: 1px solid #323435;padding-left: 75px }@media screen and (max-width:991px) {.settings-pane .links-block.left-sep {padding-left: 40px }.settings-pane .links-block.left-sep:first-child {border-left: 0 }}@media screen and (max-width:599px) {.settings-pane .links-block.left-sep {padding: 0 25px }}.settings-pane .links-block h4 {color: #fff;margin: 0;margin-bottom: 15px }.settings-pane .links-block h4 span {display: inline-block;border-bottom: 1px solid #323435;padding-bottom: 5px }.settings-pane .links-block h4 a {color: #fff }.settings-pane .links-block h4 a:hover {color: #979898 }.settings-pane .links-block ul li label {display: inline-block;padding-left: 5px;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none }.settings-pane .links-block ul li a {color: #979898;display: block }.settings-pane .links-block ul li a:hover {color: #fff }.settings-pane .links-block ul li+li a {margin-top: 5px }.settings-pane .link-blocks-env {text-align: center }.settings-pane-open .settings-pane {display: block }.settings-pane-open .sidebar-menu .sidebar-menu-inner {position: relative!important }.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon {background: #27292a;-webkit-box-shadow: 0 0 0 10px #27292a, 0 -10px 0 10px #27292a, 0 -20px 0 10px #27292a, 0 -30px 0 10px #27292a;-moz-box-shadow: 0 0 0 10px #27292a, 0 -10px 0 10px #27292a, 0 -20px 0 10px #27292a, 0 -30px 0 10px #27292a;box-shadow: 0 0 0 10px #27292a, 0 -10px 0 10px #27292a, 0 -20px 0 10px #27292a, 0 -30px 0 10px #27292a }.cbr-replaced {position: relative;display: inline-block;vertical-align: middle;top: -1px;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none }.cbr-replaced .cbr-input {display: none }.cbr-replaced .cbr-state {position: relative;display: block;background: #FFF;border: 1px solid #ddd;line-height: 1;width: 15px;height: 15px }.cbr-replaced .cbr-state span {display: block;background: url(../images/ok.png) no-repeat center center;background-image: none;position: absolute;left: 0;right: 0;bottom: 0;top: 0;cursor: pointer }.cbr-replaced.cbr-checked span {background-image: url(../images/ok.png) }.cbr-replaced.cbr-disabled {zoom: 1;filter: alpha(opacity=40);-webkit-opacity: .4;-moz-opacity: .4;opacity: .4 }.cbr-replaced.cbr-radio .cbr-state {-webkit-border-radius: 50%;-webkit-background-clip: padding-box;-moz-border-radius: 50%;-moz-background-clip: padding;border-radius: 50%;background-clip: padding-box }.cbr-replaced.cbr-radio .cbr-state span {background: #FFF;left: 2px;right: 2px;top: 2px;bottom: 2px;-webkit-border-radius: 50%;-webkit-background-clip: padding-box;-moz-border-radius: 50%;-moz-background-clip: padding;border-radius: 50%;background-clip: padding-box }.cbr-replaced.cbr-radio.cbr-checked .cbr-state span {background: #ddd }.cbr-replaced.cbr-primary .cbr-state {background: #2c2e2f;border-color: #323435 }.cbr-replaced.cbr-primary.cbr-checked span {background-image: url(../images/ok-white-full.png) }.cbr-replaced.cbr-primary.cbr-radio .cbr-state {background: #fff }.cbr-replaced.cbr-primary.cbr-radio .cbr-state span {background-color: #fff }.cbr-replaced.cbr-primary.cbr-radio.cbr-checked .cbr-state span {background: #2c2e2f }.cbr-replaced.cbr-secondary .cbr-state {background: #68b828;border-color: #68b828 }.cbr-replaced.cbr-secondary.cbr-checked span {background-image: url(../images/ok-white-full.png) }.cbr-replaced.cbr-secondary.cbr-checked.cbr-radio .cbr-state span {background: #68b828 }.cbr-replaced.cbr-secondary.cbr-radio .cbr-state {background: #fff }.cbr-replaced.cbr-success .cbr-state {background: #8dc63f;border-color: #8dc63f }.cbr-replaced.cbr-success.cbr-checked span {background-image: url(../images/ok-white-full.png) }.cbr-replaced.cbr-success.cbr-checked.cbr-radio .cbr-state span {background: #8dc63f }.cbr-replaced.cbr-success.cbr-radio .cbr-state {background: #fff }.cbr-replaced.cbr-info .cbr-state {background: #40bbea;border-color: #40bbea }.cbr-replaced.cbr-info.cbr-checked span {background-image: url(../images/ok-white-full.png) }.cbr-replaced.cbr-info.cbr-checked.cbr-radio .cbr-state span {background: #40bbea }.cbr-replaced.cbr-info.cbr-radio .cbr-state {background: #fff }.cbr-replaced.cbr-danger .cbr-state {background: #cc3f44;border-color: #cc3f44 }.cbr-replaced.cbr-danger.cbr-checked span {background-image: url(../images/ok-white-full.png) }.cbr-replaced.cbr-danger.cbr-checked.cbr-radio .cbr-state span {background: #cc3f44 }.cbr-replaced.cbr-danger.cbr-radio .cbr-state {background: #fff }.cbr-replaced.cbr-warning .cbr-state {background: #ffba00;border-color: #ffba00 }.cbr-replaced.cbr-warning.cbr-checked span {background-image: url(../images/ok-white-full.png) }.cbr-replaced.cbr-warning.cbr-checked.cbr-radio .cbr-state span {background: #ffba00 }.cbr-replaced.cbr-warning.cbr-radio .cbr-state {background: #fff }.cbr-replaced.cbr-red .cbr-state {background: #d5080f;border-color: #d5080f }.cbr-replaced.cbr-red.cbr-checked span {background-image: url(../images/ok-white-full.png) }.cbr-replaced.cbr-red.cbr-checked.cbr-radio .cbr-state span {background: #d5080f }.cbr-replaced.cbr-red.cbr-radio .cbr-state {background: #fff }.cbr-replaced.cbr-blue .cbr-state {background: #0e62c7;border-color: #0e62c7 }.cbr-replaced.cbr-blue.cbr-checked span {background-image: url(../images/ok-white-full.png) }.cbr-replaced.cbr-blue.cbr-checked.cbr-radio .cbr-state span {background: #0e62c7 }.cbr-replaced.cbr-blue.cbr-radio .cbr-state {background: #fff }.cbr-replaced.cbr-purple .cbr-state {background: #7c38bc;border-color: #7c38bc }.cbr-replaced.cbr-purple.cbr-checked span {background-image: url(../images/ok-white-full.png) }.cbr-replaced.cbr-purple.cbr-checked.cbr-radio .cbr-state span {background: #7c38bc }.cbr-replaced.cbr-purple.cbr-radio .cbr-state {background: #fff }.cbr-replaced.cbr-pink .cbr-state {background: #ff6264;border-color: #ff6264 }.cbr-replaced.cbr-pink.cbr-checked span {background-image: url(../images/ok-white-full.png) }.cbr-replaced.cbr-pink.cbr-checked.cbr-radio .cbr-state span {background: #ff6264 }.cbr-replaced.cbr-pink.cbr-radio .cbr-state {background: #fff }.cbr-replaced.cbr-orange .cbr-state {background: #f7aa47;border-color: #f7aa47 }.cbr-replaced.cbr-orange.cbr-checked span {background-image: url(../images/ok-white-full.png) }.cbr-replaced.cbr-orange.cbr-checked.cbr-radio .cbr-state span {background: #f7aa47 }.cbr-replaced.cbr-orange.cbr-radio .cbr-state {background: #fff }.cbr-replaced.cbr-turquoise .cbr-state {background: #00b19d;border-color: #00b19d }.cbr-replaced.cbr-turquoise.cbr-checked span {background-image: url(../images/ok-white-full.png) }.cbr-replaced.cbr-turquoise.cbr-checked.cbr-radio .cbr-state span {background: #00b19d }.cbr-replaced.cbr-turquoise.cbr-radio .cbr-state {background: #fff }.cbr-replaced.cbr-yellow .cbr-state {background: #fcd036;border-color: #fcd036 }.cbr-replaced.cbr-yellow.cbr-checked span {background-image: url(../images/ok-white-full.png) }.cbr-replaced.cbr-yellow.cbr-checked.cbr-radio .cbr-state span {background: #fcd036 }.cbr-replaced.cbr-yellow.cbr-radio .cbr-state {background: #fff }.cbr-replaced.cbr-gray .cbr-state {background: #c8c8c8;border-color: #c8c8c8 }.cbr-replaced.cbr-gray.cbr-checked span {background-image: url(../images/ok-white-full.png) }.cbr-replaced.cbr-gray.cbr-checked.cbr-radio .cbr-state span {background: #c8c8c8 }.cbr-replaced.cbr-gray.cbr-radio .cbr-state {background: #fff }.cbr-replaced.cbr-gray.cbr-checked span {background-image: url(../images/ok.png) }.cbr-replaced+label {padding-left: 5px }label .cbr-replaced {margin-right: 4px }label.cbr-inline {padding-top: 7px }label.cbr-inline+.cbr-inline {margin-left: 10px }.btn {outline: 0;border: 1px solid transparent;margin-bottom: 10px }.btn.text-left {text-align: left }.btn.text-right {text-align: right }.btn:active, .btn:focus {outline: 0!important }.btn:active, .btn.active {-webkit-box-shadow: inset 0 0 5px 2px rgba(0, 0, 0, .08);-moz-box-shadow: inset 0 0 5px 2px rgba(0, 0, 0, .08);box-shadow: inset 0 0 5px 2px rgba(0, 0, 0, .08) }.btn+.btn {margin-left: 5px }.btn+.btn.btn-block {margin-left: 0 }.btn.btn-single {margin-bottom: 0 }.btn.btn-icon {line-height: 1 }.btn.btn-icon i {vertical-align: middle;display: inline-block;padding: 5px 0 }.btn.btn-icon span {display: inline-block }.btn.btn-icon-standalone {padding: 0;border: 0;line-height: 1 }.btn.btn-icon-standalone i, .btn.btn-icon-standalone span {display: block;padding: 12px 12px }.btn.btn-icon-standalone i {border-right: 1px solid transparent;float: left }.btn.btn-icon-standalone span {padding-left: 55px;padding-right: 13px }.btn.btn-icon-standalone.btn-icon-standalone-right i {float: right;border-left: 1px solid transparent;border-right: 0 }.btn.btn-icon-standalone.btn-icon-standalone-right span {padding-left: 13px;padding-right: 55px }.btn.btn-icon-standalone.btn-lg i, .btn.btn-icon-standalone.btn-lg span {padding: 15px 16px }.btn.btn-icon-standalone.btn-lg span {padding-left: 75px }.btn.btn-icon-standalone.btn-lg.btn-icon-standalone-right span {padding-left: 17px;padding-right: 75px }.btn.btn-icon-standalone.btn-sm i, .btn.btn-icon-standalone.btn-sm span {padding: 8px 10px }.btn.btn-icon-standalone.btn-sm span {padding-left: 50px }.btn.btn-icon-standalone.btn-sm.btn-icon-standalone-right span {padding-left: 12px;padding-right: 50px }.btn.btn-icon-standalone.btn-xs i, .btn.btn-icon-standalone.btn-xs span {padding: 5px 5px }.btn.btn-icon-standalone.btn-xs span {padding-left: 34px }.btn.btn-icon-standalone.btn-xs.btn-icon-standalone-right span {padding-left: 10px;padding-right: 34px }.btn.btn-secondary {background-color: #68b828;color: #fff }.btn.btn-secondary:hover {background-color: #5ca323;text-color: #fff }.btn.btn-secondary:active, .btn.btn-secondary:focus {background-color: #5ca323;border-color: #579b22 }.btn.btn-purple {background-color: #7c38bc;color: #fff }.btn.btn-purple:hover {background-color: #6f32a8;text-color: #fff }.btn.btn-purple:active, .btn.btn-purple:focus {background-color: #6f32a8;border-color: #6a30a0 }.btn.btn-orange {background-color: #f7aa47;color: #fff }.btn.btn-orange:hover {background-color: #f69f2f;text-color: #fff }.btn.btn-orange:active, .btn.btn-orange:focus {background-color: #f69f2f;border-color: #f69a25 }.btn.btn-pink {background-color: #ff6264;color: #fff }.btn.btn-pink:hover {background-color: #ff484b;text-color: #fff }.btn.btn-pink:active, .btn.btn-pink:focus {background-color: #ff484b;border-color: #ff3e41 }.btn.btn-turquoise {background-color: #00b19d;color: #fff }.btn.btn-turquoise:hover {background-color: #009886;text-color: #fff }.btn.btn-turquoise:active, .btn.btn-turquoise:focus {background-color: #009886;border-color: #008d7d }.btn.btn-blue {background-color: #0e62c7;color: #fff }.btn.btn-blue:hover {background-color: #0c56af;text-color: #fff }.btn.btn-blue:active, .btn.btn-blue:focus {background-color: #0c56af;border-color: #0c52a6 }.btn.btn-red {background-color: #d5080f;color: #fff }.btn.btn-red:hover {background-color: #bc070d;text-color: #fff }.btn.btn-red:active, .btn.btn-red:focus {background-color: #bc070d;border-color: #b3070d }.btn.btn-gray {background-color: #eee;color: #333 }.btn.btn-gray:hover {background-color: #e1e1e1;text-color: #333 }.btn.btn-gray:active, .btn.btn-gray:focus {background-color: #e1e1e1;border-color: #dcdcdc }.btn.btn-black {background-color: #222;color: #fff }.btn.btn-black:hover {background-color: #151515;text-color: #fff }.btn.btn-black:active, .btn.btn-black:focus {background-color: #151515;border-color: #101010 }.btn.btn-black:hover {background-color: #3c3c3c }.btn.btn-white {background-color: #fff;color: #333;border: 1px solid #ddd }.btn.btn-white:hover {background-color: #f2f2f2;text-color: #333 }.btn.btn-white:active, .btn.btn-white:focus {background-color: #f2f2f2;border-color: #ededed }.btn.btn-primary.btn-icon-standalone i {background-color: #383b3c;border-right-color: #454849 }.btn.btn-primary.btn-icon-standalone.btn-icon-standalone-right i {border-left-color: #454849 }.btn.btn-primary.btn-icon-standalone.btn-icon-standalone-right:hover i {border-left-color: #1d1f1f }.btn.btn-primary.btn-icon-standalone:hover i {border-right-color: #1d1f1f }.btn.btn-secondary.btn-icon-standalone i {background-color: #63b026;border-right-color: #5fa724 }.btn.btn-secondary.btn-icon-standalone.btn-icon-standalone-right i {border-left-color: #5fa724 }.btn.btn-secondary.btn-icon-standalone.btn-icon-standalone-right:hover i {border-left-color: #5a9f23 }.btn.btn-secondary.btn-icon-standalone:hover i {border-right-color: #5a9f23 }.btn.btn-info.btn-icon-standalone i {background-color: #2eb4e8;border-right-color: #1baee6 }.btn.btn-info.btn-icon-standalone.btn-icon-standalone-right i {border-left-color: #1baee6 }.btn.btn-info.btn-icon-standalone.btn-icon-standalone-right:hover i {border-left-color: #24b1e7 }.btn.btn-info.btn-icon-standalone:hover i {border-right-color: #24b1e7 }.btn.btn-danger.btn-icon-standalone i {background-color: #c33439;border-right-color: #b32f34 }.btn.btn-danger.btn-icon-standalone.btn-icon-standalone-right i {border-left-color: #b32f34 }.btn.btn-danger.btn-icon-standalone.btn-icon-standalone-right:hover i {border-left-color: #bb3236 }.btn.btn-danger.btn-icon-standalone:hover i {border-right-color: #bb3236 }.btn.btn-warning.btn-icon-standalone i {background-color: #f0af00;border-right-color: #e6a700 }.btn.btn-warning.btn-icon-standalone.btn-icon-standalone-right i {border-left-color: #e6a700 }.btn.btn-warning.btn-icon-standalone.btn-icon-standalone-right:hover i {border-left-color: #e0a400 }.btn.btn-warning.btn-icon-standalone:hover i {border-right-color: #e0a400 }.btn.btn-red.btn-icon-standalone i {background-color: #c1070e;border-right-color: #b8070d }.btn.btn-red.btn-icon-standalone.btn-icon-standalone-right i {border-left-color: #b8070d }.btn.btn-red.btn-icon-standalone.btn-icon-standalone-right:hover i {border-left-color: #b8070d }.btn.btn-red.btn-icon-standalone:hover i {border-right-color: #b8070d }.btn.btn-purple.btn-icon-standalone i {background-color: #7233ac;border-right-color: #NaNNaNNaN }.btn.btn-purple.btn-icon-standalone.btn-icon-standalone-right i {border-left-color: #NaNNaNNaN }.btn.btn-purple.btn-icon-standalone.btn-icon-standalone-right:hover i {border-left-color: #6c31a4 }.btn.btn-purple.btn-icon-standalone:hover i {border-right-color: #6c31a4 }.btn.btn-blue.btn-icon-standalone i {background-color: #0d59b4;border-right-color: #0c54aa }.btn.btn-blue.btn-icon-standalone.btn-icon-standalone-right i {border-left-color: #0c54aa }.btn.btn-blue.btn-icon-standalone.btn-icon-standalone-right:hover i {border-left-color: #0c54aa }.btn.btn-blue.btn-icon-standalone:hover i {border-right-color: #0c54aa }.btn.btn-white.btn-icon-standalone i {background-color: #f5f5f5;border-right-color: #e6e6e6 }.btn.btn-white.btn-icon-standalone.btn-icon-standalone-right i {border-left-color: #e6e6e6 }.btn.btn-white.btn-icon-standalone.btn-icon-standalone-right:hover i {border-left-color: #e0e0e0 }.btn.btn-white.btn-icon-standalone:hover i {border-right-color: #e0e0e0 }.btn.btn-gray.btn-icon-standalone i {background-color: #e4e4e4;border-right-color: #d5d5d5 }.btn.btn-gray.btn-icon-standalone.btn-icon-standalone-right i {border-left-color: #d5d5d5 }.btn.btn-gray.btn-icon-standalone.btn-icon-standalone-right:hover i {border-left-color: #cfcfcf }.btn.btn-gray.btn-icon-standalone:hover i {border-right-color: #cfcfcf }.btn.btn-black.btn-icon-standalone i {background-color: #2f2f2f;border-right-color: #3c3c3c }.btn.btn-black.btn-icon-standalone.btn-icon-standalone-right i {border-left-color: #3c3c3c }.btn.btn-black.btn-icon-standalone.btn-icon-standalone-right:hover i {border-left-color: #414141 }.btn.btn-black.btn-icon-standalone:hover i {border-right-color: #414141 }.btn-group .btn.btn-purple:hover {border-color: #552681 }.btn-group .btn.btn-red:hover {border-color: #8b050a }.btn-group .btn.btn-blue:hover {border-color: #093f80 }.btn-group .btn.btn-white:hover {border-color: #d9d9d9 }.btn-group .btn.btn-gray:hover {border-color: #c8c8c8 }.btn-group .btn.btn-black:hover {border-color: #484848 }.btn-unstyled {margin: 0;padding: 0;background: 0 0;border: 0;height: auto;line-height: 1 }.btn-unstyled:active, .btn-unstyled:focus {background: 0 0;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.dropdown-menu.no-spacing {margin-top: -10px }.dropdown-menu.dropdown-primary {background: #2c2e2f;border-color: #2c2e2f }.dropdown-menu.dropdown-primary .divider {height: 1px;margin: 8px 0;overflow: hidden;background-color: #454849 }.dropdown-menu.dropdown-primary>li>a {color: #fff }.dropdown-menu.dropdown-primary>li>a:hover {background-color: #454849 }.dropdown-menu.dropdown-secondary {background: #68b828;border-color: #68b828 }.dropdown-menu.dropdown-secondary .divider {height: 1px;margin: 8px 0;overflow: hidden;background-color: #5ca323 }.dropdown-menu.dropdown-secondary>li>a {color: #fff }.dropdown-menu.dropdown-secondary>li>a:hover {background-color: #5ca323 }.dropdown-menu.dropdown-info {background: #40bbea;border-color: #40bbea }.dropdown-menu.dropdown-info .divider {height: 1px;margin: 8px 0;overflow: hidden;background-color: #1baee6 }.dropdown-menu.dropdown-info>li>a {color: #fff }.dropdown-menu.dropdown-info>li>a:hover {background-color: #1baee6 }.dropdown-menu.dropdown-success {background: #8dc63f;border-color: #8dc63f }.dropdown-menu.dropdown-success .divider {height: 1px;margin: 8px 0;overflow: hidden;background-color: #80b636 }.dropdown-menu.dropdown-success>li>a {color: #fff }.dropdown-menu.dropdown-success>li>a:hover {background-color: #80b636 }.dropdown-menu.dropdown-warning {background: #ffba00;border-color: #ffba00 }.dropdown-menu.dropdown-warning .divider {height: 1px;margin: 8px 0;overflow: hidden;background-color: #e6a700 }.dropdown-menu.dropdown-warning>li>a {color: #fff }.dropdown-menu.dropdown-warning>li>a:hover {background-color: #e6a700 }.dropdown-menu.dropdown-danger {background: #cc3f44;border-color: #cc3f44 }.dropdown-menu.dropdown-danger .divider {height: 1px;margin: 8px 0;overflow: hidden;background-color: #b32f34 }.dropdown-menu.dropdown-danger>li>a {color: #fff }.dropdown-menu.dropdown-danger>li>a:hover {background-color: #b32f34 }.dropdown-menu.dropdown-red {background: #d5080f;border-color: #d5080f }.dropdown-menu.dropdown-red .divider {height: 1px;margin: 8px 0;overflow: hidden;background-color: #bc070d }.dropdown-menu.dropdown-red>li>a {color: #fff }.dropdown-menu.dropdown-red>li>a:hover {background-color: #bc070d }.dropdown-menu.dropdown-purple {background: #7c38bc;border-color: #7c38bc }.dropdown-menu.dropdown-purple .divider {height: 1px;margin: 8px 0;overflow: hidden;background-color: #672f9d }.dropdown-menu.dropdown-purple>li>a {color: #fff }.dropdown-menu.dropdown-purple>li>a:hover {background-color: #672f9d }.dropdown-menu.dropdown-blue {background: #0e62c7;border-color: #0e62c7 }.dropdown-menu.dropdown-blue .divider {height: 1px;margin: 8px 0;overflow: hidden;background-color: #0b4fa1 }.dropdown-menu.dropdown-blue>li>a {color: #fff }.dropdown-menu.dropdown-blue>li>a:hover {background-color: #0b4fa1 }.dropdown-menu.dropdown-black {background: #222;border-color: #222 }.dropdown-menu.dropdown-black .divider {height: 1px;margin: 8px 0;overflow: hidden;background-color: #363636 }.dropdown-menu.dropdown-black>li>a {color: #fff }.dropdown-menu.dropdown-black>li>a:hover {background-color: #363636 }.dropdown-menu.dropdown-white.no-spacing {margin-top: -11px }.nav.nav-tabs {border-bottom: 0 }.nav.nav-tabs>li {display: inline-block;float: none;margin-bottom: 0 }.nav.nav-tabs>li>a {border: none;background-color: #f4f4f4;margin-right: 5px;padding-left: 20px;padding-right: 20px;cursor: pointer }.nav.nav-tabs>li>a:hover {border: none;background-color: #fff }.nav.nav-tabs>li.active>a {border: 0;background-color: #fff }.nav.nav-tabs.right-aligned, .right-aligned .nav.nav-tabs {text-align: right }.nav.nav-tabs.right-aligned>li, .right-aligned .nav.nav-tabs>li {float: none;display: inline-block }.nav.nav-tabs.right-aligned>li>a, .right-aligned .nav.nav-tabs>li>a {margin-right: 0;margin-left: 5px }.nav.nav-tabs.nav-tabs-justified, .nav-tabs-justified .nav.nav-tabs {display: table;width: 100%;table-layout: fixed;border-collapse: separate }.nav.nav-tabs.nav-tabs-justified:before, .nav-tabs-justified .nav.nav-tabs:before, .nav.nav-tabs.nav-tabs-justified:after, .nav-tabs-justified .nav.nav-tabs:after {display: none }.nav.nav-tabs.nav-tabs-justified>li, .nav-tabs-justified .nav.nav-tabs>li {display: table-cell;vertical-align: top;width: 1%;text-align: center }.nav.nav-tabs.nav-tabs-justified>li:last-child>a, .nav-tabs-justified .nav.nav-tabs>li:last-child>a {margin-right: 0 }.nav.nav-tabs+.tab-content {background: #FFF;padding: 30px;margin-bottom: 30px }.nav.nav-tabs+.tab-content>p:last-child, .nav.nav-tabs+.tab-content *>p:last-child {margin-bottom: 0 }.panel-group .panel .panel-heading {padding-bottom: 0;border-bottom: 0 }.panel-group .panel .panel-heading .panel-title {float: none }.panel-group .panel .panel-heading a[data-toggle=collapse], .panel-group .panel .panel-heading .accordion-toggle {display: block }.panel-group .panel .panel-heading a[data-toggle=collapse]:before, .panel-group .panel .panel-heading .accordion-toggle:before {float: right;display: block;content: '–';font-size: 18px;width: 25px;text-align: right }.panel-group .panel .panel-heading a[data-toggle=collapse].collapsed:before, .panel-group .panel .panel-heading .accordion-toggle.collapsed:before {content: '+' }.panel-group .panel .panel-heading .accordion-toggle {cursor: pointer }.panel-group .panel .panel-heading .accordion-toggle:before {content: '+' }.panel-group .panel .panel-heading+.panel-collapse .panel-body {border-top: 2px solid #f5f5f5;margin-top: 15px }.panel-group.panel-group-joined, .panel-group-joined .panel-group {border: 1px solid #ddd }.panel-group.panel-group-joined .panel .panel-collapse .panel-body, .panel-group-joined .panel-group .panel .panel-collapse .panel-body {border-top: 0;padding-top: 0 }.panel-group.panel-group-joined .panel+.panel, .panel-group-joined .panel-group .panel+.panel {margin-top: 0;border-top: 1px solid #ddd }.panel.expanded .accordion-toggle:before {content: '–'!important }.tabs-vertical-env {display: table;margin-bottom: 30px;width: 100% }.tabs-vertical-env .nav.tabs-vertical, .tabs-vertical-env .tab-content {display: table-cell;vertical-align: top }.tabs-vertical-env .nav.tabs-vertical {min-width: 120px;width: 150px }.tabs-vertical-env .nav.tabs-vertical li>a {background-color: #f4f4f4;margin-bottom: 5px;text-align: center;white-space: nowrap }.tabs-vertical-env .nav.tabs-vertical li.active>a {background-color: #fff }.tabs-vertical-env .nav.tabs-vertical li:last-child {padding-bottom: 20px }.tabs-vertical-env .tab-content {padding: 30px;background: #FFF }.tabs-vertical-env .tab-content *>p:last-child {margin-bottom: 0 }.tabs-vertical-env.tabs-vertical-bordered .tab-content, .tabs-vertical-env.tabs-vertical-bordered .nav.tabs-vertical>li>a {border: 1px solid #ddd }.tabs-vertical-env.tabs-vertical-bordered .nav.tabs-vertical {position: relative;right: -1px }.tabs-vertical-env.tabs-vertical-bordered .nav.tabs-vertical>li.active>a {border-right-color: #fff }.tabs-vertical-env.tabs-vertical-bordered.right-aligned .nav.tabs-vertical {right: 1px }.tabs-vertical-env.tabs-vertical-bordered.right-aligned .nav.tabs-vertical>li.active>a {border-left-color: #fff;border-right-color: #ddd }.label {position: relative }.label.pull-right {margin-top: 4px }.label.pull-left {margin-top: 4px;margin-right: 5px }.label.label-primary {background-color: #2c2e2f;color: #fff }.label.label-secondary {background-color: #68b828;color: #fff }.label.label-success {background-color: #8dc63f;color: #fff }.label.label-danger {background-color: #cc3f44;color: #fff }.label.label-info {background-color: #40bbea;color: #fff }.label.label-warning {background-color: #ffba00;color: #fff }.label.label-red {background-color: #d5080f;color: #fff }.label.label-purple {background-color: #7c38bc;color: #fff }.label.label-pink {background-color: #ff6264;color: #fff }.label.label-yellow {background-color: #fcd036;color: #fff }.label.label-orange {background-color: #f7aa47;color: #fff }.label.label-turquoise {background-color: #00b19d;color: #fff }.label.label-blue {background-color: #0e62c7;color: #fff }.label.label-black {background-color: #222;color: #fff }.label.label-white {color: #333;-webkit-box-shadow: 0 0 0 1px #ddd;-moz-box-shadow: 0 0 0 1px #ddd;box-shadow: 0 0 0 1px #ddd }.line-height-default li {line-height: 1.85 }.popover+.btn, .tooltip+.btn {margin-left: 5px }.popover {padding: 0;border: 1px solid #ddd;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.popover.popover-primary .popover-title {background-color: #2c2e2f;color: #FFF;position: relative }.popover.popover-primary.top .popover-title, .popover.popover-primary.bottom .popover-title {margin: -1px }.popover.popover-primary.bottom .arrow:after {border-bottom-color: #2c2e2f }.popover.popover-secondary .popover-title {background-color: #68b828;color: #FFF;position: relative }.popover.popover-secondary.top .popover-title, .popover.popover-secondary.bottom .popover-title {margin: -1px }.popover.popover-secondary.bottom .arrow:after {border-bottom-color: #68b828 }.popover.popover-info .popover-title {background-color: #40bbea;color: #FFF;position: relative }.popover.popover-info.top .popover-title, .popover.popover-info.bottom .popover-title {margin: -1px }.popover.popover-info.bottom .arrow:after {border-bottom-color: #40bbea }.popover.popover-warning .popover-title {background-color: #ffba00;color: #FFF;position: relative }.popover.popover-warning.top .popover-title, .popover.popover-warning.bottom .popover-title {margin: -1px }.popover.popover-warning.bottom .arrow:after {border-bottom-color: #ffba00 }.popover.popover-danger .popover-title {background-color: #cc3f44;color: #FFF;position: relative }.popover.popover-danger.top .popover-title, .popover.popover-danger.bottom .popover-title {margin: -1px }.popover.popover-danger.bottom .arrow:after {border-bottom-color: #cc3f44 }.popover.popover-success .popover-title {background-color: #8dc63f;color: #FFF;position: relative }.popover.popover-success.top .popover-title, .popover.popover-success.bottom .popover-title {margin: -1px }.popover.popover-success.bottom .arrow:after {border-bottom-color: #8dc63f }.popover.popover-purple .popover-title {background-color: #7c38bc;color: #FFF;position: relative }.popover.popover-purple.top .popover-title, .popover.popover-purple.bottom .popover-title {margin: -1px }.popover.popover-purple.bottom .arrow:after {border-bottom-color: #7c38bc }.popover.popover-blue .popover-title {background-color: #0e62c7;color: #FFF;position: relative }.popover.popover-blue.top .popover-title, .popover.popover-blue.bottom .popover-title {margin: -1px }.popover.popover-blue.bottom .arrow:after {border-bottom-color: #0e62c7 }.popover.popover-red .popover-title {background-color: #d5080f;color: #FFF;position: relative }.popover.popover-red.top .popover-title, .popover.popover-red.bottom .popover-title {margin: -1px }.popover.popover-red.bottom .arrow:after {border-bottom-color: #d5080f }.popover.popover-black .popover-title {background-color: #0e62c7;color: #FFF;position: relative }.popover.popover-black.top .popover-title, .popover.popover-black.bottom .popover-title {margin: -1px }.popover.popover-black.bottom .arrow:after {border-bottom-color: #0e62c7 }.tooltip .tooltip-inner {padding: 10px 15px }.tooltip.tooltip-primary .tooltip-inner {background-color: #2c2e2f }.tooltip.tooltip-primary.top .tooltip-arrow {border-top-color: #2c2e2f }.tooltip.tooltip-primary.bottom .tooltip-arrow {border-bottom-color: #2c2e2f }.tooltip.tooltip-primary.left .tooltip-arrow {border-left-color: #2c2e2f }.tooltip.tooltip-primary.right .tooltip-arrow {border-right-color: #2c2e2f }.tooltip.tooltip-secondary .tooltip-inner {background-color: #68b828 }.tooltip.tooltip-secondary.top .tooltip-arrow {border-top-color: #68b828 }.tooltip.tooltip-secondary.bottom .tooltip-arrow {border-bottom-color: #68b828 }.tooltip.tooltip-secondary.left .tooltip-arrow {border-left-color: #68b828 }.tooltip.tooltip-secondary.right .tooltip-arrow {border-right-color: #68b828 }.tooltip.tooltip-info .tooltip-inner {background-color: #40bbea }.tooltip.tooltip-info.top .tooltip-arrow {border-top-color: #40bbea }.tooltip.tooltip-info.bottom .tooltip-arrow {border-bottom-color: #40bbea }.tooltip.tooltip-info.left .tooltip-arrow {border-left-color: #40bbea }.tooltip.tooltip-info.right .tooltip-arrow {border-right-color: #40bbea }.tooltip.tooltip-warning .tooltip-inner {background-color: #ffba00 }.tooltip.tooltip-warning.top .tooltip-arrow {border-top-color: #ffba00 }.tooltip.tooltip-warning.bottom .tooltip-arrow {border-bottom-color: #ffba00 }.tooltip.tooltip-warning.left .tooltip-arrow {border-left-color: #ffba00 }.tooltip.tooltip-warning.right .tooltip-arrow {border-right-color: #ffba00 }.tooltip.tooltip-danger .tooltip-inner {background-color: #cc3f44 }.tooltip.tooltip-danger.top .tooltip-arrow {border-top-color: #cc3f44 }.tooltip.tooltip-danger.bottom .tooltip-arrow {border-bottom-color: #cc3f44 }.tooltip.tooltip-danger.left .tooltip-arrow {border-left-color: #cc3f44 }.tooltip.tooltip-danger.right .tooltip-arrow {border-right-color: #cc3f44 }.tooltip.tooltip-success .tooltip-inner {background-color: #8dc63f }.tooltip.tooltip-success.top .tooltip-arrow {border-top-color: #8dc63f }.tooltip.tooltip-success.bottom .tooltip-arrow {border-bottom-color: #8dc63f }.tooltip.tooltip-success.left .tooltip-arrow {border-left-color: #8dc63f }.tooltip.tooltip-success.right .tooltip-arrow {border-right-color: #8dc63f }.tooltip.tooltip-purple .tooltip-inner {background-color: #7c38bc }.tooltip.tooltip-purple.top .tooltip-arrow {border-top-color: #7c38bc }.tooltip.tooltip-purple.bottom .tooltip-arrow {border-bottom-color: #7c38bc }.tooltip.tooltip-purple.left .tooltip-arrow {border-left-color: #7c38bc }.tooltip.tooltip-purple.right .tooltip-arrow {border-right-color: #7c38bc }.tooltip.tooltip-blue .tooltip-inner {background-color: #0e62c7 }.tooltip.tooltip-blue.top .tooltip-arrow {border-top-color: #0e62c7 }.tooltip.tooltip-blue.bottom .tooltip-arrow {border-bottom-color: #0e62c7 }.tooltip.tooltip-blue.left .tooltip-arrow {border-left-color: #0e62c7 }.tooltip.tooltip-blue.right .tooltip-arrow {border-right-color: #0e62c7 }.tooltip.tooltip-red .tooltip-inner {background-color: #d5080f }.tooltip.tooltip-red.top .tooltip-arrow {border-top-color: #d5080f }.tooltip.tooltip-red.bottom .tooltip-arrow {border-bottom-color: #d5080f }.tooltip.tooltip-red.left .tooltip-arrow {border-left-color: #d5080f }.tooltip.tooltip-red.right .tooltip-arrow {border-right-color: #d5080f }.tooltip.tooltip-black .tooltip-inner {background-color: #0e62c7 }.tooltip.tooltip-black.top .tooltip-arrow {border-top-color: #0e62c7 }.tooltip.tooltip-black.bottom .tooltip-arrow {border-bottom-color: #0e62c7 }.tooltip.tooltip-black.left .tooltip-arrow {border-left-color: #0e62c7 }.tooltip.tooltip-black.right .tooltip-arrow {border-right-color: #0e62c7 }blockquote small {margin-top: 10px;display: block }.blockquote {position: relative;padding: 20px 30px;background: #fff;border: 1px solid #ddd }.blockquote:before {content: '';display: block;position: absolute;left: 0;top: 0;bottom: 0;width: 6px;background: #f7f7f7 }.blockquote.blockquote-blue {border: 1px solid #0e62c7 }.blockquote.blockquote-blue:before {background: rgba(14, 98, 199, .1) }.blockquote.blockquote-blue strong {color: #0e62c7 }.blockquote.blockquote-red {border: 1px solid #d5080f }.blockquote.blockquote-red:before {background: rgba(213, 8, 15, .1) }.blockquote.blockquote-red strong {color: #d5080f }.blockquote.blockquote-success {border: 1px solid #8dc63f }.blockquote.blockquote-success:before {background: rgba(141, 198, 63, .1) }.blockquote.blockquote-success strong {color: #8dc63f }.blockquote.blockquote-warning {border: 1px solid #ffba00 }.blockquote.blockquote-warning:before {background: rgba(255, 186, 0, .1) }.blockquote.blockquote-warning strong {color: #ffba00 }.blockquote.blockquote-info {border: 1px solid #40bbea }.blockquote.blockquote-info:before {background: rgba(64, 187, 234, .1) }.blockquote.blockquote-info strong {color: #40bbea }.blockquote.blockquote-danger {border: 1px solid #cc3f44 }.blockquote.blockquote-danger:before {background: rgba(204, 63, 68, .1) }.blockquote.blockquote-danger strong {color: #cc3f44 }.blockquote.blockquote-purple {border: 1px solid #7c38bc }.blockquote.blockquote-purple:before {background: rgba(124, 56, 188, .1) }.blockquote.blockquote-purple strong {color: #7c38bc }.blockquote.blockquote-black {border: 1px solid #222 }.blockquote.blockquote-black:before {background: rgba(34, 34, 34, .1) }.blockquote.blockquote-black strong {color: #222 }.modal .modal-dialog .modal-content {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none;border-color: #f5f5f5;padding: 30px }.modal .modal-dialog .modal-content .modal-header {margin: 0;padding: 0;border-bottom-width: 2px;padding-bottom: 15px }.modal .modal-dialog .modal-content .modal-header .close {outline: 0 }.modal .modal-dialog .modal-content .modal-body {padding: 20px 0 }.modal .modal-dialog .modal-content .modal-footer {padding: 0;padding-top: 15px }.modal .modal-dialog .modal-content .modal-footer .btn {margin-bottom: 0 }.modal.scale .modal-dialog {zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;-webkit-transform: scale(0.8);-moz-transform: scale(0.8);-o-transform: scale(0.8);-ms-transform: scale(0.8);transform: scale(0.8);-webkit-transition: all 1000ms ease-in-out;-moz-transition: all 1000ms ease-in-out;-o-transition: all 1000ms ease-in-out;transition: all 1000ms ease-in-out;-webkit-transform-origin: center bottom;-moz-transform-origin: center bottom;-o-transform-origin: center bottom;-ms-transform-origin: center bottom;transform-origin: center bottom }.modal.scale.in .modal-dialog {zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-webkit-transform: scale(1);-moz-transform: scale(1);-o-transform: scale(1);-ms-transform: scale(1);transform: scale(1) }.table.table-bordered {border-color: #eee }.table.table-bordered>thead>tr>td, .table.table-bordered>tbody>tr>td, .table.table-bordered>tfood>tr>td, .table.table-bordered>thead>tr>th, .table.table-bordered>tbody>tr>th, .table.table-bordered>tfood>tr>th {border-color: #eee }.table>thead>tr>td, .table>tbody>tr>td, .table>tfood>tr>td, .table>thead>tr>th, .table>tbody>tr>th, .table>tfood>tr>th {padding: 12px 15px }.text-center.table>thead>tr>td, .text-center.table>tbody>tr>td, .text-center.table>tfood>tr>td, .text-center.table>thead>tr>th, .text-center.table>tbody>tr>th, .text-center.table>tfood>tr>th {text-align: center!important }.middle-align.table>thead>tr>td, .middle-align.table>tbody>tr>td, .middle-align.table>tfood>tr>td, .middle-align.table>thead>tr>th, .middle-align.table>tbody>tr>th, .middle-align.table>tfood>tr>th {vertical-align: middle }.table>thead>tr>td.middle-align, .table>tbody>tr>td.middle-align, .table>tfood>tr>td.middle-align, .table>thead>tr>th.middle-align, .table>tbody>tr>th.middle-align, .table>tfood>tr>th.middle-align {vertical-align: middle }.table>thead>tr.no-borders>td, .table>tbody>tr.no-borders>td, .table>tfood>tr.no-borders>td, .table>thead>tr.no-borders>th, .table>tbody>tr.no-borders>th, .table>tfood>tr.no-borders>th {border-left: 0;border-right: 0 }.table>thead>tr>td, .table>thead>tr>th {position: relative;border-bottom: 1px solid #eee;color: #2c2e2f }.table>thead>tr>td:after, .table>thead>tr>th:after {content: '';display: block;position: absolute;left: 0;right: 0;bottom: 1px;height: 1px;background-color: #eee }.table>tbody>tr>td, .table>tfoot>tr>td, .table>tbody>tr>th, .table>tfoot>tr>th {border-top: 0;border-bottom: 1px solid #eee }.table>tbody>tr>td .progress, .table>tfoot>tr>td .progress, .table>tbody>tr>th .progress, .table>tfoot>tr>th .progress, .table>tbody>tr>td .btn, .table>tfoot>tr>td .btn, .table>tbody>tr>th .btn, .table>tfoot>tr>th .btn {margin-bottom: 0 }.table>tfoot>tr>td, .table>tfoot>tr>th {border-left: 0;border-bottom: 0;border-top: 1px solid #eee;padding: 12px 15px;position: relative;color: #2c2e2f }.table>tfoot>tr>td:after, .table>tfoot>tr>th:after {content: '';display: block;position: absolute;left: 0;right: 0;top: 1px;height: 1px;background-color: #eee }.table.table-condensed>thead>tr>td, .table.table-condensed>tbody>tr>td, .table.table-condensed>tfoot>tr>td, .table.table-condensed>thead>tr>th, .table.table-condensed>tbody>tr>th, .table.table-condensed>tfoot>tr>th {padding: 5px 8px }.table.table-model-2>thead>tr {background: #f6f6f6 }.table.table-model-2>thead>tr>td:after, .table.table-model-2>thead>tr>th:after {display: none }.table.table-model-2>thead>tr>td, .table.table-model-2>tbody>tr>td, .table.table-model-2>tfood>tr>td, .table.table-model-2>thead>tr>th, .table.table-model-2>tbody>tr>th, .table.table-model-2>tfood>tr>th {border-color: #ddd }.table.table-model-2.table-bordered {border-color: #ddd }.table tbody.middle-align>tr>th, .table tbody.middle-align>tr>td {vertical-align: middle }.panel>.table>thead>tr>td:after, .panel>.table>thead>tr>th:after {display: none }.dataTables_wrapper .dataTables_length, .dataTables_wrapper .dataTables_filter {padding-bottom: 5px }.dataTables_wrapper .dataTables_filter .form-control {margin-left: 10px }.dataTables_wrapper .dataTables_info, .dataTables_wrapper .dataTables_paginate {padding-top: 10px }.dataTables_wrapper .DTTT_container {float: right;border: 1px solid #eee;position: relative;margin-top: -2px;margin-left: 20px }.dataTables_wrapper .DTTT_container+.dataTables_filter {float: right }.dataTables_wrapper .DTTT_container .DTTT_button {position: relative;display: block;float: left;padding: 7px 10px }.dataTables_wrapper .DTTT_container .DTTT_button span {position: relative;z-index: 100;cursor: pointer }.dataTables_wrapper .DTTT_container .DTTT_button:hover {background: #f5f5f5 }.dataTables_wrapper .DTTT_container .DTTT_button:hover div {background: #f5f5f5 }.dataTables_wrapper .DTTT_container .DTTT_button+.DTTT_button {border-left: 1px solid #eee }.dataTables_wrapper table.dataTable thead>tr>th {padding-left: 15px;padding-right: 15px }.dataTables_wrapper tr.replace-inputs>th, .dataTables_wrapper tr.replace-inputs>td {vertical-align: top }.dataTables_wrapper tr .dataTables_empty {border-bottom: 1px solid #eee }.dataTables_wrapper tr .yadcf-filter-wrapper {position: relative;margin-top: 10px;border-top: 1px solid #eee;margin-left: -15px;margin-right: -15px;display: block;padding: 10px 15px;padding-bottom: 0 }.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter-reset-button {margin: 0;padding: 0;background: 0 0;border: 0;height: auto;position: absolute;top: 0;right: 0;padding: 2px 5px;padding-top: 0;background: #f5f5f5;color: #979898;line-height: 1;font-weight: 400;font-size: 11px;zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0 }.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter-reset-button:active, .dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter-reset-button:focus {background: 0 0;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.dataTables_wrapper tr .yadcf-filter-wrapper:hover .yadcf-filter-reset-button {zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1 }.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter {display: block;width: 100%;margin: 0 }.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter[type=text] {background: #fff;border: 1px solid #e4e4e4;font-weight: 400;outline: 0;padding: 0 10px;height: 30px;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter-wrapper-inner {display: table;width: 100% }.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter-wrapper-inner .yadcf-filter-range {display: table-cell;width: 100%;background: #fff;border: 1px solid #e4e4e4;font-weight: 400;outline: 0;padding: 0 5px;height: 32px;text-align: center;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter-wrapper-inner .yadcf-filter-range-number-seperator {padding: 0 5px;display: table-cell;width: 10% }.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter-wrapper-inner .yadcf-filter-range-number-seperator:after {content: '–';color: #979898;font-size: 11px;font-weight: 400 }.dataTables_wrapper .table thead>tr .sorting, .dataTables_wrapper .table thead>tr .sorting_asc, .dataTables_wrapper .table thead>tr .sorting_desc {background: 0 0 }.dataTables_wrapper .table thead>tr .sorting:before, .dataTables_wrapper .table thead>tr .sorting_asc:before, .dataTables_wrapper .table thead>tr .sorting_desc:before {font-family: fontawesome;content: '\f0dc';float: right;display: block;zoom: 1;filter: alpha(opacity=50);-webkit-opacity: .5;-moz-opacity: .5;opacity: .5 }.dataTables_wrapper .table thead>tr .sorting_asc:before {content: '\f0de' }.dataTables_wrapper .table thead>tr .sorting_desc:before {content: '\f0dd' }.dataTables_wrapper .table thead>tr .no-sorting:before {display: none }.form-horizontal .control-label {text-align: right }.form-horizontal>.form-group:last-child {margin-bottom: 0 }input.form-control.form-focus-primary:focus {border-color: rgba(44, 46, 47, .6);outline: 0;-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(44, 46, 47, .6);-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(44, 46, 47, .6);box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(44, 46, 47, .6) }input.form-control.form-focus-primary:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }input.form-control.form-focus-warning:focus {border-color: rgba(255, 186, 0, .6);outline: 0;-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(255, 186, 0, .6);-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(255, 186, 0, .6);box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(255, 186, 0, .6) }input.form-control.form-focus-warning:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }input.form-control.form-focus-danger:focus {border-color: rgba(204, 63, 68, .6);outline: 0;-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(204, 63, 68, .6);-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(204, 63, 68, .6);box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(204, 63, 68, .6) }input.form-control.form-focus-danger:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }input.form-control.form-focus-success:focus {border-color: rgba(141, 198, 63, .6);outline: 0;-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(141, 198, 63, .6);-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(141, 198, 63, .6);box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(141, 198, 63, .6) }input.form-control.form-focus-success:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }input.form-control.form-focus-info:focus {border-color: rgba(64, 187, 234, .6);outline: 0;-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(64, 187, 234, .6);-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(64, 187, 234, .6);box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(64, 187, 234, .6) }input.form-control.form-focus-info:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }input.form-control.form-focus-purple:focus {border-color: rgba(124, 56, 188, .6);outline: 0;-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(124, 56, 188, .6);-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(124, 56, 188, .6);box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(124, 56, 188, .6) }input.form-control.form-focus-purple:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }input.form-control.form-focus-red:focus {border-color: rgba(213, 8, 15, .6);outline: 0;-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(213, 8, 15, .6);-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(213, 8, 15, .6);box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(213, 8, 15, .6) }input.form-control.form-focus-red:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }input.form-control.form-focus-blue:focus {border-color: rgba(14, 98, 199, .6);outline: 0;-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(14, 98, 199, .6);-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(14, 98, 199, .6);box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(14, 98, 199, .6) }input.form-control.form-focus-blue:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }input.form-control.form-focus-gray:focus {border-color: rgba(200, 200, 200, .6);outline: 0;-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(200, 200, 200, .6);-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(200, 200, 200, .6);box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(200, 200, 200, .6) }input.form-control.form-focus-gray:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }form .help-block {color: #979898 }form .form-block {padding-top: 7px }form .form-group.has-success .help-block, form .form-group.has-success .control-label, form .form-group.has-success .radio, form .form-group.has-success .checkbox, form .form-group.has-success .radio-inline, form .form-group.has-success .checkbox-inline {color: #8dc63f }form .form-group.has-success .form-control {border-color: rgba(141, 198, 63, .4);-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }form .form-group.has-success .form-control:focus {border-color: #8dc63f }form .form-group.has-success .input-group-addon {color: #8dc63f;border-color: rgba(141, 198, 63, .4) }form .form-group.has-success .form-control-feedback {color: #8dc63f }form .form-group.has-warning .help-block, form .form-group.has-warning .control-label, form .form-group.has-warning .radio, form .form-group.has-warning .checkbox, form .form-group.has-warning .radio-inline, form .form-group.has-warning .checkbox-inline {color: #ffba00 }form .form-group.has-warning .form-control {border-color: rgba(255, 186, 0, .6);-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }form .form-group.has-warning .form-control:focus {border-color: #ffba00 }form .form-group.has-warning .input-group-addon {color: #ffba00;border-color: rgba(255, 186, 0, .6) }form .form-group.has-warning .form-control-feedback {color: #ffba00 }form .form-group.has-error .help-block, form .form-group.has-error .control-label, form .form-group.has-error .radio, form .form-group.has-error .checkbox, form .form-group.has-error .radio-inline, form .form-group.has-error .checkbox-inline {color: #cc3f44 }form .form-group.has-error .form-control {border-color: rgba(204, 63, 68, .4);-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }form .form-group.has-error .form-control:focus {border-color: #cc3f44 }form .form-group.has-error .input-group-addon {color: #cc3f44;border-color: rgba(204, 63, 68, .4) }form .form-group.has-error .form-control-feedback {color: #cc3f44 }form .form-group.has-info .help-block, form .form-group.has-info .control-label, form .form-group.has-info .radio, form .form-group.has-info .checkbox, form .form-group.has-info .radio-inline, form .form-group.has-info .checkbox-inline {color: #40bbea }form .form-group.has-info .form-control {border-color: rgba(64, 187, 234, .4);-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }form .form-group.has-info .form-control:focus {border-color: #40bbea }form .form-group.has-info .input-group-addon {color: #40bbea;border-color: rgba(64, 187, 234, .4) }form .form-group.has-info .form-control-feedback {color: #40bbea }form .form-group.validate-has-error .form-control {border-color: #cc3f44;color: #cc3f44 }form .form-group.validate-has-error .form-control::-moz-placeholder {color: #cc3f44;opacity: 1 }form .form-group.validate-has-error .form-control:-ms-input-placeholder {color: #cc3f44 }form .form-group.validate-has-error .form-control::-webkit-input-placeholder {color: #cc3f44 }form .form-group.validate-has-error .form-control::-webkit-input-placeholder {color: #cc3f44 }form .form-group.validate-has-error .form-control:-moz-placeholder {color: #cc3f44 }form .form-group.validate-has-error .form-control::-moz-placeholder {color: #cc3f44 }form .form-group.validate-has-error .form-control:-ms-input-placeholder {color: #cc3f44 }form .form-group.validate-has-error .form-control+span {display: block;padding-top: 5px;font-size: 12px;color: #cc3f44 }form.form-inline .form-group+.form-group {margin-left: 5px }form .form-group-separator {height: 1px;background: #eee;margin-bottom: 15px }label[for] {-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none }label.checkbox-inline input[type=checkbox] {margin-top: 2px }label.radio-inline input[type=radio] {margin-top: 2px }.radio input[type=radio], .checkbox input[type=checkbox] {margin-top: 2px }.input-group .btn {margin-bottom: 0 }.input-group.input-group-minimal>.form-control:first-child {border-right: 0;padding-right: 0 }.input-group.input-group-minimal .input-group-addon {background: 0 0;-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;-webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;-moz-transition: border-color ease-in-out .15s, -moz-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 }.input-group.input-group-minimal .input-group-addon+.form-control {border-left: 0;padding-left: 0 }.input-group.input-group-minimal .input-group-addon+.form-control.no-right-border {padding-right: 0 }.input-group.input-group-minimal.focused .input-group-addon {border-color: rgba(104, 184, 40, .5) }nav.navbar {border: 0 }nav.navbar form>.btn {margin-bottom: 0 }nav.navbar .navbar-header .navbar-brand {padding-left: 30px;padding-right: 30px }nav.navbar .navbar-nav li a {padding-left: 20px;padding-right: 20px }nav.navbar.navbar-inverse .navbar-toggle i {color: #fff }@media print {.sidebar-menu {display: none }.main-content {padding: 0!important }.main-content .user-info-navbar, .main-content .page-title, .main-content footer.main-footer {display: none }.main-content>.panel {margin-bottom: 0 }.main-content>.panel+.panel {margin-top: 30px }}.overflow-hidden {overflow: hidden!important }.vertical-top>* {vertical-align: top }strong+table {margin-top: 10px }.text-small {font-size: 65% }.text-bold {font-weight: 700 }address {padding-left: 20px;border-left: 5px solid #f0f0f0 }.scrollable .scrollable {margin-right: 20px }.super-large {font-size: 66px }.inline {display: inline-block!important }.text-overflow {overflow: hidden;text-overflow: ellipsis;white-space: nowrap;max-width: 100% }.list-margin {margin: 10px 0 }.list-margin li {padding: 5px 0 }.rotate-45deg {position: relative;-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);-o-transform: rotate(45deg);-ms-transform: rotate(45deg);transform: rotate(45deg) }.text-medium {font-size: 12px }.text-bold {font-weight: 700 }.text-bold.h1, .text-bold.h2, .text-bold.h3, .text-bold.h4, .text-bold.h5, .text-bold.h6 {font-weight: 700 }.text-upper {text-transform: uppercase }.chart-item-bg {position: relative;background: #fff;width: 100%;margin-bottom: 30px }.chart-item-bg .chart-label {position: absolute;left: 0;top: 0;padding: 30px;font-size: 15px }.chart-item-bg .chart-label.chart-label-small {padding: 20px }.chart-item-bg .chart-label .h1, .chart-item-bg .chart-label .h2, .chart-item-bg .chart-label .h3, .chart-item-bg .chart-label .h4 {margin: 0;padding: 0 }.chart-item-bg .chart-right-legend {position: absolute;left: 0;top: 0;padding: 30px;font-size: 15px;left: auto;right: 0 }.chart-item-bg .chart-right-legend.chart-label-small {padding: 20px }.chart-item-bg .chart-right-legend .h1, .chart-item-bg .chart-right-legend .h2, .chart-item-bg .chart-right-legend .h3, .chart-item-bg .chart-right-legend .h4 {margin: 0;padding: 0 }.chart-item-bg .chart-inner {padding: 20px }.chart-item-bg .chart-inner-wide {padding: 20px 40px }.chart-item-bg .chart-entry-view {border-top: 1px solid #eee;display: table;table-layout: fixed;width: 100% }.chart-item-bg .chart-entry-view>div {display: table-cell;vertical-align: middle;padding: 20px 30px;color: #979898;font-size: 14px }.chart-item-bg .chart-entry-view:hover {background: #fafafa }.chart-item-bg-2 {background: #fff;display: table;width: 100%;margin-bottom: 30px }.chart-item-bg-2>div {display: table-cell;padding: 15px;vertical-align: middle }.chart-item-bg-2 .chart-item-num {padding-left: 40px;font-size: 90px;color: #434444;padding-right: 30px;white-space: nowrap }.chart-item-bg-2 .chart-item-num.num-sm {font-size: 70px }.chart-item-bg-2 .chart-item-env>div {margin: 10px 0 }.skin-color-palette-entry {margin-top: 10px }.skin-color-palette {display: block;border: 1px solid #f0f0f0;margin-right: 20px }.skin-color-palette>span {float: left;width: 16.66666667%;height: 20px }.skin-color-palette>span+span {border-left: 0 solid #fff }.skin-color-palette.skin-color-palette-four>span {width: 25% }.skin-name-link {font-weight: 700;color: #2c2e2f }.skin-name-link:hover {color: #68b828 }.bs-example {line-height: 1.85 }.bs-example .label {margin-left: 2px }.same-margin>* {margin-top: 0;margin-bottom: 15px }.same-margin>:last-child {margin-bottom: 0 }.vspacer {height: 80px }.vspacer.v2 {height: 15px }.vspacer.v3 {height: 30px;display: block!important }.vspacer.v4 {height: 10px;display: block!important }@media screen and (max-width:768px) {.vspacer {display: none }.vspacer.v2 {display: block }}.img-container {margin-bottom: 20px }.img-shade {display: block;background: #f5f5f5;text-align: center;line-height: 0;margin-bottom: 20px }.img-preview {display: inline-block;overflow: hidden;background: #f7f7f7;line-height: 1 }.img-preview img {display: block }.no-left-border {border-left: 0!important }.no-right-border {border-right: 0!important }.no-top-margin {margin-top: 0!important }.no-padding {padding: 0!important }.no-margin {margin: 0!important }.no-transition {-webkit-transition: none!important;-moz-transition: none!important;-o-transition: none!important;transition: none!important }img.img-cirlce {-webkit-border-radius: 50%;-webkit-background-clip: padding-box;-moz-border-radius: 50%;-moz-background-clip: padding;border-radius: 50%;background-clip: padding-box }.col-margin.row>* {margin-bottom: 20px }.col-margin.row>:last-child {margin-bottom: 0 }.ckeditor+.cke {margin-top: 20px;margin-bottom: 30px }[class*=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 }div.scrollable {max-height: 200px;overflow: hidden;position: relative }.icon-collection .page-header {margin: 0;margin-bottom: 10px }.icon-collection section .page-header {margin-top: 40px }.icon-collection .fontawesome-icon-list {margin-left: -15px;margin-right: -15px }.icon-collection .fontawesome-icon-list .fa-hover {float: left;width: 25%;margin-bottom: 10px }.icon-collection .fontawesome-icon-list .fa-hover .icon-str {display: block;background: #fff;border: 1px solid #ddd;margin: 0 5px;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box }.icon-collection .fontawesome-icon-list .fa-hover .icon-str>i {display: block;float: left;position: relative;background: #fafafa;border-right: 1px solid #e9e9e9;padding: 10px;text-align: center;width: 25% }.icon-collection .fontawesome-icon-list .fa-hover .icon-str>i:hover {width: 60%;background: #68b828;color: #fff }.icon-collection .fontawesome-icon-list .fa-hover .icon-str>i:hover+span {width: 40% }.icon-collection .fontawesome-icon-list .fa-hover .icon-str>span {display: block;float: right;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;max-width: 100%;padding: 10px;padding-bottom: 8px;width: 75%;color: #7d7f7f;font-family: Arimo, "Helvetica Neue", Helvetica, Arial, sans-serif }.icon-collection .fontawesome-icon-list .fa-hover .icon-str>span:hover {color: #2c2e2f }@media (max-width:991px) {.icon-collection .fontawesome-icon-list .fa-hover {width: 33% }}@media (max-width:767px) {.icon-collection .fontawesome-icon-list .fa-hover {width: 50% }}.layout-variants {background: #fff;padding: 30px;margin-bottom: 30px }.layout-variants .row-clearer {clear: both;height: 15px }.layout-variants .layout-variant {display: block;margin-bottom: 20px;padding: 15px;border: 1px solid transparent }.layout-variants .layout-variant:hover, .layout-variants .layout-variant.layout-current {background: rgba(240, 240, 240, .2);border-color: #f0f0f0 }.layout-variants .layout-variant:hover .layout-name a, .layout-variants .layout-variant.layout-current .layout-name a {color: #2c2e2f }.layout-variants .layout-variant .layout-img {margin-bottom: 15px }.layout-variants .layout-variant .layout-img img {display: block;width: 100% }.layout-variants .layout-variant .layout-name {font-weight: 700 }.layout-variants .layout-variant .layout-name a {color: #6a6e71;max-width: 218px;display: block;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;max-width: 100% }.layout-variants .layout-variant .layout-name:after {display: block;content: '';width: 20px;height: 1px;background: #ccc;margin: 5.88px 0 }.layout-variants .layout-variant .layout-links {list-style: none;margin: 0;padding: 0 }.layout-variants .layout-variant .layout-links li {margin: 2px 0 }.layout-variants .layout-variant .layout-links li a {color: #979898;font-size: 10px;text-transform: uppercase }.layout-variants .layout-variant .layout-links li a:hover, .layout-variants .layout-variant .layout-links li a.layout-mode-current {color: #4b4b4b }.layout-variants .layout-variant .layout-links li a.layout-mode-current {font-weight: 700 }.layout-variants .layout-variant .layout-links li a.disabled {cursor: not-allowed;color: #979898 }.dx-warning {background: #FFF;border: 5px solid #ffba00;padding: 20px;margin-bottom: 30px }.dx-warning h2 {margin: 0;margin-bottom: 20px;padding-bottom: 15px;border-bottom: 2px solid #f0f0f0 }.dx-warning ol {margin-top: 20px }.dx-warning li {margin: 5px 0 }.loader-1 {-webkit-animation: loaderAnimate 1000ms linear infinite;-moz-animation: loaderAnimate 1000ms linear infinite;-o-animation: loaderAnimate 1000ms linear infinite;animation: loaderAnimate 1000ms linear infinite;clip: rect(0, 30px, 30px, 15px);height: 30px;width: 30px;position: absolute;left: 50%;top: 50%;margin-left: -15px;margin-top: -15px }lesshat-selector {-lh-property: 0 }@-webkit-keyframes loaderAnimate {0% {-webkit-transform: rotate(0deg) }100% {-webkit-transform: rotate(220deg) }}@-moz-keyframes loaderAnimate {0% {-moz-transform: rotate(0deg) }100% {-moz-transform: rotate(220deg) }}@-o-keyframes loaderAnimate {0% {-o-transform: rotate(0deg) }100% {-o-transform: rotate(220deg) }}@keyframes loaderAnimate {0% {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }100% {-webkit-transform: rotate(220deg);-moz-transform: rotate(220deg);-ms-transform: rotate(220deg);transform: rotate(220deg) }}lesshat-selector {-lh-property: 0 }@-webkit-keyframes loaderAnimate2 {0% {box-shadow: inset #555 0 0 0 8px;-webkit-transform: rotate(-140deg) }50% {box-shadow: inset #555 0 0 0 2px }100% {box-shadow: inset #555 0 0 0 8px;-webkit-transform: rotate(140deg) }}@-moz-keyframes loaderAnimate2 {0% {box-shadow: inset #555 0 0 0 8px;-moz-transform: rotate(-140deg) }50% {box-shadow: inset #555 0 0 0 2px }100% {box-shadow: inset #555 0 0 0 8px;-moz-transform: rotate(140deg) }}@-o-keyframes loaderAnimate2 {0% {box-shadow: inset #555 0 0 0 8px;-o-transform: rotate(-140deg) }50% {box-shadow: inset #555 0 0 0 2px }100% {box-shadow: inset #555 0 0 0 8px;-o-transform: rotate(140deg) }}@keyframes loaderAnimate2 {0% {box-shadow: inset #555 0 0 0 8px;-webkit-transform: rotate(-140deg);-moz-transform: rotate(-140deg);-ms-transform: rotate(-140deg);transform: rotate(-140deg) }50% {box-shadow: inset #555 0 0 0 2px }100% {box-shadow: inset #555 0 0 0 8px;-webkit-transform: rotate(140deg);-moz-transform: rotate(140deg);-ms-transform: rotate(140deg);transform: rotate(140deg) }}.loader-1:after {-webkit-animation: loaderAnimate2 1000ms ease-in-out infinite;-moz-animation: loaderAnimate2 1000ms ease-in-out infinite;-o-animation: loaderAnimate2 1000ms ease-in-out infinite;animation: loaderAnimate2 1000ms ease-in-out infinite;clip: rect(0, 30px, 30px, 15px);content: '';border-radius: 50%;height: 30px;width: 30px;position: absolute }@keyframes loaderAnimate2 {0% {box-shadow: inset #fff 0 0 0 17px;transform: rotate(-140deg) }50% {box-shadow: inset #fff 0 0 0 2px }100% {box-shadow: inset #fff 0 0 0 17px;transform: rotate(140deg) }}.loader-2 {-webkit-animation: loaderAnimate2 1000ms linear infinite;-moz-animation: loaderAnimate2 1000ms linear infinite;-o-animation: loaderAnimate2 1000ms linear infinite;animation: loaderAnimate2 1000ms linear infinite;clip: rect(0, 30px, 30px, 15px);height: 30px;width: 30px;position: absolute;left: 50%;top: 50%;margin-left: -15px;margin-top: -15px }lesshat-selector {-lh-property: 0 }@-webkit-keyframes loaderAnimate2 {0% {-webkit-transform: rotate(0deg) }100% {-webkit-transform: rotate(220deg) }}@-moz-keyframes loaderAnimate2 {0% {-moz-transform: rotate(0deg) }100% {-moz-transform: rotate(220deg) }}@-o-keyframes loaderAnimate2 {0% {-o-transform: rotate(0deg) }100% {-o-transform: rotate(220deg) }}@keyframes loaderAnimate2 {0% {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }100% {-webkit-transform: rotate(220deg);-moz-transform: rotate(220deg);-ms-transform: rotate(220deg);transform: rotate(220deg) }}lesshat-selector {-lh-property: 0 }@-webkit-keyframes loaderAnimate22 {0% {box-shadow: inset #fff 0 0 0 8px;-webkit-transform: rotate(-140deg) }50% {box-shadow: inset #fff 0 0 0 2px }100% {box-shadow: inset #fff 0 0 0 8px;-webkit-transform: rotate(140deg) }}@-moz-keyframes loaderAnimate22 {0% {box-shadow: inset #fff 0 0 0 8px;-moz-transform: rotate(-140deg) }50% {box-shadow: inset #fff 0 0 0 2px }100% {box-shadow: inset #fff 0 0 0 8px;-moz-transform: rotate(140deg) }}@-o-keyframes loaderAnimate22 {0% {box-shadow: inset #fff 0 0 0 8px;-o-transform: rotate(-140deg) }50% {box-shadow: inset #fff 0 0 0 2px }100% {box-shadow: inset #fff 0 0 0 8px;-o-transform: rotate(140deg) }}@keyframes loaderAnimate22 {0% {box-shadow: inset #fff 0 0 0 8px;-webkit-transform: rotate(-140deg);-moz-transform: rotate(-140deg);-ms-transform: rotate(-140deg);transform: rotate(-140deg) }50% {box-shadow: inset #fff 0 0 0 2px }100% {box-shadow: inset #fff 0 0 0 8px;-webkit-transform: rotate(140deg);-moz-transform: rotate(140deg);-ms-transform: rotate(140deg);transform: rotate(140deg) }}.loader-2:after {-webkit-animation: loaderAnimate22 1000ms ease-in-out infinite;-moz-animation: loaderAnimate22 1000ms ease-in-out infinite;-o-animation: loaderAnimate22 1000ms ease-in-out infinite;animation: loaderAnimate22 1000ms ease-in-out infinite;clip: rect(0, 30px, 30px, 15px);content: '';border-radius: 50%;height: 30px;width: 30px;position: absolute }@keyframes loaderAnimate22 {0% {box-shadow: inset #fff 0 0 0 17px;transform: rotate(-140deg) }50% {box-shadow: inset #fff 0 0 0 2px }100% {box-shadow: inset #fff 0 0 0 17px;transform: rotate(140deg) }}.page-loading-overlay {position: fixed;left: 0;top: 0;bottom: 0;right: 0;overflow: hidden;background: #2c2e2f;z-index: 10000;-webkit-perspective: 10000;-moz-perspective: 10000;perspective: 10000;-webkit-perspective: 10000px;-moz-perspective: 10000px;perspective: 10000px;zoom: 1;filter: alpha(opacity=100);-webkit-opacity: 1;-moz-opacity: 1;opacity: 1;-webkit-transition: all 800ms ease-in-out;-moz-transition: all 800ms ease-in-out;-o-transition: all 800ms ease-in-out;transition: all 800ms ease-in-out }.page-loading-overlay.loaded {zoom: 1;filter: alpha(opacity=0);-webkit-opacity: 0;-moz-opacity: 0;opacity: 0;visibility: hidden }.tocify.full-width {width: 100%!important }img.img-corona {-webkit-box-shadow: 0 0 0 4px rgba(221, 221, 221, .3);-moz-box-shadow: 0 0 0 4px rgba(221, 221, 221, .3);box-shadow: 0 0 0 4px rgba(221, 221, 221, .3) }.highlights {margin-bottom: 20px }.highlights li {display: block;margin: 0 }.highlights li.version+li {margin-top: 20px }.highlights li h4 {margin-bottom: 0 }.highlights li+li {margin-top: 50px }.highlights .entry-img {display: block;float: left;width: 30%;padding-right: 20px;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box }.highlights .entry-img img {display: block;border: 1px solid rgba(0, 0, 0, .2);-webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);-moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);box-shadow: 0 4px 5px rgba(0, 0, 0, .15);max-width: 100% }.highlights .entry-description {float: left;width: 70% }.highlights .entry-description h3 {margin-top: 10px;color: #2c2e2f }@media screen and (max-width:768px) {.highlights .entry-description h3 {font-size: 19px;margin-bottom: 15px }}.highlights .entry-description h3 a {color: #2c2e2f }@media screen and (min-width:1500px) {.highlights .entry-img {width: 21% }.highlights .entry-description {width: 79% }}@media screen and (max-width:992px) {.highlights .entry-img {width: 35% }.highlights .entry-description {width: 65% }}@media screen and (max-width:768px) {.highlights .entry-img, .highlights .entry-description {float: none;width: 100%;text-align: center }.highlights .entry-img {padding-bottom: 20px;padding-top: 20px;padding-right: 0 }.highlights .entry-img img {display: inline-block }.highlights .entry-description p {text-align: left }}@media screen and (max-width:768px) {.text-left-sm {text-align: left }}@media screen and (max-width:768px) {.text-center-sm {text-align: center }}@media screen and (max-width:768px) {.text-right-sm {text-align: right }}@media screen and (min-width:992px) {.pull-right-md {float: right }}@media screen and (min-width:768px) {.pull-right-sm {float: right }}pre.pre-line {white-space: pre-line }a:hover {text-decoration: none }label {font-weight: 400 }.label {-webkit-border-radius: 0;-webkit-background-clip: padding-box;-moz-border-radius: 0;-moz-background-clip: padding;border-radius: 0;background-clip: padding-box }.dropdown-menu {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.dropdown-menu>li>a {padding: 5px 20px }.dropdown-menu>li>a>i {display: inline-block;margin-right: 5px }.left-dropdown .btn {float: right }.left-dropdown .btn.dropdown-toggle {float: left }.form-control {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.form-control:focus, .form-control:active {outline: 0;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {font-weight: 400 }.btn-group+.btn-group {margin-left: 5px }.alert.alert-dismissable {padding-right: 20px }.alert.alert-dismissable .close {right: -10px;top: 0 }.alert .close {position: relative;margin-top: -2px;outline: 0;color: #000 }.alert .close span {text-shadow: none }.alert.alert-default {background-color: #eee;border-color: #eee;color: #333 }.alert.alert-default hr {border-top-color: #e1e1e1 }.alert.alert-default .alert-link {color: #1a1a1a }.alert.alert-white {background-color: #fff;border-color: #eee;color: #333 }.alert.alert-white hr {border-top-color: #e1e1e1 }.alert.alert-white .alert-link {color: #1a1a1a }.alert.alert-black {background-color: #000;border-color: #000;color: #fff }.alert.alert-black hr {border-top-color: #000 }.alert.alert-black .alert-link {color: #e6e6e6 }.alert.alert-black .close {zoom: 1;filter: alpha(opacity=50);-webkit-opacity: .5;-moz-opacity: .5;opacity: .5 }.alert.alert-black .close span {color: #FFF }.alert.alert-black .close:hover {zoom: 1;filter: alpha(opacity=90);-webkit-opacity: .9;-moz-opacity: .9;opacity: .9 }.progress {height: 6px;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.progress.progress-bar-purple>.progress-bar {background-color: #7c38bc }.progress-striped .progress.progress-bar-purple>.progress-bar {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.progress-bar-blue>.progress-bar {background-color: #0e62c7 }.progress-striped .progress.progress-bar-blue>.progress-bar {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.progress-bar-red>.progress-bar {background-color: #d5080f }.progress-striped .progress.progress-bar-red>.progress-bar {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.progress-bar-black>.progress-bar {background-color: #222 }.progress-striped .progress.progress-bar-black>.progress-bar {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.progress-bar-gray>.progress-bar {background-color: #ccc }.progress-striped .progress.progress-bar-gray>.progress-bar {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 .progress-bar {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.progress .progress-bar.progress-bar-purple {background-color: #7c38bc }.progress-striped .progress .progress-bar.progress-bar-purple {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 .progress-bar.progress-bar-blue {background-color: #0e62c7 }.progress-striped .progress .progress-bar.progress-bar-blue {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 .progress-bar.progress-bar-red {background-color: #d5080f }.progress-striped .progress .progress-bar.progress-bar-red {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 .progress-bar.progress-bar-black {background-color: #222 }.progress-striped .progress .progress-bar.progress-bar-black {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 .progress-bar.progress-bar-gray {background-color: #ccc }.progress-striped .progress .progress-bar.progress-bar-gray {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) }.list-group .list-group-item {padding: 15px 20px }.list-group .list-group-item .list-group-item-text {margin-top: 10px }.list-group.list-group-minimal .list-group-item {padding: 10px 15px }.badge-roundless {-webkit-border-radius: 0;-webkit-background-clip: padding-box;-moz-border-radius: 0;-moz-background-clip: padding;border-radius: 0;background-clip: padding-box }mark, .mark {background-color: rgba(255, 186, 0, .5);color: #666;padding-left: 5px;padding-right: 5px }.text-muted {color: #9d9d9d }.text-primary {color: #2c2e2f }a.text-primary:hover {color: #131415 }.text-secondary {color: #68b828 }a.text-secondary:hover {color: #508e1f }.text-purple {color: #7c38bc }a.text-purple:hover {color: #622c95 }.text-turquoise {color: #00b19d }a.text-turquoise:hover {color: #007e70 }.text-red {color: #d5080f }a.text-red:hover {color: #a4060c }.text-blue {color: #0e62c7 }a.text-blue:hover {color: #0b4b97 }.text-pink {color: #ff6264 }a.text-pink:hover {color: #ff2f32 }.text-yellow {color: #fcd036 }a.text-yellow:hover {color: #fbc404 }.text-gray {color: #555 }a.text-gray:hover {color: #3b3b3b }.text-success {color: #8dc63f }a.text-success:hover {color: #72a230 }.text-info {color: #40bbea }a.text-info:hover {color: #18a8df }.text-warning {color: #ffba00 }a.text-warning:hover {color: #cc9500 }.text-danger {color: #cc3f44 }a.text-danger:hover {color: #ab2d32 }.text-white {color: #fff }a.text-white:hover {color: #e6e6e6 }.bg-muted, .bg-gray, .bg-primary, .bg-success, .bg-info, .bg-warning, .bg-danger {padding: 10px 15px;color: #fff }.bg-muted {background-color: #d0d0d0 }.bg-gray {background-color: #eee }pre {white-space: pre-wrap;font-size: 12px }.page-body .jumbotron {padding: 0;padding-top: 0!important;padding-bottom: 48px;margin-bottom: 20px }.page-body .jumbotron>h1 {margin-top: 0;margin-bottom: 20px }@media screen and (max-width:768px) {.page-body .jumbotron {padding-left: 0;padding-right: 0 }}@media screen and (min-width:768px) {.page-body .jumbotron {padding-top: 15px;padding-bottom: 48px }} diff --git a/web/static/index/css/xenon-forms.css b/web/static/index/css/xenon-forms.css new file mode 100644 index 0000000..73ce0e8 --- /dev/null +++ b/web/static/index/css/xenon-forms.css @@ -0,0 +1,18 @@ +.transall,.form-wizard>.tabs>li a,.form-wizard>.tabs>li a:after,.droppable-area.dz-drag-hover{-webkit-transition:all 220ms ease-in-out;-moz-transition:all 220ms ease-in-out;-o-transition:all 220ms ease-in-out;transition:all 220ms ease-in-out}.clearfix:before,.clearfix:after,.icheck-skins:before,.icheck-skins:after,.form-wizard:before,.form-wizard:after{content:" ";display:table}.clearfix:after,.icheck-skins:after,.form-wizard:after{clear:both}div.datepicker{padding:4px;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box;direction:ltr}div.datepicker-inline{width:206px}div.datepickerdiv.datepicker-rtl{direction:rtl}div.datepickerdiv.datepicker-rtl table tr td span{float:right}div.datepicker-dropdown{top:0;left:0}div.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #e4e4e4;border-top:0;border-bottom-color:#e4e4e4;position:absolute}div.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;border-top:0;position:absolute}div.datepicker-dropdown.datepicker-orient-left:before{left:6px}div.datepicker-dropdown.datepicker-orient-left:after{left:7px}div.datepicker-dropdown.datepicker-orient-right:before{right:6px}div.datepicker-dropdown.datepicker-orient-right:after{right:7px}div.datepicker-dropdown.datepicker-orient-top:before{top:-7px}div.datepicker-dropdown.datepicker-orient-top:after{top:-6px}div.datepicker-dropdown.datepicker-orient-bottom:before{bottom:-7px;border-bottom:0;border-top:7px solid #e4e4e4}div.datepicker-dropdown.datepicker-orient-bottom:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}div.datepicker>div{display:none}div.datepicker.days div.datepicker-days{display:block}div.datepicker.months div.datepicker-months{display:block}div.datepicker.years div.datepicker-years{display:block}div.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.datepicker td,div.datepicker th{text-align:center;width:20px;height:20px;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box;border:none}.table-striped div.datepicker table tr td,.table-striped div.datepicker table tr th{background-color:transparent}div.datepicker table tr td.day{color:#646565}div.datepicker table tr td.day:hover{background:#f5f5f5;cursor:pointer;color:#2c2e2f}div.datepicker table tr td.old,div.datepicker table tr td.new{color:#b1b1b1}div.datepicker table tr td.disabled,div.datepicker table tr td.disabled:hover{background:0 0;color:#777;color:#979898;cursor:default}div.datepicker table tr td.today,div.datepicker table tr td.today:hover,div.datepicker table tr td.today.disabled,div.datepicker table tr td.today.disabled:hover{;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#000}div.datepicker table tr td.today.switch-left,div.datepicker table tr td.today:hover.switch-left,div.datepicker table tr td.today.disabled.switch-left,div.datepicker table tr td.today.disabled:hover.switch-left{background-color:#76797e;color:#fff}div.datepicker table tr td.today.switch-right,div.datepicker table tr td.today:hover.switch-right,div.datepicker table tr td.today.disabled.switch-right,div.datepicker table tr td.today.disabled:hover.switch-right{background-color:#f5f5f5;color:#979898}div.datepicker table tr td.today.switch-right:hover,div.datepicker table tr td.today:hover.switch-right:hover,div.datepicker table tr td.today.disabled.switch-right:hover,div.datepicker table tr td.today.disabled:hover.switch-right:hover{background-color:#f5f5f5;color:#979898}div.datepicker table tr td.today:hover,div.datepicker table tr td.today:hover:hover,div.datepicker table tr td.today.disabled:hover,div.datepicker table tr td.today.disabled:hover:hover,div.datepicker table tr td.today:focus,div.datepicker table tr td.today:hover:focus,div.datepicker table tr td.today.disabled:focus,div.datepicker table tr td.today.disabled:hover:focus,div.datepicker table tr td.today:active,div.datepicker table tr td.today:hover:active,div.datepicker table tr td.today.disabled:active,div.datepicker table tr td.today.disabled:hover:active,div.datepicker table tr td.today.active,div.datepicker table tr td.today:hover.active,div.datepicker table tr td.today.disabled.active,div.datepicker table tr td.today.disabled:hover.active,div.datepicker table tr td.today.disabled,div.datepicker table tr td.today:hover.disabled,div.datepicker table tr td.today.disabled.disabled,div.datepicker table tr td.today.disabled:hover.disabled,div.datepicker table tr td.today[disabled],div.datepicker table tr td.today:hover[disabled],div.datepicker table tr td.today.disabled[disabled],div.datepicker table tr td.today.disabled:hover[disabled]{color:#fff;}div.datepicker table tr td.today:active,div.datepicker table tr td.today:hover:active,div.datepicker table tr td.today.disabled:active,div.datepicker table tr td.today.disabled:hover:active,div.datepicker table tr td.today.active,div.datepicker table tr td.today:hover.active,div.datepicker table tr td.today.disabled.active,div.datepicker table tr td.today.disabled:hover.active{background-color:#5d5f64 \9}div.datepicker table tr td.today:hover:hover{color:#000}div.datepicker table tr td.today.active:hover{color:#fff}div.datepicker table tr td.range,div.datepicker table tr td.range:hover,div.datepicker table tr td.range.disabled,div.datepicker table tr td.range.disabled:hover{background:#eee;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}div.datepicker table tr td.range.today,div.datepicker table tr td.range.today:hover,div.datepicker table tr td.range.today.disabled,div.datepicker table tr td.range.today.disabled:hover{;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}div.datepicker table tr td.range.today.switch-left,div.datepicker table tr td.range.today:hover.switch-left,div.datepicker table tr td.range.today.disabled.switch-left,div.datepicker table tr td.range.today.disabled:hover.switch-left{background-color:#f3ea7a;color:#fff}div.datepicker table tr td.range.today.switch-right,div.datepicker table tr td.range.today:hover.switch-right,div.datepicker table tr td.range.today.disabled.switch-right,div.datepicker table tr td.range.today.disabled:hover.switch-right{background-color:#f5f5f5;color:#979898}div.datepicker table tr td.range.today.switch-right:hover,div.datepicker table tr td.range.today:hover.switch-right:hover,div.datepicker table tr td.range.today.disabled.switch-right:hover,div.datepicker table tr td.range.today.disabled:hover.switch-right:hover{background-color:#f5f5f5;color:#979898}div.datepicker table tr td.range.today:hover,div.datepicker table tr td.range.today:hover:hover,div.datepicker table tr td.range.today.disabled:hover,div.datepicker table tr td.range.today.disabled:hover:hover,div.datepicker table tr td.range.today:focus,div.datepicker table tr td.range.today:hover:focus,div.datepicker table tr td.range.today.disabled:focus,div.datepicker table tr td.range.today.disabled:hover:focus,div.datepicker table tr td.range.today:active,div.datepicker table tr td.range.today:hover:active,div.datepicker table tr td.range.today.disabled:active,div.datepicker table tr td.range.today.disabled:hover:active,div.datepicker table tr td.range.today.active,div.datepicker table tr td.range.today:hover.active,div.datepicker table tr td.range.today.disabled.active,div.datepicker table tr td.range.today.disabled:hover.active,div.datepicker table tr td.range.today.disabled,div.datepicker table tr td.range.today:hover.disabled,div.datepicker table tr td.range.today.disabled.disabled,div.datepicker table tr td.range.today.disabled:hover.disabled,div.datepicker table tr td.range.today[disabled],div.datepicker table tr td.range.today:hover[disabled],div.datepicker table tr td.range.today.disabled[disabled],div.datepicker table tr td.range.today.disabled:hover[disabled]{color:#fff;}div.datepicker table tr td.range.today:active,div.datepicker table tr td.range.today:hover:active,div.datepicker table tr td.range.today.disabled:active,div.datepicker table tr td.range.today.disabled:hover:active,div.datepicker table tr td.range.today.active,div.datepicker table tr td.range.today:hover.active,div.datepicker table tr td.range.today.disabled.active,div.datepicker table tr td.range.today.disabled:hover.active{background-color:#efe24b \9}div.datepicker table tr td.selected,div.datepicker table tr td.selected:hover,div.datepicker table tr td.selected.disabled,div.datepicker table tr td.selected.disabled:hover{;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}div.datepicker table tr td.selected.switch-left,div.datepicker table tr td.selected:hover.switch-left,div.datepicker table tr td.selected.disabled.switch-left,div.datepicker table tr td.selected.disabled:hover.switch-left{background-color:#5e5e5e;color:#fff}div.datepicker table tr td.selected.switch-right,div.datepicker table tr td.selected:hover.switch-right,div.datepicker table tr td.selected.disabled.switch-right,div.datepicker table tr td.selected.disabled:hover.switch-right{background-color:#f5f5f5;color:#979898}div.datepicker table tr td.selected.switch-right:hover,div.datepicker table tr td.selected:hover.switch-right:hover,div.datepicker table tr td.selected.disabled.switch-right:hover,div.datepicker table tr td.selected.disabled:hover.switch-right:hover{background-color:#f5f5f5;color:#979898}div.datepicker table tr td.selected:hover,div.datepicker table tr td.selected:hover:hover,div.datepicker table tr td.selected.disabled:hover,div.datepicker table tr td.selected.disabled:hover:hover,div.datepicker table tr td.selected:focus,div.datepicker table tr td.selected:hover:focus,div.datepicker table tr td.selected.disabled:focus,div.datepicker table tr td.selected.disabled:hover:focus,div.datepicker table tr td.selected:active,div.datepicker table tr td.selected:hover:active,div.datepicker table tr td.selected.disabled:active,div.datepicker table tr td.selected.disabled:hover:active,div.datepicker table tr td.selected.active,div.datepicker table tr td.selected:hover.active,div.datepicker table tr td.selected.disabled.active,div.datepicker table tr td.selected.disabled:hover.active,div.datepicker table tr td.selected.disabled,div.datepicker table tr td.selected:hover.disabled,div.datepicker table tr td.selected.disabled.disabled,div.datepicker table tr td.selected.disabled:hover.disabled,div.datepicker table tr td.selected[disabled],div.datepicker table tr td.selected:hover[disabled],div.datepicker table tr td.selected.disabled[disabled],div.datepicker table tr td.selected.disabled:hover[disabled]{color:#fff;}div.datepicker table tr td.selected:active,div.datepicker table tr td.selected:hover:active,div.datepicker table tr td.selected.disabled:active,div.datepicker table tr td.selected.disabled:hover:active,div.datepicker table tr td.selected.active,div.datepicker table tr td.selected:hover.active,div.datepicker table tr td.selected.disabled.active,div.datepicker table tr td.selected.disabled:hover.active{background-color:#444 \9}div.datepicker table tr td.active,div.datepicker table tr td.active:hover,div.datepicker table tr td.active.disabled,div.datepicker table tr td.active.disabled:hover{background:#68b828;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}div.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}div.datepicker table tr td span:hover{background:#f5f5f5}div.datepicker table tr td span.disabled,div.datepicker table tr td span.disabled:hover{background:0 0;color:#777;cursor:default}div.datepicker table tr td span.active,div.datepicker table tr td span.active:hover,div.datepicker table tr td span.active.disabled,div.datepicker table tr td span.active.disabled:hover{background:#68b828;color:#fff}div.datepicker table tr td span.old,div.datepicker table tr td span.new{color:#b1b1b1}div.datepicker th.datepicker-switch{width:145px}div.datepicker thead tr:first-child th,div.datepicker tfoot tr th{cursor:pointer}div.datepicker thead tr:first-child th.datepicker-switch,div.datepicker tfoot tr th.datepicker-switch{color:#2c2e2f}div.datepicker thead tr:first-child th:hover,div.datepicker tfoot tr th:hover{background:#f5f5f5}div.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}div.datepicker thead tr:first-child th.cw{cursor:default;background-color:transparent}.input-append.date .add-on i,.input-prepend.date .add-on i{display:block;cursor:pointer;width:16px;height:16px}.input-daterange input{text-align:center}.input-daterange input:first-child{-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.input-daterange input:last-child{-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.input-daterange .add-on{display:inline-block;width:auto;min-width:16px;height:1.42857143;padding:4px 5px;font-weight:400;line-height:1.42857143;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:1px solid #ccc;margin-left:-5px;margin-right:-5px}.datepicker-inline{border:1px solid #e4e4e4}.datepicker-inline.no-border{border-color:transparent}.datepicker-inline table{width:195px}.no-border .datepicker-inline{border:0;padding:0}.input-group-addon .color-preview{width:16px;height:16px;background:#FFF;display:inline-block;border:1px solid #e4e4e4}.dropdown-menu.daterangepicker{background:#fafafa;border-color:#e4e4e4;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.dropdown-menu.daterangepicker:has(.ranges) .calendar{display:none}.dropdown-menu.daterangepicker.opensright:before{border-right:7px solid transparent;border-bottom:7px solid #e4e4e4;border-left:7px solid transparent;border-bottom-color:#e4e4e4}.dropdown-menu.daterangepicker.opensright:after{border-right:6px solid transparent;border-bottom:6px solid #fafafa;border-left:6px solid transparent}.dropdown-menu.daterangepicker .calendar-time{background:#fff;border:1px solid #e4e4e4;border-color:#e4e4e4;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.dropdown-menu.daterangepicker .no-border-radius{border-color:#e4e4e4;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.dropdown-menu.daterangepicker .range_inputs input{color:#979898;outline:0}.dropdown-menu.daterangepicker .calendar-date,.dropdown-menu.daterangepicker .range_inputs input,.dropdown-menu.daterangepicker table>thead>tr>th,.dropdown-menu.daterangepicker table>thead>tr>td,.dropdown-menu.daterangepicker table>tbody>tr>th,.dropdown-menu.daterangepicker table>tbody>tr>td,.dropdown-menu.daterangepicker table>tbody>tr>td.start-date.end-date{border-color:#e4e4e4;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.dropdown-menu.daterangepicker .calendar-date table>thead th{color:#979898}.dropdown-menu.daterangepicker .calendar-date table>thead .month{color:#2c2e2f}.dropdown-menu.daterangepicker .calendar-date table>thead .next i:before,.dropdown-menu.daterangepicker .calendar-date table>thead .prev i:before{font-family:fontawesome;content:'\f105';font-size:11px}.dropdown-menu.daterangepicker .calendar-date table>thead .next.prev i:before,.dropdown-menu.daterangepicker .calendar-date table>thead .prev.prev i:before{content:'\f104'}.dropdown-menu.daterangepicker .calendar-date table>thead .next:hover,.dropdown-menu.daterangepicker .calendar-date table>thead .prev:hover{background-color:#f5f5f5}.dropdown-menu.daterangepicker .calendar-date table>tbody>tr>td{color:#979898;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.dropdown-menu.daterangepicker .calendar-date table>tbody>tr>td:hover{background-color:#f5f5f5}.dropdown-menu.daterangepicker .calendar-date table>tbody>tr>td.available{color:#7d7f7f}.dropdown-menu.daterangepicker .calendar-date table>tbody>tr>td.off{color:#bdbebe}.dropdown-menu.daterangepicker .calendar-date table>tbody>tr>td.disabled{background-color:#fafafa;color:#bdbebe;cursor:not-allowed}.dropdown-menu.daterangepicker .calendar-date table>tbody>tr>td.in-range{background-color:rgba(104,184,40,.1)}.dropdown-menu.daterangepicker .calendar-date table>tbody>tr>td.active{background-color:#68b828;color:#fff}.dropdown-menu.daterangepicker .btn-default{border-color:#e4e4e4}.dropdown-menu.daterangepicker .ranges ul li{background:#fff;border-color:#e4e4e4;color:#979898;padding:4px 8px;font-size:12px;text-align:center;line-height:1;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.dropdown-menu.daterangepicker .ranges ul li:hover{background:#f5f5f5}.dropdown-menu.daterangepicker .ranges ul li.active{color:#fff;background:#68b828;border-color:#68b828}.daterange-inline{background:#f5f5f5;border:1px solid #e4e4e4;padding:10px;cursor:pointer}.daterange-inline i{color:#2c2e2f;margin-right:5px}.daterange-inline:hover{color:#2c2e2f}/*! + * Timepicker Component for Twitter Bootstrap + * + * Copyright 2013 Joris de Wit + * + * Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */.bootstrap-timepicker{position:relative}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu{left:auto;right:0}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before{left:auto;right:12px}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after{left:auto;right:13px}.bootstrap-timepicker .add-on{cursor:pointer}.bootstrap-timepicker .add-on i{display:inline-block;width:16px;height:16px}.bootstrap-timepicker-widget.dropdown-menu{padding:0}.bootstrap-timepicker-widget.dropdown-menu.open{display:inline-block}.bootstrap-timepicker-widget.dropdown-menu:before{border-bottom:7px solid #e4e4e4;border-left:7px solid transparent;border-right:7px solid transparent;content:"";display:inline-block;position:absolute}.bootstrap-timepicker-widget.dropdown-menu:after{border-bottom:6px solid #FFF;border-left:6px solid transparent;border-right:6px solid transparent;content:"";display:inline-block;position:absolute}.bootstrap-timepicker-widget.timepicker-orient-left:before{left:6px}.bootstrap-timepicker-widget.timepicker-orient-left:after{left:7px}.bootstrap-timepicker-widget.timepicker-orient-right:before{right:6px}.bootstrap-timepicker-widget.timepicker-orient-right:after{right:7px}.bootstrap-timepicker-widget.timepicker-orient-top:before{top:-7px}.bootstrap-timepicker-widget.timepicker-orient-top:after{top:-6px}.bootstrap-timepicker-widget.timepicker-orient-bottom:before{bottom:-7px;border-bottom:0;border-top:7px solid #e4e4e4}.bootstrap-timepicker-widget.timepicker-orient-bottom:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.bootstrap-timepicker-widget a.btn,.bootstrap-timepicker-widget input{border-radius:0}.bootstrap-timepicker-widget table{width:100%;margin:0}.bootstrap-timepicker-widget table td{text-align:center;height:30px;margin:0;padding:2px;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.bootstrap-timepicker-widget table td:not(.separator){min-width:30px}.bootstrap-timepicker-widget table td span{width:100%}.bootstrap-timepicker-widget table td a{border:1px transparent solid;width:100%;display:inline-block;margin:0;padding:0;outline:0;color:#979898}.bootstrap-timepicker-widget table td a .icon-chevron-up:before{font-family:fontawesome;content:'\f0d8';font-style:normal;color:#575858}.bootstrap-timepicker-widget table td a .icon-chevron-down:before{font-family:fontawesome;content:'\f0d7';font-style:normal;color:#575858}.bootstrap-timepicker-widget table td a:hover{text-decoration:none;background-color:#f5f5f5;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.bootstrap-timepicker-widget table td a i{margin-top:2px;font-size:18px}.bootstrap-timepicker-widget table td input{width:25px;margin:0;text-align:center;border:0;background:0 0;padding:0;height:auto}.bootstrap-timepicker-widget .modal-content{padding:4px}@media (min-width:767px){.bootstrap-timepicker-widget.modal{width:200px;margin-left:-100px}}@media (max-width:767px){.bootstrap-timepicker{width:100%}.bootstrap-timepicker .dropdown-menu{width:100%}}.date-and-time .form-control{float:left}.date-and-time .form-control+.form-control{border-left:0}.date-and-time .form-control.datepicker{width:65%}.date-and-time .form-control.timepicker{width:35%}/*! + * Bootstrap Colorpicker + * http://mjolnic.github.io/bootstrap-colorpicker/ + * + * Originally written by (c) 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + */.colorpicker-saturation{width:100px;height:100px;background-image:url(../js/colorpicker/images/saturation.png);cursor:crosshair;float:left}.colorpicker-saturation i{display:block;height:5px;width:5px;border:1px solid #000;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;position:absolute;top:0;left:0;margin:-4px 0 0 -4px}.colorpicker-saturation i b{display:block;height:5px;width:5px;border:1px solid #fff;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.colorpicker-hue,.colorpicker-alpha{width:15px;height:100px;float:left;cursor:row-resize;margin-left:4px;margin-bottom:4px}.colorpicker-hue i,.colorpicker-alpha i{display:block;height:1px;background:#000;border-top:1px solid #fff;position:absolute;top:0;left:0;width:100%;margin-top:-1px}.colorpicker-hue{background-image:url(../js/colorpicker/images/hue.png)}.colorpicker-alpha{background-image:url(../js/colorpicker/images/alpha.png);display:none}div.colorpicker{;top:0;left:0;padding:4px;min-width:130px;margin-top:1px;-webkit-border-radius:-1px;-moz-border-radius:-1px;border-radius:-1px;z-index:2500}.colorpicker:before,.colorpicker:after{display:table;content:"";line-height:0}.colorpicker:after{clear:both}.colorpicker:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #e4e4e4;border-bottom-color:#dfdfdf;position:absolute;top:-7px;left:6px}.colorpicker:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:7px}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-image:url(../js/colorpicker/images/alpha.png);background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-element .input-group-addon i{display:block;cursor:pointer;width:16px;height:16px}.colorpicker.colorpicker-inline{position:relative;display:inline-block;float:none}.colorpicker.colorpicker-horizontal{width:110px;min-width:110px;height:auto}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-hue,.colorpicker.colorpicker-horizontal .colorpicker-alpha{width:100px;height:15px;float:left;cursor:col-resize;margin-left:0;margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-hue i,.colorpicker.colorpicker-horizontal .colorpicker-alpha i{display:block;height:15px;background:#fff;position:absolute;top:0;left:0;width:1px;border:none;margin-top:0}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url(../js/colorpicker/images/hue-horizontal.png)}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url(../js/colorpicker/images/alpha-horizontal.png)}.colorpicker.colorpicker-hidden{display:none}.colorpicker.colorpicker-visible{display:block}.colorpicker-inline.colorpicker-visible{display:inline-block}html .select2-container{width:100%}html .select2-container .select2-choice{background:#fff!important;border-color:#e4e4e4!important;padding:0;height:35px;-webkit-border-radius:0!important;-webkit-background-clip:padding-box!important;-moz-border-radius:0!important;-moz-background-clip:padding!important;border-radius:0!important;background-clip:padding-box!important;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}html .select2-container .select2-choice .select2-chosen,html .select2-container .select2-choice .select2-search-choice-close,html .select2-container .select2-choice .select2-arrow{padding:0;line-height:35px}html .select2-container .select2-choice .select2-chosen{margin:0;padding-left:15px;padding-right:10px;margin-right:35px}html .select2-container .select2-choice .select2-search-choice-close{margin-right:20px;top:11px}html .select2-container .select2-choice .select2-arrow{background:#f5f5f5;border-left-color:#e4e4e4;text-align:center;color:#717272;width:35px;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}html .select2-container .select2-choice .select2-arrow b{background:none!important;-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);-webkit-transition:all 150ms ease-in-out;-moz-transition:all 150ms ease-in-out;-o-transition:all 150ms ease-in-out;transition:all 150ms ease-in-out}html .select2-container .select2-choice .select2-arrow b:before{position:relative;display:block;font-family:FontAwesome;content:'\f107'}html .select2-container.select2-dropdown-open{border-color:#e4e4e4!important;-webkit-border-radius:0!important;-webkit-background-clip:padding-box!important;-moz-border-radius:0!important;-moz-background-clip:padding!important;border-radius:0!important;background-clip:padding-box!important}html .select2-container.select2-dropdown-open .select2-arrow{border-left:1px solid #e4e4e4!important}html .select2-container.select2-dropdown-open .select2-arrow b{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}html .select2-container.select2-container-multi .select2-choices{border:1px solid #e4e4e4;background:#fff;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}html .select2-container.select2-container-multi .select2-choices .select2-search-choice{background:#f5f5f5;border:1px solid #e4e4e4;-webkit-box-shadow:none!important;-moz-box-shadow:none!important;box-shadow:none!important;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}html .select2-container.select2-container-multi .select2-choices .select2-search-choice div{color:#7d7f7f}html .select2-drop{border-top:1px solid #fff;-webkit-border-radius:0!important;-webkit-background-clip:padding-box!important;-moz-border-radius:0!important;-moz-background-clip:padding!important;border-radius:0!important;background-clip:padding-box!important}html .select2-drop.select2-drop-above{border:1px solid #e4e4e4!important;border-top:1px solid #e4e4e4!important}html .select2-drop.select2-drop-above .select2-search input{margin-top:0}html .select2-drop.select2-drop-active{border-color:#e4e4e4;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}html .select2-drop .select2-search{padding:0;position:relative}html .select2-drop .select2-search:after{position:absolute;content:'\e801';font-family:linecons;color:#979898;right:0;top:0;bottom:0;padding:10px 15px;z-index:2}html .select2-drop .select2-input{border:0;background:0 0;padding:0;height:auto;padding:10px 15px;padding-right:45px;background-image:none!important;border-bottom:1px solid #e8e8e8;position:relative;z-index:1;background:#f5f5f5}html .select2-drop .select2-results{padding:0;margin:0;max-height:250px}html .select2-drop .select2-results.overflow-hidden{overflow:hidden;position:relative}html .select2-drop .select2-results li.select2-result-selectable .select2-result-label{color:#7d7f7f;padding-left:15px}html .select2-drop .select2-results li.select2-result-unselectable .select2-result-label{padding:8px 15px;color:#7d7f7f}html .select2-drop .select2-results li.select2-no-results,html .select2-drop .select2-results li.select2-searching{padding:10px 15px;color:#979898;background:#fff}html .select2-drop .select2-results li ul .select2-result-label{padding-left:30px!important}html .select2-drop .select2-results li .select2-result-unselectable.select2-disabled{border:0!important;background:#f9f9f9}html .select2-drop .select2-results li .select2-result-unselectable.select2-disabled .select2-result-label{cursor:not-allowed;color:#a4a5a5}html .select2-drop .select2-results li .select2-result-selectable .select2-result-label{padding:5px}html .select2-drop .select2-results li .select2-result-selectable.select2-highlighted .select2-result-label{color:#fff}html .select2-drop .select2-results li.select2-highlighted{background-color:#68b828}html .select2-drop .select2-results li.select2-highlighted .select2-result-label{color:#fff}.selectboxit-container{position:relative;display:block;vertical-align:top}.selectboxit-container .selectboxit-open .selectboxit-arrow-container{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectboxit-container *{font:14px Helvetica,Arial;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:-moz-none;-ms-user-select:none;-o-user-select:none;user-select:none;outline:0;white-space:nowrap}.selectboxit-container .selectboxit{width:100%!important;cursor:pointer;margin:0;padding:0;border-radius:0;overflow:hidden;display:block;position:relative}.selectboxit-container span,.selectboxit-container .selectboxit-options a{height:35px;line-height:35px;display:block}.selectboxit-container .selectboxit-options a{height:25px;line-height:25px}.selectboxit-container .selectboxit:focus{outline:0}.selectboxit.selectboxit-disabled,.selectboxit-options .selectboxit-disabled{opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;cursor:default}.selectboxit-text{text-indent:10px;overflow:hidden;text-overflow:ellipsis;float:left;max-width:100%!important;color:#7d7f7f;font-size:13px}.selectboxit .selectboxit-option-icon-container{margin-left:5px}.selectboxit-container .selectboxit-options{-moz-box-sizing:border-box;box-sizing:border-box;min-width:100%;;margin:0;padding:0;list-style:none;position:absolute;overflow-x:hidden;overflow-y:auto;cursor:pointer;display:none;z-index:9999999999999;border-radius:0;text-align:left;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.selectboxit-option .selectboxit-option-anchor{padding:0 10px}.selectboxit-option .selectboxit-option-anchor:hover{text-decoration:none}.selectboxit-option,.selectboxit-optgroup-header{text-indent:5px;margin:0;list-style-type:none}.selectboxit-option-first{border-top-right-radius:0;border-top-left-radius:0}.selectboxit-optgroup-header+.selectboxit-option-first{border-top-right-radius:0;border-top-left-radius:0}.selectboxit-option-last{border-bottom-right-radius:0;border-bottom-left-radius:0}.selectboxit-optgroup-header{font-weight:700}.selectboxit-optgroup-header:hover{cursor:default}.selectboxit-arrow-container{width:30px;position:absolute;right:0;-webkit-transition:all 220ms ease-in-out;-moz-transition:all 220ms ease-in-out;-o-transition:all 220ms ease-in-out;transition:all 220ms ease-in-out}.selectboxit .selectboxit-arrow-container .selectboxit-arrow{margin:0 auto;position:absolute;top:10px;right:10px;left:0}.selectboxit .selectboxit-arrow-container .selectboxit-arrow.ui-icon{top:30%}.selectboxit-option-icon-container{float:left}.selectboxit-container .selectboxit-option-icon{margin:0;padding:0;vertical-align:middle}.selectboxit-option-icon-url{width:18px;background-size:18px 18px;background-repeat:no-repeat;height:100%;background-position:center;float:left}.selectboxit-rendering{display:inline-block!important;;zoom:1!important;visibility:visible!important;position:absolute!important;top:-9999px!important;left:-9999px!important}.jqueryui .ui-icon{background-color:inherit}.jqueryui .ui-icon-triangle-1-s{background-position:-64px -16px}.selectboxit-btn{background-color:#fff;background-repeat:repeat-x;border:1px solid #e4e4e4}.selectboxit-btn.selectboxit-enabled:hover,.selectboxit-btn.selectboxit-enabled:focus,.selectboxit-btn.selectboxit-enabled:active{color:#2c2e2f}.selectboxit-btn.selectboxit-enabled:hover,.selectboxit-btn.selectboxit-enabled:focus{color:#2c2e2f;text-decoration:none;background-position:0 -15px}.selectboxit-default-arrow{width:0;height:0}.selectboxit-default-arrow:before{display:block;content:'\f107';font-family:FontAwesome}.selectboxit-list{background-color:#fff;border:1px solid #e4e4e4;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);width:100%;max-height:250px}.selectboxit-list.ps-container{overflow:hidden}.selectboxit-list .selectboxit-option-anchor{color:#717272;font-size:13px}.selectboxit-list>.selectboxit-focus>.selectboxit-option-anchor{color:#fff;background-color:#68b828;background-repeat:repeat-x}.selectboxit-list>.selectboxit-disabled>.selectboxit-option-anchor{color:#999}.bootstrap-tagsinput{background-color:#fff;border:1px solid #e4e4e4;display:block;padding:4px 6px;color:#7d7f7f;vertical-align:middle;max-width:100%;line-height:22px;cursor:text}.bootstrap-tagsinput input{border:none;box-shadow:none;outline:0;background-color:transparent;padding:0;margin:0;width:auto!important;max-width:inherit}.bootstrap-tagsinput input:focus{border:none;box-shadow:none}.bootstrap-tagsinput .tag{margin-right:2px;color:#fff}.bootstrap-tagsinput .tag [data-role=remove]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role=remove]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role=remove]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.bootstrap-tagsinput .tag [data-role=remove]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}span.twitter-typeahead{width:100%}span.twitter-typeahead .tt-dropdown-menu{background:#fff;border:1px solid #e4e4e4;width:100%;margin-top:-1px;max-height:250px;overflow:auto}span.twitter-typeahead .tt-suggestion.tt-cursor{background-color:#fafafa}span.twitter-typeahead .tt-hint{color:#cacbcb}span.twitter-typeahead .empty-message{padding:5px 13px;color:#bdbebe}span.twitter-typeahead .tt-suggestion>p{padding:5px 13px}span.twitter-typeahead .tt-suggestion>p .tt-highlight{color:#7d7f7f}span.twitter-typeahead .tt-suggestion>p:hover,span.twitter-typeahead .tt-suggestion>p:focus{background:#fafafa;cursor:pointer}.input-group span.twitter-typeahead{display:block!important}.input-group span.twitter-typeahead .tt-dropdown-menu{top:32px!important}.input-group.input-group-lg span.twitter-typeahead .tt-dropdown-menu{top:44px!important}.input-group.input-group-sm span.twitter-typeahead .tt-dropdown-menu{top:28px!important}.ms-container{-webkit-background-size:21px!important;-moz-background-size:21px!important;background-size:21px!important}@media screen and (max-width:768px){.ms-container{width:100%!important}}.ms-container>div>.ms-list{border-color:#e4e4e4!important;-webkit-box-shadow:none!important;-moz-box-shadow:none!important;box-shadow:none!important;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden}.ms-container>div>.ms-list:active{border-color:#cbcbcb!important}.ms-container>div>.ms-list li{display:block;width:100%}.ms-container>div>.ms-list li span{font-size:13px}.ms-container>div>.ms-list li.ms-hover{background-color:#68b828}.icheck-list{width:100%;padding:0;margin:0;list-style:none}.icheck-list>li{display:block;margin-bottom:10px}.icheck-list>li:last-child{margin-bottom:0}.icheck-list>li div+label{position:relative;top:1px;margin-left:5px}.icheck-skins{display:block;margin-top:10px}.icheck-skins a{display:inline-block;border:1px solid transparent;background:#333;-webkit-transition:all 450ms cubic-bezier(0.175,.885,.32,1.275);-moz-transition:all 450ms cubic-bezier(0.175,.885,.32,1.275);-o-transition:all 450ms cubic-bezier(0.175,.885,.32,1.275);transition:all 450ms cubic-bezier(0.175,.885,.32,1.275);width:20px;height:20px;margin-right:5px}.icheck-skins a[data-color-class=red]{background-color:#d54e21}.icheck-skins a[data-color-class=green]{background-color:#1b7e5a}.icheck-skins a[data-color-class=blue]{background-color:#2489c5}.icheck-skins a[data-color-class=aero]{background-color:#9cc2cb}.icheck-skins a[data-color-class=grey]{background-color:#73716e}.icheck-skins a[data-color-class=orange]{background-color:#f70}.icheck-skins a[data-color-class=yellow]{background-color:#fc3}.icheck-skins a[data-color-class=pink]{background-color:#a77a94}.icheck-skins a[data-color-class=purple]{background-color:#6a5a8c}.icheck-skins a.current{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.5);-moz-box-shadow:0 0 0 1px rgba(0,0,0,.5);box-shadow:0 0 0 1px rgba(0,0,0,.5);-webkit-transform:scale(1.15);-moz-transform:scale(1.15);-o-transform:scale(1.15);-ms-transform:scale(1.15);transform:scale(1.15)}.form-wizard>.tabs{list-style:none;padding:0;margin:0;display:table;position:relative;width:100%}.form-wizard>.tabs>li{display:table-cell;width:1%;text-align:center;background:#fcfcfc}.form-wizard>.tabs>li a{position:relative;display:block;padding:10px 5px;color:#979898}.form-wizard>.tabs>li a>span{background:#68b828;font-size:12px;color:#fff;background:#e9e9e9;color:#979898;padding:2px 0;text-align:center;display:block;position:relative;margin:-10px -5px;margin-top:10px}.form-wizard>.tabs>li a:after{content:'';position:absolute;display:block;height:10px;background:0 0;top:100%;left:0;right:0}.form-wizard>.tabs>li a:hover{background:#f7f7f7}.form-wizard>.tabs>li+li{border-left:1px solid #eee}.form-wizard>.tabs>li.active a{color:#646565}.form-wizard>.tabs>li.active a:after{background-color:rgba(0,0,0,.1)}.form-wizard>.tabs>li.completed{background-color:#f7f7f7}.form-wizard>.progress-indicator{height:10px;position:relative;background:0 0;width:0;overflow:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:height 250ms cubic-bezier(0.19,1,.22,1),width 500ms cubic-bezier(0.19,1,.22,1);-moz-transition:height 250ms cubic-bezier(0.19,1,.22,1),width 500ms cubic-bezier(0.19,1,.22,1);-o-transition:height 250ms cubic-bezier(0.19,1,.22,1),width 500ms cubic-bezier(0.19,1,.22,1);transition:height 250ms cubic-bezier(0.19,1,.22,1),width 500ms cubic-bezier(0.19,1,.22,1)}.form-wizard>.progress-indicator>span{display:block;background:#8dc63f;height:10px;line-height:1;text-indent:-9999px}.form-wizard .tab-content{margin-top:20px}.form-wizard .tab-content strong{color:#7d7f7f}.form-wizard .tab-content label{color:#979898}.form-wizard .tab-content .tab-pane>.form-group{margin-bottom:25px}.form-wizard .tab-content .tab-pane>.form-group:last-child{margin-bottom:0}.form-wizard .tab-content.no-margin{margin-top:0}.form-wizard .tab-content.no-margin .tab-pane.with-bg{padding-top:15px}.form-wizard .tab-content .tab-pane.with-bg{background:#fff;padding:20px}.form-wizard .pager{margin-top:20px}.form-wizard .pager .previous+.previous a{margin-left:5px}.form-wizard .pager .next+.next a{margin-right:5px}.form-wizard .pager .disabled a{zoom:1;filter:alpha(opacity=50);-webkit-opacity:.5;-moz-opacity:.5;opacity:.5}html body .ui-rangeSlider .ui-rangeSlider-container{height:10px;background:#ebebeb;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}html body .ui-rangeSlider .ui-rangeSlider-container .ui-rangeSlider-bar{background:#68b828;height:10px}html body .ui-rangeSlider .ui-rangeSlider-container .ui-rangeSlider-handle{position:relative;background:#68b828;width:10px;height:10px;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box;border:0 solid #FFF;padding:8px;margin-top:-7px}html body .ui-rangeSlider .ui-rangeSlider-container .ui-rangeSlider-handle.ui-rangeSlider-leftHandle{-webkit-transform:translateX(-100px);-moz-transform:translateX(-100px);-o-transform:translateX(-100px);-ms-transform:translateX(-100px);transform:translateX(-100px)}html body .ui-rangeSlider .ui-rangeSlider-label{visibility:hidden}html body .slider{height:8px;margin-bottom:30px;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box;background:#ebebeb}html body .slider .ui-slider-handle{background:#68b828;top:-3px;border:0;width:14px;height:14px;margin-top:0;outline:0;cursor:pointer!important}html body .slider .ui-slider-handle .ui-label{position:absolute;left:-50%;top:18px;color:#7d7f7f;margin-left:4px;white-space:nowrap}html body .slider .ui-slider-range{background:#68b828;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}html body .slider.ui-slider-horizontal .ui-slider-handle .ui-label{margin-top:0}html body .slider.ui-slider-vertical{height:250px;width:8px}html body .slider.ui-slider-vertical .ui-slider-handle{top:auto;margin-left:.5px}html body .slider.ui-slider-vertical .ui-slider-handle .ui-label{top:-1px;left:18px}html body .slider .ui-slider-handle{background:#508e1f;border:0}html body .slider .ui-slider-range,html body .slider .ui-fill{background:#68b828}html body .slider.slider-primary{background:#ebebeb}html body .slider.slider-primary .ui-slider-handle{background:#131415;border:0}html body .slider.slider-primary .ui-slider-range,html body .slider.slider-primary .ui-fill{background:#2c2e2f}html body .slider.slider-secondary{background:#ebebeb}html body .slider.slider-secondary .ui-slider-handle{background:#508e1f;border:0}html body .slider.slider-secondary .ui-slider-range,html body .slider.slider-secondary .ui-fill{background:#68b828}html body .slider.slider-success{background:#ebebeb}html body .slider.slider-success .ui-slider-handle{background:#72a230;border:0}html body .slider.slider-success .ui-slider-range,html body .slider.slider-success .ui-fill{background:#8dc63f}html body .slider.slider-info{background:#ebebeb}html body .slider.slider-info .ui-slider-handle{background:#18a8df;border:0}html body .slider.slider-info .ui-slider-range,html body .slider.slider-info .ui-fill{background:#40bbea}html body .slider.slider-danger{background:#ebebeb}html body .slider.slider-danger .ui-slider-handle{background:#ab2d32;border:0}html body .slider.slider-danger .ui-slider-range,html body .slider.slider-danger .ui-fill{background:#cc3f44}html body .slider.slider-warning{background:#ebebeb}html body .slider.slider-warning .ui-slider-handle{background:#f7d227;border:0}html body .slider.slider-warning .ui-slider-range,html body .slider.slider-warning .ui-fill{background:#f9dc58}html body .slider.slider-purple{background:#ebebeb}html body .slider.slider-purple .ui-slider-handle{background:#622c95;border:0}html body .slider.slider-purple .ui-slider-range,html body .slider.slider-purple .ui-fill{background:#7c38bc}html body .slider.slider-blue{background:#ebebeb}html body .slider.slider-blue .ui-slider-handle{background:#0b4b97;border:0}html body .slider.slider-blue .ui-slider-range,html body .slider.slider-blue .ui-fill{background:#0e62c7}html body .slider.slider-red{background:#ebebeb}html body .slider.slider-red .ui-slider-handle{background:#a4060c;border:0}html body .slider.slider-red .ui-slider-range,html body .slider.slider-red .ui-fill{background:#d5080f}html body .slider.slider-gray{background:#ebebeb}html body .slider.slider-gray .ui-slider-handle{background:#959595;border:0}html body .slider.slider-gray .ui-slider-range,html body .slider.slider-gray .ui-fill{background:#aeaeae}.wysihtml5{min-height:250px}.wysihtml5-toolbar .btn{margin-bottom:0}.wysihtml5-toolbar .btn.btn-white:active,.wysihtml5-toolbar .btn.btn-white:focus,.wysihtml5-toolbar .btn.btn-white.active{border-color:#d8d8d8!important}.wysihtml5-toolbar .btn.btn-white.wysihtml5-command-active{background:#eee;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.wysihtml5-toolbar .btn.btn-white.dropdown-toggle i{position:relative;top:1px}.wysihtml5-toolbar li.html-code-icon{float:right}.wysihtml5-toolbar .dropdown-menu{border-color:#e4e4e4}.wysihtml5-toolbar a.wysihtml5-colors-title{padding-top:3px!important;padding-left:35px!important}.wysihtml5-toolbar div.wysihtml5-colors{width:25px!important}.wysihtml5-sandbox{min-height:250px;padding:10px 15px!important}.wysihtml5-sandbox::-webkit-scrollbar{width:5px}.wysihtml5-sandbox::-webkit-scrollbar-track{width:5px;background-color:#e0e0e0}.wysihtml5-sandbox::-webkit-scrollbar-thumb{background-color:#bdbdbd}.modal .bootstrap-wysihtml5-insert-link-url{margin-bottom:12px!important}.modal .bootstrap-wysihtml5-insert-link-url+label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.modal .bootstrap-wysihtml5-insert-link-url+label input{top:4px;margin-right:10px!important}html .dropzone{border:1px solid #e9e9e9;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.droppable-area{display:inline-block;background:#ededed;border:2px dashed #cbcbcb;width:150px;min-height:150px!important;height:150px;line-height:150px;text-align:center;font-size:15px;color:#646565;margin-bottom:30px;-webkit-border-radius:50%;-webkit-background-clip:padding-box;-moz-border-radius:50%;-moz-background-clip:padding;border-radius:50%;background-clip:padding-box}.droppable-area.dz-clickable{cursor:pointer}.droppable-area.dz-drag-hover{background:#68b828;color:#fff;border-style:solid;border-color:#508e1f;border-width:5px;line-height:143px}input[type=checkbox].iswitch{font-size:10px;position:relative;display:inline-block;width:38px;height:22px;line-height:22px;border-radius:11px;margin:0;padding:0;box-shadow:inset 0 0 0 2px #eee;outline:1px solid transparent!important;cursor:pointer;border:none;background:0 0;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin-right:4px;margin-bottom:7px;transition:box-shadow .3s ease-in-out,padding .25s ease-in-out;transition-delay:.1s,0s}input[type=checkbox].iswitch:checked{transition-delay:0s,0s;box-shadow:inset 0 0 0 12.57px #eee!important;padding-left:16px}input[type=checkbox].iswitch.iswitch-primary:checked{box-shadow:inset 0 0 0 12.57px #2c2e2f!important}input[type=checkbox].iswitch.iswitch-secondary:checked{box-shadow:inset 0 0 0 12.57px #68b828!important}input[type=checkbox].iswitch.iswitch-info:checked{box-shadow:inset 0 0 0 12.57px #40bbea!important}input[type=checkbox].iswitch.iswitch-warning:checked{box-shadow:inset 0 0 0 12.57px #ffba00!important}input[type=checkbox].iswitch.iswitch-danger:checked{box-shadow:inset 0 0 0 12.57px #cc3f44!important}input[type=checkbox].iswitch.iswitch-success:checked{box-shadow:inset 0 0 0 12.57px #8dc63f!important}input[type=checkbox].iswitch.iswitch-red:checked{box-shadow:inset 0 0 0 12.57px #d5080f!important}input[type=checkbox].iswitch.iswitch-blue:checked{box-shadow:inset 0 0 0 12.57px #0e62c7!important}input[type=checkbox].iswitch.iswitch-purple:checked{box-shadow:inset 0 0 0 12.57px #7c38bc!important}input[type=checkbox].iswitch.iswitch-pink:checked{box-shadow:inset 0 0 0 12.57px #ff6264!important}input[type=checkbox].iswitch.iswitch-turquoise:checked{box-shadow:inset 0 0 0 12.57px #00b19d!important}input[type=checkbox].iswitch.iswitch-yellow:checked{box-shadow:inset 0 0 0 12.57px #fcd036!important}input[type=checkbox].iswitch.iswitch-orange:checked{box-shadow:inset 0 0 0 12.57px #f7aa47!important}input[type=checkbox].iswitch.iswitch-gray:checked{box-shadow:inset 0 0 0 12.57px #d5d5d5!important}input[type=checkbox].iswitch.hit{-webkit-animation:slide-off .35s ease both;-moz-animation:slide-off .35s ease both;-o-animation:slide-off .35s ease both;animation:slide-off .35s ease both}input[type=checkbox].iswitch.hit:checked{-webkit-animation:slide-on .35s ease both .05s;-moz-animation:slide-on .35s ease both .05s;-o-animation:slide-on .35s ease both .05s;animation:slide-on .35s ease both .05s}input[type=checkbox].iswitch:before,input[type=checkbox].iswitch:after{content:""}input[type=checkbox].iswitch:after{position:absolute;top:-6px;left:-6px;bottom:-6px;right:-6px}input[type=checkbox].iswitch:before{display:inline-block;height:18px;width:18px;margin:2px 0 0 2px;background-color:#fff;border-radius:9px;box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 0 1px 1px rgba(0,0,0,.1);-webkit-transition:all .1s ease .1s;-moz-transition:all .1s ease .1s;-o-transition:all .1s ease .1s;transition:all .1s ease .1s}input[type=checkbox].iswitch:active:before{transition:all .1s ease .05s}input[type=checkbox].iswitch.touch:hover:before{transition:all 0s ease 0s}input[type=checkbox].iswitch:active:before,input[type=checkbox].iswitch.touch:hover:before{width:20px}input[type=checkbox].iswitch:active:checked:before,input[type=checkbox].iswitch.touch:hover:checked:before{margin-left:0}@keyframes slide-on{0%{padding-left:0}60%{padding-left:16px}100%{padding-left:16px}}@keyframes slide-off{0%{padding-left:16px;text-indent:0}60%{padding-left:0;text-indent:0}100%{padding-left:0;text-indent:0}}input[type=checkbox].iswitch-lg{font-size:10px;position:relative;display:inline-block;width:50px;height:28px;line-height:28px;border-radius:14px;margin:0;padding:0;box-shadow:inset 0 0 0 2px #eee;outline:1px solid transparent!important;cursor:pointer;border:none;background:0 0;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin-right:4px;margin-bottom:7px;transition:box-shadow .3s ease-in-out,padding .25s ease-in-out;transition-delay:.1s,0s}input[type=checkbox].iswitch-lg:checked{transition-delay:0s,0s;box-shadow:inset 0 0 0 16px #eee!important;padding-left:22px}input[type=checkbox].iswitch-lg.iswitch-primary:checked{box-shadow:inset 0 0 0 16px #2c2e2f!important}input[type=checkbox].iswitch-lg.iswitch-secondary:checked{box-shadow:inset 0 0 0 16px #68b828!important}input[type=checkbox].iswitch-lg.iswitch-info:checked{box-shadow:inset 0 0 0 16px #40bbea!important}input[type=checkbox].iswitch-lg.iswitch-warning:checked{box-shadow:inset 0 0 0 16px #ffba00!important}input[type=checkbox].iswitch-lg.iswitch-danger:checked{box-shadow:inset 0 0 0 16px #cc3f44!important}input[type=checkbox].iswitch-lg.iswitch-success:checked{box-shadow:inset 0 0 0 16px #8dc63f!important}input[type=checkbox].iswitch-lg.iswitch-red:checked{box-shadow:inset 0 0 0 16px #d5080f!important}input[type=checkbox].iswitch-lg.iswitch-blue:checked{box-shadow:inset 0 0 0 16px #0e62c7!important}input[type=checkbox].iswitch-lg.iswitch-purple:checked{box-shadow:inset 0 0 0 16px #7c38bc!important}input[type=checkbox].iswitch-lg.iswitch-pink:checked{box-shadow:inset 0 0 0 16px #ff6264!important}input[type=checkbox].iswitch-lg.iswitch-turquoise:checked{box-shadow:inset 0 0 0 16px #00b19d!important}input[type=checkbox].iswitch-lg.iswitch-yellow:checked{box-shadow:inset 0 0 0 16px #fcd036!important}input[type=checkbox].iswitch-lg.iswitch-orange:checked{box-shadow:inset 0 0 0 16px #f7aa47!important}input[type=checkbox].iswitch-lg.iswitch-gray:checked{box-shadow:inset 0 0 0 16px #d5d5d5!important}input[type=checkbox].iswitch-lg.hit{-webkit-animation:slide-off .35s ease both;-moz-animation:slide-off .35s ease both;-o-animation:slide-off .35s ease both;animation:slide-off .35s ease both}input[type=checkbox].iswitch-lg.hit:checked{-webkit-animation:slide-on .35s ease both .05s;-moz-animation:slide-on .35s ease both .05s;-o-animation:slide-on .35s ease both .05s;animation:slide-on .35s ease both .05s}input[type=checkbox].iswitch-lg:before,input[type=checkbox].iswitch-lg:after{content:""}input[type=checkbox].iswitch-lg:after{position:absolute;top:-8px;left:-8px;bottom:-8px;right:-8px}input[type=checkbox].iswitch-lg:before{display:inline-block;height:24px;width:24px;margin:2px 0 0 2px;background-color:#fff;border-radius:12px;box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 0 1px 1px rgba(0,0,0,.1);-webkit-transition:all .1s ease .1s;-moz-transition:all .1s ease .1s;-o-transition:all .1s ease .1s;transition:all .1s ease .1s}input[type=checkbox].iswitch-lg:active:before{transition:all .1s ease .05s}input[type=checkbox].iswitch-lg.touch:hover:before{transition:all 0s ease 0s}input[type=checkbox].iswitch-lg:active:before,input[type=checkbox].iswitch-lg.touch:hover:before{width:26px}input[type=checkbox].iswitch-lg:active:checked:before,input[type=checkbox].iswitch-lg.touch:hover:checked:before{margin-left:0}@keyframes slide-on{0%{padding-left:0}60%{padding-left:22px}100%{padding-left:22px}}@keyframes slide-off{0%{padding-left:22px;text-indent:0}60%{padding-left:0;text-indent:0}100%{padding-left:0;text-indent:0}}input[type=checkbox].iswitch-xlg{font-size:10px;position:relative;display:inline-block;width:85px;height:38px;line-height:38px;border-radius:19px;margin:0;padding:0;box-shadow:inset 0 0 0 2px #eee;outline:1px solid transparent!important;cursor:pointer;border:none;background:0 0;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin-right:4px;margin-bottom:7px;transition:box-shadow .3s ease-in-out,padding .25s ease-in-out;transition-delay:.1s,0s}input[type=checkbox].iswitch-xlg:checked{transition-delay:0s,0s;box-shadow:inset 0 0 0 21.71px #eee!important;padding-left:47px}input[type=checkbox].iswitch-xlg.iswitch-primary:checked{box-shadow:inset 0 0 0 21.71px #2c2e2f!important}input[type=checkbox].iswitch-xlg.iswitch-secondary:checked{box-shadow:inset 0 0 0 21.71px #68b828!important}input[type=checkbox].iswitch-xlg.iswitch-info:checked{box-shadow:inset 0 0 0 21.71px #40bbea!important}input[type=checkbox].iswitch-xlg.iswitch-warning:checked{box-shadow:inset 0 0 0 21.71px #ffba00!important}input[type=checkbox].iswitch-xlg.iswitch-danger:checked{box-shadow:inset 0 0 0 21.71px #cc3f44!important}input[type=checkbox].iswitch-xlg.iswitch-success:checked{box-shadow:inset 0 0 0 21.71px #8dc63f!important}input[type=checkbox].iswitch-xlg.iswitch-red:checked{box-shadow:inset 0 0 0 21.71px #d5080f!important}input[type=checkbox].iswitch-xlg.iswitch-blue:checked{box-shadow:inset 0 0 0 21.71px #0e62c7!important}input[type=checkbox].iswitch-xlg.iswitch-purple:checked{box-shadow:inset 0 0 0 21.71px #7c38bc!important}input[type=checkbox].iswitch-xlg.iswitch-pink:checked{box-shadow:inset 0 0 0 21.71px #ff6264!important}input[type=checkbox].iswitch-xlg.iswitch-turquoise:checked{box-shadow:inset 0 0 0 21.71px #00b19d!important}input[type=checkbox].iswitch-xlg.iswitch-yellow:checked{box-shadow:inset 0 0 0 21.71px #fcd036!important}input[type=checkbox].iswitch-xlg.iswitch-orange:checked{box-shadow:inset 0 0 0 21.71px #f7aa47!important}input[type=checkbox].iswitch-xlg.iswitch-gray:checked{box-shadow:inset 0 0 0 21.71px #d5d5d5!important}input[type=checkbox].iswitch-xlg.hit{-webkit-animation:slide-off .35s ease both;-moz-animation:slide-off .35s ease both;-o-animation:slide-off .35s ease both;animation:slide-off .35s ease both}input[type=checkbox].iswitch-xlg.hit:checked{-webkit-animation:slide-on .35s ease both .05s;-moz-animation:slide-on .35s ease both .05s;-o-animation:slide-on .35s ease both .05s;animation:slide-on .35s ease both .05s}input[type=checkbox].iswitch-xlg:before,input[type=checkbox].iswitch-xlg:after{content:""}input[type=checkbox].iswitch-xlg:after{position:absolute;top:-11.33px;left:-11.33px;bottom:-11.33px;right:-11.33px}input[type=checkbox].iswitch-xlg:before{display:inline-block;height:34px;width:34px;margin:2px 0 0 2px;background-color:#fff;border-radius:17px;box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 0 1px 1px rgba(0,0,0,.1);-webkit-transition:all .1s ease .1s;-moz-transition:all .1s ease .1s;-o-transition:all .1s ease .1s;transition:all .1s ease .1s}input[type=checkbox].iswitch-xlg:active:before{transition:all .1s ease .05s}input[type=checkbox].iswitch-xlg.touch:hover:before{transition:all 0s ease 0s}input[type=checkbox].iswitch-xlg:active:before,input[type=checkbox].iswitch-xlg.touch:hover:before{width:36px}input[type=checkbox].iswitch-xlg:active:checked:before,input[type=checkbox].iswitch-xlg.touch:hover:checked:before{margin-left:0}@keyframes slide-on{0%{padding-left:0}60%{padding-left:47px}100%{padding-left:47px}}@keyframes slide-off{0%{padding-left:47px;text-indent:0}60%{padding-left:0;text-indent:0}100%{padding-left:0;text-indent:0}} \ No newline at end of file diff --git a/web/static/index/css/xenon-skins.css b/web/static/index/css/xenon-skins.css new file mode 100644 index 0000000..3591c71 --- /dev/null +++ b/web/static/index/css/xenon-skins.css @@ -0,0 +1 @@ +.page-body.skin-aero .btn-primary {background: #558c89 }.page-body.skin-aero .btn-primary:hover {background: #4b7c79;border-color: #4b7c79 }.page-body.skin-aero .btn-primary:active, .page-body.skin-aero .btn-primary:focus {background: #385c5a;border-color: #385c5a }.page-body.skin-aero .btn.btn-secondary {background-color: #255e5b;color: #fff }.page-body.skin-aero .btn.btn-secondary:hover {background-color: #1e4c49;text-color: #fff }.page-body.skin-aero .btn.btn-secondary:active, .page-body.skin-aero .btn.btn-secondary:focus {background-color: #1e4c49;border-color: #1b4442 }.page-body.skin-aero .settings-pane {background: #5f9a97;color: #ececea }.page-body.skin-aero .settings-pane>a[data-toggle=settings-pane] {color: #ececea }.page-body.skin-aero .settings-pane>a[data-toggle=settings-pane]:hover {color: #FFF }.page-body.skin-aero .settings-pane .user-info .user-details h3 a {color: #fff }.page-body.skin-aero .settings-pane .user-info .user-details .user-title {color: rgba(255, 255, 255, .65) }.page-body.skin-aero .settings-pane .links-block.left-sep {border-left: 1px solid #558c89 }.page-body.skin-aero .settings-pane .links-block h4 {color: #fff }.page-body.skin-aero .settings-pane .links-block h4 span {display: inline-block;border-bottom: 1px solid #5f9a97 }.page-body.skin-aero .settings-pane .links-block h4 a {color: #fff }.page-body.skin-aero .settings-pane .links-block h4 a:hover {color: #ececea }.page-body.skin-aero .settings-pane .links-block ul li a {color: #ececea }.page-body.skin-aero .settings-pane .links-block ul li a:hover {color: #fff }.page-body.skin-aero .sidebar-menu {background: #558c89 }.page-body.skin-aero .sidebar-menu .logo-env {border-bottom: 1px solid #5f9a97 }.page-body.skin-aero .sidebar-menu .logo-env .settings-icon a {color: #ececea }.page-body.skin-aero .sidebar-menu .logo-env .settings-icon a:hover {color: #fff }.page-body.skin-aero .sidebar-menu .main-menu a {color: #ececea;border-bottom: 1px solid #5f9a97 }.page-body.skin-aero .sidebar-menu .main-menu a:hover {color: #fff }.page-body.skin-aero .sidebar-menu .main-menu li.active>a {color: #fff }.page-body.skin-aero .sidebar-menu .main-menu li.has-sub>a:before {color: #acccca }.page-body.skin-aero .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x, .page-body.skin-aero .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y {background-color: #fff }@media screen and (min-width:768px) {.page-body.skin-aero .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar] {color: #606161 }.page-body.skin-aero .sidebar-menu.collapsed .main-menu>li.active, .page-body.skin-aero .sidebar-menu.collapsed .main-menu>li li.active {background-color: #4f8280 }.page-body.skin-aero .sidebar-menu.collapsed .main-menu>li>ul {background: #558c89 }}.page-body.skin-aero .page-loading-overlay {background-color: #558c89 }.page-body.skin-aero.login-page {background: #558c89;color: #fff }.page-body.skin-aero.login-page .login-form .login-header .logo span {color: #ececea }.page-body.skin-aero.login-page .login-form .login-header p {color: #ececea }.page-body.skin-aero.login-page .login-form .form-group .control-label {color: #ececea }.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark {background: #4b7c79;border: 1px solid transparent;color: #ececea }.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff;opacity: 1 }.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder {color: #fff }.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff }.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-aero.login-page .login-form .form-group .form-control.error {border-color: rgba(204, 63, 68, .5) }.page-body.skin-aero.login-page .login-form .form-group .btn.btn-dark {border-color: #5f9a97;background-color: #558c89;color: #fff }.page-body.skin-aero.login-page .login-form .form-group .btn.btn-dark:hover {background-color: rgba(95, 154, 151, .3) }.page-body.skin-aero.login-page .login-form .login-footer {margin-top: 45px }.page-body.skin-aero.login-page .login-form .login-footer a {color: #fff }.page-body.skin-aero.login-page .login-form .login-footer a:hover {color: #fff }.page-body.skin-aero.login-page .login-form .login-footer .info-links {font-size: 11px;margin-top: 5px;color: #ececea }.page-body.skin-aero.login-page .login-form .login-footer .info-links a {color: #ececea }.page-body.skin-aero.login-page .login-form .login-footer .info-links a:hover {color: #fff }.page-body.skin-aero.login-page .external-login {position: relative;margin-bottom: 30px;padding: 0 30px }.page-body.skin-aero.login-page .external-login a {display: block;color: #fff;background: #2c2e2f;padding: 13px 20px;font-size: 15px;margin-bottom: 10px }.page-body.skin-aero.login-page .external-login a i {margin-right: 5px }.page-body.skin-aero.login-page .external-login a:hover {background: #454849 }.page-body.skin-aero.login-page .external-login a.facebook {background-color: #3b5998 }.page-body.skin-aero.login-page .external-login a.facebook:hover {background-color: #2d4373 }.page-body.skin-aero.login-page .external-login a.twitter {background-color: #55acee }.page-body.skin-aero.login-page .external-login a.twitter:hover {background-color: #2795e9 }.page-body.skin-aero.login-page .external-login a.gplus {background-color: #dd4b39 }.page-body.skin-aero.login-page .external-login a.gplus:hover {background-color: #c23321 }.page-body.skin-aero.login-page.login-light {background: #eee }.page-body.skin-aero.login-page.login-light .errors-container, .page-body.skin-aero.login-page.login-light .external-login {padding: 0 }.page-body.skin-aero.login-page.login-light .form-group label.error {color: rgba(151, 152, 152, .8) }.page-body.skin-aero.login-page.login-light .login-form {background: #fff;color: #979898 }.page-body.skin-aero.login-page.login-light .login-form .login-footer a {color: #68b828 }.page-body.skin-aero.login-page.login-light .login-form .login-footer a:hover {color: #508e1f }.page-body.skin-aero.login-page.login-light .login-form .login-footer .info-links a {color: rgba(151, 152, 152, .7) }.page-body.skin-aero.login-page.login-light .login-form .login-footer .info-links a:hover {color: #979898 }@media screen and (max-width:768px) {.page-body.skin-aero.login-page {padding-top: 0 }.page-body.skin-aero.login-page .login-form, .page-body.skin-aero.login-page .errors-container, .page-body.skin-aero.login-page .external-login {padding-left: 10px;padding-right: 10px }.page-body.skin-aero.login-page .errors-container {margin-top: 20px }.page-body.skin-aero.login-page.login-light .login-form {padding-left: 30px;padding-right: 30px }.page-body.skin-aero.login-page.login-light .errors-container, .page-body.skin-aero.login-page.login-light .external-login {padding-left: 0;padding-right: 0 }.page-body.skin-aero.login-page .row {margin: 0 }}.page-body.skin-aero.lockscreen-page {background: #558c89 }.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group p {color: #ececea }.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group h3 {color: #ececea }.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control {border: 1px solid #5f9a97;color: #fff }.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5);opacity: 1 }.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn {color: #fff;border: 1px solid #5f9a97 }.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover, .page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus {background-color: rgba(95, 154, 151, .3) }.page-body.skin-aero.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon {background: #5f9a97;-webkit-box-shadow: 0 0 0 10px #5f9a97, 0 -10px 0 10px #5f9a97, 0 -20px 0 10px #5f9a97, 0 -30px 0 10px #5f9a97;-moz-box-shadow: 0 0 0 10px #5f9a97, 0 -10px 0 10px #5f9a97, 0 -20px 0 10px #5f9a97, 0 -30px 0 10px #5f9a97;box-shadow: 0 0 0 10px #5f9a97, 0 -10px 0 10px #5f9a97, 0 -20px 0 10px #5f9a97, 0 -30px 0 10px #5f9a97 }.page-body.skin-aero .sidebar-user-info {background-color: #4b7c79;border-bottom-color: #5f9a97 }.page-body.skin-aero .sidebar-user-info .user-profile span {color: #ececea }.page-body.skin-aero .sidebar-user-info .user-profile span strong {color: #fff }.page-body.skin-aero .sidebar-user-info .user-links {border-top-color: #5f9a97 }.page-body.skin-aero .sidebar-user-info .user-links li a {color: #ececea }.page-body.skin-aero .sidebar-user-info .user-links li a:hover {color: #fff;background-color: rgba(95, 154, 151, .25) }.page-body.skin-aero .sidebar-user-info .user-links li.active a {color: #fff;background-color: rgba(95, 154, 151, .25) }.page-body.skin-aero .sidebar-user-info .user-links li+li a {border-left-color: #5f9a97 }@media screen and (min-width:991px) {.sidebar-menu.collapsed .page-body.skin-aero .sidebar-user-info .sidebar-user-info-inner .user-profile span {background-color: #27292a }.sidebar-menu.collapsed .page-body.skin-aero .sidebar-user-info .sidebar-user-info-inner .user-links {background-color: #27292a }}.page-body.skin-navy .btn-primary {background: #2c3e50 }.page-body.skin-navy .btn-primary:hover {background: #233140;border-color: #233140 }.page-body.skin-navy .btn-primary:active, .page-body.skin-navy .btn-primary:focus {background: #11181f;border-color: #11181f }.page-body.skin-navy .btn.btn-secondary {background-color: #ff4e50;color: #fff }.page-body.skin-navy .btn.btn-secondary:hover {background-color: #ff3437;text-color: #fff }.page-body.skin-navy .btn.btn-secondary:active, .page-body.skin-navy .btn.btn-secondary:focus {background-color: #ff3437;border-color: #ff2a2d }.page-body.skin-navy .settings-pane {background: #34495e;color: #a7bfd6 }.page-body.skin-navy .settings-pane>a[data-toggle=settings-pane] {color: #a7bfd6 }.page-body.skin-navy .settings-pane>a[data-toggle=settings-pane]:hover {color: #FFF }.page-body.skin-navy .settings-pane .user-info .user-details h3 a {color: #fff }.page-body.skin-navy .settings-pane .user-info .user-details .user-title {color: rgba(255, 255, 255, .65) }.page-body.skin-navy .settings-pane .links-block.left-sep {border-left: 1px solid #2c3e50 }.page-body.skin-navy .settings-pane .links-block h4 {color: #fff }.page-body.skin-navy .settings-pane .links-block h4 span {display: inline-block;border-bottom: 1px solid #34495e }.page-body.skin-navy .settings-pane .links-block h4 a {color: #fff }.page-body.skin-navy .settings-pane .links-block h4 a:hover {color: #a7bfd6 }.page-body.skin-navy .settings-pane .links-block ul li a {color: #a7bfd6 }.page-body.skin-navy .settings-pane .links-block ul li a:hover {color: #fff }.page-body.skin-navy .sidebar-menu {background: #2c3e50 }.page-body.skin-navy .sidebar-menu .logo-env {border-bottom: 1px solid #34495e }.page-body.skin-navy .sidebar-menu .logo-env .settings-icon a {color: #a7bfd6 }.page-body.skin-navy .sidebar-menu .logo-env .settings-icon a:hover {color: #fff }.page-body.skin-navy .sidebar-menu .main-menu a {color: #a7bfd6;border-bottom: 1px solid #34495e }.page-body.skin-navy .sidebar-menu .main-menu a:hover {color: #fff }.page-body.skin-navy .sidebar-menu .main-menu li.active>a {color: #fff }.page-body.skin-navy .sidebar-menu .main-menu li.has-sub>a:before {color: #6789ab }.page-body.skin-navy .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x, .page-body.skin-navy .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y {background-color: #fff }@media screen and (min-width:768px) {.page-body.skin-navy .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar] {color: #606161 }.page-body.skin-navy .sidebar-menu.collapsed .main-menu>li.active, .page-body.skin-navy .sidebar-menu.collapsed .main-menu>li li.active {background-color: #273646 }.page-body.skin-navy .sidebar-menu.collapsed .main-menu>li>ul {background: #2c3e50 }}.page-body.skin-navy .page-loading-overlay {background-color: #2c3e50 }.page-body.skin-navy.login-page {background: #2c3e50;color: #fff }.page-body.skin-navy.login-page .login-form .login-header .logo span {color: #a7bfd6 }.page-body.skin-navy.login-page .login-form .login-header p {color: #a7bfd6 }.page-body.skin-navy.login-page .login-form .form-group .control-label {color: #a7bfd6 }.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark {background: #233140;border: 1px solid transparent;color: #a7bfd6 }.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff;opacity: 1 }.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder {color: #fff }.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff }.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-navy.login-page .login-form .form-group .form-control.error {border-color: rgba(204, 63, 68, .5) }.page-body.skin-navy.login-page .login-form .form-group .btn.btn-dark {border-color: #34495e;background-color: #2c3e50;color: #fff }.page-body.skin-navy.login-page .login-form .form-group .btn.btn-dark:hover {background-color: rgba(52, 73, 94, .3) }.page-body.skin-navy.login-page .login-form .login-footer {margin-top: 45px }.page-body.skin-navy.login-page .login-form .login-footer a {color: #fff }.page-body.skin-navy.login-page .login-form .login-footer a:hover {color: #dbe5ee }.page-body.skin-navy.login-page .login-form .login-footer .info-links {font-size: 11px;margin-top: 5px;color: #a7bfd6 }.page-body.skin-navy.login-page .login-form .login-footer .info-links a {color: #a7bfd6 }.page-body.skin-navy.login-page .login-form .login-footer .info-links a:hover {color: #fff }.page-body.skin-navy.login-page .external-login {position: relative;margin-bottom: 30px;padding: 0 30px }.page-body.skin-navy.login-page .external-login a {display: block;color: #fff;background: #2c2e2f;padding: 13px 20px;font-size: 15px;margin-bottom: 10px }.page-body.skin-navy.login-page .external-login a i {margin-right: 5px }.page-body.skin-navy.login-page .external-login a:hover {background: #454849 }.page-body.skin-navy.login-page .external-login a.facebook {background-color: #3b5998 }.page-body.skin-navy.login-page .external-login a.facebook:hover {background-color: #2d4373 }.page-body.skin-navy.login-page .external-login a.twitter {background-color: #55acee }.page-body.skin-navy.login-page .external-login a.twitter:hover {background-color: #2795e9 }.page-body.skin-navy.login-page .external-login a.gplus {background-color: #dd4b39 }.page-body.skin-navy.login-page .external-login a.gplus:hover {background-color: #c23321 }.page-body.skin-navy.login-page.login-light {background: #eee }.page-body.skin-navy.login-page.login-light .errors-container, .page-body.skin-navy.login-page.login-light .external-login {padding: 0 }.page-body.skin-navy.login-page.login-light .form-group label.error {color: rgba(151, 152, 152, .8) }.page-body.skin-navy.login-page.login-light .login-form {background: #fff;color: #979898 }.page-body.skin-navy.login-page.login-light .login-form .login-footer a {color: #68b828 }.page-body.skin-navy.login-page.login-light .login-form .login-footer a:hover {color: #508e1f }.page-body.skin-navy.login-page.login-light .login-form .login-footer .info-links a {color: rgba(151, 152, 152, .7) }.page-body.skin-navy.login-page.login-light .login-form .login-footer .info-links a:hover {color: #979898 }@media screen and (max-width:768px) {.page-body.skin-navy.login-page {padding-top: 0 }.page-body.skin-navy.login-page .login-form, .page-body.skin-navy.login-page .errors-container, .page-body.skin-navy.login-page .external-login {padding-left: 10px;padding-right: 10px }.page-body.skin-navy.login-page .errors-container {margin-top: 20px }.page-body.skin-navy.login-page.login-light .login-form {padding-left: 30px;padding-right: 30px }.page-body.skin-navy.login-page.login-light .errors-container, .page-body.skin-navy.login-page.login-light .external-login {padding-left: 0;padding-right: 0 }.page-body.skin-navy.login-page .row {margin: 0 }}.page-body.skin-navy.lockscreen-page {background: #2c3e50 }.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group p {color: #a7bfd6 }.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group h3 {color: #a7bfd6 }.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control {border: 1px solid #34495e;color: #fff }.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5);opacity: 1 }.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn {color: #fff;border: 1px solid #34495e }.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover, .page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus {background-color: rgba(52, 73, 94, .3) }.page-body.skin-navy.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon {background: #34495e;-webkit-box-shadow: 0 0 0 10px #34495e, 0 -10px 0 10px #34495e, 0 -20px 0 10px #34495e, 0 -30px 0 10px #34495e;-moz-box-shadow: 0 0 0 10px #34495e, 0 -10px 0 10px #34495e, 0 -20px 0 10px #34495e, 0 -30px 0 10px #34495e;box-shadow: 0 0 0 10px #34495e, 0 -10px 0 10px #34495e, 0 -20px 0 10px #34495e, 0 -30px 0 10px #34495e }.page-body.skin-navy .sidebar-user-info {background-color: #233140;border-bottom-color: #34495e }.page-body.skin-navy .sidebar-user-info .user-profile span {color: #a7bfd6 }.page-body.skin-navy .sidebar-user-info .user-profile span strong {color: #fff }.page-body.skin-navy .sidebar-user-info .user-links {border-top-color: #34495e }.page-body.skin-navy .sidebar-user-info .user-links li a {color: #a7bfd6 }.page-body.skin-navy .sidebar-user-info .user-links li a:hover {color: #fff;background-color: rgba(52, 73, 94, .25) }.page-body.skin-navy .sidebar-user-info .user-links li.active a {color: #fff;background-color: rgba(52, 73, 94, .25) }.page-body.skin-navy .sidebar-user-info .user-links li+li a {border-left-color: #34495e }@media screen and (min-width:991px) {.sidebar-menu.collapsed .page-body.skin-navy .sidebar-user-info .sidebar-user-info-inner .user-profile span {background-color: #27292a }.sidebar-menu.collapsed .page-body.skin-navy .sidebar-user-info .sidebar-user-info-inner .user-links {background-color: #27292a }}.page-body.skin-facebook .btn-primary {background: #3b5998 }.page-body.skin-facebook .btn-primary:hover {background: #344e86;border-color: #344e86 }.page-body.skin-facebook .btn-primary:active, .page-body.skin-facebook .btn-primary:focus {background: #263961;border-color: #263961 }.page-body.skin-facebook .btn.btn-secondary {background-color: #8b9dc3;color: #fff }.page-body.skin-facebook .btn.btn-secondary:hover {background-color: #7a8fba;text-color: #fff }.page-body.skin-facebook .btn.btn-secondary:active, .page-body.skin-facebook .btn.btn-secondary:focus {background-color: #7a8fba;border-color: #7389b7 }.page-body.skin-facebook .settings-pane {background: #4160a0;color: #8b9dc3 }.page-body.skin-facebook .settings-pane>a[data-toggle=settings-pane] {color: #8b9dc3 }.page-body.skin-facebook .settings-pane>a[data-toggle=settings-pane]:hover {color: #FFF }.page-body.skin-facebook .settings-pane .user-info .user-details h3 a {color: #fff }.page-body.skin-facebook .settings-pane .user-info .user-details .user-title {color: rgba(255, 255, 255, .65) }.page-body.skin-facebook .settings-pane .links-block.left-sep {border-left: 1px solid #3b5998 }.page-body.skin-facebook .settings-pane .links-block h4 {color: #fff }.page-body.skin-facebook .settings-pane .links-block h4 span {display: inline-block;border-bottom: 1px solid #4160a0 }.page-body.skin-facebook .settings-pane .links-block h4 a {color: #fff }.page-body.skin-facebook .settings-pane .links-block h4 a:hover {color: #8b9dc3 }.page-body.skin-facebook .settings-pane .links-block ul li a {color: #8b9dc3 }.page-body.skin-facebook .settings-pane .links-block ul li a:hover {color: #fff }.page-body.skin-facebook .sidebar-menu {background: #3b5998 }.page-body.skin-facebook .sidebar-menu .logo-env {border-bottom: 1px solid #4160a0 }.page-body.skin-facebook .sidebar-menu .logo-env .settings-icon a {color: #8b9dc3 }.page-body.skin-facebook .sidebar-menu .logo-env .settings-icon a:hover {color: #fff }.page-body.skin-facebook .sidebar-menu .main-menu a {color: #8b9dc3;border-bottom: 1px solid #4160a0 }.page-body.skin-facebook .sidebar-menu .main-menu a:hover {color: #fff }.page-body.skin-facebook .sidebar-menu .main-menu li.active>a {color: #fff }.page-body.skin-facebook .sidebar-menu .main-menu li.has-sub>a:before {color: #8fa5d2 }.page-body.skin-facebook .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x, .page-body.skin-facebook .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y {background-color: #fff }@media screen and (min-width:768px) {.page-body.skin-facebook .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar] {color: #606161 }.page-body.skin-facebook .sidebar-menu.collapsed .main-menu>li.active, .page-body.skin-facebook .sidebar-menu.collapsed .main-menu>li li.active {background-color: #37538d }.page-body.skin-facebook .sidebar-menu.collapsed .main-menu>li>ul {background: #3b5998 }}.page-body.skin-facebook .page-loading-overlay {background-color: #3b5998 }.page-body.skin-facebook.login-page {background: #3b5998;color: #fff }.page-body.skin-facebook.login-page .login-form .login-header .logo span {color: #8b9dc3 }.page-body.skin-facebook.login-page .login-form .login-header p {color: #8b9dc3 }.page-body.skin-facebook.login-page .login-form .form-group .control-label {color: #8b9dc3 }.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark {background: #344e86;border: 1px solid transparent;color: #8b9dc3 }.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff;opacity: 1 }.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder {color: #fff }.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff }.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-facebook.login-page .login-form .form-group .form-control.error {border-color: rgba(204, 63, 68, .5) }.page-body.skin-facebook.login-page .login-form .form-group .btn.btn-dark {border-color: #4160a0;background-color: #3b5998;color: #fff }.page-body.skin-facebook.login-page .login-form .form-group .btn.btn-dark:hover {background-color: rgba(65, 96, 160, .3) }.page-body.skin-facebook.login-page .login-form .login-footer {margin-top: 45px }.page-body.skin-facebook.login-page .login-form .login-footer a {color: #fff }.page-body.skin-facebook.login-page .login-form .login-footer a:hover {color: #bdc8dd }.page-body.skin-facebook.login-page .login-form .login-footer .info-links {font-size: 11px;margin-top: 5px;color: #8b9dc3 }.page-body.skin-facebook.login-page .login-form .login-footer .info-links a {color: #8b9dc3 }.page-body.skin-facebook.login-page .login-form .login-footer .info-links a:hover {color: #fff }.page-body.skin-facebook.login-page .external-login {position: relative;margin-bottom: 30px;padding: 0 30px }.page-body.skin-facebook.login-page .external-login a {display: block;color: #fff;background: #2c2e2f;padding: 13px 20px;font-size: 15px;margin-bottom: 10px }.page-body.skin-facebook.login-page .external-login a i {margin-right: 5px }.page-body.skin-facebook.login-page .external-login a:hover {background: #454849 }.page-body.skin-facebook.login-page .external-login a.facebook {background-color: #3b5998 }.page-body.skin-facebook.login-page .external-login a.facebook:hover {background-color: #2d4373 }.page-body.skin-facebook.login-page .external-login a.twitter {background-color: #55acee }.page-body.skin-facebook.login-page .external-login a.twitter:hover {background-color: #2795e9 }.page-body.skin-facebook.login-page .external-login a.gplus {background-color: #dd4b39 }.page-body.skin-facebook.login-page .external-login a.gplus:hover {background-color: #c23321 }.page-body.skin-facebook.login-page.login-light {background: #eee }.page-body.skin-facebook.login-page.login-light .errors-container, .page-body.skin-facebook.login-page.login-light .external-login {padding: 0 }.page-body.skin-facebook.login-page.login-light .form-group label.error {color: rgba(151, 152, 152, .8) }.page-body.skin-facebook.login-page.login-light .login-form {background: #fff;color: #979898 }.page-body.skin-facebook.login-page.login-light .login-form .login-footer a {color: #68b828 }.page-body.skin-facebook.login-page.login-light .login-form .login-footer a:hover {color: #508e1f }.page-body.skin-facebook.login-page.login-light .login-form .login-footer .info-links a {color: rgba(151, 152, 152, .7) }.page-body.skin-facebook.login-page.login-light .login-form .login-footer .info-links a:hover {color: #979898 }@media screen and (max-width:768px) {.page-body.skin-facebook.login-page {padding-top: 0 }.page-body.skin-facebook.login-page .login-form, .page-body.skin-facebook.login-page .errors-container, .page-body.skin-facebook.login-page .external-login {padding-left: 10px;padding-right: 10px }.page-body.skin-facebook.login-page .errors-container {margin-top: 20px }.page-body.skin-facebook.login-page.login-light .login-form {padding-left: 30px;padding-right: 30px }.page-body.skin-facebook.login-page.login-light .errors-container, .page-body.skin-facebook.login-page.login-light .external-login {padding-left: 0;padding-right: 0 }.page-body.skin-facebook.login-page .row {margin: 0 }}.page-body.skin-facebook.lockscreen-page {background: #3b5998 }.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group p {color: #8b9dc3 }.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group h3 {color: #8b9dc3 }.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control {border: 1px solid #4160a0;color: #fff }.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5);opacity: 1 }.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn {color: #fff;border: 1px solid #4160a0 }.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover, .page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus {background-color: rgba(65, 96, 160, .3) }.page-body.skin-facebook.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon {background: #4160a0;-webkit-box-shadow: 0 0 0 10px #4160a0, 0 -10px 0 10px #4160a0, 0 -20px 0 10px #4160a0, 0 -30px 0 10px #4160a0;-moz-box-shadow: 0 0 0 10px #4160a0, 0 -10px 0 10px #4160a0, 0 -20px 0 10px #4160a0, 0 -30px 0 10px #4160a0;box-shadow: 0 0 0 10px #4160a0, 0 -10px 0 10px #4160a0, 0 -20px 0 10px #4160a0, 0 -30px 0 10px #4160a0 }.page-body.skin-facebook .sidebar-user-info {background-color: #344e86;border-bottom-color: #4160a0 }.page-body.skin-facebook .sidebar-user-info .user-profile span {color: #8b9dc3 }.page-body.skin-facebook .sidebar-user-info .user-profile span strong {color: #fff }.page-body.skin-facebook .sidebar-user-info .user-links {border-top-color: #4160a0 }.page-body.skin-facebook .sidebar-user-info .user-links li a {color: #8b9dc3 }.page-body.skin-facebook .sidebar-user-info .user-links li a:hover {color: #fff;background-color: rgba(65, 96, 160, .25) }.page-body.skin-facebook .sidebar-user-info .user-links li.active a {color: #fff;background-color: rgba(65, 96, 160, .25) }.page-body.skin-facebook .sidebar-user-info .user-links li+li a {border-left-color: #4160a0 }@media screen and (min-width:991px) {.sidebar-menu.collapsed .page-body.skin-facebook .sidebar-user-info .sidebar-user-info-inner .user-profile span {background-color: #27292a }.sidebar-menu.collapsed .page-body.skin-facebook .sidebar-user-info .sidebar-user-info-inner .user-links {background-color: #27292a }}.page-body.skin-turquoise .btn-primary {background: #16a085 }.page-body.skin-turquoise .btn-primary:hover {background: #138a72;border-color: #138a72 }.page-body.skin-turquoise .btn-primary:active, .page-body.skin-turquoise .btn-primary:focus {background: #0d5d4d;border-color: #0d5d4d }.page-body.skin-turquoise .btn.btn-secondary {background-color: #0f7e68;color: #fff }.page-body.skin-turquoise .btn.btn-secondary:hover {background-color: #0c6755;text-color: #fff }.page-body.skin-turquoise .btn.btn-secondary:active, .page-body.skin-turquoise .btn.btn-secondary:focus {background-color: #0c6755;border-color: #0b5e4e }.page-body.skin-turquoise .settings-pane {background: #1daf92;color: #96ead9 }.page-body.skin-turquoise .settings-pane>a[data-toggle=settings-pane] {color: #96ead9 }.page-body.skin-turquoise .settings-pane>a[data-toggle=settings-pane]:hover {color: #FFF }.page-body.skin-turquoise .settings-pane .user-info .user-details h3 a {color: #fff }.page-body.skin-turquoise .settings-pane .user-info .user-details .user-title {color: rgba(255, 255, 255, .65) }.page-body.skin-turquoise .settings-pane .links-block.left-sep {border-left: 1px solid #16a085 }.page-body.skin-turquoise .settings-pane .links-block h4 {color: #fff }.page-body.skin-turquoise .settings-pane .links-block h4 span {display: inline-block;border-bottom: 1px solid #1daf92 }.page-body.skin-turquoise .settings-pane .links-block h4 a {color: #fff }.page-body.skin-turquoise .settings-pane .links-block h4 a:hover {color: #96ead9 }.page-body.skin-turquoise .settings-pane .links-block ul li a {color: #96ead9 }.page-body.skin-turquoise .settings-pane .links-block ul li a:hover {color: #fff }.page-body.skin-turquoise .sidebar-menu {background: #16a085 }.page-body.skin-turquoise .sidebar-menu .logo-env {border-bottom: 1px solid #1daf92 }.page-body.skin-turquoise .sidebar-menu .logo-env .settings-icon a {color: #96ead9 }.page-body.skin-turquoise .sidebar-menu .logo-env .settings-icon a:hover {color: #fff }.page-body.skin-turquoise .sidebar-menu .main-menu a {color: #96ead9;border-bottom: 1px solid #1daf92 }.page-body.skin-turquoise .sidebar-menu .main-menu a:hover {color: #fff }.page-body.skin-turquoise .sidebar-menu .main-menu li.active>a {color: #fff }.page-body.skin-turquoise .sidebar-menu .main-menu li.has-sub>a:before {color: #66e6cc }.page-body.skin-turquoise .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x, .page-body.skin-turquoise .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y {background-color: #fff }@media screen and (min-width:768px) {.page-body.skin-turquoise .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar] {color: #606161 }.page-body.skin-turquoise .sidebar-menu.collapsed .main-menu>li.active, .page-body.skin-turquoise .sidebar-menu.collapsed .main-menu>li li.active {background-color: #14937a }.page-body.skin-turquoise .sidebar-menu.collapsed .main-menu>li>ul {background: #16a085 }}.page-body.skin-turquoise .page-loading-overlay {background-color: #16a085 }.page-body.skin-turquoise.login-page {background: #16a085;color: #fff }.page-body.skin-turquoise.login-page .login-form .login-header .logo span {color: #96ead9 }.page-body.skin-turquoise.login-page .login-form .login-header p {color: #96ead9 }.page-body.skin-turquoise.login-page .login-form .form-group .control-label {color: #96ead9 }.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark {background: #138a72;border: 1px solid transparent;color: #96ead9 }.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff;opacity: 1 }.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder {color: #fff }.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff }.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-turquoise.login-page .login-form .form-group .form-control.error {border-color: rgba(204, 63, 68, .5) }.page-body.skin-turquoise.login-page .login-form .form-group .btn.btn-dark {border-color: #1daf92;background-color: #16a085;color: #fff }.page-body.skin-turquoise.login-page .login-form .form-group .btn.btn-dark:hover {background-color: rgba(29, 175, 146, .3) }.page-body.skin-turquoise.login-page .login-form .login-footer {margin-top: 45px }.page-body.skin-turquoise.login-page .login-form .login-footer a {color: #fff }.page-body.skin-turquoise.login-page .login-form .login-footer a:hover {color: #d6f7f0 }.page-body.skin-turquoise.login-page .login-form .login-footer .info-links {font-size: 11px;margin-top: 5px;color: #96ead9 }.page-body.skin-turquoise.login-page .login-form .login-footer .info-links a {color: #96ead9 }.page-body.skin-turquoise.login-page .login-form .login-footer .info-links a:hover {color: #fff }.page-body.skin-turquoise.login-page .external-login {position: relative;margin-bottom: 30px;padding: 0 30px }.page-body.skin-turquoise.login-page .external-login a {display: block;color: #fff;background: #2c2e2f;padding: 13px 20px;font-size: 15px;margin-bottom: 10px }.page-body.skin-turquoise.login-page .external-login a i {margin-right: 5px }.page-body.skin-turquoise.login-page .external-login a:hover {background: #454849 }.page-body.skin-turquoise.login-page .external-login a.facebook {background-color: #3b5998 }.page-body.skin-turquoise.login-page .external-login a.facebook:hover {background-color: #2d4373 }.page-body.skin-turquoise.login-page .external-login a.twitter {background-color: #55acee }.page-body.skin-turquoise.login-page .external-login a.twitter:hover {background-color: #2795e9 }.page-body.skin-turquoise.login-page .external-login a.gplus {background-color: #dd4b39 }.page-body.skin-turquoise.login-page .external-login a.gplus:hover {background-color: #c23321 }.page-body.skin-turquoise.login-page.login-light {background: #eee }.page-body.skin-turquoise.login-page.login-light .errors-container, .page-body.skin-turquoise.login-page.login-light .external-login {padding: 0 }.page-body.skin-turquoise.login-page.login-light .form-group label.error {color: rgba(151, 152, 152, .8) }.page-body.skin-turquoise.login-page.login-light .login-form {background: #fff;color: #979898 }.page-body.skin-turquoise.login-page.login-light .login-form .login-footer a {color: #68b828 }.page-body.skin-turquoise.login-page.login-light .login-form .login-footer a:hover {color: #508e1f }.page-body.skin-turquoise.login-page.login-light .login-form .login-footer .info-links a {color: rgba(151, 152, 152, .7) }.page-body.skin-turquoise.login-page.login-light .login-form .login-footer .info-links a:hover {color: #979898 }@media screen and (max-width:768px) {.page-body.skin-turquoise.login-page {padding-top: 0 }.page-body.skin-turquoise.login-page .login-form, .page-body.skin-turquoise.login-page .errors-container, .page-body.skin-turquoise.login-page .external-login {padding-left: 10px;padding-right: 10px }.page-body.skin-turquoise.login-page .errors-container {margin-top: 20px }.page-body.skin-turquoise.login-page.login-light .login-form {padding-left: 30px;padding-right: 30px }.page-body.skin-turquoise.login-page.login-light .errors-container, .page-body.skin-turquoise.login-page.login-light .external-login {padding-left: 0;padding-right: 0 }.page-body.skin-turquoise.login-page .row {margin: 0 }}.page-body.skin-turquoise.lockscreen-page {background: #16a085 }.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group p {color: #96ead9 }.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group h3 {color: #96ead9 }.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control {border: 1px solid #1daf92;color: #fff }.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5);opacity: 1 }.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn {color: #fff;border: 1px solid #1daf92 }.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover, .page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus {background-color: rgba(29, 175, 146, .3) }.page-body.skin-turquoise.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon {background: #1daf92;-webkit-box-shadow: 0 0 0 10px #1daf92, 0 -10px 0 10px #1daf92, 0 -20px 0 10px #1daf92, 0 -30px 0 10px #1daf92;-moz-box-shadow: 0 0 0 10px #1daf92, 0 -10px 0 10px #1daf92, 0 -20px 0 10px #1daf92, 0 -30px 0 10px #1daf92;box-shadow: 0 0 0 10px #1daf92, 0 -10px 0 10px #1daf92, 0 -20px 0 10px #1daf92, 0 -30px 0 10px #1daf92 }.page-body.skin-turquoise .sidebar-user-info {background-color: #138a72;border-bottom-color: #1daf92 }.page-body.skin-turquoise .sidebar-user-info .user-profile span {color: #96ead9 }.page-body.skin-turquoise .sidebar-user-info .user-profile span strong {color: #fff }.page-body.skin-turquoise .sidebar-user-info .user-links {border-top-color: #1daf92 }.page-body.skin-turquoise .sidebar-user-info .user-links li a {color: #96ead9 }.page-body.skin-turquoise .sidebar-user-info .user-links li a:hover {color: #fff;background-color: rgba(29, 175, 146, .25) }.page-body.skin-turquoise .sidebar-user-info .user-links li.active a {color: #fff;background-color: rgba(29, 175, 146, .25) }.page-body.skin-turquoise .sidebar-user-info .user-links li+li a {border-left-color: #1daf92 }@media screen and (min-width:991px) {.sidebar-menu.collapsed .page-body.skin-turquoise .sidebar-user-info .sidebar-user-info-inner .user-profile span {background-color: #27292a }.sidebar-menu.collapsed .page-body.skin-turquoise .sidebar-user-info .sidebar-user-info-inner .user-links {background-color: #27292a }}.page-body.skin-lime .btn-primary {background: #8cc657 }.page-body.skin-lime .btn-primary:hover {background: #7fc044;border-color: #7fc044 }.page-body.skin-lime .btn-primary:active, .page-body.skin-lime .btn-primary:focus {background: #669c35;border-color: #669c35 }.page-body.skin-lime .btn.btn-secondary {background-color: #70a93c;color: #fff }.page-body.skin-lime .btn.btn-secondary:hover {background-color: #649635;text-color: #fff }.page-body.skin-lime .btn.btn-secondary:active, .page-body.skin-lime .btn.btn-secondary:focus {background-color: #649635;border-color: #5f8f33 }.page-body.skin-lime .settings-pane {background: #95cd62;color: #fff }.page-body.skin-lime .settings-pane>a[data-toggle=settings-pane] {color: #fff }.page-body.skin-lime .settings-pane>a[data-toggle=settings-pane]:hover {color: #FFF }.page-body.skin-lime .settings-pane .user-info .user-details h3 a {color: #fff }.page-body.skin-lime .settings-pane .user-info .user-details .user-title {color: rgba(255, 255, 255, .65) }.page-body.skin-lime .settings-pane .links-block.left-sep {border-left: 1px solid #8cc657 }.page-body.skin-lime .settings-pane .links-block h4 {color: #fff }.page-body.skin-lime .settings-pane .links-block h4 span {display: inline-block;border-bottom: 1px solid #95cd62 }.page-body.skin-lime .settings-pane .links-block h4 a {color: #fff }.page-body.skin-lime .settings-pane .links-block h4 a:hover {color: #fff }.page-body.skin-lime .settings-pane .links-block ul li a {color: #fff }.page-body.skin-lime .settings-pane .links-block ul li a:hover {color: #fff }.page-body.skin-lime .sidebar-menu {background: #8cc657 }.page-body.skin-lime .sidebar-menu .logo-env {border-bottom: 1px solid #95cd62 }.page-body.skin-lime .sidebar-menu .logo-env .settings-icon a {color: #fff }.page-body.skin-lime .sidebar-menu .logo-env .settings-icon a:hover {color: #fff }.page-body.skin-lime .sidebar-menu .main-menu a {color: #fff;border-bottom: 1px solid #95cd62 }.page-body.skin-lime .sidebar-menu .main-menu a:hover {color: #fff }.page-body.skin-lime .sidebar-menu .main-menu li.active>a {color: #fff }.page-body.skin-lime .sidebar-menu .main-menu li.has-sub>a:before {color: #d6ecc3 }.page-body.skin-lime .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x, .page-body.skin-lime .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y {background-color: #fff }@media screen and (min-width:768px) {.page-body.skin-lime .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar] {color: #606161 }.page-body.skin-lime .sidebar-menu.collapsed .main-menu>li.active, .page-body.skin-lime .sidebar-menu.collapsed .main-menu>li li.active {background-color: #84c24c }.page-body.skin-lime .sidebar-menu.collapsed .main-menu>li>ul {background: #8cc657 }}.page-body.skin-lime .page-loading-overlay {background-color: #8cc657 }.page-body.skin-lime.login-page {background: #8cc657;color: #fff }.page-body.skin-lime.login-page .login-form .login-header .logo span {color: #fff }.page-body.skin-lime.login-page .login-form .login-header p {color: #fff }.page-body.skin-lime.login-page .login-form .form-group .control-label {color: #fff }.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark {background: #7fc044;border: 1px solid transparent;color: #fff }.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff;opacity: 1 }.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder {color: #fff }.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff }.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-lime.login-page .login-form .form-group .form-control.error {border-color: rgba(204, 63, 68, .5) }.page-body.skin-lime.login-page .login-form .form-group .btn.btn-dark {border-color: #95cd62;background-color: #8cc657;color: #fff }.page-body.skin-lime.login-page .login-form .form-group .btn.btn-dark:hover {background-color: rgba(149, 205, 98, .3) }.page-body.skin-lime.login-page .login-form .login-footer {margin-top: 45px }.page-body.skin-lime.login-page .login-form .login-footer a {color: #fff }.page-body.skin-lime.login-page .login-form .login-footer a:hover {color: #fff }.page-body.skin-lime.login-page .login-form .login-footer .info-links {font-size: 11px;margin-top: 5px;color: #fff }.page-body.skin-lime.login-page .login-form .login-footer .info-links a {color: #fff }.page-body.skin-lime.login-page .login-form .login-footer .info-links a:hover {color: #fff }.page-body.skin-lime.login-page .external-login {position: relative;margin-bottom: 30px;padding: 0 30px }.page-body.skin-lime.login-page .external-login a {display: block;color: #fff;background: #2c2e2f;padding: 13px 20px;font-size: 15px;margin-bottom: 10px }.page-body.skin-lime.login-page .external-login a i {margin-right: 5px }.page-body.skin-lime.login-page .external-login a:hover {background: #454849 }.page-body.skin-lime.login-page .external-login a.facebook {background-color: #3b5998 }.page-body.skin-lime.login-page .external-login a.facebook:hover {background-color: #2d4373 }.page-body.skin-lime.login-page .external-login a.twitter {background-color: #55acee }.page-body.skin-lime.login-page .external-login a.twitter:hover {background-color: #2795e9 }.page-body.skin-lime.login-page .external-login a.gplus {background-color: #dd4b39 }.page-body.skin-lime.login-page .external-login a.gplus:hover {background-color: #c23321 }.page-body.skin-lime.login-page.login-light {background: #eee }.page-body.skin-lime.login-page.login-light .errors-container, .page-body.skin-lime.login-page.login-light .external-login {padding: 0 }.page-body.skin-lime.login-page.login-light .form-group label.error {color: rgba(151, 152, 152, .8) }.page-body.skin-lime.login-page.login-light .login-form {background: #fff;color: #979898 }.page-body.skin-lime.login-page.login-light .login-form .login-footer a {color: #68b828 }.page-body.skin-lime.login-page.login-light .login-form .login-footer a:hover {color: #508e1f }.page-body.skin-lime.login-page.login-light .login-form .login-footer .info-links a {color: rgba(151, 152, 152, .7) }.page-body.skin-lime.login-page.login-light .login-form .login-footer .info-links a:hover {color: #979898 }@media screen and (max-width:768px) {.page-body.skin-lime.login-page {padding-top: 0 }.page-body.skin-lime.login-page .login-form, .page-body.skin-lime.login-page .errors-container, .page-body.skin-lime.login-page .external-login {padding-left: 10px;padding-right: 10px }.page-body.skin-lime.login-page .errors-container {margin-top: 20px }.page-body.skin-lime.login-page.login-light .login-form {padding-left: 30px;padding-right: 30px }.page-body.skin-lime.login-page.login-light .errors-container, .page-body.skin-lime.login-page.login-light .external-login {padding-left: 0;padding-right: 0 }.page-body.skin-lime.login-page .row {margin: 0 }}.page-body.skin-lime.lockscreen-page {background: #8cc657 }.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group p {color: #fff }.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group h3 {color: #fff }.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control {border: 1px solid #95cd62;color: #fff }.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5);opacity: 1 }.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn {color: #fff;border: 1px solid #95cd62 }.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover, .page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus {background-color: rgba(149, 205, 98, .3) }.page-body.skin-lime.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon {background: #95cd62;-webkit-box-shadow: 0 0 0 10px #95cd62, 0 -10px 0 10px #95cd62, 0 -20px 0 10px #95cd62, 0 -30px 0 10px #95cd62;-moz-box-shadow: 0 0 0 10px #95cd62, 0 -10px 0 10px #95cd62, 0 -20px 0 10px #95cd62, 0 -30px 0 10px #95cd62;box-shadow: 0 0 0 10px #95cd62, 0 -10px 0 10px #95cd62, 0 -20px 0 10px #95cd62, 0 -30px 0 10px #95cd62 }.page-body.skin-lime .sidebar-user-info {background-color: #7fc044;border-bottom-color: #95cd62 }.page-body.skin-lime .sidebar-user-info .user-profile span {color: #fff }.page-body.skin-lime .sidebar-user-info .user-profile span strong {color: #fff }.page-body.skin-lime .sidebar-user-info .user-links {border-top-color: #95cd62 }.page-body.skin-lime .sidebar-user-info .user-links li a {color: #fff }.page-body.skin-lime .sidebar-user-info .user-links li a:hover {color: #fff;background-color: rgba(149, 205, 98, .25) }.page-body.skin-lime .sidebar-user-info .user-links li.active a {color: #fff;background-color: rgba(149, 205, 98, .25) }.page-body.skin-lime .sidebar-user-info .user-links li+li a {border-left-color: #95cd62 }@media screen and (min-width:991px) {.sidebar-menu.collapsed .page-body.skin-lime .sidebar-user-info .sidebar-user-info-inner .user-profile span {background-color: #27292a }.sidebar-menu.collapsed .page-body.skin-lime .sidebar-user-info .sidebar-user-info-inner .user-links {background-color: #27292a }}.page-body.skin-green .btn-primary {background: #27ae60 }.page-body.skin-green .btn-primary:hover {background: #295;border-color: #295 }.page-body.skin-green .btn-primary:active, .page-body.skin-green .btn-primary:focus {background: #19703e;border-color: #19703e }.page-body.skin-green .btn.btn-secondary {background-color: #1c954f;color: #fff }.page-body.skin-green .btn.btn-secondary:hover {background-color: #188044;text-color: #fff }.page-body.skin-green .btn.btn-secondary:active, .page-body.skin-green .btn.btn-secondary:focus {background-color: #188044;border-color: #16773f }.page-body.skin-green .settings-pane {background: #2fbd6b;color: #a2f9c7 }.page-body.skin-green .settings-pane>a[data-toggle=settings-pane] {color: #a2f9c7 }.page-body.skin-green .settings-pane>a[data-toggle=settings-pane]:hover {color: #FFF }.page-body.skin-green .settings-pane .user-info .user-details h3 a {color: #fff }.page-body.skin-green .settings-pane .user-info .user-details .user-title {color: rgba(255, 255, 255, .65) }.page-body.skin-green .settings-pane .links-block.left-sep {border-left: 1px solid #27ae60 }.page-body.skin-green .settings-pane .links-block h4 {color: #fff }.page-body.skin-green .settings-pane .links-block h4 span {display: inline-block;border-bottom: 1px solid #2fbd6b }.page-body.skin-green .settings-pane .links-block h4 a {color: #fff }.page-body.skin-green .settings-pane .links-block h4 a:hover {color: #a2f9c7 }.page-body.skin-green .settings-pane .links-block ul li a {color: #a2f9c7 }.page-body.skin-green .settings-pane .links-block ul li a:hover {color: #fff }.page-body.skin-green .sidebar-menu {background: #27ae60 }.page-body.skin-green .sidebar-menu .logo-env {border-bottom: 1px solid #2fbd6b }.page-body.skin-green .sidebar-menu .logo-env .settings-icon a {color: #a2f9c7 }.page-body.skin-green .sidebar-menu .logo-env .settings-icon a:hover {color: #fff }.page-body.skin-green .sidebar-menu .main-menu a {color: #a2f9c7;border-bottom: 1px solid #2fbd6b }.page-body.skin-green .sidebar-menu .main-menu a:hover {color: #fff }.page-body.skin-green .sidebar-menu .main-menu li.active>a {color: #fff }.page-body.skin-green .sidebar-menu .main-menu li.has-sub>a:before {color: #8ae2af }.page-body.skin-green .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x, .page-body.skin-green .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y {background-color: #fff }@media screen and (min-width:768px) {.page-body.skin-green .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar] {color: #606161 }.page-body.skin-green .sidebar-menu.collapsed .main-menu>li.active, .page-body.skin-green .sidebar-menu.collapsed .main-menu>li li.active {background-color: #24a259 }.page-body.skin-green .sidebar-menu.collapsed .main-menu>li>ul {background: #27ae60 }}.page-body.skin-green .page-loading-overlay {background-color: #27ae60 }.page-body.skin-green.login-page {background: #27ae60;color: #fff }.page-body.skin-green.login-page .login-form .login-header .logo span {color: #a2f9c7 }.page-body.skin-green.login-page .login-form .login-header p {color: #a2f9c7 }.page-body.skin-green.login-page .login-form .form-group .control-label {color: #a2f9c7 }.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark {background: #295;border: 1px solid transparent;color: #a2f9c7 }.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff;opacity: 1 }.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder {color: #fff }.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff }.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-green.login-page .login-form .form-group .form-control.error {border-color: rgba(204, 63, 68, .5) }.page-body.skin-green.login-page .login-form .form-group .btn.btn-dark {border-color: #2fbd6b;background-color: #27ae60;color: #fff }.page-body.skin-green.login-page .login-form .form-group .btn.btn-dark:hover {background-color: rgba(47, 189, 107, .3) }.page-body.skin-green.login-page .login-form .login-footer {margin-top: 45px }.page-body.skin-green.login-page .login-form .login-footer a {color: #fff }.page-body.skin-green.login-page .login-form .login-footer a:hover {color: #eafef2 }.page-body.skin-green.login-page .login-form .login-footer .info-links {font-size: 11px;margin-top: 5px;color: #a2f9c7 }.page-body.skin-green.login-page .login-form .login-footer .info-links a {color: #a2f9c7 }.page-body.skin-green.login-page .login-form .login-footer .info-links a:hover {color: #fff }.page-body.skin-green.login-page .external-login {position: relative;margin-bottom: 30px;padding: 0 30px }.page-body.skin-green.login-page .external-login a {display: block;color: #fff;background: #2c2e2f;padding: 13px 20px;font-size: 15px;margin-bottom: 10px }.page-body.skin-green.login-page .external-login a i {margin-right: 5px }.page-body.skin-green.login-page .external-login a:hover {background: #454849 }.page-body.skin-green.login-page .external-login a.facebook {background-color: #3b5998 }.page-body.skin-green.login-page .external-login a.facebook:hover {background-color: #2d4373 }.page-body.skin-green.login-page .external-login a.twitter {background-color: #55acee }.page-body.skin-green.login-page .external-login a.twitter:hover {background-color: #2795e9 }.page-body.skin-green.login-page .external-login a.gplus {background-color: #dd4b39 }.page-body.skin-green.login-page .external-login a.gplus:hover {background-color: #c23321 }.page-body.skin-green.login-page.login-light {background: #eee }.page-body.skin-green.login-page.login-light .errors-container, .page-body.skin-green.login-page.login-light .external-login {padding: 0 }.page-body.skin-green.login-page.login-light .form-group label.error {color: rgba(151, 152, 152, .8) }.page-body.skin-green.login-page.login-light .login-form {background: #fff;color: #979898 }.page-body.skin-green.login-page.login-light .login-form .login-footer a {color: #68b828 }.page-body.skin-green.login-page.login-light .login-form .login-footer a:hover {color: #508e1f }.page-body.skin-green.login-page.login-light .login-form .login-footer .info-links a {color: rgba(151, 152, 152, .7) }.page-body.skin-green.login-page.login-light .login-form .login-footer .info-links a:hover {color: #979898 }@media screen and (max-width:768px) {.page-body.skin-green.login-page {padding-top: 0 }.page-body.skin-green.login-page .login-form, .page-body.skin-green.login-page .errors-container, .page-body.skin-green.login-page .external-login {padding-left: 10px;padding-right: 10px }.page-body.skin-green.login-page .errors-container {margin-top: 20px }.page-body.skin-green.login-page.login-light .login-form {padding-left: 30px;padding-right: 30px }.page-body.skin-green.login-page.login-light .errors-container, .page-body.skin-green.login-page.login-light .external-login {padding-left: 0;padding-right: 0 }.page-body.skin-green.login-page .row {margin: 0 }}.page-body.skin-green.lockscreen-page {background: #27ae60 }.page-body.skin-green.lockscreen-page .lockcreen-form .form-group p {color: #a2f9c7 }.page-body.skin-green.lockscreen-page .lockcreen-form .form-group h3 {color: #a2f9c7 }.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control {border: 1px solid #2fbd6b;color: #fff }.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5);opacity: 1 }.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn {color: #fff;border: 1px solid #2fbd6b }.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover, .page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus {background-color: rgba(47, 189, 107, .3) }.page-body.skin-green.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon {background: #2fbd6b;-webkit-box-shadow: 0 0 0 10px #2fbd6b, 0 -10px 0 10px #2fbd6b, 0 -20px 0 10px #2fbd6b, 0 -30px 0 10px #2fbd6b;-moz-box-shadow: 0 0 0 10px #2fbd6b, 0 -10px 0 10px #2fbd6b, 0 -20px 0 10px #2fbd6b, 0 -30px 0 10px #2fbd6b;box-shadow: 0 0 0 10px #2fbd6b, 0 -10px 0 10px #2fbd6b, 0 -20px 0 10px #2fbd6b, 0 -30px 0 10px #2fbd6b }.page-body.skin-green .sidebar-user-info {background-color: #295;border-bottom-color: #2fbd6b }.page-body.skin-green .sidebar-user-info .user-profile span {color: #a2f9c7 }.page-body.skin-green .sidebar-user-info .user-profile span strong {color: #fff }.page-body.skin-green .sidebar-user-info .user-links {border-top-color: #2fbd6b }.page-body.skin-green .sidebar-user-info .user-links li a {color: #a2f9c7 }.page-body.skin-green .sidebar-user-info .user-links li a:hover {color: #fff;background-color: rgba(47, 189, 107, .25) }.page-body.skin-green .sidebar-user-info .user-links li.active a {color: #fff;background-color: rgba(47, 189, 107, .25) }.page-body.skin-green .sidebar-user-info .user-links li+li a {border-left-color: #2fbd6b }@media screen and (min-width:991px) {.sidebar-menu.collapsed .page-body.skin-green .sidebar-user-info .sidebar-user-info-inner .user-profile span {background-color: #27292a }.sidebar-menu.collapsed .page-body.skin-green .sidebar-user-info .sidebar-user-info-inner .user-links {background-color: #27292a }}.page-body.skin-purple .btn-primary {background: #795b95 }.page-body.skin-purple .btn-primary:hover {background: #6c5185;border-color: #6c5185 }.page-body.skin-purple .btn-primary:active, .page-body.skin-purple .btn-primary:focus {background: #523e66;border-color: #523e66 }.page-body.skin-purple .btn.btn-secondary {background-color: #5f3d7e;color: #fff }.page-body.skin-purple .btn.btn-secondary:hover {background-color: #52356d;text-color: #fff }.page-body.skin-purple .btn.btn-secondary:active, .page-body.skin-purple .btn.btn-secondary:focus {background-color: #52356d;border-color: #4d3166 }.page-body.skin-purple .settings-pane {background: #81629f;color: #c2afd4 }.page-body.skin-purple .settings-pane>a[data-toggle=settings-pane] {color: #c2afd4 }.page-body.skin-purple .settings-pane>a[data-toggle=settings-pane]:hover {color: #FFF }.page-body.skin-purple .settings-pane .user-info .user-details h3 a {color: #fff }.page-body.skin-purple .settings-pane .user-info .user-details .user-title {color: rgba(255, 255, 255, .65) }.page-body.skin-purple .settings-pane .links-block.left-sep {border-left: 1px solid #795b95 }.page-body.skin-purple .settings-pane .links-block h4 {color: #fff }.page-body.skin-purple .settings-pane .links-block h4 span {display: inline-block;border-bottom: 1px solid #81629f }.page-body.skin-purple .settings-pane .links-block h4 a {color: #fff }.page-body.skin-purple .settings-pane .links-block h4 a:hover {color: #c2afd4 }.page-body.skin-purple .settings-pane .links-block ul li a {color: #c2afd4 }.page-body.skin-purple .settings-pane .links-block ul li a:hover {color: #fff }.page-body.skin-purple .sidebar-menu {background: #795b95 }.page-body.skin-purple .sidebar-menu .logo-env {border-bottom: 1px solid #81629f }.page-body.skin-purple .sidebar-menu .logo-env .settings-icon a {color: #c2afd4 }.page-body.skin-purple .sidebar-menu .logo-env .settings-icon a:hover {color: #fff }.page-body.skin-purple .sidebar-menu .main-menu a {color: #c2afd4;border-bottom: 1px solid #81629f }.page-body.skin-purple .sidebar-menu .main-menu a:hover {color: #fff }.page-body.skin-purple .sidebar-menu .main-menu li.active>a {color: #fff }.page-body.skin-purple .sidebar-menu .main-menu li.has-sub>a:before {color: #c0b1cf }.page-body.skin-purple .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x, .page-body.skin-purple .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y {background-color: #fff }@media screen and (min-width:768px) {.page-body.skin-purple .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar] {color: #606161 }.page-body.skin-purple .sidebar-menu.collapsed .main-menu>li.active, .page-body.skin-purple .sidebar-menu.collapsed .main-menu>li li.active {background-color: #71558c }.page-body.skin-purple .sidebar-menu.collapsed .main-menu>li>ul {background: #795b95 }}.page-body.skin-purple .page-loading-overlay {background-color: #795b95 }.page-body.skin-purple.login-page {background: #795b95;color: #fff }.page-body.skin-purple.login-page .login-form .login-header .logo span {color: #c2afd4 }.page-body.skin-purple.login-page .login-form .login-header p {color: #c2afd4 }.page-body.skin-purple.login-page .login-form .form-group .control-label {color: #c2afd4 }.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark {background: #6c5185;border: 1px solid transparent;color: #c2afd4 }.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff;opacity: 1 }.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder {color: #fff }.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff }.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-purple.login-page .login-form .form-group .form-control.error {border-color: rgba(204, 63, 68, .5) }.page-body.skin-purple.login-page .login-form .form-group .btn.btn-dark {border-color: #81629f;background-color: #795b95;color: #fff }.page-body.skin-purple.login-page .login-form .form-group .btn.btn-dark:hover {background-color: rgba(129, 98, 159, .3) }.page-body.skin-purple.login-page .login-form .login-footer {margin-top: 45px }.page-body.skin-purple.login-page .login-form .login-footer a {color: #fff }.page-body.skin-purple.login-page .login-form .login-footer a:hover {color: #e8e1ef }.page-body.skin-purple.login-page .login-form .login-footer .info-links {font-size: 11px;margin-top: 5px;color: #c2afd4 }.page-body.skin-purple.login-page .login-form .login-footer .info-links a {color: #c2afd4 }.page-body.skin-purple.login-page .login-form .login-footer .info-links a:hover {color: #fff }.page-body.skin-purple.login-page .external-login {position: relative;margin-bottom: 30px;padding: 0 30px }.page-body.skin-purple.login-page .external-login a {display: block;color: #fff;background: #2c2e2f;padding: 13px 20px;font-size: 15px;margin-bottom: 10px }.page-body.skin-purple.login-page .external-login a i {margin-right: 5px }.page-body.skin-purple.login-page .external-login a:hover {background: #454849 }.page-body.skin-purple.login-page .external-login a.facebook {background-color: #3b5998 }.page-body.skin-purple.login-page .external-login a.facebook:hover {background-color: #2d4373 }.page-body.skin-purple.login-page .external-login a.twitter {background-color: #55acee }.page-body.skin-purple.login-page .external-login a.twitter:hover {background-color: #2795e9 }.page-body.skin-purple.login-page .external-login a.gplus {background-color: #dd4b39 }.page-body.skin-purple.login-page .external-login a.gplus:hover {background-color: #c23321 }.page-body.skin-purple.login-page.login-light {background: #eee }.page-body.skin-purple.login-page.login-light .errors-container, .page-body.skin-purple.login-page.login-light .external-login {padding: 0 }.page-body.skin-purple.login-page.login-light .form-group label.error {color: rgba(151, 152, 152, .8) }.page-body.skin-purple.login-page.login-light .login-form {background: #fff;color: #979898 }.page-body.skin-purple.login-page.login-light .login-form .login-footer a {color: #68b828 }.page-body.skin-purple.login-page.login-light .login-form .login-footer a:hover {color: #508e1f }.page-body.skin-purple.login-page.login-light .login-form .login-footer .info-links a {color: rgba(151, 152, 152, .7) }.page-body.skin-purple.login-page.login-light .login-form .login-footer .info-links a:hover {color: #979898 }@media screen and (max-width:768px) {.page-body.skin-purple.login-page {padding-top: 0 }.page-body.skin-purple.login-page .login-form, .page-body.skin-purple.login-page .errors-container, .page-body.skin-purple.login-page .external-login {padding-left: 10px;padding-right: 10px }.page-body.skin-purple.login-page .errors-container {margin-top: 20px }.page-body.skin-purple.login-page.login-light .login-form {padding-left: 30px;padding-right: 30px }.page-body.skin-purple.login-page.login-light .errors-container, .page-body.skin-purple.login-page.login-light .external-login {padding-left: 0;padding-right: 0 }.page-body.skin-purple.login-page .row {margin: 0 }}.page-body.skin-purple.lockscreen-page {background: #795b95 }.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group p {color: #c2afd4 }.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group h3 {color: #c2afd4 }.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control {border: 1px solid #81629f;color: #fff }.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5);opacity: 1 }.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn {color: #fff;border: 1px solid #81629f }.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover, .page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus {background-color: rgba(129, 98, 159, .3) }.page-body.skin-purple.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon {background: #81629f;-webkit-box-shadow: 0 0 0 10px #81629f, 0 -10px 0 10px #81629f, 0 -20px 0 10px #81629f, 0 -30px 0 10px #81629f;-moz-box-shadow: 0 0 0 10px #81629f, 0 -10px 0 10px #81629f, 0 -20px 0 10px #81629f, 0 -30px 0 10px #81629f;box-shadow: 0 0 0 10px #81629f, 0 -10px 0 10px #81629f, 0 -20px 0 10px #81629f, 0 -30px 0 10px #81629f }.page-body.skin-purple .sidebar-user-info {background-color: #6c5185;border-bottom-color: #81629f }.page-body.skin-purple .sidebar-user-info .user-profile span {color: #c2afd4 }.page-body.skin-purple .sidebar-user-info .user-profile span strong {color: #fff }.page-body.skin-purple .sidebar-user-info .user-links {border-top-color: #81629f }.page-body.skin-purple .sidebar-user-info .user-links li a {color: #c2afd4 }.page-body.skin-purple .sidebar-user-info .user-links li a:hover {color: #fff;background-color: rgba(129, 98, 159, .25) }.page-body.skin-purple .sidebar-user-info .user-links li.active a {color: #fff;background-color: rgba(129, 98, 159, .25) }.page-body.skin-purple .sidebar-user-info .user-links li+li a {border-left-color: #81629f }@media screen and (min-width:991px) {.sidebar-menu.collapsed .page-body.skin-purple .sidebar-user-info .sidebar-user-info-inner .user-profile span {background-color: #27292a }.sidebar-menu.collapsed .page-body.skin-purple .sidebar-user-info .sidebar-user-info-inner .user-links {background-color: #27292a }}.page-body.skin-white .btn-primary {background: #95cd62 }.page-body.skin-white .btn-primary:hover {background: #88c74f;border-color: #88c74f }.page-body.skin-white .btn-primary:active, .page-body.skin-white .btn-primary:focus {background: #6fac37;border-color: #6fac37 }.page-body.skin-white .btn.btn-secondary {background-color: #555;color: #fff }.page-body.skin-white .btn.btn-secondary:hover {background-color: #484848;text-color: #fff }.page-body.skin-white .btn.btn-secondary:active, .page-body.skin-white .btn.btn-secondary:focus {background-color: #484848;border-color: #434343 }.page-body.skin-white .settings-pane {background: #eee;color: #666 }.page-body.skin-white .settings-pane>a[data-toggle=settings-pane] {color: #666 }.page-body.skin-white .settings-pane>a[data-toggle=settings-pane]:hover {color: #FFF }.page-body.skin-white .settings-pane .user-info .user-details h3 a {color: #95cd62 }.page-body.skin-white .settings-pane .user-info .user-details .user-title {color: rgba(149, 205, 98, .65) }.page-body.skin-white .settings-pane .links-block.left-sep {border-left: 1px solid #fff }.page-body.skin-white .settings-pane .links-block h4 {color: #95cd62 }.page-body.skin-white .settings-pane .links-block h4 span {display: inline-block;border-bottom: 1px solid #eee }.page-body.skin-white .settings-pane .links-block h4 a {color: #95cd62 }.page-body.skin-white .settings-pane .links-block h4 a:hover {color: #666 }.page-body.skin-white .settings-pane .links-block ul li a {color: #666 }.page-body.skin-white .settings-pane .links-block ul li a:hover {color: #95cd62 }.page-body.skin-white .sidebar-menu {background: #fff }.page-body.skin-white .sidebar-menu .logo-env {border-bottom: 1px solid #eee }.page-body.skin-white .sidebar-menu .logo-env .settings-icon a {color: #666 }.page-body.skin-white .sidebar-menu .logo-env .settings-icon a:hover {color: #95cd62 }.page-body.skin-white .sidebar-menu .main-menu a {color: #666;border-bottom: 1px solid #eee }.page-body.skin-white .sidebar-menu .main-menu a:hover {color: #5095d5;}.page-body.skin-white .sidebar-menu .main-menu li.active>a {color: #5095d5 }.page-body.skin-white .sidebar-menu .main-menu li.has-sub>a:before {color: #666 }.page-body.skin-white .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x, .page-body.skin-white .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y {background-color: #eee }@media screen and (min-width:768px) {.page-body.skin-white .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar] {color: #606161 }.page-body.skin-white .sidebar-menu.collapsed .main-menu>li.active, .page-body.skin-white .sidebar-menu.collapsed .main-menu>li li.active {background-color: #f7f7f7 }.page-body.skin-white .sidebar-menu.collapsed .main-menu>li>ul {background: #fff }}.page-body.skin-white .page-loading-overlay {background-color: #fff }.page-body.skin-white.login-page {background: #fff;color: #fff }.page-body.skin-white.login-page .login-form .login-header .logo span {color: #666 }.page-body.skin-white.login-page .login-form .login-header p {color: #666 }.page-body.skin-white.login-page .login-form .form-group .control-label {color: #666 }.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark {background: #f2f2f2;border: 1px solid transparent;color: #666 }.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #95cd62;opacity: 1 }.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #95cd62 }.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #95cd62 }.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #95cd62 }.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder {color: #95cd62 }.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #95cd62 }.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #95cd62 }.page-body.skin-white.login-page .login-form .form-group .form-control.error {border-color: rgba(204, 63, 68, .5) }.page-body.skin-white.login-page .login-form .form-group .btn.btn-dark {border-color: #eee;background-color: #fff;color: #95cd62 }.page-body.skin-white.login-page .login-form .form-group .btn.btn-dark:hover {background-color: rgba(238, 238, 238, .3) }.page-body.skin-white.login-page .login-form .login-footer {margin-top: 45px }.page-body.skin-white.login-page .login-form .login-footer a {color: #95cd62 }.page-body.skin-white.login-page .login-form .login-footer a:hover {color: #8c8c8c }.page-body.skin-white.login-page .login-form .login-footer .info-links {font-size: 11px;margin-top: 5px;color: #666 }.page-body.skin-white.login-page .login-form .login-footer .info-links a {color: #666 }.page-body.skin-white.login-page .login-form .login-footer .info-links a:hover {color: #95cd62 }.page-body.skin-white.login-page .external-login {position: relative;margin-bottom: 30px;padding: 0 30px }.page-body.skin-white.login-page .external-login a {display: block;color: #fff;background: #2c2e2f;padding: 13px 20px;font-size: 15px;margin-bottom: 10px }.page-body.skin-white.login-page .external-login a i {margin-right: 5px }.page-body.skin-white.login-page .external-login a:hover {background: #454849 }.page-body.skin-white.login-page .external-login a.facebook {background-color: #3b5998 }.page-body.skin-white.login-page .external-login a.facebook:hover {background-color: #2d4373 }.page-body.skin-white.login-page .external-login a.twitter {background-color: #55acee }.page-body.skin-white.login-page .external-login a.twitter:hover {background-color: #2795e9 }.page-body.skin-white.login-page .external-login a.gplus {background-color: #dd4b39 }.page-body.skin-white.login-page .external-login a.gplus:hover {background-color: #c23321 }.page-body.skin-white.login-page.login-light {background: #eee }.page-body.skin-white.login-page.login-light .errors-container, .page-body.skin-white.login-page.login-light .external-login {padding: 0 }.page-body.skin-white.login-page.login-light .form-group label.error {color: rgba(151, 152, 152, .8) }.page-body.skin-white.login-page.login-light .login-form {background: #fff;color: #979898 }.page-body.skin-white.login-page.login-light .login-form .login-footer a {color: #68b828 }.page-body.skin-white.login-page.login-light .login-form .login-footer a:hover {color: #508e1f }.page-body.skin-white.login-page.login-light .login-form .login-footer .info-links a {color: rgba(151, 152, 152, .7) }.page-body.skin-white.login-page.login-light .login-form .login-footer .info-links a:hover {color: #979898 }@media screen and (max-width:768px) {.page-body.skin-white.login-page {padding-top: 0 }.page-body.skin-white.login-page .login-form, .page-body.skin-white.login-page .errors-container, .page-body.skin-white.login-page .external-login {padding-left: 10px;padding-right: 10px }.page-body.skin-white.login-page .errors-container {margin-top: 20px }.page-body.skin-white.login-page.login-light .login-form {padding-left: 30px;padding-right: 30px }.page-body.skin-white.login-page.login-light .errors-container, .page-body.skin-white.login-page.login-light .external-login {padding-left: 0;padding-right: 0 }.page-body.skin-white.login-page .row {margin: 0 }}.page-body.skin-white.lockscreen-page {background: #fff }.page-body.skin-white.lockscreen-page .lockcreen-form .form-group p {color: #666 }.page-body.skin-white.lockscreen-page .lockcreen-form .form-group h3 {color: #666 }.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control {border: 1px solid #eee;color: #95cd62 }.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(149, 205, 98, .5);opacity: 1 }.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(149, 205, 98, .5) }.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(149, 205, 98, .5) }.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(149, 205, 98, .5) }.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder {color: rgba(149, 205, 98, .5) }.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(149, 205, 98, .5) }.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(149, 205, 98, .5) }.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn {color: #95cd62;border: 1px solid #eee }.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover, .page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus {background-color: rgba(238, 238, 238, .3) }.page-body.skin-white.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon {background: #eee;-webkit-box-shadow: 0 0 0 10px #eee, 0 -10px 0 10px #eee, 0 -20px 0 10px #eee, 0 -30px 0 10px #eee;-moz-box-shadow: 0 0 0 10px #eee, 0 -10px 0 10px #eee, 0 -20px 0 10px #eee, 0 -30px 0 10px #eee;box-shadow: 0 0 0 10px #eee, 0 -10px 0 10px #eee, 0 -20px 0 10px #eee, 0 -30px 0 10px #eee }.page-body.skin-white .sidebar-user-info {background-color: #f2f2f2;border-bottom-color: #eee }.page-body.skin-white .sidebar-user-info .user-profile span {color: #666 }.page-body.skin-white .sidebar-user-info .user-profile span strong {color: #95cd62 }.page-body.skin-white .sidebar-user-info .user-links {border-top-color: #eee }.page-body.skin-white .sidebar-user-info .user-links li a {color: #666 }.page-body.skin-white .sidebar-user-info .user-links li a:hover {color: #95cd62;background-color: rgba(238, 238, 238, .25) }.page-body.skin-white .sidebar-user-info .user-links li.active a {color: #95cd62;background-color: rgba(238, 238, 238, .25) }.page-body.skin-white .sidebar-user-info .user-links li+li a {border-left-color: #eee }@media screen and (min-width:991px) {.sidebar-menu.collapsed .page-body.skin-white .sidebar-user-info .sidebar-user-info-inner .user-profile span {background-color: #27292a }.sidebar-menu.collapsed .page-body.skin-white .sidebar-user-info .sidebar-user-info-inner .user-links {background-color: #27292a }}.page-body.skin-concrete .btn-primary {background: #a40f37 }.page-body.skin-concrete .btn-primary:hover {background: #8d0d2f;border-color: #8d0d2f }.page-body.skin-concrete .btn-primary:active, .page-body.skin-concrete .btn-primary:focus {background: #5e091f;border-color: #5e091f }.page-body.skin-concrete .btn.btn-secondary {background-color: #323232;color: #fff }.page-body.skin-concrete .btn.btn-secondary:hover {background-color: #252525;text-color: #fff }.page-body.skin-concrete .btn.btn-secondary:active, .page-body.skin-concrete .btn.btn-secondary:focus {background-color: #252525;border-color: #202020 }.page-body.skin-concrete .settings-pane {background: #b8bbb3;color: #666 }.page-body.skin-concrete .settings-pane>a[data-toggle=settings-pane] {color: #666 }.page-body.skin-concrete .settings-pane>a[data-toggle=settings-pane]:hover {color: #FFF }.page-body.skin-concrete .settings-pane .user-info .user-details h3 a {color: #a40f37 }.page-body.skin-concrete .settings-pane .user-info .user-details .user-title {color: rgba(164, 15, 55, .65) }.page-body.skin-concrete .settings-pane .links-block.left-sep {border-left: 1px solid #a8aba2 }.page-body.skin-concrete .settings-pane .links-block h4 {color: #a40f37 }.page-body.skin-concrete .settings-pane .links-block h4 span {display: inline-block;border-bottom: 1px solid #b8bbb3 }.page-body.skin-concrete .settings-pane .links-block h4 a {color: #a40f37 }.page-body.skin-concrete .settings-pane .links-block h4 a:hover {color: #666 }.page-body.skin-concrete .settings-pane .links-block ul li a {color: #666 }.page-body.skin-concrete .settings-pane .links-block ul li a:hover {color: #a40f37 }.page-body.skin-concrete .sidebar-menu {background: #a8aba2 }.page-body.skin-concrete .sidebar-menu .logo-env {border-bottom: 1px solid #b8bbb3 }.page-body.skin-concrete .sidebar-menu .logo-env .settings-icon a {color: #666 }.page-body.skin-concrete .sidebar-menu .logo-env .settings-icon a:hover {color: #a40f37 }.page-body.skin-concrete .sidebar-menu .main-menu a {color: #666;border-bottom: 1px solid #b8bbb3 }.page-body.skin-concrete .sidebar-menu .main-menu a:hover {color: #a40f37 }.page-body.skin-concrete .sidebar-menu .main-menu li.active>a {color: #a40f37 }.page-body.skin-concrete .sidebar-menu .main-menu li.has-sub>a:before {color: #f7f7f6 }.page-body.skin-concrete .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x, .page-body.skin-concrete .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y {background-color: #fff }@media screen and (min-width:768px) {.page-body.skin-concrete .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar] {color: #606161 }.page-body.skin-concrete .sidebar-menu.collapsed .main-menu>li.active, .page-body.skin-concrete .sidebar-menu.collapsed .main-menu>li li.active {background-color: #a0a49a }.page-body.skin-concrete .sidebar-menu.collapsed .main-menu>li>ul {background: #a8aba2 }}.page-body.skin-concrete .page-loading-overlay {background-color: #a8aba2 }.page-body.skin-concrete.login-page {background: #a8aba2;color: #fff }.page-body.skin-concrete.login-page .login-form .login-header .logo span {color: #666 }.page-body.skin-concrete.login-page .login-form .login-header p {color: #666 }.page-body.skin-concrete.login-page .login-form .form-group .control-label {color: #666 }.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark {background: #9b9f95;border: 1px solid transparent;color: #666 }.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #a40f37;opacity: 1 }.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #a40f37 }.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #a40f37 }.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #a40f37 }.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder {color: #a40f37 }.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #a40f37 }.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #a40f37 }.page-body.skin-concrete.login-page .login-form .form-group .form-control.error {border-color: rgba(204, 63, 68, .5) }.page-body.skin-concrete.login-page .login-form .form-group .btn.btn-dark {border-color: #b8bbb3;background-color: #a8aba2;color: #a40f37 }.page-body.skin-concrete.login-page .login-form .form-group .btn.btn-dark:hover {background-color: rgba(184, 187, 179, .3) }.page-body.skin-concrete.login-page .login-form .login-footer {margin-top: 45px }.page-body.skin-concrete.login-page .login-form .login-footer a {color: #a40f37 }.page-body.skin-concrete.login-page .login-form .login-footer a:hover {color: #8c8c8c }.page-body.skin-concrete.login-page .login-form .login-footer .info-links {font-size: 11px;margin-top: 5px;color: #666 }.page-body.skin-concrete.login-page .login-form .login-footer .info-links a {color: #666 }.page-body.skin-concrete.login-page .login-form .login-footer .info-links a:hover {color: #a40f37 }.page-body.skin-concrete.login-page .external-login {position: relative;margin-bottom: 30px;padding: 0 30px }.page-body.skin-concrete.login-page .external-login a {display: block;color: #fff;background: #2c2e2f;padding: 13px 20px;font-size: 15px;margin-bottom: 10px }.page-body.skin-concrete.login-page .external-login a i {margin-right: 5px }.page-body.skin-concrete.login-page .external-login a:hover {background: #454849 }.page-body.skin-concrete.login-page .external-login a.facebook {background-color: #3b5998 }.page-body.skin-concrete.login-page .external-login a.facebook:hover {background-color: #2d4373 }.page-body.skin-concrete.login-page .external-login a.twitter {background-color: #55acee }.page-body.skin-concrete.login-page .external-login a.twitter:hover {background-color: #2795e9 }.page-body.skin-concrete.login-page .external-login a.gplus {background-color: #dd4b39 }.page-body.skin-concrete.login-page .external-login a.gplus:hover {background-color: #c23321 }.page-body.skin-concrete.login-page.login-light {background: #eee }.page-body.skin-concrete.login-page.login-light .errors-container, .page-body.skin-concrete.login-page.login-light .external-login {padding: 0 }.page-body.skin-concrete.login-page.login-light .form-group label.error {color: rgba(151, 152, 152, .8) }.page-body.skin-concrete.login-page.login-light .login-form {background: #fff;color: #979898 }.page-body.skin-concrete.login-page.login-light .login-form .login-footer a {color: #68b828 }.page-body.skin-concrete.login-page.login-light .login-form .login-footer a:hover {color: #508e1f }.page-body.skin-concrete.login-page.login-light .login-form .login-footer .info-links a {color: rgba(151, 152, 152, .7) }.page-body.skin-concrete.login-page.login-light .login-form .login-footer .info-links a:hover {color: #979898 }@media screen and (max-width:768px) {.page-body.skin-concrete.login-page {padding-top: 0 }.page-body.skin-concrete.login-page .login-form, .page-body.skin-concrete.login-page .errors-container, .page-body.skin-concrete.login-page .external-login {padding-left: 10px;padding-right: 10px }.page-body.skin-concrete.login-page .errors-container {margin-top: 20px }.page-body.skin-concrete.login-page.login-light .login-form {padding-left: 30px;padding-right: 30px }.page-body.skin-concrete.login-page.login-light .errors-container, .page-body.skin-concrete.login-page.login-light .external-login {padding-left: 0;padding-right: 0 }.page-body.skin-concrete.login-page .row {margin: 0 }}.page-body.skin-concrete.lockscreen-page {background: #a8aba2 }.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group p {color: #666 }.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group h3 {color: #666 }.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control {border: 1px solid #b8bbb3;color: #a40f37 }.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(164, 15, 55, .5);opacity: 1 }.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(164, 15, 55, .5) }.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(164, 15, 55, .5) }.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(164, 15, 55, .5) }.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder {color: rgba(164, 15, 55, .5) }.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(164, 15, 55, .5) }.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(164, 15, 55, .5) }.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn {color: #a40f37;border: 1px solid #b8bbb3 }.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover, .page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus {background-color: rgba(184, 187, 179, .3) }.page-body.skin-concrete.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon {background: #b8bbb3;-webkit-box-shadow: 0 0 0 10px #b8bbb3, 0 -10px 0 10px #b8bbb3, 0 -20px 0 10px #b8bbb3, 0 -30px 0 10px #b8bbb3;-moz-box-shadow: 0 0 0 10px #b8bbb3, 0 -10px 0 10px #b8bbb3, 0 -20px 0 10px #b8bbb3, 0 -30px 0 10px #b8bbb3;box-shadow: 0 0 0 10px #b8bbb3, 0 -10px 0 10px #b8bbb3, 0 -20px 0 10px #b8bbb3, 0 -30px 0 10px #b8bbb3 }.page-body.skin-concrete .sidebar-user-info {background-color: #9b9f95;border-bottom-color: #b8bbb3 }.page-body.skin-concrete .sidebar-user-info .user-profile span {color: #666 }.page-body.skin-concrete .sidebar-user-info .user-profile span strong {color: #a40f37 }.page-body.skin-concrete .sidebar-user-info .user-links {border-top-color: #b8bbb3 }.page-body.skin-concrete .sidebar-user-info .user-links li a {color: #666 }.page-body.skin-concrete .sidebar-user-info .user-links li a:hover {color: #a40f37;background-color: rgba(184, 187, 179, .25) }.page-body.skin-concrete .sidebar-user-info .user-links li.active a {color: #a40f37;background-color: rgba(184, 187, 179, .25) }.page-body.skin-concrete .sidebar-user-info .user-links li+li a {border-left-color: #b8bbb3 }@media screen and (min-width:991px) {.sidebar-menu.collapsed .page-body.skin-concrete .sidebar-user-info .sidebar-user-info-inner .user-profile span {background-color: #27292a }.sidebar-menu.collapsed .page-body.skin-concrete .sidebar-user-info .sidebar-user-info-inner .user-links {background-color: #27292a }}.page-body.skin-watermelon .btn-primary {background: #b63131 }.page-body.skin-watermelon .btn-primary:hover {background: #a22c2c;border-color: #a22c2c }.page-body.skin-watermelon .btn-primary:active, .page-body.skin-watermelon .btn-primary:focus {background: #7a2121;border-color: #7a2121 }.page-body.skin-watermelon .btn.btn-secondary {background-color: #32932e;color: #fff }.page-body.skin-watermelon .btn.btn-secondary:hover {background-color: #2b8028;text-color: #fff }.page-body.skin-watermelon .btn.btn-secondary:active, .page-body.skin-watermelon .btn.btn-secondary:focus {background-color: #2b8028;border-color: #297825 }.page-body.skin-watermelon .settings-pane {background: #c03737;color: #f7b2b2 }.page-body.skin-watermelon .settings-pane>a[data-toggle=settings-pane] {color: #f7b2b2 }.page-body.skin-watermelon .settings-pane>a[data-toggle=settings-pane]:hover {color: #FFF }.page-body.skin-watermelon .settings-pane .user-info .user-details h3 a {color: #fff }.page-body.skin-watermelon .settings-pane .user-info .user-details .user-title {color: rgba(255, 255, 255, .65) }.page-body.skin-watermelon .settings-pane .links-block.left-sep {border-left: 1px solid #b63131 }.page-body.skin-watermelon .settings-pane .links-block h4 {color: #fff }.page-body.skin-watermelon .settings-pane .links-block h4 span {display: inline-block;border-bottom: 1px solid #c03737 }.page-body.skin-watermelon .settings-pane .links-block h4 a {color: #fff }.page-body.skin-watermelon .settings-pane .links-block h4 a:hover {color: #f7b2b2 }.page-body.skin-watermelon .settings-pane .links-block ul li a {color: #f7b2b2 }.page-body.skin-watermelon .settings-pane .links-block ul li a:hover {color: #fff }.page-body.skin-watermelon .sidebar-menu {background: #b63131 }.page-body.skin-watermelon .sidebar-menu .logo-env {border-bottom: 1px solid #c03737 }.page-body.skin-watermelon .sidebar-menu .logo-env .settings-icon a {color: #f7b2b2 }.page-body.skin-watermelon .sidebar-menu .logo-env .settings-icon a:hover {color: #fff }.page-body.skin-watermelon .sidebar-menu .main-menu a {color: #f7b2b2;border-bottom: 1px solid #c03737 }.page-body.skin-watermelon .sidebar-menu .main-menu a:hover {color: #fff }.page-body.skin-watermelon .sidebar-menu .main-menu li.active>a {color: #fff }.page-body.skin-watermelon .sidebar-menu .main-menu li.has-sub>a:before {color: #e19696 }.page-body.skin-watermelon .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x, .page-body.skin-watermelon .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y {background-color: #fff }@media screen and (min-width:768px) {.page-body.skin-watermelon .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar] {color: #606161 }.page-body.skin-watermelon .sidebar-menu.collapsed .main-menu>li.active, .page-body.skin-watermelon .sidebar-menu.collapsed .main-menu>li li.active {background-color: #aa2e2e }.page-body.skin-watermelon .sidebar-menu.collapsed .main-menu>li>ul {background: #b63131 }}.page-body.skin-watermelon .page-loading-overlay {background-color: #b63131 }.page-body.skin-watermelon.login-page {background: #b63131;color: #fff }.page-body.skin-watermelon.login-page .login-form .login-header .logo span {color: #f7b2b2 }.page-body.skin-watermelon.login-page .login-form .login-header p {color: #f7b2b2 }.page-body.skin-watermelon.login-page .login-form .form-group .control-label {color: #f7b2b2 }.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark {background: #a22c2c;border: 1px solid transparent;color: #f7b2b2 }.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff;opacity: 1 }.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder {color: #fff }.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff }.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-watermelon.login-page .login-form .form-group .form-control.error {border-color: rgba(204, 63, 68, .5) }.page-body.skin-watermelon.login-page .login-form .form-group .btn.btn-dark {border-color: #c03737;background-color: #b63131;color: #fff }.page-body.skin-watermelon.login-page .login-form .form-group .btn.btn-dark:hover {background-color: rgba(192, 55, 55, .3) }.page-body.skin-watermelon.login-page .login-form .login-footer {margin-top: 45px }.page-body.skin-watermelon.login-page .login-form .login-footer a {color: #fff }.page-body.skin-watermelon.login-page .login-form .login-footer a:hover {color: #fef7f7 }.page-body.skin-watermelon.login-page .login-form .login-footer .info-links {font-size: 11px;margin-top: 5px;color: #f7b2b2 }.page-body.skin-watermelon.login-page .login-form .login-footer .info-links a {color: #f7b2b2 }.page-body.skin-watermelon.login-page .login-form .login-footer .info-links a:hover {color: #fff }.page-body.skin-watermelon.login-page .external-login {position: relative;margin-bottom: 30px;padding: 0 30px }.page-body.skin-watermelon.login-page .external-login a {display: block;color: #fff;background: #2c2e2f;padding: 13px 20px;font-size: 15px;margin-bottom: 10px }.page-body.skin-watermelon.login-page .external-login a i {margin-right: 5px }.page-body.skin-watermelon.login-page .external-login a:hover {background: #454849 }.page-body.skin-watermelon.login-page .external-login a.facebook {background-color: #3b5998 }.page-body.skin-watermelon.login-page .external-login a.facebook:hover {background-color: #2d4373 }.page-body.skin-watermelon.login-page .external-login a.twitter {background-color: #55acee }.page-body.skin-watermelon.login-page .external-login a.twitter:hover {background-color: #2795e9 }.page-body.skin-watermelon.login-page .external-login a.gplus {background-color: #dd4b39 }.page-body.skin-watermelon.login-page .external-login a.gplus:hover {background-color: #c23321 }.page-body.skin-watermelon.login-page.login-light {background: #eee }.page-body.skin-watermelon.login-page.login-light .errors-container, .page-body.skin-watermelon.login-page.login-light .external-login {padding: 0 }.page-body.skin-watermelon.login-page.login-light .form-group label.error {color: rgba(151, 152, 152, .8) }.page-body.skin-watermelon.login-page.login-light .login-form {background: #fff;color: #979898 }.page-body.skin-watermelon.login-page.login-light .login-form .login-footer a {color: #68b828 }.page-body.skin-watermelon.login-page.login-light .login-form .login-footer a:hover {color: #508e1f }.page-body.skin-watermelon.login-page.login-light .login-form .login-footer .info-links a {color: rgba(151, 152, 152, .7) }.page-body.skin-watermelon.login-page.login-light .login-form .login-footer .info-links a:hover {color: #979898 }@media screen and (max-width:768px) {.page-body.skin-watermelon.login-page {padding-top: 0 }.page-body.skin-watermelon.login-page .login-form, .page-body.skin-watermelon.login-page .errors-container, .page-body.skin-watermelon.login-page .external-login {padding-left: 10px;padding-right: 10px }.page-body.skin-watermelon.login-page .errors-container {margin-top: 20px }.page-body.skin-watermelon.login-page.login-light .login-form {padding-left: 30px;padding-right: 30px }.page-body.skin-watermelon.login-page.login-light .errors-container, .page-body.skin-watermelon.login-page.login-light .external-login {padding-left: 0;padding-right: 0 }.page-body.skin-watermelon.login-page .row {margin: 0 }}.page-body.skin-watermelon.lockscreen-page {background: #b63131 }.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group p {color: #f7b2b2 }.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group h3 {color: #f7b2b2 }.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control {border: 1px solid #c03737;color: #fff }.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5);opacity: 1 }.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn {color: #fff;border: 1px solid #c03737 }.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover, .page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus {background-color: rgba(192, 55, 55, .3) }.page-body.skin-watermelon.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon {background: #c03737;-webkit-box-shadow: 0 0 0 10px #c03737, 0 -10px 0 10px #c03737, 0 -20px 0 10px #c03737, 0 -30px 0 10px #c03737;-moz-box-shadow: 0 0 0 10px #c03737, 0 -10px 0 10px #c03737, 0 -20px 0 10px #c03737, 0 -30px 0 10px #c03737;box-shadow: 0 0 0 10px #c03737, 0 -10px 0 10px #c03737, 0 -20px 0 10px #c03737, 0 -30px 0 10px #c03737 }.page-body.skin-watermelon .sidebar-user-info {background-color: #a22c2c;border-bottom-color: #c03737 }.page-body.skin-watermelon .sidebar-user-info .user-profile span {color: #f7b2b2 }.page-body.skin-watermelon .sidebar-user-info .user-profile span strong {color: #fff }.page-body.skin-watermelon .sidebar-user-info .user-links {border-top-color: #c03737 }.page-body.skin-watermelon .sidebar-user-info .user-links li a {color: #f7b2b2 }.page-body.skin-watermelon .sidebar-user-info .user-links li a:hover {color: #fff;background-color: rgba(192, 55, 55, .25) }.page-body.skin-watermelon .sidebar-user-info .user-links li.active a {color: #fff;background-color: rgba(192, 55, 55, .25) }.page-body.skin-watermelon .sidebar-user-info .user-links li+li a {border-left-color: #c03737 }@media screen and (min-width:991px) {.sidebar-menu.collapsed .page-body.skin-watermelon .sidebar-user-info .sidebar-user-info-inner .user-profile span {background-color: #27292a }.sidebar-menu.collapsed .page-body.skin-watermelon .sidebar-user-info .sidebar-user-info-inner .user-links {background-color: #27292a }}.page-body.skin-lemonade .btn-primary {background: #f5c150 }.page-body.skin-lemonade .btn-primary:hover {background: #f4b838;border-color: #f4b838 }.page-body.skin-lemonade .btn-primary:active, .page-body.skin-lemonade .btn-primary:focus {background: #eba50d;border-color: #eba50d }.page-body.skin-lemonade .btn.btn-secondary {background-color: #d9a940;color: #fff }.page-body.skin-lemonade .btn.btn-secondary:hover {background-color: #d59f2b;text-color: #fff }.page-body.skin-lemonade .btn.btn-secondary:active, .page-body.skin-lemonade .btn.btn-secondary:focus {background-color: #d59f2b;border-color: #cd9929 }.page-body.skin-lemonade .settings-pane {background: #ffcf67;color: #ffeec9 }.page-body.skin-lemonade .settings-pane>a[data-toggle=settings-pane] {color: #ffeec9 }.page-body.skin-lemonade .settings-pane>a[data-toggle=settings-pane]:hover {color: #FFF }.page-body.skin-lemonade .settings-pane .user-info .user-details h3 a {color: #fff }.page-body.skin-lemonade .settings-pane .user-info .user-details .user-title {color: rgba(255, 255, 255, .65) }.page-body.skin-lemonade .settings-pane .links-block.left-sep {border-left: 1px solid #f5c150 }.page-body.skin-lemonade .settings-pane .links-block h4 {color: #fff }.page-body.skin-lemonade .settings-pane .links-block h4 span {display: inline-block;border-bottom: 1px solid #ffcf67 }.page-body.skin-lemonade .settings-pane .links-block h4 a {color: #fff }.page-body.skin-lemonade .settings-pane .links-block h4 a:hover {color: #ffeec9 }.page-body.skin-lemonade .settings-pane .links-block ul li a {color: #ffeec9 }.page-body.skin-lemonade .settings-pane .links-block ul li a:hover {color: #fff }.page-body.skin-lemonade .sidebar-menu {background: #f5c150 }.page-body.skin-lemonade .sidebar-menu .logo-env {border-bottom: 1px solid #ffcf67 }.page-body.skin-lemonade .sidebar-menu .logo-env .settings-icon a {color: #ffeec9 }.page-body.skin-lemonade .sidebar-menu .logo-env .settings-icon a:hover {color: #fff }.page-body.skin-lemonade .sidebar-menu .main-menu a {color: #ffeec9;border-bottom: 1px solid #ffcf67 }.page-body.skin-lemonade .sidebar-menu .main-menu a:hover {color: #fff }.page-body.skin-lemonade .sidebar-menu .main-menu li.active>a {color: #fff }.page-body.skin-lemonade .sidebar-menu .main-menu li.has-sub>a:before {color: #fff7e6 }.page-body.skin-lemonade .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x, .page-body.skin-lemonade .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y {background-color: #fff }@media screen and (min-width:768px) {.page-body.skin-lemonade .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar] {color: #606161 }.page-body.skin-lemonade .sidebar-menu.collapsed .main-menu>li.active, .page-body.skin-lemonade .sidebar-menu.collapsed .main-menu>li li.active {background-color: #f4bc42 }.page-body.skin-lemonade .sidebar-menu.collapsed .main-menu>li>ul {background: #f5c150 }}.page-body.skin-lemonade .page-loading-overlay {background-color: #f5c150 }.page-body.skin-lemonade.login-page {background: #f5c150;color: #fff }.page-body.skin-lemonade.login-page .login-form .login-header .logo span {color: #ffeec9 }.page-body.skin-lemonade.login-page .login-form .login-header p {color: #ffeec9 }.page-body.skin-lemonade.login-page .login-form .form-group .control-label {color: #ffeec9 }.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark {background: #f4b838;border: 1px solid transparent;color: #ffeec9 }.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff;opacity: 1 }.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder {color: #fff }.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder {color: #fff }.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder {color: #fff }.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder {color: #fff }.page-body.skin-lemonade.login-page .login-form .form-group .form-control.error {border-color: rgba(204, 63, 68, .5) }.page-body.skin-lemonade.login-page .login-form .form-group .btn.btn-dark {border-color: #ffcf67;background-color: #f5c150;color: #fff }.page-body.skin-lemonade.login-page .login-form .form-group .btn.btn-dark:hover {background-color: rgba(255, 207, 103, .3) }.page-body.skin-lemonade.login-page .login-form .login-footer {margin-top: 45px }.page-body.skin-lemonade.login-page .login-form .login-footer a {color: #fff }.page-body.skin-lemonade.login-page .login-form .login-footer a:hover {color: #fff }.page-body.skin-lemonade.login-page .login-form .login-footer .info-links {font-size: 11px;margin-top: 5px;color: #ffeec9 }.page-body.skin-lemonade.login-page .login-form .login-footer .info-links a {color: #ffeec9 }.page-body.skin-lemonade.login-page .login-form .login-footer .info-links a:hover {color: #fff }.page-body.skin-lemonade.login-page .external-login {position: relative;margin-bottom: 30px;padding: 0 30px }.page-body.skin-lemonade.login-page .external-login a {display: block;color: #fff;background: #2c2e2f;padding: 13px 20px;font-size: 15px;margin-bottom: 10px }.page-body.skin-lemonade.login-page .external-login a i {margin-right: 5px }.page-body.skin-lemonade.login-page .external-login a:hover {background: #454849 }.page-body.skin-lemonade.login-page .external-login a.facebook {background-color: #3b5998 }.page-body.skin-lemonade.login-page .external-login a.facebook:hover {background-color: #2d4373 }.page-body.skin-lemonade.login-page .external-login a.twitter {background-color: #55acee }.page-body.skin-lemonade.login-page .external-login a.twitter:hover {background-color: #2795e9 }.page-body.skin-lemonade.login-page .external-login a.gplus {background-color: #dd4b39 }.page-body.skin-lemonade.login-page .external-login a.gplus:hover {background-color: #c23321 }.page-body.skin-lemonade.login-page.login-light {background: #eee }.page-body.skin-lemonade.login-page.login-light .errors-container, .page-body.skin-lemonade.login-page.login-light .external-login {padding: 0 }.page-body.skin-lemonade.login-page.login-light .form-group label.error {color: rgba(151, 152, 152, .8) }.page-body.skin-lemonade.login-page.login-light .login-form {background: #fff;color: #979898 }.page-body.skin-lemonade.login-page.login-light .login-form .login-footer a {color: #68b828 }.page-body.skin-lemonade.login-page.login-light .login-form .login-footer a:hover {color: #508e1f }.page-body.skin-lemonade.login-page.login-light .login-form .login-footer .info-links a {color: rgba(151, 152, 152, .7) }.page-body.skin-lemonade.login-page.login-light .login-form .login-footer .info-links a:hover {color: #979898 }@media screen and (max-width:768px) {.page-body.skin-lemonade.login-page {padding-top: 0 }.page-body.skin-lemonade.login-page .login-form, .page-body.skin-lemonade.login-page .errors-container, .page-body.skin-lemonade.login-page .external-login {padding-left: 10px;padding-right: 10px }.page-body.skin-lemonade.login-page .errors-container {margin-top: 20px }.page-body.skin-lemonade.login-page.login-light .login-form {padding-left: 30px;padding-right: 30px }.page-body.skin-lemonade.login-page.login-light .errors-container, .page-body.skin-lemonade.login-page.login-light .external-login {padding-left: 0;padding-right: 0 }.page-body.skin-lemonade.login-page .row {margin: 0 }}.page-body.skin-lemonade.lockscreen-page {background: #f5c150 }.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group p {color: #ffeec9 }.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group h3 {color: #ffeec9 }.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control {border: 1px solid #ffcf67;color: #fff }.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5);opacity: 1 }.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder {color: rgba(255, 255, 255, .5) }.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn {color: #fff;border: 1px solid #ffcf67 }.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover, .page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus {background-color: rgba(255, 207, 103, .3) }.page-body.skin-lemonade.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon {background: #ffcf67;-webkit-box-shadow: 0 0 0 10px #ffcf67, 0 -10px 0 10px #ffcf67, 0 -20px 0 10px #ffcf67, 0 -30px 0 10px #ffcf67;-moz-box-shadow: 0 0 0 10px #ffcf67, 0 -10px 0 10px #ffcf67, 0 -20px 0 10px #ffcf67, 0 -30px 0 10px #ffcf67;box-shadow: 0 0 0 10px #ffcf67, 0 -10px 0 10px #ffcf67, 0 -20px 0 10px #ffcf67, 0 -30px 0 10px #ffcf67 }.page-body.skin-lemonade .sidebar-user-info {background-color: #f4b838;border-bottom-color: #ffcf67 }.page-body.skin-lemonade .sidebar-user-info .user-profile span {color: #ffeec9 }.page-body.skin-lemonade .sidebar-user-info .user-profile span strong {color: #fff }.page-body.skin-lemonade .sidebar-user-info .user-links {border-top-color: #ffcf67 }.page-body.skin-lemonade .sidebar-user-info .user-links li a {color: #ffeec9 }.page-body.skin-lemonade .sidebar-user-info .user-links li a:hover {color: #fff;background-color: rgba(255, 207, 103, .25) }.page-body.skin-lemonade .sidebar-user-info .user-links li.active a {color: #fff;background-color: rgba(255, 207, 103, .25) }.page-body.skin-lemonade .sidebar-user-info .user-links li+li a {border-left-color: #ffcf67 }@media screen and (min-width:991px) {.sidebar-menu.collapsed .page-body.skin-lemonade .sidebar-user-info .sidebar-user-info-inner .user-profile span {background-color: #27292a }.sidebar-menu.collapsed .page-body.skin-lemonade .sidebar-user-info .sidebar-user-info-inner .user-links {background-color: #27292a }}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu {background: #558c89;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.settings-pane-open .page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #ececea }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #ececea }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i {color: #fff }@media screen and (min-width:768px) {.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before {-webkit-transform: rotate(90deg);-moz-transform: rotate(90deg);-o-transform: rotate(90deg);-ms-transform: rotate(90deg);transform: rotate(90deg) }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav a {color: #ececea }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a, .page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a {color: #fff }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav>li {border: 0 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active, .page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover {border-color: transparent;background-color: #5f9a97 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover {border-left-color: transparent }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul {border: none;-webkit-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);-moz-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);box-shadow: 0 2px 8px rgba(0, 1, 1, .05) }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul {background: #5f9a97 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a {color: #ececea }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after {background: #6da5a2 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a {color: #fff;background: #558c89 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before {color: #ececea }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul {background: #6da5a2;border-top: 1px solid #77aba8;border-bottom: 1px solid #77aba8 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul {background: #649f9c;border-top-color: #6aa3a0;border-bottom-color: #6aa3a0 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after {background-color: #6aa3a0 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul {background: #6aa3a0;border-top-color: #6aa3a0;border-bottom-color: #6aa3a0 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after {background-color: #6aa3a0 }}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li:hover {background: #5f9a97 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li i {color: #ececea }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>a {border: 0 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover {background: #5f9a97;color: #fff }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i {color: #fff }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before {background: #68b828 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus {background: #5f9a97 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before {background-color: #7c38bc }.chat-open .page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i {color: #fff }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon {background-color: #5f9a97;border-color: #6da5a2;color: #ececea }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i {color: #fff }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before {display: block }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>ul {border-color: #5f9a97 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus {background-color: #5f9a97 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span {color: #ececea }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover {color: #fff }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a {background-color: #5f9a97;border-color: #5f9a97 }.page-body.horizontal-menu-skin-aero .page-loading-overlay {background-color: #558c89 }@media screen and (max-width:768px) {.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu {background: #558c89;color: #ececea }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.navbar-nav a {color: #ececea;border-color: #5f9a97 }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover, .page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active, .page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus {color: #fff }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a {color: #ececea }.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover, .page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active, .page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus {color: #fff }}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu {background: #2c3e50;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.settings-pane-open .page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #a7bfd6 }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #a7bfd6 }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i {color: #fff }@media screen and (min-width:768px) {.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before {-webkit-transform: rotate(90deg);-moz-transform: rotate(90deg);-o-transform: rotate(90deg);-ms-transform: rotate(90deg);transform: rotate(90deg) }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav a {color: #a7bfd6 }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a, .page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a {color: #fff }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav>li {border: 0 }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active, .page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover {border-color: transparent;background-color: #34495e }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover {border-left-color: transparent }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul {border: none;-webkit-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);-moz-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);box-shadow: 0 2px 8px rgba(0, 1, 1, .05) }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul {background: #34495e }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a {color: #a7bfd6 }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after {background: #3d566e }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a {color: #fff;background: #2c3e50 }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before {color: #a7bfd6 }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul {background: #3d566e;border-top: 1px solid #435d78;border-bottom: 1px solid #435d78 }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul {background: #384e65;border-top-color: #3b536b;border-bottom-color: #3b536b }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after {background-color: #3b536b }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul {background: #3b536b;border-top-color: #3b536b;border-bottom-color: #3b536b }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after {background-color: #3b536b }}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li:hover {background: #34495e }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li i {color: #a7bfd6 }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>a {border: 0 }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover {background: #34495e;color: #fff }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i {color: #fff }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before {background: #68b828 }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus {background: #34495e }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before {background-color: #7c38bc }.chat-open .page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i {color: #fff }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon {background-color: #34495e;border-color: #3d566e;color: #a7bfd6 }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i {color: #fff }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before {display: block }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>ul {border-color: #34495e }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus {background-color: #34495e }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span {color: #a7bfd6 }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover {color: #fff }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a {background-color: #34495e;border-color: #34495e }.page-body.horizontal-menu-skin-navy .page-loading-overlay {background-color: #2c3e50 }@media screen and (max-width:768px) {.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu {background: #2c3e50;color: #a7bfd6 }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.navbar-nav a {color: #a7bfd6;border-color: #34495e }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover, .page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active, .page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus {color: #fff }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a {color: #a7bfd6 }.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover, .page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active, .page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus {color: #fff }}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu {background: #3b5998;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.settings-pane-open .page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #8b9dc3 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #8b9dc3 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i {color: #fff }@media screen and (min-width:768px) {.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before {-webkit-transform: rotate(90deg);-moz-transform: rotate(90deg);-o-transform: rotate(90deg);-ms-transform: rotate(90deg);transform: rotate(90deg) }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav a {color: #8b9dc3 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a, .page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a {color: #fff }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav>li {border: 0 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active, .page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover {border-color: transparent;background-color: #4160a0 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover {border-left-color: transparent }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul {border: none;-webkit-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);-moz-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);box-shadow: 0 2px 8px rgba(0, 1, 1, .05) }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul {background: #4160a0 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a {color: #8b9dc3 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after {background: #486bb2 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a {color: #fff;background: #3b5998 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before {color: #8b9dc3 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul {background: #486bb2;border-top: 1px solid #5173b8;border-bottom: 1px solid #5173b8 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul {background: #4464a7;border-top-color: #4769af;border-bottom-color: #4769af }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after {background-color: #4769af }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul {background: #4769af;border-top-color: #4769af;border-bottom-color: #4769af }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after {background-color: #4769af }}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li:hover {background: #4160a0 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li i {color: #8b9dc3 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>a {border: 0 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover {background: #4160a0;color: #fff }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i {color: #fff }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before {background: #68b828 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus {background: #4160a0 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before {background-color: #7c38bc }.chat-open .page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i {color: #fff }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon {background-color: #4160a0;border-color: #486bb2;color: #8b9dc3 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i {color: #fff }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before {display: block }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>ul {border-color: #4160a0 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus {background-color: #4160a0 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span {color: #8b9dc3 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover {color: #fff }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a {background-color: #4160a0;border-color: #4160a0 }.page-body.horizontal-menu-skin-facebook .page-loading-overlay {background-color: #3b5998 }@media screen and (max-width:768px) {.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu {background: #3b5998;color: #8b9dc3 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.navbar-nav a {color: #8b9dc3;border-color: #4160a0 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover, .page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active, .page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus {color: #fff }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a {color: #8b9dc3 }.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover, .page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active, .page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus {color: #fff }}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu {background: #16a085;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.settings-pane-open .page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #96ead9 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #96ead9 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i {color: #fff }@media screen and (min-width:768px) {.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before {-webkit-transform: rotate(90deg);-moz-transform: rotate(90deg);-o-transform: rotate(90deg);-ms-transform: rotate(90deg);transform: rotate(90deg) }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav a {color: #96ead9 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a, .page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a {color: #fff }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav>li {border: 0 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active, .page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover {border-color: transparent;background-color: #1daf92 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover {border-left-color: transparent }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul {border: none;-webkit-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);-moz-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);box-shadow: 0 2px 8px rgba(0, 1, 1, .05) }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul {background: #1daf92 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a {color: #96ead9 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after {background: #21c5a4 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a {color: #fff;background: #16a085 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before {color: #96ead9 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul {background: #21c5a4;border-top: 1px solid #23d2af;border-bottom: 1px solid #23d2af }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul {background: #1eb899;border-top-color: #20c1a1;border-bottom-color: #20c1a1 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after {background-color: #20c1a1 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul {background: #20c1a1;border-top-color: #20c1a1;border-bottom-color: #20c1a1 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after {background-color: #20c1a1 }}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li:hover {background: #1daf92 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li i {color: #96ead9 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>a {border: 0 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover {background: #1daf92;color: #fff }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i {color: #fff }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before {background: #68b828 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus {background: #1daf92 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before {background-color: #7c38bc }.chat-open .page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i {color: #fff }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon {background-color: #1daf92;border-color: #21c5a4;color: #96ead9 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i {color: #fff }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before {display: block }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>ul {border-color: #1daf92 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus {background-color: #1daf92 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span {color: #96ead9 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover {color: #fff }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a {background-color: #1daf92;border-color: #1daf92 }.page-body.horizontal-menu-skin-turquoise .page-loading-overlay {background-color: #16a085 }@media screen and (max-width:768px) {.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu {background: #16a085;color: #96ead9 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.navbar-nav a {color: #96ead9;border-color: #1daf92 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover, .page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active, .page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus {color: #fff }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a {color: #96ead9 }.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover, .page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active, .page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus {color: #fff }}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu {background: #8cc657;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.settings-pane-open .page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i {color: #fff }@media screen and (min-width:768px) {.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before {-webkit-transform: rotate(90deg);-moz-transform: rotate(90deg);-o-transform: rotate(90deg);-ms-transform: rotate(90deg);transform: rotate(90deg) }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav a {color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a, .page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a {color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav>li {border: 0 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active, .page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover {border-color: transparent;background-color: #95cd62 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover {border-left-color: transparent }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul {border: none;-webkit-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);-moz-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);box-shadow: 0 2px 8px rgba(0, 1, 1, .05) }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul {background: #95cd62 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a {color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after {background: #a2d375 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a {color: #fff;background: #8cc657 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before {color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul {background: #a2d375;border-top: 1px solid #aad781;border-bottom: 1px solid #aad781 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul {background: #9acf6a;border-top-color: #9fd271;border-bottom-color: #9fd271 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after {background-color: #9fd271 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul {background: #9fd271;border-top-color: #9fd271;border-bottom-color: #9fd271 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after {background-color: #9fd271 }}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li:hover {background: #95cd62 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li i {color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>a {border: 0 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover {background: #95cd62;color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i {color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before {background: #68b828 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus {background: #95cd62 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before {background-color: #7c38bc }.chat-open .page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i {color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon {background-color: #95cd62;border-color: #a2d375;color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i {color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before {display: block }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>ul {border-color: #95cd62 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus {background-color: #95cd62 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span {color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover {color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a {background-color: #95cd62;border-color: #95cd62 }.page-body.horizontal-menu-skin-lime .page-loading-overlay {background-color: #8cc657 }@media screen and (max-width:768px) {.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu {background: #8cc657;color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.navbar-nav a {color: #fff;border-color: #95cd62 }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover, .page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active, .page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus {color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a {color: #fff }.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover, .page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active, .page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus {color: #fff }}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu {background: #27ae60;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.settings-pane-open .page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #a2f9c7 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #a2f9c7 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i {color: #fff }@media screen and (min-width:768px) {.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before {-webkit-transform: rotate(90deg);-moz-transform: rotate(90deg);-o-transform: rotate(90deg);-ms-transform: rotate(90deg);transform: rotate(90deg) }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav a {color: #a2f9c7 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a, .page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a {color: #fff }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav>li {border: 0 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active, .page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover {border-color: transparent;background-color: #2fbd6b }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover {border-left-color: transparent }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul {border: none;-webkit-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);-moz-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);box-shadow: 0 2px 8px rgba(0, 1, 1, .05) }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul {background: #2fbd6b }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a {color: #a2f9c7 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after {background: #38ce77 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a {color: #fff;background: #27ae60 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before {color: #a2f9c7 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul {background: #38ce77;border-top: 1px solid #44d180;border-bottom: 1px solid #44d180 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul {background: #31c570;border-top-color: #34cc74;border-bottom-color: #34cc74 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after {background-color: #34cc74 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul {background: #34cc74;border-top-color: #34cc74;border-bottom-color: #34cc74 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after {background-color: #34cc74 }}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li:hover {background: #2fbd6b }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li i {color: #a2f9c7 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>a {border: 0 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover {background: #2fbd6b;color: #fff }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i {color: #fff }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before {background: #68b828 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus {background: #2fbd6b }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before {background-color: #7c38bc }.chat-open .page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i {color: #fff }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon {background-color: #2fbd6b;border-color: #38ce77;color: #a2f9c7 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i {color: #fff }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before {display: block }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>ul {border-color: #2fbd6b }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus {background-color: #2fbd6b }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span {color: #a2f9c7 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover {color: #fff }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a {background-color: #2fbd6b;border-color: #2fbd6b }.page-body.horizontal-menu-skin-green .page-loading-overlay {background-color: #27ae60 }@media screen and (max-width:768px) {.page-body.horizontal-menu-skin-green .navbar.horizontal-menu {background: #27ae60;color: #a2f9c7 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.navbar-nav a {color: #a2f9c7;border-color: #2fbd6b }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover, .page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active, .page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus {color: #fff }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a {color: #a2f9c7 }.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover, .page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active, .page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus {color: #fff }}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu {background: #795b95;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.settings-pane-open .page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #c2afd4 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #c2afd4 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i {color: #fff }@media screen and (min-width:768px) {.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before {-webkit-transform: rotate(90deg);-moz-transform: rotate(90deg);-o-transform: rotate(90deg);-ms-transform: rotate(90deg);transform: rotate(90deg) }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav a {color: #c2afd4 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a, .page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a {color: #fff }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav>li {border: 0 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active, .page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover {border-color: transparent;background-color: #81629f }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover {border-left-color: transparent }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul {border: none;-webkit-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);-moz-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);box-shadow: 0 2px 8px rgba(0, 1, 1, .05) }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul {background: #81629f }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a {color: #c2afd4 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after {background: #8e72a9 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a {color: #fff;background: #795b95 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before {color: #c2afd4 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul {background: #8e72a9;border-top: 1px solid #957bae;border-bottom: 1px solid #957bae }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul {background: #8668a3;border-top-color: #8b6fa7;border-bottom-color: #8b6fa7 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after {background-color: #8b6fa7 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul {background: #8b6fa7;border-top-color: #8b6fa7;border-bottom-color: #8b6fa7 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after {background-color: #8b6fa7 }}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li:hover {background: #81629f }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li i {color: #c2afd4 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>a {border: 0 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover {background: #81629f;color: #fff }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i {color: #fff }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before {background: #68b828 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus {background: #81629f }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before {background-color: #7c38bc }.chat-open .page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i {color: #fff }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon {background-color: #81629f;border-color: #8e72a9;color: #c2afd4 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i {color: #fff }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before {display: block }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>ul {border-color: #81629f }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus {background-color: #81629f }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span {color: #c2afd4 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover {color: #fff }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a {background-color: #81629f;border-color: #81629f }.page-body.horizontal-menu-skin-purple .page-loading-overlay {background-color: #795b95 }@media screen and (max-width:768px) {.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu {background: #795b95;color: #c2afd4 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.navbar-nav a {color: #c2afd4;border-color: #81629f }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover, .page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active, .page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus {color: #fff }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a {color: #c2afd4 }.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover, .page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active, .page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus {color: #fff }}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu {background: #fff;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.settings-pane-open .page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #666 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #666 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i {color: #95cd62 }@media screen and (min-width:768px) {.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before {-webkit-transform: rotate(90deg);-moz-transform: rotate(90deg);-o-transform: rotate(90deg);-ms-transform: rotate(90deg);transform: rotate(90deg) }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav a {color: #666 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a, .page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a {color: #95cd62 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav>li {border: 0 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active, .page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover {border-color: transparent;background-color: #eee }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover {border-left-color: transparent }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul {border: none;-webkit-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);-moz-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);box-shadow: 0 2px 8px rgba(0, 1, 1, .05) }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul {background: #eee }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a {color: #666 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after {background: #fbfbfb }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a {color: #95cd62;background: #fff }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before {color: #666 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul {background: #fbfbfb;border-top: 1px solid #fff;border-bottom: 1px solid #fff }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul {background: #f3f3f3;border-top-color: #f8f8f8;border-bottom-color: #f8f8f8 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after {background-color: #f8f8f8 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul {background: #f8f8f8;border-top-color: #f8f8f8;border-bottom-color: #f8f8f8 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after {background-color: #f8f8f8 }}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li:hover {background: #eee }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li i {color: #666 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>a {border: 0 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover {background: #eee;color: #95cd62 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i {color: #95cd62 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before {background: #68b828 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus {background: #eee }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before {background-color: #7c38bc }.chat-open .page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i {color: #95cd62 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon {background-color: #eee;border-color: #fbfbfb;color: #666 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i {color: #95cd62 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before {display: block }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>ul {border-color: #eee }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus {background-color: #eee }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span {color: #666 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover {color: #95cd62 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a {background-color: #eee;border-color: #eee }.page-body.horizontal-menu-skin-white .page-loading-overlay {background-color: #fff }@media screen and (max-width:768px) {.page-body.horizontal-menu-skin-white .navbar.horizontal-menu {background: #fff;color: #666 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.navbar-nav a {color: #666;border-color: #eee }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover, .page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active, .page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus {color: #95cd62 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a {color: #666 }.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover, .page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active, .page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus {color: #95cd62 }}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu {background: #a8aba2;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.settings-pane-open .page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #666 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #666 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i {color: #a40f37 }@media screen and (min-width:768px) {.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before {-webkit-transform: rotate(90deg);-moz-transform: rotate(90deg);-o-transform: rotate(90deg);-ms-transform: rotate(90deg);transform: rotate(90deg) }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav a {color: #666 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a, .page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a {color: #a40f37 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav>li {border: 0 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active, .page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover {border-color: transparent;background-color: #b8bbb3 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover {border-left-color: transparent }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul {border: none;-webkit-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);-moz-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);box-shadow: 0 2px 8px rgba(0, 1, 1, .05) }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul {background: #b8bbb3 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a {color: #666 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after {background: #c5c7c0 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a {color: #a40f37;background: #a8aba2 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before {color: #666 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul {background: #c5c7c0;border-top: 1px solid #cccec9;border-bottom: 1px solid #cccec9 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul {background: #bdc0b8;border-top-color: #c2c5be;border-bottom-color: #c2c5be }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after {background-color: #c2c5be }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul {background: #c2c5be;border-top-color: #c2c5be;border-bottom-color: #c2c5be }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after {background-color: #c2c5be }}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li:hover {background: #b8bbb3 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li i {color: #666 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>a {border: 0 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover {background: #b8bbb3;color: #a40f37 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i {color: #a40f37 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before {background: #68b828 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus {background: #b8bbb3 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before {background-color: #7c38bc }.chat-open .page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i {color: #a40f37 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon {background-color: #b8bbb3;border-color: #c5c7c0;color: #666 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i {color: #a40f37 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before {display: block }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>ul {border-color: #b8bbb3 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus {background-color: #b8bbb3 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span {color: #666 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover {color: #a40f37 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a {background-color: #b8bbb3;border-color: #b8bbb3 }.page-body.horizontal-menu-skin-concrete .page-loading-overlay {background-color: #a8aba2 }@media screen and (max-width:768px) {.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu {background: #a8aba2;color: #666 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.navbar-nav a {color: #666;border-color: #b8bbb3 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover, .page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active, .page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus {color: #a40f37 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a {color: #666 }.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover, .page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active, .page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus {color: #a40f37 }}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu {background: #b63131;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.settings-pane-open .page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #f7b2b2 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #f7b2b2 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i {color: #fff }@media screen and (min-width:768px) {.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before {-webkit-transform: rotate(90deg);-moz-transform: rotate(90deg);-o-transform: rotate(90deg);-ms-transform: rotate(90deg);transform: rotate(90deg) }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav a {color: #f7b2b2 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a, .page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a {color: #fff }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav>li {border: 0 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active, .page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover {border-color: transparent;background-color: #c03737 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover {border-left-color: transparent }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul {border: none;-webkit-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);-moz-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);box-shadow: 0 2px 8px rgba(0, 1, 1, .05) }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul {background: #c03737 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a {color: #f7b2b2 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after {background: #ca4646 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a {color: #fff;background: #b63131 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before {color: #f7b2b2 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul {background: #ca4646;border-top: 1px solid #ce5252;border-bottom: 1px solid #ce5252 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul {background: #c73a3a;border-top-color: #c94242;border-bottom-color: #c94242 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after {background-color: #c94242 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul {background: #c94242;border-top-color: #c94242;border-bottom-color: #c94242 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after {background-color: #c94242 }}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li:hover {background: #c03737 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li i {color: #f7b2b2 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>a {border: 0 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover {background: #c03737;color: #fff }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i {color: #fff }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before {background: #68b828 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus {background: #c03737 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before {background-color: #7c38bc }.chat-open .page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i {color: #fff }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon {background-color: #c03737;border-color: #ca4646;color: #f7b2b2 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i {color: #fff }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before {display: block }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>ul {border-color: #c03737 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus {background-color: #c03737 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span {color: #f7b2b2 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover {color: #fff }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a {background-color: #c03737;border-color: #c03737 }.page-body.horizontal-menu-skin-watermelon .page-loading-overlay {background-color: #b63131 }@media screen and (max-width:768px) {.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu {background: #b63131;color: #f7b2b2 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.navbar-nav a {color: #f7b2b2;border-color: #c03737 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover, .page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active, .page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus {color: #fff }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a {color: #f7b2b2 }.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover, .page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active, .page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus {color: #fff }}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu {background: #f5c150;-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.settings-pane-open .page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #ffeec9 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i {color: #ffeec9 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i {color: #fff }@media screen and (min-width:768px) {.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before {-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);-ms-transform: rotate(0deg);transform: rotate(0deg) }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before {-webkit-transform: rotate(90deg);-moz-transform: rotate(90deg);-o-transform: rotate(90deg);-ms-transform: rotate(90deg);transform: rotate(90deg) }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav a {color: #ffeec9 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a, .page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a {color: #fff }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav>li {border: 0 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active, .page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover {border-color: transparent;background-color: #ffcf67 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover {border-left-color: transparent }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul {border: none;-webkit-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);-moz-box-shadow: 0 2px 8px rgba(0, 1, 1, .05);box-shadow: 0 2px 8px rgba(0, 1, 1, .05) }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul {background: #ffcf67 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a {color: #ffeec9 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after {background: #ffd781 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a {color: #fff;background: #f5c150 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before {color: #ffeec9 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul {background: #ffd781;border-top: 1px solid #ffdc90;border-bottom: 1px solid #ffdc90 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul {background: #ffd271;border-top-color: #ffd57b;border-bottom-color: #ffd57b }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after {background-color: #ffd57b }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul {background: #ffd57b;border-top-color: #ffd57b;border-bottom-color: #ffd57b }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after {background-color: #ffd57b }}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li:hover {background: #ffcf67 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li i {color: #ffeec9 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>a {border: 0 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover {background: #ffcf67;color: #fff }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i {color: #fff }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before {background: #68b828 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus {background: #ffcf67 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before {background-color: #7c38bc }.chat-open .page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i {color: #fff }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon {background-color: #ffcf67;border-color: #ffd781;color: #ffeec9 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i {color: #fff }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before {display: block }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>ul {border-color: #ffcf67 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus {background-color: #ffcf67 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span {color: #ffeec9 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover {color: #fff }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a {background-color: #ffcf67;border-color: #ffcf67 }.page-body.horizontal-menu-skin-lemonade .page-loading-overlay {background-color: #f5c150 }@media screen and (max-width:768px) {.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu {background: #f5c150;color: #ffeec9 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.navbar-nav a {color: #ffeec9;border-color: #ffcf67 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover, .page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active, .page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus {color: #fff }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a {color: #ffeec9 }.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover, .page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active, .page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus {color: #fff }}.page-body.user-info-navbar-skin-aero .user-info-navbar {background-color: #558c89 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li {border: 0 solid transparent }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.hover-line:before {background: #ececea }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li>a {color: #ececea;border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li>a:hover {color: #fff }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li>form {border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .btn {color: #ececea }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .btn:hover {color: #fff }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .btn:active, .page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .btn:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field {border: 1px solid #5f9a97;background: #f3f3f3 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898;opacity: 1 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn {color: #fff }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.open {border-left-color: transparent;border-right-color: transparent;z-index: 15 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.open>a {color: #fff }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu {background: #5f9a97;border: 1px solid transparent }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a {color: #ececea }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after {background: #6da5a2 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover {color: #fff }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a {color: #fff }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu>.top a {color: #ececea }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover {color: #fff }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu>.top p {color: #ececea;border-bottom: 1px solid #6da5a2 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after {background-color: #6da5a2 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu>.external a {color: #ececea;background-color: #6da5a2 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover {color: #fff }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after {background-color: #6da5a2 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after {background-color: #8dc63f }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list {max-height: 276px }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i {background: #5f9a97;color: #FFF }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line {padding-left: 45px }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i {background-color: #FFF;color: #444;-webkit-box-shadow: 0 0 0 1px #eee;-moz-box-shadow: 0 0 0 1px #eee;box-shadow: 0 0 0 1px #eee }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a {color: #ececea;border-bottom: 1px solid #6da5a2 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover {color: #fff }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last {background: #6da5a2 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after {background: #6da5a2 }.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a {border-bottom: 0 }.page-body.user-info-navbar-skin-navy .user-info-navbar {background-color: #2c3e50 }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li {border: 0 solid transparent }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.hover-line:before {background: #a7bfd6 }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li>a {color: #a7bfd6;border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li>a:hover {color: #fff }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li>form {border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .btn {color: #a7bfd6 }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .btn:hover {color: #fff }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .btn:active, .page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .btn:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field {border: 1px solid #34495e;background: #f3f3f3 }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898;opacity: 1 }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn {color: #fff }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.open {border-left-color: transparent;border-right-color: transparent;z-index: 15 }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.open>a {color: #fff }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu {background: #34495e;border: 1px solid transparent }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a {color: #a7bfd6 }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after {background: #3d566e }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover {color: #fff }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a {color: #fff }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu>.top a {color: #a7bfd6 }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover {color: #fff }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu>.top p {color: #a7bfd6;border-bottom: 1px solid #3d566e }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after {background-color: #3d566e }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu>.external a {color: #a7bfd6;background-color: #3d566e }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover {color: #fff }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after {background-color: #3d566e }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after {background-color: #8dc63f }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list {max-height: 276px }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i {background: #34495e;color: #FFF }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line {padding-left: 45px }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i {background-color: #FFF;color: #444;-webkit-box-shadow: 0 0 0 1px #eee;-moz-box-shadow: 0 0 0 1px #eee;box-shadow: 0 0 0 1px #eee }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a {color: #a7bfd6;border-bottom: 1px solid #3d566e }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover {color: #fff }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last {background: #3d566e }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after {background: #3d566e }.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a {border-bottom: 0 }.page-body.user-info-navbar-skin-facebook .user-info-navbar {background-color: #3b5998 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li {border: 0 solid transparent }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.hover-line:before {background: #8b9dc3 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li>a {color: #8b9dc3;border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li>a:hover {color: #fff }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li>form {border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .btn {color: #8b9dc3 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .btn:hover {color: #fff }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .btn:active, .page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .btn:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field {border: 1px solid #4160a0;background: #f3f3f3 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898;opacity: 1 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn {color: #fff }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.open {border-left-color: transparent;border-right-color: transparent;z-index: 15 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.open>a {color: #fff }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu {background: #4160a0;border: 1px solid transparent }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a {color: #8b9dc3 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after {background: #486bb2 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover {color: #fff }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a {color: #fff }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu>.top a {color: #8b9dc3 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover {color: #fff }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu>.top p {color: #8b9dc3;border-bottom: 1px solid #486bb2 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after {background-color: #486bb2 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu>.external a {color: #8b9dc3;background-color: #486bb2 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover {color: #fff }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after {background-color: #486bb2 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after {background-color: #8dc63f }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list {max-height: 276px }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i {background: #4160a0;color: #FFF }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line {padding-left: 45px }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i {background-color: #FFF;color: #444;-webkit-box-shadow: 0 0 0 1px #eee;-moz-box-shadow: 0 0 0 1px #eee;box-shadow: 0 0 0 1px #eee }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a {color: #8b9dc3;border-bottom: 1px solid #486bb2 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover {color: #fff }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last {background: #486bb2 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after {background: #486bb2 }.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a {border-bottom: 0 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar {background-color: #16a085 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li {border: 0 solid transparent }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.hover-line:before {background: #96ead9 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li>a {color: #96ead9;border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li>a:hover {color: #fff }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li>form {border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .btn {color: #96ead9 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .btn:hover {color: #fff }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .btn:active, .page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .btn:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field {border: 1px solid #1daf92;background: #f3f3f3 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898;opacity: 1 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn {color: #fff }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.open {border-left-color: transparent;border-right-color: transparent;z-index: 15 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.open>a {color: #fff }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu {background: #1daf92;border: 1px solid transparent }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a {color: #96ead9 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after {background: #21c5a4 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover {color: #fff }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a {color: #fff }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu>.top a {color: #96ead9 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover {color: #fff }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu>.top p {color: #96ead9;border-bottom: 1px solid #21c5a4 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after {background-color: #21c5a4 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu>.external a {color: #96ead9;background-color: #21c5a4 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover {color: #fff }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after {background-color: #21c5a4 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after {background-color: #8dc63f }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list {max-height: 276px }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i {background: #1daf92;color: #FFF }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line {padding-left: 45px }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i {background-color: #FFF;color: #444;-webkit-box-shadow: 0 0 0 1px #eee;-moz-box-shadow: 0 0 0 1px #eee;box-shadow: 0 0 0 1px #eee }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a {color: #96ead9;border-bottom: 1px solid #21c5a4 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover {color: #fff }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last {background: #21c5a4 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after {background: #21c5a4 }.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a {border-bottom: 0 }.page-body.user-info-navbar-skin-lime .user-info-navbar {background-color: #8cc657 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li {border: 0 solid transparent }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.hover-line:before {background: #fff }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li>a {color: #fff;border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li>a:hover {color: #fff }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li>form {border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .btn {color: #fff }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .btn:hover {color: #fff }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .btn:active, .page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .btn:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field {border: 1px solid #95cd62;background: #f3f3f3 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898;opacity: 1 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn {color: #fff }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.open {border-left-color: transparent;border-right-color: transparent;z-index: 15 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.open>a {color: #fff }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu {background: #95cd62;border: 1px solid transparent }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a {color: #fff }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after {background: #a2d375 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover {color: #fff }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a {color: #fff }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu>.top a {color: #fff }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover {color: #fff }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu>.top p {color: #fff;border-bottom: 1px solid #a2d375 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after {background-color: #a2d375 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu>.external a {color: #fff;background-color: #a2d375 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover {color: #fff }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after {background-color: #a2d375 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after {background-color: #8dc63f }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list {max-height: 276px }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i {background: #95cd62;color: #FFF }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line {padding-left: 45px }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i {background-color: #FFF;color: #444;-webkit-box-shadow: 0 0 0 1px #eee;-moz-box-shadow: 0 0 0 1px #eee;box-shadow: 0 0 0 1px #eee }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a {color: #fff;border-bottom: 1px solid #a2d375 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover {color: #fff }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last {background: #a2d375 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after {background: #a2d375 }.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a {border-bottom: 0 }.page-body.user-info-navbar-skin-green .user-info-navbar {background-color: #27ae60 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li {border: 0 solid transparent }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.hover-line:before {background: #a2f9c7 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li>a {color: #a2f9c7;border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li>a:hover {color: #fff }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li>form {border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .btn {color: #a2f9c7 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .btn:hover {color: #fff }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .btn:active, .page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .btn:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field {border: 1px solid #2fbd6b;background: #f3f3f3 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898;opacity: 1 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn {color: #fff }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.open {border-left-color: transparent;border-right-color: transparent;z-index: 15 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.open>a {color: #fff }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu {background: #2fbd6b;border: 1px solid transparent }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a {color: #a2f9c7 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after {background: #38ce77 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover {color: #fff }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a {color: #fff }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu>.top a {color: #a2f9c7 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover {color: #fff }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu>.top p {color: #a2f9c7;border-bottom: 1px solid #38ce77 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after {background-color: #38ce77 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu>.external a {color: #a2f9c7;background-color: #38ce77 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover {color: #fff }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after {background-color: #38ce77 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after {background-color: #8dc63f }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list {max-height: 276px }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i {background: #2fbd6b;color: #FFF }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line {padding-left: 45px }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i {background-color: #FFF;color: #444;-webkit-box-shadow: 0 0 0 1px #eee;-moz-box-shadow: 0 0 0 1px #eee;box-shadow: 0 0 0 1px #eee }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a {color: #a2f9c7;border-bottom: 1px solid #38ce77 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover {color: #fff }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last {background: #38ce77 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after {background: #38ce77 }.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a {border-bottom: 0 }.page-body.user-info-navbar-skin-purple .user-info-navbar {background-color: #795b95 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li {border: 0 solid transparent }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.hover-line:before {background: #c2afd4 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li>a {color: #c2afd4;border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li>a:hover {color: #fff }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li>form {border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .btn {color: #c2afd4 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .btn:hover {color: #fff }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .btn:active, .page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .btn:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field {border: 1px solid #81629f;background: #f3f3f3 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898;opacity: 1 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn {color: #fff }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.open {border-left-color: transparent;border-right-color: transparent;z-index: 15 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.open>a {color: #fff }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu {background: #81629f;border: 1px solid transparent }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a {color: #c2afd4 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after {background: #8e72a9 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover {color: #fff }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a {color: #fff }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu>.top a {color: #c2afd4 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover {color: #fff }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu>.top p {color: #c2afd4;border-bottom: 1px solid #8e72a9 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after {background-color: #8e72a9 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu>.external a {color: #c2afd4;background-color: #8e72a9 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover {color: #fff }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after {background-color: #8e72a9 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after {background-color: #8dc63f }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list {max-height: 276px }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i {background: #81629f;color: #FFF }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line {padding-left: 45px }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i {background-color: #FFF;color: #444;-webkit-box-shadow: 0 0 0 1px #eee;-moz-box-shadow: 0 0 0 1px #eee;box-shadow: 0 0 0 1px #eee }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a {color: #c2afd4;border-bottom: 1px solid #8e72a9 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover {color: #fff }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last {background: #8e72a9 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after {background: #8e72a9 }.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a {border-bottom: 0 }.page-body.user-info-navbar-skin-white .user-info-navbar {background-color: #fff }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li {border: 0 solid transparent }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.hover-line:before {background: #666 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li>a {color: #666;border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li>a:hover {color: #95cd62 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li>form {border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .btn {color: #666 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .btn:hover {color: #95cd62 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .btn:active, .page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .btn:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field {border: 1px solid #eee;background: #f3f3f3 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898;opacity: 1 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn {color: #95cd62 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.open {border-left-color: transparent;border-right-color: transparent;z-index: 15 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.open>a {color: #95cd62 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu {background: #eee;border: 1px solid transparent }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a {color: #666 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after {background: #fbfbfb }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover {color: #95cd62 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a {color: #95cd62 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu>.top a {color: #666 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover {color: #95cd62 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu>.top p {color: #666;border-bottom: 1px solid #fbfbfb }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after {background-color: #fbfbfb }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu>.external a {color: #666;background-color: #fbfbfb }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover {color: #95cd62 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after {background-color: #fbfbfb }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after {background-color: #8dc63f }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list {max-height: 276px }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i {background: #eee;color: #FFF }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line {padding-left: 45px }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i {background-color: #FFF;color: #444;-webkit-box-shadow: 0 0 0 1px #eee;-moz-box-shadow: 0 0 0 1px #eee;box-shadow: 0 0 0 1px #eee }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a {color: #666;border-bottom: 1px solid #fbfbfb }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover {color: #95cd62 }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last {background: #fbfbfb }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after {background: #fbfbfb }.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a {border-bottom: 0 }.page-body.user-info-navbar-skin-concrete .user-info-navbar {background-color: #a8aba2 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li {border: 0 solid transparent }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.hover-line:before {background: #666 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li>a {color: #666;border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li>a:hover {color: #a40f37 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li>form {border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .btn {color: #666 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .btn:hover {color: #a40f37 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .btn:active, .page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .btn:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field {border: 1px solid #b8bbb3;background: #f3f3f3 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898;opacity: 1 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn {color: #a40f37 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.open {border-left-color: transparent;border-right-color: transparent;z-index: 15 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.open>a {color: #a40f37 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu {background: #b8bbb3;border: 1px solid transparent }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a {color: #666 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after {background: #c5c7c0 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover {color: #a40f37 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a {color: #a40f37 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu>.top a {color: #666 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover {color: #a40f37 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu>.top p {color: #666;border-bottom: 1px solid #c5c7c0 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after {background-color: #c5c7c0 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu>.external a {color: #666;background-color: #c5c7c0 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover {color: #a40f37 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after {background-color: #c5c7c0 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after {background-color: #8dc63f }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list {max-height: 276px }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i {background: #b8bbb3;color: #FFF }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line {padding-left: 45px }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i {background-color: #FFF;color: #444;-webkit-box-shadow: 0 0 0 1px #eee;-moz-box-shadow: 0 0 0 1px #eee;box-shadow: 0 0 0 1px #eee }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a {color: #666;border-bottom: 1px solid #c5c7c0 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover {color: #a40f37 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last {background: #c5c7c0 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after {background: #c5c7c0 }.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a {border-bottom: 0 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar {background-color: #b63131 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li {border: 0 solid transparent }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.hover-line:before {background: #f7b2b2 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li>a {color: #f7b2b2;border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li>a:hover {color: #fff }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li>form {border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .btn {color: #f7b2b2 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .btn:hover {color: #fff }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .btn:active, .page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .btn:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field {border: 1px solid #c03737;background: #f3f3f3 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898;opacity: 1 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn {color: #fff }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.open {border-left-color: transparent;border-right-color: transparent;z-index: 15 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.open>a {color: #fff }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu {background: #c03737;border: 1px solid transparent }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a {color: #f7b2b2 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after {background: #ca4646 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover {color: #fff }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a {color: #fff }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu>.top a {color: #f7b2b2 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover {color: #fff }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu>.top p {color: #f7b2b2;border-bottom: 1px solid #ca4646 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after {background-color: #ca4646 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu>.external a {color: #f7b2b2;background-color: #ca4646 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover {color: #fff }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after {background-color: #ca4646 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after {background-color: #8dc63f }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list {max-height: 276px }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i {background: #c03737;color: #FFF }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line {padding-left: 45px }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i {background-color: #FFF;color: #444;-webkit-box-shadow: 0 0 0 1px #eee;-moz-box-shadow: 0 0 0 1px #eee;box-shadow: 0 0 0 1px #eee }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a {color: #f7b2b2;border-bottom: 1px solid #ca4646 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover {color: #fff }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last {background: #ca4646 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after {background: #ca4646 }.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a {border-bottom: 0 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar {background-color: #f5c150 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li {border: 0 solid transparent }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.hover-line:before {background: #ffeec9 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li>a {color: #ffeec9;border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li>a:hover {color: #fff }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li>form {border-bottom: 1px solid transparent }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .btn {color: #ffeec9 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .btn:hover {color: #fff }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .btn:active, .page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .btn:focus {-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field {border: 1px solid #ffcf67;background: #f3f3f3 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898;opacity: 1 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder {color: #979898 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder {color: #979898 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn {color: #fff }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.open {border-left-color: transparent;border-right-color: transparent;z-index: 15 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.open>a {color: #fff }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu {background: #ffcf67;border: 1px solid transparent }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a {color: #ffeec9 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after {background: #ffd781 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover {color: #fff }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a {color: #fff }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu>.top a {color: #ffeec9 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover {color: #fff }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu>.top p {color: #ffeec9;border-bottom: 1px solid #ffd781 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after {background-color: #ffd781 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu>.external a {color: #ffeec9;background-color: #ffd781 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover {color: #fff }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after {background-color: #ffd781 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after {background-color: #8dc63f }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list {max-height: 276px }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i {background: #ffcf67;color: #FFF }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line {padding-left: 45px }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i {background-color: #FFF;color: #444;-webkit-box-shadow: 0 0 0 1px #eee;-moz-box-shadow: 0 0 0 1px #eee;box-shadow: 0 0 0 1px #eee }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a {color: #ffeec9;border-bottom: 1px solid #ffd781 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover {color: #fff }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last {background: #ffd781 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after {background: #ffd781 }.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a {border-bottom: 0 } diff --git a/web/static/index/css/xenon.css b/web/static/index/css/xenon.css new file mode 100644 index 0000000..3ae9a50 --- /dev/null +++ b/web/static/index/css/xenon.css @@ -0,0 +1,18 @@ +.ps-container .ps-scrollbar-x-rail{position:absolute;bottom:3px;height:5px;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transition:background-color .2s linear,opacity .2s linear;-moz-transition:background-color .2s linear,opacity .2s linear;-o-transition:background-color .2s linear,opacity .2s linear;transition:background-color .2s linear,opacity .2s linear}.ps-container:hover .ps-scrollbar-x-rail,.ps-container.hover .ps-scrollbar-x-rail{zoom:1;-webkit-opacity:.6;-moz-opacity:.6;opacity:.6;-ms-filter:alpha(Opacity=60);filter:alpha(opacity=60)}.ps-container .ps-scrollbar-x-rail:hover,.ps-container .ps-scrollbar-x-rail.hover{background-color:rgba(255,255,255,.5)}.ps-container .ps-scrollbar-x-rail.in-scrolling{background-color:rgba(255,255,255,.9)}.ps-container .ps-scrollbar-y-rail{position:absolute;right:2px;width:5px;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transition:background-color .2s linear,opacity .2s linear;-moz-transition:background-color .2s linear,opacity .2s linear;-o-transition:background-color .2s linear,opacity .2s linear;transition:background-color .2s linear,opacity .2s linear}.ps-container:hover .ps-scrollbar-y-rail,.ps-container.hover .ps-scrollbar-y-rail{zoom:1;-webkit-opacity:.6;-moz-opacity:.6;opacity:.6;-ms-filter:alpha(Opacity=60);filter:alpha(opacity=60)}.ps-container .ps-scrollbar-y-rail:hover,.ps-container .ps-scrollbar-y-rail.hover{background-color:rgba(255,255,255,.5)}.ps-container .ps-scrollbar-y-rail.in-scrolling{background-color:#eee;zoom:1;-webkit-opacity:.9;-moz-opacity:.9;opacity:.9;-ms-filter:alpha(Opacity=90);filter:alpha(opacity=90)}.ps-container .ps-scrollbar-x{position:absolute;bottom:0;height:5px;background-color:#aaa;-o-transition:background-color .2s linear;-webkit-transition:background-color .2s linear;-moz-transition:background-color .2s linear;transition:background-color .2s linear}.ps-container.ie6 .ps-scrollbar-x{font-size:0}.ps-container .ps-scrollbar-x-rail:hover .ps-scrollbar-x,.ps-container .ps-scrollbar-x-rail.hover .ps-scrollbar-x{background-color:#999}.ps-container .ps-scrollbar-y{position:absolute;right:0;width:5px;background-color:#aaa;-webkit-transition:background-color .2s linear;-moz-transition:background-color .2s linear;-o-transition:background-color .2s linear;transition:background-color .2s linear}.ps-container.ie6 .ps-scrollbar-y{font-size:0}.ps-container .ps-scrollbar-y-rail:hover .ps-scrollbar-y,.ps-container .ps-scrollbar-y-rail.hover .ps-scrollbar-y{background-color:#FAFAFA}.ps-container.ie .ps-scrollbar-x,.ps-container.ie .ps-scrollbar-y{visibility:hidden}.ps-container.ie:hover .ps-scrollbar-x,.ps-container.ie:hover .ps-scrollbar-y,.ps-container.ie.hover .ps-scrollbar-x,.ps-container.ie.hover .ps-scrollbar-y{visibility:visible}.cbp_tmtimeline{margin:30px 0 0 0;padding:0;list-style:none;position:relative}.cbp_tmtimeline:before{content:'';position:absolute;top:0;bottom:0;width:10px;background:#afdcf8;left:20%;margin-left:-10px}.cbp_tmtimeline>li{position:relative}.cbp_tmtimeline>li .cbp_tmtime{display:block;width:25%;padding-right:100px;position:absolute}.cbp_tmtimeline>li .cbp_tmtime span{display:block;text-align:right}.cbp_tmtimeline>li .cbp_tmtime span:first-child{font-size:.9em;color:#bdd0db}.cbp_tmtimeline>li .cbp_tmtime span:last-child{font-size:2.9em;color:#3594cb}.cbp_tmtimeline>li:nth-child(odd) .cbp_tmtime span:last-child{color:#6cbfee}.cbp_tmtimeline>li .cbp_tmlabel{margin:0 0 15px 25%;background:#3594cb;color:#fff;padding:2em;font-size:1.2em;font-weight:300;line-height:1.4;position:relative;border-radius:5px}.cbp_tmtimeline>li:nth-child(odd) .cbp_tmlabel{background:#6cbfee}.cbp_tmtimeline>li .cbp_tmlabel h2{margin-top:0;padding:0 0 10px 0;border-bottom:1px solid rgba(255,255,255,.4)}.cbp_tmtimeline>li .cbp_tmlabel:after{right:100%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#3594cb;border-width:10px;top:10px}.cbp_tmtimeline>li:nth-child(odd) .cbp_tmlabel:after{border-right-color:#6cbfee}.cbp_tmtimeline>li .cbp_tmicon{width:40px;height:40px;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;font-size:1.4em;line-height:40px;-webkit-font-smoothing:antialiased;position:absolute;color:#fff;background:#46a4da;border-radius:50%;box-shadow:0 0 0 8px #afdcf8;text-align:center;left:20%;top:0;margin:0 0 0 -25px}@media screen and (max-width:65.375em){.cbp_tmtimeline>li .cbp_tmtime span:last-child{font-size:1.5em}}@media screen and (max-width:47.2em){.cbp_tmtimeline:before{display:none}.cbp_tmtimeline>li .cbp_tmtime{width:100%;position:relative;padding:0 0 20px 0}.cbp_tmtimeline>li .cbp_tmtime span{text-align:left}.cbp_tmtimeline>li .cbp_tmlabel{margin:0 0 30px 0;padding:1em;font-weight:400;font-size:95%}.cbp_tmtimeline>li .cbp_tmlabel:after{right:auto;left:20px;border-right-color:transparent;border-bottom-color:#3594cb;top:-20px}.cbp_tmtimeline>li:nth-child(odd) .cbp_tmlabel:after{border-right-color:transparent;border-bottom-color:#6cbfee}.cbp_tmtimeline>li .cbp_tmicon{position:relative;float:right;left:auto;margin:-55px 5px 0 0}}.dropdown-menu>li.checkbox-row{padding:5px 20px}.dropdown-menu li.checkbox-row{display:block;clear:both;font-weight:400;line-height:18px;color:#333;white-space:nowrap}.dropdown-menu li.checkbox-row label{font-weight:400}.dropdown-menu li.checkbox-row:hover,.dropdown-menu li.checkbox-row input:hover,.dropdown-menu li.checkbox-row label:hover{cursor:pointer}.no-touch .dropdown-menu>.checkbox-row:hover,.no-touch .dropdown-menu>.checkbox-row:active{text-decoration:none;color:#262626;background-color:#f5f5f5}.btn-toolbar{margin-bottom:5px}.btn-toolbar .btn-default{background-color:#68b828;color:#fff;border:1px solid transparent}.btn-toolbar .btn-default.dropdown-toggle{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-color:transparent}.btn-toolbar .btn-primary{background-color:#508e1f}.btn-toolbar .btn-group.open .dropdown-toggle{background-color:#508e1f;color:#fff}.btn-toolbar .dropdown-menu{margin-top:0}.btn-toolbar .dropdown-menu .checkbox-row{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-toolbar .dropdown-menu .checkbox-row .cbr-replaced{margin:0;margin-right:5px}.btn-toolbar .dropdown-menu .checkbox-row label{color:#979898;font-size:12px;margin:0}.lt-ie8 .btn-toolbar{display:none}.table-responsive{border-radius:0;border:1px solid #eee;margin-bottom:18px}.table-responsive>.table{margin-bottom:0}.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}.table-responsive[data-pattern=priority-columns]{position:relative;width:100%;margin-bottom:18px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;border-radius:0;border:1px solid #eee;-webkit-overflow-scrolling:touch}.table-responsive[data-pattern=priority-columns]>.table{margin-bottom:0}.table-responsive[data-pattern=priority-columns]>.table>thead>tr>th,.table-responsive[data-pattern=priority-columns]>.table>tbody>tr>th,.table-responsive[data-pattern=priority-columns]>.table>tfoot>tr>th,.table-responsive[data-pattern=priority-columns]>.table>thead>tr>td,.table-responsive[data-pattern=priority-columns]>.table>tbody>tr>td,.table-responsive[data-pattern=priority-columns]>.table>tfoot>tr>td{white-space:nowrap}.table-responsive[data-pattern=priority-columns]>.table-bordered{border:0}.table-responsive[data-pattern=priority-columns]>.table-bordered>thead>tr>th:first-child,.table-responsive[data-pattern=priority-columns]>.table-bordered>tbody>tr>th:first-child,.table-responsive[data-pattern=priority-columns]>.table-bordered>tfoot>tr>th:first-child,.table-responsive[data-pattern=priority-columns]>.table-bordered>thead>tr>td:first-child,.table-responsive[data-pattern=priority-columns]>.table-bordered>tbody>tr>td:first-child,.table-responsive[data-pattern=priority-columns]>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive[data-pattern=priority-columns]>.table-bordered>thead>tr>th:last-child,.table-responsive[data-pattern=priority-columns]>.table-bordered>tbody>tr>th:last-child,.table-responsive[data-pattern=priority-columns]>.table-bordered>tfoot>tr>th:last-child,.table-responsive[data-pattern=priority-columns]>.table-bordered>thead>tr>td:last-child,.table-responsive[data-pattern=priority-columns]>.table-bordered>tbody>tr>td:last-child,.table-responsive[data-pattern=priority-columns]>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive[data-pattern=priority-columns]>.table-bordered>tbody>tr:last-child>th,.table-responsive[data-pattern=priority-columns]>.table-bordered>tfoot>tr:last-child>th,.table-responsive[data-pattern=priority-columns]>.table-bordered>tbody>tr:last-child>td,.table-responsive[data-pattern=priority-columns]>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority],.mq.js.lt-ie10 .sticky-table-header th[data-priority],.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority],.mq.js.lt-ie10 .sticky-table-header td[data-priority]{display:none}.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="1"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="1"],.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="1"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="1"]{display:inline}.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="1"],.mq.js.lt-ie10 .sticky-table-header th[data-priority="1"],.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="1"],.mq.js.lt-ie10 .sticky-table-header td[data-priority="1"]{display:table-cell}@media screen and (min-width:480px){.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="2"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="2"],.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="2"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="2"]{display:inline}.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="2"],.mq.js.lt-ie10 .sticky-table-header th[data-priority="2"],.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="2"],.mq.js.lt-ie10 .sticky-table-header td[data-priority="2"]{display:table-cell}}@media screen and (min-width:640px){.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="3"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="3"],.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="3"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="3"]{display:inline}.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="3"],.mq.js.lt-ie10 .sticky-table-header th[data-priority="3"],.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="3"],.mq.js.lt-ie10 .sticky-table-header td[data-priority="3"]{display:table-cell}}@media screen and (min-width:800px){.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="4"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="4"],.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="4"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="4"]{display:inline}.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="4"],.mq.js.lt-ie10 .sticky-table-header th[data-priority="4"],.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="4"],.mq.js.lt-ie10 .sticky-table-header td[data-priority="4"]{display:table-cell}}@media screen and (min-width:960px){.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="5"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="5"],.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="5"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="5"]{display:inline}.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="5"],.mq.js.lt-ie10 .sticky-table-header th[data-priority="5"],.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="5"],.mq.js.lt-ie10 .sticky-table-header td[data-priority="5"]{display:table-cell}}@media screen and (min-width:1120px){.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="6"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="6"],.lt-ie9.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="6"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="6"]{display:inline}.mq.js .table-responsive[data-pattern=priority-columns] th[data-priority="6"],.mq.js.lt-ie10 .sticky-table-header th[data-priority="6"],.mq.js .table-responsive[data-pattern=priority-columns] td[data-priority="6"],.mq.js.lt-ie10 .sticky-table-header td[data-priority="6"]{display:table-cell}}table.table-small-font{font-size:12px;-webkit-text-size-adjust:none;line-height:1.5em}table.focus-on tbody tr:hover{cursor:pointer}table.focus-on tbody tr.unfocused th,table.focus-on tbody tr.unfocused td{color:#777;color:rgba(0,0,0,.4)}table.focus-on tbody tr.focused th,table.focus-on tbody tr.focused td{background-color:#68b828;color:#fff;border-color:#63b026}table th.col-hide,table td.col-hide{display:none}table th.col-show,table td.col-show{display:inline}.lt-ie9 table th.col-show,.lt-ie9 table td.col-show{display:table-cell}.lt-ie9 table.display-all th,.lt-ie9 table.display-all td{display:inline!important}table.display-all th,table.display-all td{display:table-cell!important}.sticky-table-header{background-color:#fff;border:none;border-radius:0;border-top:1px solid #eee;border-bottom:1px solid #eee;position:absolute;top:0;visibility:hidden;z-index:990;overflow:hidden;min-width:100%}.sticky-table-header.fixed-solution{min-width:0;position:fixed}.lt-ie10 .sticky-table-header.fixed-solution{border-left:1px solid #eee;border-right:1px solid #eee;box-sizing:content-box;border-bottom:none}.sticky-table-header.border-radius-fix{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.sticky-table-header>.table{margin-bottom:0}.sticky-table-header>.table>thead>tr>th,.sticky-table-header>.table>tbody>tr>th,.sticky-table-header>.table>tfoot>tr>th,.sticky-table-header>.table>thead>tr>td,.sticky-table-header>.table>tbody>tr>td,.sticky-table-header>.table>tfoot>tr>td{white-space:nowrap}.sticky-table-header>.table-bordered{border:0}.sticky-table-header>.table-bordered>thead>tr>th:first-child,.sticky-table-header>.table-bordered>tbody>tr>th:first-child,.sticky-table-header>.table-bordered>tfoot>tr>th:first-child,.sticky-table-header>.table-bordered>thead>tr>td:first-child,.sticky-table-header>.table-bordered>tbody>tr>td:first-child,.sticky-table-header>.table-bordered>tfoot>tr>td:first-child{border-left:0}.sticky-table-header>.table-bordered>thead>tr>th:last-child,.sticky-table-header>.table-bordered>tbody>tr>th:last-child,.sticky-table-header>.table-bordered>tfoot>tr>th:last-child,.sticky-table-header>.table-bordered>thead>tr>td:last-child,.sticky-table-header>.table-bordered>tbody>tr>td:last-child,.sticky-table-header>.table-bordered>tfoot>tr>td:last-child{border-right:0}.sticky-table-header>.table-bordered>tbody>tr:last-child>th,.sticky-table-header>.table-bordered>tfoot>tr:last-child>th,.sticky-table-header>.table-bordered>tbody>tr:last-child>td,.sticky-table-header>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.transall,.sidebar-menu .main-menu a,.navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane],.navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i,footer.main-footer .go-up a,.user-info-navbar .user-info-menu>li>a,.footer-sticked-chat .chat-conversations>li .chat-user,.footer-sticked-chat .chat-conversations>li.open .conversation-window,.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li a span,.breadcrumb.auto-hidden li a,.icon-collection .fontawesome-icon-list .fa-hover .icon-str>i,.icon-collection .fontawesome-icon-list .fa-hover .icon-str>span,.form-wizard>.tabs>li a,.form-wizard>.tabs>li a:after,.droppable-area.dz-drag-hover,.gallery-env .album-images .album-image .image-checkbox .cbr-replaced,.login-page .login-form .form-group .control-label,.login-page .login-form .form-group .form-control,.lockscreen-page .lockcreen-form .form-group .input-group .form-control,.xe-widget.xe-single-news .xe-image .xe-gradient,.xe-widget.xe-weather .xe-current-day .xe-forecast .xe-forecast-entry time,.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-temp,.sidebar-user-info .user-links li a{-webkit-transition:all 220ms ease-in-out;-moz-transition:all 220ms ease-in-out;-o-transition:all 220ms ease-in-out;transition:all 220ms ease-in-out}.clearfix:before,.clearfix:after,.page-container .main-content .page-title:before,.page-container .main-content .page-title:after,.sidebar-menu .logo-env:before,.sidebar-menu .logo-env:after,.navbar.horizontal-menu .navbar-inner:before,.navbar.horizontal-menu .navbar-inner:after,footer.main-footer .footer-inner:before,footer.main-footer .footer-inner:after,.user-info-navbar .user-info-menu>li .dropdown-menu>.external a:before,.user-info-navbar .user-info-menu>li .dropdown-menu>.external a:after,#chat .chat-conversation .conversation-body>li:before,#chat .chat-conversation .conversation-body>li:after,.panel .panel-heading:before,.panel .panel-heading:after,.breadcrumb.auto-hidden:before,.breadcrumb.auto-hidden:after,.dataTables_wrapper .dataTables_length:before,.dataTables_wrapper .dataTables_length:after,.dataTables_wrapper .dataTables_filter:before,.dataTables_wrapper .dataTables_filter:after,.dataTables_wrapper .DTTT_container:before,.dataTables_wrapper .DTTT_container:after,.skin-color-palette:before,.skin-color-palette:after,.icon-collection .fontawesome-icon-list:before,.icon-collection .fontawesome-icon-list:after,.icon-collection .fontawesome-icon-list .fa-hover .icon-str:before,.icon-collection .fontawesome-icon-list .fa-hover .icon-str:after,.highlights li:before,.highlights li:after,.icheck-skins:before,.icheck-skins:after,.form-wizard:before,.form-wizard:after,.mailbox-env:before,.mailbox-env:after,.mailbox-env .mail-env .mail-table .mail-pagination .next-prev:before,.mailbox-env .mail-env .mail-table .mail-pagination .next-prev:after,.mailbox-env .mail-single .mail-single-header:before,.mailbox-env .mail-single .mail-single-header:after,.mailbox-env .mail-single .mail-single-info:before,.mailbox-env .mail-single .mail-single-info:after,.invoice-env:before,.invoice-env:after,.invoice-env .invoice-header:before,.invoice-env .invoice-header:after,.invoice-env .invoice-details:before,.invoice-env .invoice-details:after,.invoice-env .invoice-details .invoice-client-info:before,.invoice-env .invoice-details .invoice-client-info:after,.invoice-env .invoice-details .invoice-payment-info:before,.invoice-env .invoice-details .invoice-payment-info:after,.invoice-env .invoice-totals:before,.invoice-env .invoice-totals:after,.gallery-env:before,.gallery-env:after,.gallery-env .album-header:before,.gallery-env .album-header:after,.gallery-env .album-images .album-image:before,.gallery-env .album-images .album-image:after,.calendar-env:before,.calendar-env:after,.profile-env:before,.profile-env:after,.profile-env .user-timeline-stories .timeline-story header:before,.profile-env .user-timeline-stories .timeline-story header:after,.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info:before,.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info:after,.profile-env .user-timeline-stories .timeline-story .story-album:before,.profile-env .user-timeline-stories .timeline-story .story-album:after,.timeline-centered:before,.timeline-centered:after,.timeline-centered .timeline-entry .timeline-entry-inner:before,.timeline-centered .timeline-entry .timeline-entry-inner:after,.notes-env .notes-list:before,.notes-env .notes-list:after,.lockscreen-page .lockcreen-form:before,.lockscreen-page .lockcreen-form:after,.xe-widget.xe-weather:before,.xe-widget.xe-weather:after,.xe-widget.xe-weather .xe-current-day .xe-now:before,.xe-widget.xe-weather .xe-current-day .xe-now:after,.xe-widget.xe-map-stats:before,.xe-widget.xe-map-stats:after,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:before,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:after{content:" ";display:table}.clearfix:after,.page-container .main-content .page-title:after,.sidebar-menu .logo-env:after,.navbar.horizontal-menu .navbar-inner:after,footer.main-footer .footer-inner:after,.user-info-navbar .user-info-menu>li .dropdown-menu>.external a:after,#chat .chat-conversation .conversation-body>li:after,.panel .panel-heading:after,.breadcrumb.auto-hidden:after,.dataTables_wrapper .dataTables_length:after,.dataTables_wrapper .dataTables_filter:after,.dataTables_wrapper .DTTT_container:after,.skin-color-palette:after,.icon-collection .fontawesome-icon-list:after,.icon-collection .fontawesome-icon-list .fa-hover .icon-str:after,.highlights li:after,.icheck-skins:after,.form-wizard:after,.mailbox-env:after,.mailbox-env .mail-env .mail-table .mail-pagination .next-prev:after,.mailbox-env .mail-single .mail-single-header:after,.mailbox-env .mail-single .mail-single-info:after,.invoice-env:after,.invoice-env .invoice-header:after,.invoice-env .invoice-details:after,.invoice-env .invoice-details .invoice-client-info:after,.invoice-env .invoice-details .invoice-payment-info:after,.invoice-env .invoice-totals:after,.gallery-env:after,.gallery-env .album-header:after,.gallery-env .album-images .album-image:after,.calendar-env:after,.profile-env:after,.profile-env .user-timeline-stories .timeline-story header:after,.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info:after,.profile-env .user-timeline-stories .timeline-story .story-album:after,.timeline-centered:after,.timeline-centered .timeline-entry .timeline-entry-inner:after,.notes-env .notes-list:after,.lockscreen-page .lockcreen-form:after,.xe-widget.xe-weather:after,.xe-widget.xe-weather .xe-current-day .xe-now:after,.xe-widget.xe-map-stats:after,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:after{clear:both}body{background-color:#eee}a{outline:0!important}p{color:#979898}html,body{height:100%;margin:0;padding:0;border:none}.boxed-container{background:#ccc}.boxed-container #chat .chat-inner{position:absolute!important}.page-container{display:table;width:100%;height:100%;vertical-align:top;border-collapse:collapse;border-spacing:0;table-layout:fixed}.boxed-container .page-container{max-width:1140px;margin:20px auto}@media screen and (max-width:768px){.boxed-container .page-container{margin:0}}.page-container.container{max-width:1140px;table-layout:auto}.page-container .main-content{display:table-cell;position:relative;z-index:1;padding:30px;padding-bottom:0;vertical-align:top;word-break:break-word;width:100%;-webkit-transition:opacity 100ms ease-in-out;-moz-transition:opacity 100ms ease-in-out;-o-transition:opacity 100ms ease-in-out;transition:opacity 100ms ease-in-out}.page-container .main-content.is-loading{zoom:1;-webkit-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:alpha(Opacity=50);filter:alpha(opacity=50);-webkit-transition:opacity 300ms ease-in-out;-moz-transition:opacity 300ms ease-in-out;-o-transition:opacity 300ms ease-in-out;transition:opacity 300ms ease-in-out}.boxed-container .page-container .main-content{background-color:#eee}.page-container .main-content:hover{z-index:15}.page-container .main-content .page-title{background:#f8f8f8;margin:-30px;margin-bottom:30px;padding:20px 0;-webkit-box-shadow:0 1px 0 rgba(0,1,1,.08),inset 0 1px 0 #ededed;-moz-box-shadow:0 1px 0 rgba(0,1,1,.08),inset 0 1px 0 #ededed;box-shadow:0 1px 0 rgba(0,1,1,.08),inset 0 1px 0 #ededed}@media screen and (max-width:768px){.page-container .main-content .page-title{padding:15px 0}}.page-container .main-content .page-title.full-width .title-env{width:100%;padding-right:30px}.page-container .main-content .page-title .title-env,.page-container .main-content .page-title .breadcrumb-env{display:block}.page-container .main-content .page-title .title-env{float:left;padding-left:30px}.page-container .main-content .page-title .title-env .title{margin:0;font-size:27px}@media screen and (max-width:768px){.page-container .main-content .page-title .title-env .title{font-size:23px}.page-container .main-content .page-title .title-env .title+p{font-size:12px}}@media screen and (max-width:480px){.page-container .main-content .page-title .title-env .title{font-size:19px}}.page-container .main-content .page-title .title-env .title+p{margin:0;margin-top:5px;color:#979898}.page-container .main-content .page-title .breadcrumb-env{float:right;padding-right:30px}@media screen and (max-width:480px){.page-container .main-content .page-title .breadcrumb-env{clear:both;float:none;padding:0 10px}}.page-container .main-content .page-title .breadcrumb-env .breadcrumb{margin-bottom:0;margin-top:8px}@media screen and (max-width:768px){.page-container .main-content .page-title .breadcrumb-env .breadcrumb{margin-top:4px}.page-container .main-content .page-title .breadcrumb-env .breadcrumb li a{font-size:12px}}.sidebar-menu{display:table-cell;position:relative;width:340px;background:#2c2e2f;z-index:1}.sidebar-menu .logo-env{padding:30px 45px;border-bottom:1px solid #313437}.sidebar-menu .logo-env .logo{float:left}.sidebar-menu .logo-env .logo .logo-collapsed{display:none}.sidebar-menu .logo-env .settings-icon{float:right;position:relative;top:1px}.sidebar-menu .logo-env .settings-icon a{color:#979898;line-height:1}.sidebar-menu .logo-env .settings-icon a i{line-height:1;font-size:18px}.sidebar-menu .logo-env .settings-icon a:hover{color:#fff}.sidebar-menu .main-menu{padding-left:40px;padding-right:40px;margin-top:20px;margin-bottom:20px;list-style:none}@media screen and (max-width:768px){.sidebar-menu .main-menu{margin-top:10px;margin-bottom:10px}}.sidebar-menu .main-menu a{color:#979898;text-decoration:none;display:block;padding:13px 5px;border-bottom:1px solid #313437}.sidebar-menu .main-menu a>i{display:inline-block;margin-right:10px}.sidebar-menu .main-menu a>i+span{padding-right:10px}.sidebar-menu .main-menu a>span{display:inline-block}.sidebar-menu .main-menu a>.label{margin-top:1px}.sidebar-menu .main-menu a>.badge{font-size:75%;line-height:1.2}.sidebar-menu .main-menu a:hover{color:#fff}.sidebar-menu .main-menu li.active>a{color:#fff}.sidebar-menu .main-menu li.has-sub>a:before{position:relative;display:inline-block;font-family:FontAwesome;content:'\f107';float:right;color:#6d747a;margin-left:10px;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:all 150ms ease-in-out;-moz-transition:all 150ms ease-in-out;-o-transition:all 150ms ease-in-out;transition:all 150ms ease-in-out}.sidebar-menu .main-menu li.has-sub.opened>a:before,.sidebar-menu .main-menu li.has-sub.expanded>a:before{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.sidebar-menu .main-menu>li.opened>ul{display:block}.sidebar-menu .main-menu>li.opened .opened>ul{display:block}.sidebar-menu .main-menu ul{display:none;margin:0;padding:0;overflow:hidden;list-style:none}.sidebar-menu .main-menu ul li{position:relative}@media screen and (min-width:768px){.sidebar-menu .main-menu ul li.is-hidden{left:-20px;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0)}}.sidebar-menu .main-menu ul li.is-shown{left:0;zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);-webkit-transition:all 200ms ease-in-out;-moz-transition:all 200ms ease-in-out;-o-transition:all 200ms ease-in-out;transition:all 200ms ease-in-out}.sidebar-menu .main-menu ul li.is-shown+.is-shown{-webkit-transition-delay:80ms;-moz-transition-delay:80ms;-o-transition-delay:80ms;transition-delay:80ms}.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown{-webkit-transition-delay:120ms;-moz-transition-delay:120ms;-o-transition-delay:120ms;transition-delay:120ms}.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:160ms;-moz-transition-delay:160ms;-o-transition-delay:160ms;transition-delay:160ms}.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:200ms;-moz-transition-delay:200ms;-o-transition-delay:200ms;transition-delay:200ms}.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:240ms;-moz-transition-delay:240ms;-o-transition-delay:240ms;transition-delay:240ms}.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:280ms;-moz-transition-delay:280ms;-o-transition-delay:280ms;transition-delay:280ms}.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:320ms;-moz-transition-delay:320ms;-o-transition-delay:320ms;transition-delay:320ms}.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:360ms;-moz-transition-delay:360ms;-o-transition-delay:360ms;transition-delay:360ms}.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:400ms;-moz-transition-delay:400ms;-o-transition-delay:400ms;transition-delay:400ms}.sidebar-menu .main-menu ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:440ms;-moz-transition-delay:440ms;-o-transition-delay:440ms;transition-delay:440ms}.sidebar-menu .main-menu ul li.hidden-item{visibility:hidden;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transition:all 250ms ease-in-out;-moz-transition:all 250ms ease-in-out;-o-transition:all 250ms ease-in-out;transition:all 250ms ease-in-out}.sidebar-menu .main-menu ul li a{padding-left:35px}.sidebar-menu .main-menu ul li ul li a{padding-left:60px}.sidebar-menu .main-menu ul li ul li ul li a{padding-left:85px}.sidebar-menu .main-menu ul li ul li ul li ul li a{padding-left:110px}.sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x,.sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y{background-color:rgba(255,255,255,.6)}.sidebar-menu.fixed{height:100%}.sidebar-menu.fixed .sidebar-menu-inner{position:fixed;left:0;top:0;bottom:0;width:inherit;overflow:hidden}.page-body.right-sidebar .sidebar-menu.fixed .sidebar-menu-inner{left:auto;right:0}@media screen and (min-width:768px){.sidebar-menu.collapsed{width:80px;z-index:10;overflow:visible}.sidebar-menu.collapsed .hidden-collapsed{display:none!important}.sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar]{color:#606161}.sidebar-menu.collapsed+.main-content .main-footer{left:80px}.sidebar-menu.collapsed .sidebar-menu-inner{overflow:visible;position:relative}.sidebar-menu.collapsed .logo-env{padding:18px 0}.sidebar-menu.collapsed .logo-env .logo-collapsed{display:block;text-align:center}.sidebar-menu.collapsed .logo-env .logo-collapsed img{display:inline-block}.sidebar-menu.collapsed .logo-env .logo-expanded,.sidebar-menu.collapsed .logo-env .settings-icon{display:none}.sidebar-menu.collapsed .logo-env .logo{float:none}.sidebar-menu.collapsed .main-menu{padding-left:0;padding-right:0}.sidebar-menu.collapsed .main-menu>li{text-align:center;position:relative}.sidebar-menu.collapsed .main-menu>li.active,.sidebar-menu.collapsed .main-menu>li li.active{background-color:#252627}.sidebar-menu.collapsed .main-menu>li>a>i{margin-right:0;font-size:16px}.sidebar-menu.collapsed .main-menu>li>a>span{display:none}.sidebar-menu.collapsed .main-menu>li>a>span.label{display:block;position:absolute;right:0;top:0}.sidebar-menu.collapsed .main-menu>li.has-sub>a:before{display:none}.sidebar-menu.collapsed .main-menu>li.opened>ul{display:none}.sidebar-menu.collapsed .main-menu>li>ul{position:absolute;background:#2c2e2f;width:250px;top:0;left:100%;text-align:left}.page-body.right-sidebar .sidebar-menu.collapsed .main-menu>li>ul{left:auto;right:100%}.sidebar-menu.collapsed .main-menu>li>ul>li>a{padding-left:20px}.sidebar-menu.collapsed .main-menu>li>ul>li>ul>li>a{padding-left:35px}.sidebar-menu.collapsed .main-menu>li>ul>li>ul>li>ul>li>a{padding-left:50px}.sidebar-menu.collapsed .main-menu>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:65px}.sidebar-menu.collapsed .main-menu>li>ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:80px}.sidebar-menu.collapsed .main-menu>li>ul li.has-sub>a:before{margin-right:10px}.sidebar-menu.collapsed .main-menu>li:hover>ul{display:block}}.page-body.right-sidebar .page-container{direction:rtl}.page-body.right-sidebar .page-container>*{direction:ltr}.navbar.horizontal-menu{position:relative;height:85px;background:#fff;margin:0;padding:0;z-index:101;min-height:0;-webkit-box-shadow:0 0 1px rgba(0,0,0,.15);-moz-box-shadow:0 0 1px rgba(0,0,0,.15);box-shadow:0 0 1px rgba(0,0,0,.15)}.navbar.horizontal-menu.navbar-fixed-top{position:fixed;left:0;right:0;top:0}.navbar.horizontal-menu.navbar-fixed-top+.page-container{margin-top:85px}.navbar.horizontal-menu.navbar-fixed-top+.page-container>.sidebar-menu.fixed .sidebar-menu-inner{top:85px}.settings-pane-open .navbar.horizontal-menu.navbar-fixed-top{position:relative}.settings-pane-open .navbar.horizontal-menu.navbar-fixed-top+.page-container{margin-top:0}.settings-pane-open .navbar.horizontal-menu.navbar-fixed-top+.page-container>.sidebar-menu.fixed .sidebar-menu-inner{top:0}.settings-pane-open .navbar.horizontal-menu.navbar-minimal+.page-container{margin-top:0!important}.navbar.horizontal-menu+.page-container>.sidebar-menu.fixed .sidebar-menu-inner{top:85px}.navbar.horizontal-menu .navbar-inner .navbar-brand{padding:0 30px;margin:0;float:left;height:85px;display:table}.navbar.horizontal-menu .navbar-inner .navbar-brand:hover a[data-toggle=settings-pane]{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.settings-pane-open .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.settings-pane-open .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#2c2e2f}.navbar.horizontal-menu .navbar-inner .navbar-brand a{display:table-cell;vertical-align:middle}.navbar.horizontal-menu .navbar-inner .navbar-brand a.logo img{margin:0}.navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]{padding-left:10px;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0)}.navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{display:block;line-height:1;font-size:12px;color:#979898;margin-top:1px}.navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i{color:#2c2e2f}@media screen and (min-width:768px){.navbar.horizontal-menu .navbar-inner .navbar-nav{list-style:none;padding:0;margin:0}.navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.navbar.horizontal-menu .navbar-inner .navbar-nav a{position:relative;display:inline-block;line-height:1;color:#7d7f7f;z-index:1}.navbar.horizontal-menu .navbar-inner .navbar-nav a>i{display:inline-block;margin-right:5px}.navbar.horizontal-menu .navbar-inner .navbar-nav a>.label.pull-right{margin-top:0}.navbar.horizontal-menu .navbar-inner .navbar-nav a>.title{display:inline-block}.navbar.horizontal-menu .navbar-inner .navbar-nav a>.title+.badge{margin-left:7px}.navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a,.navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a{color:#313232}.navbar.horizontal-menu .navbar-inner .navbar-nav>li{position:relative;z-index:1;line-height:85px;border:1px solid transparent;border-top:0;border-bottom:0}.navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover{z-index:2}.navbar.horizontal-menu .navbar-inner .navbar-nav>li.active,.navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover{border-color:#f3f3f3;background-color:#fafafa}.navbar.horizontal-menu .navbar-inner .navbar-nav>li.active{margin-left:-1px}.navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover{border-left-color:transparent}.navbar.horizontal-menu .navbar-inner .navbar-nav>li>a{padding:0 15px;line-height:85px}.navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul{position:absolute;min-width:270px;border:1px solid #eee;visibility:hidden;display:block;left:-1px;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box;-webkit-box-shadow:0 2px 8px rgba(0,1,1,.05);-moz-box-shadow:0 2px 8px rgba(0,1,1,.05);box-shadow:0 2px 8px rgba(0,1,1,.05);-webkit-transition:opacity 180ms linear,visibility 180ms linear;-moz-transition:opacity 180ms linear,visibility 180ms linear;-o-transition:opacity 180ms linear,visibility 180ms linear;transition:opacity 180ms linear,visibility 180ms linear;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0)}.navbar.horizontal-menu .navbar-inner .navbar-nav>li.hover>ul{visibility:visible;zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.navbar.horizontal-menu .navbar-inner .navbar-nav ul{position:relative;display:none;list-style:none;padding:0;margin:0;top:100%;min-width:100%;background:#fff;z-index:2}.navbar.horizontal-menu .navbar-inner .navbar-nav ul ul{display:block;height:0;overflow:hidden;visibility:hidden;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transition:opacity 350ms linear;-moz-transition:opacity 350ms linear;-o-transition:opacity 350ms linear;transition:opacity 350ms linear}.navbar.horizontal-menu .navbar-inner .navbar-nav ul ul.is-visible{height:auto;visibility:visible;zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li:last-child>a:after{display:none}.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li{line-height:1;margin:0}.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a{position:relative;display:block;white-space:nowrap;padding:15px 25px;color:#979898}.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after{content:'';position:absolute;left:25px;right:25px;bottom:0;background:#eee;height:1px}.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a{color:#313232;background:#fafafa;border-top:1px solid #eee;margin-top:-2px}.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a:after{left:0;right:0}.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before{content:'\f105';font-family:FontAwesome;display:block;float:right;color:#979898;position:relative;margin-left:10px;line-height:1.3;-webkit-transform-origin:center center;-moz-transform-origin:center center;-o-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub:hover>a:before,.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub.expanded>a:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul{background:#f6f6f6;border-top:1px solid #eee;border-bottom:1px solid #eee;margin-top:-1px}.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul{background:#f1f1f1;border-top-color:#e7e7e7;border-bottom-color:#e7e7e7}.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after{background-color:#e7e7e7}.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul{background:#ececec;border-top-color:#e2e2e2;border-bottom-color:#e2e2e2}.navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after{background-color:#e2e2e2}}.navbar.horizontal-menu .navbar-inner .navbar-mobile-clear{display:block}.navbar.horizontal-menu .navbar-inner>.nav{list-style:none;margin:0;padding:0}.navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile{display:none}.navbar.horizontal-menu .navbar-inner>.nav>li{line-height:85px;display:inline-block}.navbar.horizontal-menu .navbar-inner>.nav>li i{font-size:15px;color:#979898;line-height:1}.navbar.horizontal-menu .navbar-inner>.nav>li>a{position:relative;padding:0 15px;margin:0;border:1px solid transparent;border-top:0;border-bottom:0;z-index:2}.navbar.horizontal-menu .navbar-inner>.nav>li>a:hover{background:#fafafa}.navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i{color:#717272}.navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon{padding:0 20px}.navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before{content:'';position:absolute;height:2px;top:0;left:0;right:0;background:#68b828;display:none}.navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:hover:before{display:block}.navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon i{margin-right:2px}.navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon .badge{font-size:9px;position:absolute;top:50%;right:10px;padding:4px;min-width:18px;font-weight:400;line-height:1;margin-top:-20px}.navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before{background-color:#7c38bc}.navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat]{padding:0 20px}.chat-open .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i{color:#717272}.navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon{background-color:#fff;border-color:#f3f3f3;color:#717272}.navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i{color:#717272}.navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before{display:block}.navbar.horizontal-menu .navbar-inner>.nav>li>ul{z-index:1;border-color:#f3f3f3}.navbar.horizontal-menu .navbar-inner>.nav>li.search-form{padding:0 20px}.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a{border:1px solid transparent;border-top:0;border-bottom:0}.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus{background-color:#fff}.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a{background-color:#fff;border-color:#f3f3f3}.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>.dropdown-menu{margin-left:-1px}.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu{line-height:1.42857143}.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu{z-index:1;margin-top:-1px}.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu{right:0!important}@media screen and (min-width:767px) and (max-width:992px){.navbar.horizontal-menu .navbar-inner .navbar-brand{padding:0 15px}.navbar.horizontal-menu .navbar-inner .navbar-nav>li{line-height:84px}.navbar.horizontal-menu .navbar-inner .navbar-nav>li>a{padding:0 10px;font-size:12px}.navbar.horizontal-menu .navbar-inner .navbar-nav>li>a>.badge{display:none}.navbar.horizontal-menu .navbar-inner>.nav>li i{font-size:13px}.navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon{padding-left:15px;padding-right:15px}.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>span{display:none!important}}.navbar.horizontal-menu.click-to-expand .has-sub:hover>a:before{-webkit-transform:rotate(0deg)!important;-moz-transform:rotate(0deg)!important;-o-transform:rotate(0deg)!important;-ms-transform:rotate(0deg)!important;transform:rotate(0deg)!important}.navbar.horizontal-menu.click-to-expand .has-sub.expanded>a:before{-webkit-transform:rotate(90deg)!important;-moz-transform:rotate(90deg)!important;-o-transform:rotate(90deg)!important;-ms-transform:rotate(90deg)!important;transform:rotate(90deg)!important}@media screen and (min-width:768px){.navbar.horizontal-menu.navbar-minimal{height:55px}}.navbar.horizontal-menu.navbar-minimal.navbar-fixed-top+.page-container{margin-top:55px}@media screen and (max-width:768px){.navbar.horizontal-menu.navbar-minimal.navbar-fixed-top+.page-container{margin-top:0}}.navbar.horizontal-menu.navbar-minimal.navbar-fixed-top+.page-container>.sidebar-menu.fixed .sidebar-menu-inner{top:55px}.navbar.horizontal-menu.navbar-minimal+.page-container>.sidebar-menu.fixed .sidebar-menu-inner{top:55px}@media screen and (min-width:768px){.navbar.horizontal-menu.navbar-minimal .navbar-inner .navbar-brand{height:55px}.navbar.horizontal-menu.navbar-minimal .navbar-inner .navbar-nav>li{line-height:55px}.navbar.horizontal-menu.navbar-minimal .navbar-inner .navbar-nav>li>a{line-height:55px}}.navbar.horizontal-menu.navbar-minimal .navbar-inner>.nav>li{line-height:55px}@media screen and (min-width:767px) and (max-width:992px){.navbar.horizontal-menu.navbar-minimal .navbar-inner .navbar-nav>li{line-height:54px}}@media screen and (max-width:768px){.navbar.horizontal-menu{background:#2c2e2f;color:#fff;height:auto}.chat-open .navbar.horizontal-menu{left:-340px}.navbar.horizontal-menu.navbar-fixed-top{position:relative}.navbar.horizontal-menu.navbar-fixed-top+.page-container{margin-top:0}.navbar.horizontal-menu.navbar-fixed-top+.page-container>.sidebar-menu.fixed .sidebar-menu-inner{top:0}.settings-pane-open .navbar.horizontal-menu.navbar-fixed-top{position:relative}.settings-pane-open .navbar.horizontal-menu.navbar-fixed-top+.page-container{margin-top:0}.settings-pane-open .navbar.horizontal-menu.navbar-fixed-top+.page-container>.sidebar-menu.fixed .sidebar-menu-inner{top:0}.navbar.horizontal-menu+.page-container>.sidebar-menu.fixed .sidebar-menu-inner{top:85px}.navbar.horizontal-menu .navbar-inner{padding:20px 0}.navbar.horizontal-menu .navbar-inner .navbar-brand{height:auto;padding-left:20px}.navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]{display:none}.navbar.horizontal-menu .navbar-inner .navbar-mobile-clear{display:block;clear:both}.navbar.horizontal-menu .navbar-inner .navbar-nav{display:none;padding-left:40px;padding-right:40px;margin-top:20px;margin-bottom:20px;list-style:none;margin-bottom:0}.navbar.horizontal-menu .navbar-inner .navbar-nav a{color:#979898;text-decoration:none;display:block;padding:13px 5px;border-bottom:1px solid #313437}.navbar.horizontal-menu .navbar-inner .navbar-nav a>i{display:inline-block;margin-right:10px}.navbar.horizontal-menu .navbar-inner .navbar-nav a>i+span{padding-right:10px}.navbar.horizontal-menu .navbar-inner .navbar-nav a>span{display:inline-block}.navbar.horizontal-menu .navbar-inner .navbar-nav a>.label{margin-top:1px}.navbar.horizontal-menu .navbar-inner .navbar-nav a>.badge{font-size:75%;line-height:1.2}.navbar.horizontal-menu .navbar-inner .navbar-nav a:hover{color:#fff}.navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a{color:#fff}.navbar.horizontal-menu .navbar-inner .navbar-nav li.has-sub>a:before{position:relative;display:inline-block;font-family:FontAwesome;content:'\f107';float:right;color:#6d747a;margin-left:10px;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:all 150ms ease-in-out;-moz-transition:all 150ms ease-in-out;-o-transition:all 150ms ease-in-out;transition:all 150ms ease-in-out}.navbar.horizontal-menu .navbar-inner .navbar-nav li.has-sub.opened>a:before,.navbar.horizontal-menu .navbar-inner .navbar-nav li.has-sub.expanded>a:before{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.navbar.horizontal-menu .navbar-inner .navbar-nav>li.opened>ul{display:block}.navbar.horizontal-menu .navbar-inner .navbar-nav>li.opened .opened>ul{display:block}.navbar.horizontal-menu .navbar-inner .navbar-nav ul{display:none;margin:0;padding:0;overflow:hidden;list-style:none}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li{position:relative}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown{left:0;zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);-webkit-transition:all 200ms ease-in-out;-moz-transition:all 200ms ease-in-out;-o-transition:all 200ms ease-in-out;transition:all 200ms ease-in-out}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown{-webkit-transition-delay:80ms;-moz-transition-delay:80ms;-o-transition-delay:80ms;transition-delay:80ms}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown{-webkit-transition-delay:120ms;-moz-transition-delay:120ms;-o-transition-delay:120ms;transition-delay:120ms}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:160ms;-moz-transition-delay:160ms;-o-transition-delay:160ms;transition-delay:160ms}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:200ms;-moz-transition-delay:200ms;-o-transition-delay:200ms;transition-delay:200ms}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:240ms;-moz-transition-delay:240ms;-o-transition-delay:240ms;transition-delay:240ms}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:280ms;-moz-transition-delay:280ms;-o-transition-delay:280ms;transition-delay:280ms}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:320ms;-moz-transition-delay:320ms;-o-transition-delay:320ms;transition-delay:320ms}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:360ms;-moz-transition-delay:360ms;-o-transition-delay:360ms;transition-delay:360ms}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:400ms;-moz-transition-delay:400ms;-o-transition-delay:400ms;transition-delay:400ms}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown+.is-shown{-webkit-transition-delay:440ms;-moz-transition-delay:440ms;-o-transition-delay:440ms;transition-delay:440ms}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.hidden-item{visibility:hidden;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transition:all 250ms ease-in-out;-moz-transition:all 250ms ease-in-out;-o-transition:all 250ms ease-in-out;transition:all 250ms ease-in-out}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li a{padding-left:35px}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li ul li a{padding-left:60px}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li ul li ul li a{padding-left:85px}.navbar.horizontal-menu .navbar-inner .navbar-nav ul li ul li ul li ul li a{padding-left:110px}.navbar.horizontal-menu .navbar-inner .navbar-nav.mobile-is-visible{display:block}.navbar.horizontal-menu .navbar-inner>.nav{display:none}.navbar.horizontal-menu .navbar-inner>.nav>li{line-height:65px}.navbar.horizontal-menu .navbar-inner>.nav.nav-userinfo{float:none;width:100%;display:none;background:#fff;position:relative;top:20px;text-align:right}.navbar.horizontal-menu .navbar-inner>.nav.nav-userinfo.mobile-is-visible{display:block}.navbar.horizontal-menu .navbar-inner>.nav.nav-userinfo>.xs-left{float:left}.navbar.horizontal-menu .navbar-inner>.nav.nav-userinfo>.xs-left.open>.dropdown-menu{left:1px}.navbar.horizontal-menu .navbar-inner>.nav.nav-userinfo .notification-icon .badge{top:50%}.navbar.horizontal-menu .navbar-inner>.nav.nav-userinfo .user-profile>a span{display:none}.navbar.horizontal-menu .navbar-inner>.nav.nav-userinfo .user-profile.open>a{background-color:#fafafa}.navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile{display:block;float:right;padding-right:20px}.navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a{position:relative;display:inline-block;color:#979898;line-height:1;margin-left:20px}.navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a i{line-height:1;font-size:18px;position:relative;top:1px}.navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover,.navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active,.navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus{color:#fff}.navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a .badge{position:absolute;right:-3px;top:-8px;font-size:8px;padding:1px 2px;min-width:14px}}@media screen and (max-width:768px) and screen and (max-width:768px){.navbar.horizontal-menu .navbar-inner .navbar-nav{margin-top:10px;margin-bottom:10px}}@media screen and (max-width:768px) and screen and (min-width:768px){.navbar.horizontal-menu .navbar-inner .navbar-nav ul li.is-hidden{left:-20px;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0)}}footer.main-footer{padding:20px 30px;border-top:1px solid #ddd;font-size:12px;margin-left:-30px;margin-right:-30px;margin-top:10px;background-color:#eee}footer.main-footer:before,footer.main-footer:after{content:" ";display:table}footer.main-footer:after{clear:both}footer.main-footer:before,footer.main-footer:after{content:" ";display:table}footer.main-footer:after{clear:both}.page-container+footer.main-footer{margin-left:0;margin-right:0}.page-container+footer.main-footer .footer-inner{max-width:1080px;margin-left:auto;margin-right:auto}footer.main-footer .footer-text{float:left}footer.main-footer .go-up{float:right;margin-bottom:20px}footer.main-footer .go-up a{display:inline-block;background-color:rgba(44,46,47,.05);padding:2px 5px}footer.main-footer .go-up a:hover{background-color:rgba(44,46,47,.1)}footer.main-footer.footer-type-2{background-color:#252729;border-top:0;color:#fff}footer.main-footer.footer-type-2 a{color:#fff}footer.main-footer.footer-type-2 .go-up a{background-color:rgba(255,255,255,.05)}footer.main-footer.footer-type-2 .go-up a:hover{background-color:rgba(255,255,255,.1)}footer.main-footer.fixed{position:fixed;left:340px;right:0;bottom:0;margin-left:0;margin-right:0;margin-top:10px!important}body.chat-open .user-info-navbar a[data-toggle=chat]{color:#606161}.user-info-navbar{background-color:#fff;min-height:0;border:0;padding:0;margin:-30px;margin-bottom:30px}.user-info-navbar .user-info-menu{margin:0}.user-info-navbar .user-info-menu.left-links{float:left}.user-info-navbar .user-info-menu.right-links{float:right}.user-info-navbar .user-info-menu li{line-height:1}.user-info-navbar .user-info-menu li a{line-height:1}.user-info-navbar .user-info-menu li a img{line-height:1}.user-info-navbar .user-info-menu>li{position:relative;margin:0;padding:0;border:1px solid #fff;border-top:0;border-bottom:0;display:block;float:left}.user-info-navbar .user-info-menu>li.hover-line:before{content:'';position:absolute;display:block;height:2px;top:0;left:0;right:0;background:#68b828;display:none}.user-info-navbar .user-info-menu>li.hover-line:hover:before,.user-info-navbar .user-info-menu>li.hover-line.open:before{display:block}.user-info-navbar .user-info-menu>li>a{position:relative;display:block;padding:30px 20px;color:#979898;border-bottom:1px solid #fff;top:1px;z-index:5;text-decoration:none}.user-info-navbar .user-info-menu>li>a i{font-size:15px;line-height:1}.user-info-navbar .user-info-menu>li>a:hover{color:#606161}.user-info-navbar .user-info-menu>li>a .badge{font-size:9px;position:absolute;top:20px;right:10px;padding:4px;min-width:18px;font-weight:400;line-height:1}.user-info-navbar .user-info-menu>li>form{position:relative;display:block;padding:30px 20px;padding-bottom:26px;margin:0;border-bottom:1px solid #fff}.user-info-navbar .user-info-menu>li a[data-toggle=sidebar]{padding-left:25px}.user-info-navbar .user-info-menu>li.fullscreen{position:relative;z-index:1}.user-info-navbar .user-info-menu>li.fullscreen:hover a{background-color:#fafafa;color:#2c2e2f}.user-info-navbar .user-info-menu>li.search-form,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form{position:relative;z-index:5}.user-info-navbar .user-info-menu>li.search-form .btn,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn{position:relative;padding:0;margin:0;height:auto;color:#979898;z-index:2}.user-info-navbar .user-info-menu>li.search-form .btn:hover,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:hover{color:#606161}.user-info-navbar .user-info-menu>li.search-form .btn:active,.user-info-navbar .user-info-menu>li.search-form .btn:focus,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:active,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.user-info-navbar .user-info-menu>li.search-form .search-field,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field{position:absolute;top:50%;right:15px;margin-top:-15.5px;line-height:1;height:31px;border:1px solid #ddd;border:0;padding:0 10px;width:170px;padding-right:30px;font-size:12px;z-index:1;visibility:hidden;background:#f3f3f3;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0)}.user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898;opacity:1}.user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-moz-placeholder{color:#979898}.user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898}.user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:focus+.btn{color:#606161}.user-info-navbar .user-info-menu>li.search-form.focused .search-field,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form.focused .search-field{visibility:visible;zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);-webkit-transition:all 100ms ease-in-out;-moz-transition:all 100ms ease-in-out;-o-transition:all 100ms ease-in-out;transition:all 100ms ease-in-out}.user-info-navbar .user-info-menu>li.search-form.always-visible .search-field,.navbar.horizontal-menu .navbar-inner>.nav>li.search-form.always-visible .search-field{visibility:visible;zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.user-info-navbar .user-info-menu>li.user-profile>a,.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a,.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a,.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a,.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a,.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a,.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a,.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a,.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a,.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a,.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a,.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a,.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a{text-decoration:none}.user-info-navbar .user-info-menu>li.user-profile>a>img,.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img,.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img,.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img,.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img,.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img,.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img,.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img,.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img,.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img,.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img,.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img,.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img{position:relative}.user-info-navbar .user-info-menu>li.user-profile>a>img+span,.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img+span,.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img+span,.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img+span,.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img+span,.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img+span,.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img+span,.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img+span,.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img+span,.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img+span,.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img+span,.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img+span,.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>img+span{margin-left:5px}.user-info-navbar .user-info-menu>li.user-profile>a span,.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span,.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span,.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span,.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span,.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span,.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span,.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span,.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span,.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span,.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span,.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span,.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span{display:inline-block}.user-info-navbar .user-info-menu>li.user-profile .userpic-32,.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile .userpic-32,.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile .userpic-32,.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile .userpic-32,.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile .userpic-32,.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile .userpic-32,.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile .userpic-32,.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile .userpic-32,.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile .userpic-32,.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile .userpic-32,.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile .userpic-32,.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile .userpic-32,.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile .userpic-32{margin-top:-17px;top:8px}.user-info-navbar .user-info-menu>li.language-switcher a>img{display:inline-block;margin-right:5px;position:relative;top:-2px}.user-info-navbar .user-info-menu>li.open{border-left-color:#ddd;border-right-color:#ddd;z-index:15}.user-info-navbar .user-info-menu>li.open>a{color:#606161}.user-info-navbar .user-info-menu>li .dropdown-menu,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu{margin:0;padding:0;margin-top:0;margin-left:-1px;z-index:3;-webkit-box-shadow:0 2px 8px rgba(0,1,1,.05);-moz-box-shadow:0 2px 8px rgba(0,1,1,.05);box-shadow:0 2px 8px rgba(0,1,1,.05)}.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list{position:relative;max-height:300px;overflow:auto}.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list.ps-scrollbar,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list.ps-scrollbar{overflow:hidden}.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li{position:relative}.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a{position:relative;display:block;padding:20px 30px;color:#979898}.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a .line,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a .line{display:block}.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a .line.desc,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a .line.desc{margin-top:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;margin-right:10px}.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a .line .light,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a .line .light{zoom:1;-webkit-opacity:.6;-moz-opacity:.6;opacity:.6;-ms-filter:alpha(Opacity=60);filter:alpha(opacity=60)}.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a .line.small,.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a .line .small,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a .line.small,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a .line .small{font-size:12px}.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a .line.time,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a .line.time{font-size:11px;margin-top:5px}.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:after{content:'';display:block;position:absolute;height:1px;background:#ededed;bottom:0;left:30px;right:30px}.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:hover{color:#606161}.user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li.active a{color:#606161}.user-info-navbar .user-info-menu>li .dropdown-menu>.top,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top{padding:20px 30px;padding-bottom:0}.user-info-navbar .user-info-menu>li .dropdown-menu>.top a,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a{color:#979898}.user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a:hover{color:#606161}.user-info-navbar .user-info-menu>li .dropdown-menu>.top p,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top p{margin:0;color:#979898;padding-bottom:15px;border-bottom:1px solid #ededed}.user-info-navbar .user-info-menu>li .dropdown-menu>.external,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external{position:relative}.user-info-navbar .user-info-menu>li .dropdown-menu>.external:after,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external:after{content:'';display:block;position:absolute;left:0;right:0;top:-1px;background-color:none;height:1px;background-color:#ededed}.user-info-navbar .user-info-menu>li .dropdown-menu>.external a,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a{display:block;padding:20px 30px;color:#979898;background-color:#f5f5f5}.user-info-navbar .user-info-menu>li .dropdown-menu>.external a span,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a span{float:left}.user-info-navbar .user-info-menu>li .dropdown-menu>.external a i,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a i{float:right}.user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:hover{color:#6a6b6c}.user-info-navbar .user-info-menu>li .dropdown-menu.messages,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages{width:370px}.user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li:after{content:'';display:block;position:absolute;background-color:#ccc;top:50%;margin-top:-2.5px;right:30px;width:5px;height:5px;-webkit-border-radius:50%;-webkit-background-clip:padding-box;-moz-border-radius:50%;-moz-background-clip:padding;border-radius:50%;background-clip:padding-box}.user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li.active:after{background-color:#8dc63f}.user-info-navbar .user-info-menu>li .dropdown-menu.notifications,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications{width:370px}.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list{max-height:276px}.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i{float:left;background:#ddd;color:#FFF;padding:5px;line-height:17px;width:27px;text-align:center;-webkit-border-radius:50%;-webkit-background-clip:padding-box;-moz-border-radius:50%;-moz-background-clip:padding;border-radius:50%;background-clip:padding-box}.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line{padding-left:45px}.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-primary>a>i,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-primary>a>i{background-color:#2c2e2f}.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-success>a>i,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-success>a>i{background-color:#8dc63f}.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-danger>a>i,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-danger>a>i{background-color:#cc3f44}.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-warning>a>i,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-warning>a>i{background-color:#ffba00}.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-info>a>i,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-info>a>i{background-color:#40bbea}.user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i{background-color:#FFF;color:#444;-webkit-box-shadow:0 0 0 1px #eee;-moz-box-shadow:0 0 0 1px #eee;box-shadow:0 0 0 1px #eee}.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu{right:-1px;left:auto;width:250px}.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li{position:relative;display:block;padding:0;margin:0;padding:15px 20px;padding-bottom:0}.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a{display:block;color:#979898;padding:0;padding-bottom:15px;border-bottom:1px solid #f0f0f0}.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a:hover{background:0 0}.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a:hover{color:#606161}.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last{background:#fafafa}.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last:after{content:'';display:block;position:absolute;height:1px;background:#f0f0f0;top:-1px;left:0;right:0}.user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last>a{border-bottom:0}.user-info-navbar .user-info-menu>li .dropdown-menu.languages,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.languages{width:200px}@media screen and (max-width:991px){.user-info-navbar .user-info-menu>li .dropdown-menu.languages,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.languages{width:auto}}.user-info-navbar .user-info-menu>li .dropdown-menu.languages li a,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.languages li a{padding-top:10px;padding-bottom:10px;color:#777879}.user-info-navbar .user-info-menu>li .dropdown-menu.languages li:hover a,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.languages li:hover a{background-color:#fbfbfb}.user-info-navbar .user-info-menu>li .dropdown-menu.languages li.active a,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.languages li.active a{background-color:#f6f6f6;color:#2c2e2f}.user-info-navbar .user-info-menu>li .dropdown-menu.languages li+li,.navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.languages li+li{border-top:1px solid #eee}.badge{position:relative;font-size:9px;line-height:12px}.badge.pull-right{margin-top:4px;margin-left:5px}.badge.pull-left{margin-top:4px;margin-right:5px}.badge.badge-default{background-color:#777}.badge.badge-red,.badge.badge-danger{background-color:#cc3f44}.badge.badge-blue,.badge.badge-info{background-color:#40bbea}.badge.badge-yellow,.badge.badge-warning{background-color:#ffba00}.badge.badge-green,.badge.badge-success{background-color:#8dc63f}.badge.badge-primary{background-color:#2c2e2f}.badge.badge-secondary{background-color:#68b828}.badge.badge-purple{background-color:#7c38bc}.badge.badge-pink{background-color:#ff6264}.badge.badge-yellow{background-color:#fcd036}.badge.badge-orange{background-color:#f7aa47}.badge.badge-turquoise{background-color:#00b19d}.badge.badge-red{background-color:#d5080f}.badge.badge-blue{background-color:#0e62c7}.badge.badge-black{background-color:#222}.badge.badge-white{background-color:#fff;color:#333;-webkit-box-shadow:0 0 0 1px #ddd;-moz-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}#chat{display:table-cell;position:relative;z-index:100;width:280px;background:#fff;vertical-align:top;display:none}body.chat-open #chat{display:table-cell}#chat.fixed .chat-inner{position:fixed;right:0;width:inherit}.page-body.right-sidebar #chat.fixed .chat-inner{right:auto;left:0}#chat .chat-inner{overflow:auto;height:100%;border-left:1px solid #ddd}.page-body.right-sidebar #chat .chat-inner{border-left:0;border-right:1px solid #ddd}#chat .chat-inner.ps-container{overflow:hidden}#chat .chat-header{font-size:16px;color:#979898;padding:29px 35px;padding-bottom:0;line-height:1;margin:0;position:relative}#chat .chat-header .badge{position:relative;top:-1px;margin-left:5px;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1);zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);-webkit-transition:all 220ms ease-in-out;-moz-transition:all 220ms ease-in-out;-o-transition:all 220ms ease-in-out;transition:all 220ms ease-in-out}#chat .chat-header .badge.is-hidden{zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transform:scale(0);-moz-transform:scale(0);-o-transform:scale(0);-ms-transform:scale(0);transform:scale(0)}#chat .chat-header .chat-close{position:absolute;right:0;font-size:15px;right:25px;margin-top:0;color:#ddd;font-weight:400;zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}#chat .chat-header .chat-close:hover{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}#chat .chat-group{margin-top:24px}#chat .chat-group>strong,#chat .chat-group>a{display:block;padding:6px 35px;font-weight:400;font-size:12px}#chat .chat-group>strong{text-transform:uppercase;color:#979898}#chat .chat-group>a{position:relative;color:#979898;-webkit-transition:background 250ms ease-in-out;-moz-transition:background 250ms ease-in-out;-o-transition:background 250ms ease-in-out;transition:background 250ms ease-in-out}#chat .chat-group>a:hover,#chat .chat-group>a.active{color:#717272}#chat .chat-group>a:before{content:'';display:block;position:absolute;width:0;height:0;border-style:solid;border-width:4px 0 4px 4px;border-color:transparent transparent transparent #111;left:0;top:50%;margin-top:-4px;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transition:all 220ms ease-in-out;-moz-transition:all 220ms ease-in-out;-o-transition:all 220ms ease-in-out;transition:all 220ms ease-in-out}#chat .chat-group>a.active:before{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}#chat .chat-group>a .badge{font-size:9px;margin-left:5px;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1);zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);-webkit-transition:all 220ms ease-in-out;-moz-transition:all 220ms ease-in-out;-o-transition:all 220ms ease-in-out;transition:all 220ms ease-in-out}#chat .chat-group>a .badge.is-hidden{zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transform:scale(0);-moz-transform:scale(0);-o-transform:scale(0);-ms-transform:scale(0);transform:scale(0)}#chat .chat-group>a em{font-style:normal}#chat .user-status{display:inline-block;background:#b7b7b7;margin-right:5px;width:8px;height:8px;-webkit-border-radius:8px;-webkit-background-clip:padding-box;-moz-border-radius:8px;-moz-background-clip:padding;border-radius:8px;background-clip:padding-box;-webkit-transition:all 220ms ease-in-out;-moz-transition:all 220ms ease-in-out;-o-transition:all 220ms ease-in-out;transition:all 220ms ease-in-out}#chat .user-status.is-online{background-color:#8dc63f}#chat .user-status.is-offline{background-color:#b7b7b7}#chat .user-status.is-idle{background-color:#ffba00}#chat .user-status.is-busy{background-color:#cc3f44}#chat .chat-conversation{position:absolute;right:279px;width:340px;background:#fff;border:1px solid #dedede;top:166px;display:none}.page-body.right-sidebar #chat .chat-conversation{right:auto;left:279px}#chat .chat-conversation.is-open{display:block}#chat .chat-conversation .conversation-header{position:relative;padding:20px 24px;font-size:14px;color:#979898;border-bottom:1px solid #ededed}#chat .chat-conversation .conversation-header small{color:rgba(151,152,152,.6);font-size:12px;padding-left:8px}#chat .chat-conversation .conversation-header .conversation-close{float:right;color:#979898;zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);position:relative;top:-2px}#chat .chat-conversation .conversation-header:after{position:absolute;display:block;content:'';width:0;height:0;border-style:solid;border-width:7px 0 7px 9.1px;border-color:transparent transparent transparent #dedede;right:-9.1px;top:50%;margin-top:-3.5px}.page-body.right-sidebar #chat .chat-conversation .conversation-header:after{right:auto;left:-8.1px;border-width:7px 7px 9.1px 0;border-color:transparent #dedede transparent transparent}#chat .chat-conversation .conversation-body{list-style:none;margin:0;padding:0;overflow:auto;height:245px}#chat .chat-conversation .conversation-body::-webkit-scrollbar{width:5px}#chat .chat-conversation .conversation-body::-webkit-scrollbar-track{width:5px;background-color:#fff}#chat .chat-conversation .conversation-body::-webkit-scrollbar-thumb{background-color:#dedede}#chat .chat-conversation .conversation-body>li{padding:0 30px;margin:0;padding-top:15px;padding-bottom:15px;border-bottom:1px solid #f1f1f1;color:#979898}#chat .chat-conversation .conversation-body>li.odd{background:rgba(250,250,250,.55)}#chat .chat-conversation .conversation-body>li .user{font-weight:700;color:#7d7f7f}#chat .chat-conversation .conversation-body>li .time{float:right;color:rgba(151,152,152,.8);font-size:10px;position:relative;top:3px}#chat .chat-conversation .conversation-body>li p{padding-top:5px}#chat .chat-conversation .conversation-body>li:last-child{border-bottom:0}#chat .chat-conversation .chat-textarea{padding:20px 24px;background:#fafafa;position:relative;border-top:1px solid #ededed;padding:0}#chat .chat-conversation .chat-textarea:after{content:'\f075';font-family:fontawesome;color:#979898;right:15px;top:10px;font-size:15px;position:absolute}#chat .chat-conversation .chat-textarea textarea{background:#fafafa;border:0;max-height:100px!important;padding-right:35px;padding-top:10px;height:32px;resize:none}#chat .chat-conversation .chat-textarea textarea::-moz-placeholder{color:rgba(151,152,152,.85);opacity:1}#chat .chat-conversation .chat-textarea textarea:-ms-input-placeholder{color:rgba(151,152,152,.85)}#chat .chat-conversation .chat-textarea textarea::-webkit-input-placeholder{color:rgba(151,152,152,.85)}#chat .chat-conversation .chat-textarea textarea::-webkit-input-placeholder{color:rgba(151,152,152,.85)}#chat .chat-conversation .chat-textarea textarea:-moz-placeholder{color:rgba(151,152,152,.85)}#chat .chat-conversation .chat-textarea textarea::-moz-placeholder{color:rgba(151,152,152,.85)}#chat .chat-conversation .chat-textarea textarea:-ms-input-placeholder{color:rgba(151,152,152,.85)}#chat .chat-conversation .chat-textarea textarea::-webkit-scrollbar{width:5px}#chat .chat-conversation .chat-textarea textarea::-webkit-scrollbar-track{width:5px;background-color:#ededed}#chat .chat-conversation .chat-textarea textarea::-webkit-scrollbar-thumb{background-color:#ccc}.chat-history{display:none}@media (max-width:767px){.chat-visible #chat,.chat-visible #chat.fixed{display:none}.chat-visible.toggle-click #chat,.chat-visible.toggle-click #chat.fixed{display:block}#chat,#chat.fixed{position:fixed;width:auto;top:0;left:0;right:0;bottom:0;margin:10px}#chat .chat-conversation,#chat.fixed .chat-conversation{position:fixed;width:auto;left:0;right:0;top:0!important;bottom:0;margin:10px;overflow:auto}#chat .chat-conversation .conversation-body,#chat.fixed .chat-conversation .conversation-body{height:auto;max-height:450px}#chat .chat-conversation::-webkit-scrollbar,#chat.fixed .chat-conversation::-webkit-scrollbar{width:5px}#chat .chat-conversation::-webkit-scrollbar-track,#chat.fixed .chat-conversation::-webkit-scrollbar-track{width:5px;background-color:#343a45}#chat .chat-conversation::-webkit-scrollbar-thumb,#chat.fixed .chat-conversation::-webkit-scrollbar-thumb{background-color:#4a5262}}.footer-sticked-chat{position:fixed;right:30px;bottom:0;z-index:1000}.chat-open .footer-sticked-chat{right:310px}@media screen and (max-width:768px){.chat-open .footer-sticked-chat{right:30px}}.right-sidebar .footer-sticked-chat{left:30px;right:auto}@media screen and (max-width:768px){.footer-sticked-chat.mobile-is-visible .chat-conversations{display:block!important}}@media screen and (max-width:768px){.footer-sticked-chat{left:0;right:0}}.footer-sticked-chat .chat-conversations{display:block;margin:0;padding:0;z-index:5;position:relative}@media screen and (max-width:768px){.footer-sticked-chat .chat-conversations{padding:15px 30px;background:#fff;border-top:1px solid #e4e4e4;display:none}}.footer-sticked-chat .chat-conversations>li{display:block;position:relative;float:left;margin:0}@media screen and (max-width:768px){.footer-sticked-chat .chat-conversations>li{float:none;width:100%}}.footer-sticked-chat .chat-conversations>li .chat-user{display:block;position:relative;z-index:5;background-color:#fff;border:1px solid #e4e4e4;color:#888;font-size:12px;line-height:1;padding:8px 10px;width:150px;text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}@media screen and (max-width:768px){.footer-sticked-chat .chat-conversations>li .chat-user{width:100%}}.footer-sticked-chat .chat-conversations>li .chat-user .user-status{display:inline-block;vertical-align:middle;background:#b7b7b7;margin-right:5px;position:relative;top:-1px;width:8px;height:8px;-webkit-border-radius:8px;-webkit-background-clip:padding-box;-moz-border-radius:8px;-moz-background-clip:padding;border-radius:8px;background-clip:padding-box;-webkit-transition:all 220ms ease-in-out;-moz-transition:all 220ms ease-in-out;-o-transition:all 220ms ease-in-out;transition:all 220ms ease-in-out}.footer-sticked-chat .chat-conversations>li .chat-user .user-status.is-online{background-color:#8dc63f}.footer-sticked-chat .chat-conversations>li .chat-user .user-status.is-offline{background-color:#b7b7b7}.footer-sticked-chat .chat-conversations>li .chat-user .user-status.is-idle{background-color:#ffba00}.footer-sticked-chat .chat-conversations>li .chat-user .user-status.is-busy{background-color:#cc3f44}.footer-sticked-chat .chat-conversations>li .chat-user:hover{color:#2c2e2f}.footer-sticked-chat .chat-conversations>li .badge{position:absolute;top:0;right:0;z-index:15;-webkit-transform:translate(25%,-25%);-moz-transform:translate(25%,-25%);-o-transform:translate(25%,-25%);-ms-transform:translate(25%,-25%);transform:translate(25%,-25%)}.footer-sticked-chat .chat-conversations>li .conversation-window{position:absolute;bottom:0;left:0;right:0;background:#fff;border:1px solid #fff;z-index:20;border:1px solid #e4e4e4;visibility:hidden;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0)}.footer-sticked-chat .chat-conversations>li .conversation-window>.chat-user{width:100%;border:0;background:#f5f5f5}.footer-sticked-chat .chat-conversations>li .conversation-window>.chat-user .close{position:absolute;right:0;top:50%;font-size:15px;-webkit-transform:translate(-100%,-50%);-moz-transform:translate(-100%,-50%);-o-transform:translate(-100%,-50%);-ms-transform:translate(-100%,-50%);transform:translate(-100%,-50%)}.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages{list-style:none;margin:0;padding:0;border-top:1px solid #e4e4e4;border-bottom:1px solid #e4e4e4;max-height:250px;overflow:hidden;position:relative}.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages.full-height{overflow:visible}.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li{display:table;width:100%;table-layout:auto}.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li .user-info,.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li .message-entry{display:table-cell;vertical-align:top;padding:10px 0}.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li .user-info{padding-left:10px;padding-right:10px}.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li .user-info+.message-entry{padding-left:0}.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li .message-entry{width:99%;color:#666;font-size:11px;padding-right:10px;padding-left:10px;word-break:break-all;white-space:normal}.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li .message-entry>p{color:#666}.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li .message-entry>p:last-child{margin-bottom:0}.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li.me{background-color:#f4f4f4}.footer-sticked-chat .chat-conversations>li .conversation-window .conversation-messages li.time{text-align:center;display:block;font-size:9px;background:#f0f0f0;text-transform:uppercase;color:#888;padding:4px 0 2px 0;line-height:1;margin-bottom:1px}.footer-sticked-chat .chat-conversations>li .conversation-window .chat-form .form-control{border:0;font-size:12px}.footer-sticked-chat .chat-conversations>li.open>a{width:250px}@media screen and (max-width:768px){.footer-sticked-chat .chat-conversations>li.open>a{width:100%}}.footer-sticked-chat .chat-conversations>li.open .conversation-window{bottom:0;visibility:visible;zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);-webkit-transition-delay:120ms;-moz-transition-delay:120ms;-o-transition-delay:120ms;transition-delay:120ms}.footer-sticked-chat .chat-conversations>li.open .badge{display:none}.right-sidebar .footer-sticked-chat .chat-conversations>li.browse-more{float:right;margin-right:0;margin-left:10px}.footer-sticked-chat .chat-conversations>li.browse-more>a{width:auto;-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}@media screen and (max-width:768px){.footer-sticked-chat .chat-conversations>li.browse-more>a{background-color:#f4f4f4}}.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list{position:absolute;bottom:100%;right:0;margin:0;padding:0;list-style:none;background-color:#fff;border:1px solid #e4e4e4;margin-bottom:-2px;z-index:1;display:none}.right-sidebar .footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list{right:auto;left:auto}@media screen and (max-width:768px){.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list{position:relative;width:100%;border-top:0}}.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li{display:block;text-align:right}@media screen and (max-width:768px){.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li{text-align:left}}.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li a{display:block;font-size:11px;font-weight:700;padding:5px 10px;white-space:nowrap;color:#888}.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li a span{position:relative;left:2px;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0)}@media screen and (max-width:768px){.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li a span{float:right;left:0}}.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li a:hover{color:#2c2e2f}.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li a:hover span{zoom:1;-webkit-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:alpha(Opacity=50);filter:alpha(opacity=50)}.footer-sticked-chat .chat-conversations>li.browse-more .other-conversations-list li+li{border-top:1px solid rgba(228,228,228,.15)}@media screen and (min-width:768px){.footer-sticked-chat .chat-conversations>li.browse-more:hover>a{border-top:0;top:1px}}.footer-sticked-chat .chat-conversations>li.browse-more:hover .other-conversations-list{display:block}.footer-sticked-chat .chat-conversations>li+li{margin-left:10px}@media screen and (max-width:768px){.footer-sticked-chat .chat-conversations>li+li{margin-left:0;margin-top:5px}}.footer-sticked-chat .mobile-chat-toggle{position:absolute;right:30px;bottom:100%;border:1px solid #e4e4e4;background-color:#fff;font-size:12px;line-height:1;padding:10px 12px;text-decoration:none;z-index:1;border-bottom:0;display:none}.footer-sticked-chat .mobile-chat-toggle i{font-size:14px}@media screen and (max-width:768px){.footer-sticked-chat .mobile-chat-toggle{display:block}}.footer-sticked-chat .mobile-chat-toggle .badge{position:absolute;top:0;left:0;z-index:15;-webkit-transform:translate(-25%,-25%);-moz-transform:translate(-25%,-25%);-o-transform:translate(-25%,-25%);-ms-transform:translate(-25%,-25%);transform:translate(-25%,-25%)}@media screen and (max-width:768px){.page-container{display:block}.page-container .sidebar-menu,.page-container .main-content{display:block;width:100%;height:auto}.page-container .sidebar-menu{position:relative}.page-container .sidebar-menu .sidebar-menu-inner{position:relative}.page-container .sidebar-menu .sidebar-menu-inner .logo-env,.page-container .sidebar-menu .sidebar-menu-inner .main-menu{padding-left:20px;padding-right:20px}.page-container .sidebar-menu .sidebar-menu-inner .logo-env{margin-bottom:0;padding-top:20px;padding-bottom:20px}.page-container .sidebar-menu .sidebar-menu-inner .logo-env .mobile-menu-toggle{float:right}.page-container .sidebar-menu .sidebar-menu-inner .logo-env .mobile-menu-toggle a{position:relative;display:inline-block;color:#979898;line-height:1;margin-left:20px}.page-container .sidebar-menu .sidebar-menu-inner .logo-env .mobile-menu-toggle a i{line-height:1;font-size:18px;position:relative;top:1px}.page-container .sidebar-menu .sidebar-menu-inner .logo-env .mobile-menu-toggle a:hover,.page-container .sidebar-menu .sidebar-menu-inner .logo-env .mobile-menu-toggle a:active,.page-container .sidebar-menu .sidebar-menu-inner .logo-env .mobile-menu-toggle a:focus{color:#fff}.page-container .sidebar-menu .sidebar-menu-inner .logo-env .mobile-menu-toggle a .badge{position:absolute;right:-3px;top:-8px;font-size:8px;padding:1px 2px;min-width:14px}.page-container .sidebar-menu .sidebar-menu-inner .main-menu{display:none;margin-bottom:0}.page-container .sidebar-menu .sidebar-menu-inner .main-menu.mobile-is-visible{display:block}.page-container .sidebar-menu .sidebar-menu-inner .main-menu.mobile-is-visible.both-menus-visible{margin-top:0;padding-top:0}.page-container .sidebar-menu .sidebar-menu-inner .main-menu>li:last-child>a{border-bottom:0}.page-container .main-content .navbar.user-info-navbar{display:none}.page-container .main-content .navbar.user-info-navbar.mobile-is-visible{display:block}.page-container .main-content .navbar.user-info-navbar .user-info-menu>li{min-height:0!important}.page-container .main-content .navbar.user-info-navbar .user-info-menu>li>a,.page-container .main-content .navbar.user-info-navbar .user-info-menu>li>form{padding-top:20px;padding-bottom:20px}.page-container .main-content .navbar.user-info-navbar .user-info-menu>li.user-profile>a>span,.page-container .main-content .navbar.navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>span,.page-container .main-content .navbar.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>span,.page-container .main-content .navbar.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>span,.page-container .main-content .navbar.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>span,.page-container .main-content .navbar.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>span,.page-container .main-content .navbar.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>span,.page-container .main-content .navbar.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>span,.page-container .main-content .navbar.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>span,.page-container .main-content .navbar.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>span,.page-container .main-content .navbar.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>span,.page-container .main-content .navbar.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>span,.page-container .main-content .navbar.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a>span{display:none}.page-container .main-content .navbar.user-info-navbar .user-info-menu>li a>.badge{top:10px}.page-container .main-content .main-footer{position:relative;left:0;right:auto;margin-left:-30px;margin-right:-30px}.page-container{position:relative}.page-container #chat{left:auto;margin:0;width:340px}.page-container #chat .chat-conversation{bottom:auto;position:absolute;left:0;top:0}.chat-open .page-container{left:-340px}}.panel{position:relative;background:#fff;padding:20px 30px;border:0;margin-bottom:30px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.panel.panel-headerless .panel-body{padding-top:0}.panel .panel-heading{position:relative;padding:0;margin:0;background:0 0;font-size:17px;padding-bottom:15px;border-bottom:2px solid #f5f5f5}.panel .panel-heading>.panel-title{float:left;font-size:17px}.panel .panel-heading>.panel-title>a{color:inherit}.panel .panel-heading>.panel-options{float:right;font-size:13px}.panel .panel-heading>.panel-options a{display:inline-block;color:#979898;margin-left:7px;line-height:1}.panel .panel-heading>.panel-options a i{line-height:1}.panel .panel-heading>.panel-options a[data-toggle=panel] span{display:block;font-size:16px;width:10px;text-align:center}.panel .panel-heading>.panel-options a[data-toggle=panel] span.expand-icon{display:none;font-size:18px}.panel .panel-heading>.panel-options a[data-toggle=remove]{font-size:18px}.panel .panel-heading>.panel-options a:first-child{margin-left:0}.panel .panel-heading>.panel-options .nav-tabs{border:0}.panel .panel-heading>.panel-options .nav-tabs>li{border:0}.panel .panel-heading>.panel-options .nav-tabs>li>a{padding:0;border:0;margin-left:15px;color:#979898;background:0 0}.panel .panel-heading>.panel-options .nav-tabs>li>a:hover{background:0 0}.panel .panel-heading>.panel-options .nav-tabs>li.active>a{color:#4b4b4b}.panel .panel-body{padding:0;padding-top:20px;color:#979898}.panel .panel-body.no-padding{padding:0;margin-top:-2px;margin-left:-30px;margin-right:-30px;margin-bottom:-20px}.panel .panel-body.panel-border{border-top:1px solid #f5f5f5;padding-top:30px}.panel .panel-body p{margin-bottom:0}.panel .panel-body p+p{margin-top:15px}.panel .panel-disabled{position:absolute;left:0;right:0;top:0;bottom:0;background:rgba(255,255,255,.7)}.panel.collapsed .panel-heading .panel-options a[data-toggle=panel] .collapse-icon{display:none}.panel.collapsed .panel-heading .panel-options a[data-toggle=panel] .expand-icon{display:block}.panel.collapsed>.panel-body,.panel.collapsed>.table{display:none}.panel.panel-border{border:1px solid #ccc}.panel.panel-shadow{-webkit-box-shadow:0 1px 1px rgba(0,1,1,.08);-moz-box-shadow:0 1px 1px rgba(0,1,1,.08);box-shadow:0 1px 1px rgba(0,1,1,.08)}.panel.panel-inverted{background:#2c2e2f;color:#FFF}.panel.panel-inverted>.panel-heading{border-bottom-color:#393c3e}.panel.panel-inverted>.panel-disabled{background:rgba(44,46,47,.5)}.panel.panel-tabs{background:0 0;padding-left:0;padding-right:0;margin-bottom:10px;padding-top:7px}.panel.panel-tabs>.panel-heading{border-bottom:0}.panel.panel-tabs>.panel-heading .nav-tabs{position:relative;margin-bottom:-21px;margin-right:-2px}.panel.panel-tabs>.panel-heading .nav-tabs>li>a{position:relative;background-color:#f5f5f5;padding:15px 20px;margin-left:5px;top:-6px}.panel.panel-tabs>.panel-heading .nav-tabs>li:hover>a,.panel.panel-tabs>.panel-heading .nav-tabs>li.active>a{background-color:#FFF}.panel.panel-tabs>.panel-body{background:#FFF;padding:20px 30px}.panel.panel-flat{background:0 0;padding-top:0;padding-left:0;padding-right:0}.panel.panel-flat .panel-heading{border-bottom-color:#ddd}.panel.panel-flat .panel-disabled{background:rgba(238,238,238,.6)}.panel.panel-success .panel-heading{background-color:#8dc63f;color:#fff}.panel.panel-success .panel-heading>.panel-title{color:#fff}.panel.panel-success .panel-heading>.panel-title>a{color:inherit}.panel.panel-success .panel-heading>.panel-options{color:#fff}.panel.panel-success .panel-heading>.panel-options a{color:rgba(255,255,255,.6)}.panel.panel-success .panel-heading>.panel-options a:hover{color:#fff}.panel.panel-success>.panel-disabled{background-color:rgba(141,198,63,.15)}.panel.panel-info .panel-heading{background-color:#40bbea;color:#fff}.panel.panel-info .panel-heading>.panel-title{color:#fff}.panel.panel-info .panel-heading>.panel-title>a{color:inherit}.panel.panel-info .panel-heading>.panel-options{color:#fff}.panel.panel-info .panel-heading>.panel-options a{color:rgba(255,255,255,.6)}.panel.panel-info .panel-heading>.panel-options a:hover{color:#fff}.panel.panel-info>.panel-disabled{background-color:rgba(64,187,234,.15)}.panel.panel-warning .panel-heading{background-color:#ffba00;color:#fff}.panel.panel-warning .panel-heading>.panel-title{color:#fff}.panel.panel-warning .panel-heading>.panel-title>a{color:inherit}.panel.panel-warning .panel-heading>.panel-options{color:#fff}.panel.panel-warning .panel-heading>.panel-options a{color:rgba(255,255,255,.6)}.panel.panel-warning .panel-heading>.panel-options a:hover{color:#fff}.panel.panel-warning>.panel-disabled{background-color:rgba(255,186,0,.15)}.panel.panel-danger .panel-heading{background-color:#cc3f44;color:#fff}.panel.panel-danger .panel-heading>.panel-title{color:#fff}.panel.panel-danger .panel-heading>.panel-title>a{color:inherit}.panel.panel-danger .panel-heading>.panel-options{color:#fff}.panel.panel-danger .panel-heading>.panel-options a{color:rgba(255,255,255,.6)}.panel.panel-danger .panel-heading>.panel-options a:hover{color:#fff}.panel.panel-danger>.panel-disabled{background-color:rgba(204,63,68,.15)}.panel.panel-red .panel-heading{background-color:#d5080f;color:#fff}.panel.panel-red .panel-heading>.panel-title{color:#fff}.panel.panel-red .panel-heading>.panel-title>a{color:inherit}.panel.panel-red .panel-heading>.panel-options{color:#fff}.panel.panel-red .panel-heading>.panel-options a{color:rgba(255,255,255,.6)}.panel.panel-red .panel-heading>.panel-options a:hover{color:#fff}.panel.panel-red>.panel-disabled{background-color:rgba(213,8,15,.15)}.panel.panel-black .panel-heading{background-color:#222;color:#fff}.panel.panel-black .panel-heading>.panel-title{color:#fff}.panel.panel-black .panel-heading>.panel-title>a{color:inherit}.panel.panel-black .panel-heading>.panel-options{color:#fff}.panel.panel-black .panel-heading>.panel-options a{color:rgba(255,255,255,.6)}.panel.panel-black .panel-heading>.panel-options a:hover{color:#fff}.panel.panel-black>.panel-disabled{background-color:rgba(34,34,34,.15)}.panel.panel-purple .panel-heading{background-color:#7c38bc;color:#fff}.panel.panel-purple .panel-heading>.panel-title{color:#fff}.panel.panel-purple .panel-heading>.panel-title>a{color:inherit}.panel.panel-purple .panel-heading>.panel-options{color:#fff}.panel.panel-purple .panel-heading>.panel-options a{color:rgba(255,255,255,.6)}.panel.panel-purple .panel-heading>.panel-options a:hover{color:#fff}.panel.panel-purple>.panel-disabled{background-color:rgba(124,56,188,.15)}.panel.panel-blue .panel-heading{background-color:#0e62c7;color:#fff}.panel.panel-blue .panel-heading>.panel-title{color:#fff}.panel.panel-blue .panel-heading>.panel-title>a{color:inherit}.panel.panel-blue .panel-heading>.panel-options{color:#fff}.panel.panel-blue .panel-heading>.panel-options a{color:rgba(255,255,255,.6)}.panel.panel-blue .panel-heading>.panel-options a:hover{color:#fff}.panel.panel-blue>.panel-disabled{background-color:rgba(14,98,199,.15)}.panel.panel-light-blue .panel-heading{background-color:#4fcdfc;color:#fff}.panel.panel-light-blue .panel-heading>.panel-title{color:#fff}.panel.panel-light-blue .panel-heading>.panel-title>a{color:inherit}.panel.panel-light-blue .panel-heading>.panel-options{color:#fff}.panel.panel-light-blue .panel-heading>.panel-options a{color:rgba(255,255,255,.6)}.panel.panel-light-blue .panel-heading>.panel-options a:hover{color:#fff}.panel.panel-light-blue>.panel-disabled{background-color:rgba(79,205,252,.15)}.panel.panel-gray .panel-heading{background-color:#e1e1e1;color:#717272}.panel.panel-gray .panel-heading>.panel-title{color:#717272}.panel.panel-gray .panel-heading>.panel-title>a{color:inherit}.panel.panel-gray .panel-heading>.panel-options{color:#717272}.panel.panel-gray .panel-heading>.panel-options a{color:rgba(113,114,114,.6)}.panel.panel-gray .panel-heading>.panel-options a:hover{color:#717272}.panel.panel-gray>.panel-disabled{background-color:rgba(225,225,225,.15)}.panel.panel-color .panel-heading{margin-top:-20px;margin-left:-30px;margin-right:-30px;padding:20px 30px;border-bottom:0}.panel.panel-color.collapsed>.panel-heading{margin-bottom:-20px}.breadcrumb{background:0 0}.breadcrumb li i{margin-right:4px}.breadcrumb li a{color:#979898}.breadcrumb li.active>*{color:#646565}.breadcrumb.bc-2{background-color:#eee}.breadcrumb.bc-3{border:1px solid #ddd}.breadcrumb.auto-hidden li{display:block;float:left}.breadcrumb.auto-hidden li:before{display:block;float:left}.breadcrumb.auto-hidden li a{display:block;float:left;white-space:nowrap;overflow:hidden}.breadcrumb.auto-hidden li a.collapsed{width:45px!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}@media screen and (max-width:768px){body.chat-open .settings-pane{left:-340px}}.settings-pane{background:#27292a;color:#fff;display:none;position:relative;overflow:hidden;-webkit-perspective:500px;-moz-perspective:500px;perspective:500px;-webkit-transform-origin:center bottom;-moz-transform-origin:center bottom;-o-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom}@media screen and (max-width:768px){.settings-pane{padding:30px}}.settings-pane .settings-pane-inner{position:relative;padding:50px}@media screen and (max-width:768px){.settings-pane .settings-pane-inner{padding:0}}.settings-pane .settings-pane-inner.with-animation{zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transition:all 350ms cubic-bezier(0.785,.135,.15,.86);-moz-transition:all 350ms cubic-bezier(0.785,.135,.15,.86);-o-transition:all 350ms cubic-bezier(0.785,.135,.15,.86);transition:all 350ms cubic-bezier(0.785,.135,.15,.86)}.settings-pane .settings-pane-inner.with-animation.visible{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);-webkit-transition-delay:200ms;-moz-transition-delay:200ms;-o-transition-delay:200ms;transition-delay:200ms}.settings-pane .settings-pane-inner.with-animation.closing{zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transition-delay:0ms;-moz-transition-delay:0ms;-o-transition-delay:0ms;transition-delay:0ms}.settings-pane>a[data-toggle=settings-pane]{display:block;color:#979898;position:absolute;right:0;top:0;padding:10px 12px;font-size:18px;line-height:1;z-index:100}.settings-pane>a[data-toggle=settings-pane]:hover{color:#FFF}.settings-pane .user-info{display:table;width:100%;border-spacing:0;border-collapse:collapse}@media screen and (min-width:768px) and (max-width:992px){.settings-pane .user-info{width:auto;margin:0 auto;margin-bottom:20px}}@media screen and (max-width:768px){.settings-pane .user-info{width:auto;margin:0 auto;margin-bottom:20px}}.settings-pane .user-info .user-image,.settings-pane .user-info .user-details{display:table-cell;vertical-align:middle}.settings-pane .user-info .user-image{width:130px}.settings-pane .user-info .user-image a{display:block;position:relative}.settings-pane .user-info .user-details{padding-left:20px}.settings-pane .user-info .user-details h3{margin:0}.settings-pane .user-info .user-details h3 a{color:#fff}.settings-pane .user-info .user-details h3 .user-status{position:relative;display:inline-block;background:#FFF;top:-3px;margin-left:5px;width:8px;height:8px;-webkit-border-radius:50%;-webkit-background-clip:padding-box;-moz-border-radius:50%;-moz-background-clip:padding;border-radius:50%;background-clip:padding-box}.settings-pane .user-info .user-details h3 .user-status.is-online{background-color:#8dc63f}.settings-pane .user-info .user-details h3 .user-status.is-idle{background-color:#ffba00}.settings-pane .user-info .user-details h3 .user-status.is-busy{background-color:#d5080f}.settings-pane .user-info .user-details h3 .user-status.is-offline{background-color:#CCC}.settings-pane .user-info .user-details .user-title{color:rgba(255,255,255,.65);margin:0;margin-top:5px}.settings-pane .user-info .user-details .user-links{margin-top:15px}.settings-pane .user-info .user-details .user-links a{display:inline-block}.settings-pane .user-info .user-details .user-links a+a{margin-left:8px}.settings-pane .links-block{display:inline-block;padding-right:85px;text-align:left}@media screen and (max-width:991px){.settings-pane .links-block{padding-right:40px;margin-top:10px}}.settings-pane .links-block.left-sep{border-left:1px solid #323435;padding-left:75px}@media screen and (max-width:991px){.settings-pane .links-block.left-sep{padding-left:40px}.settings-pane .links-block.left-sep:first-child{border-left:0}}@media screen and (max-width:599px){.settings-pane .links-block.left-sep{padding:0 25px}}.settings-pane .links-block h4{color:#fff;margin:0;margin-bottom:15px}.settings-pane .links-block h4 span{display:inline-block;border-bottom:1px solid #323435;padding-bottom:5px}.settings-pane .links-block h4 a{color:#fff}.settings-pane .links-block h4 a:hover{color:#979898}.settings-pane .links-block ul li label{display:inline-block;padding-left:5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.settings-pane .links-block ul li a{color:#979898;display:block}.settings-pane .links-block ul li a:hover{color:#fff}.settings-pane .links-block ul li+li a{margin-top:5px}.settings-pane .link-blocks-env{text-align:center}.settings-pane-open .settings-pane{display:block}.settings-pane-open .sidebar-menu .sidebar-menu-inner{position:relative!important}.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon{background:#27292a;-webkit-box-shadow:0 0 0 10px #27292a,0 -10px 0 10px #27292a,0 -20px 0 10px #27292a,0 -30px 0 10px #27292a;-moz-box-shadow:0 0 0 10px #27292a,0 -10px 0 10px #27292a,0 -20px 0 10px #27292a,0 -30px 0 10px #27292a;box-shadow:0 0 0 10px #27292a,0 -10px 0 10px #27292a,0 -20px 0 10px #27292a,0 -30px 0 10px #27292a}.cbr-replaced{position:relative;display:inline-block;vertical-align:middle;top:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.cbr-replaced .cbr-input{display:none}.cbr-replaced .cbr-state{position:relative;display:block;background:#FFF;border:1px solid #ddd;line-height:1;width:15px;height:15px}.cbr-replaced .cbr-state span{display:block;background:url(../images/ok.png) no-repeat center center;background-image:none;position:absolute;left:0;right:0;bottom:0;top:0;cursor:pointer}.cbr-replaced.cbr-checked span{background-image:url(../images/ok.png)}.cbr-replaced.cbr-disabled{zoom:1;-webkit-opacity:.4;-moz-opacity:.4;opacity:.4;-ms-filter:alpha(Opacity=40);filter:alpha(opacity=40)}.cbr-replaced.cbr-radio .cbr-state{-webkit-border-radius:50%;-webkit-background-clip:padding-box;-moz-border-radius:50%;-moz-background-clip:padding;border-radius:50%;background-clip:padding-box}.cbr-replaced.cbr-radio .cbr-state span{background:#FFF;left:2px;right:2px;top:2px;bottom:2px;-webkit-border-radius:50%;-webkit-background-clip:padding-box;-moz-border-radius:50%;-moz-background-clip:padding;border-radius:50%;background-clip:padding-box}.cbr-replaced.cbr-radio.cbr-checked .cbr-state span{background:#ddd}.cbr-replaced.cbr-primary .cbr-state{background:#2c2e2f;border-color:#323435}.cbr-replaced.cbr-primary.cbr-checked span{background-image:url(../images/ok-white-full.png)}.cbr-replaced.cbr-primary.cbr-radio .cbr-state{background:#fff}.cbr-replaced.cbr-primary.cbr-radio .cbr-state span{background-color:#fff}.cbr-replaced.cbr-primary.cbr-radio.cbr-checked .cbr-state span{background:#2c2e2f}.cbr-replaced.cbr-secondary .cbr-state{background:#68b828;border-color:#68b828}.cbr-replaced.cbr-secondary.cbr-checked span{background-image:url(../images/ok-white-full.png)}.cbr-replaced.cbr-secondary.cbr-checked.cbr-radio .cbr-state span{background:#68b828}.cbr-replaced.cbr-secondary.cbr-radio .cbr-state{background:#fff}.cbr-replaced.cbr-success .cbr-state{background:#8dc63f;border-color:#8dc63f}.cbr-replaced.cbr-success.cbr-checked span{background-image:url(../images/ok-white-full.png)}.cbr-replaced.cbr-success.cbr-checked.cbr-radio .cbr-state span{background:#8dc63f}.cbr-replaced.cbr-success.cbr-radio .cbr-state{background:#fff}.cbr-replaced.cbr-info .cbr-state{background:#40bbea;border-color:#40bbea}.cbr-replaced.cbr-info.cbr-checked span{background-image:url(../images/ok-white-full.png)}.cbr-replaced.cbr-info.cbr-checked.cbr-radio .cbr-state span{background:#40bbea}.cbr-replaced.cbr-info.cbr-radio .cbr-state{background:#fff}.cbr-replaced.cbr-danger .cbr-state{background:#cc3f44;border-color:#cc3f44}.cbr-replaced.cbr-danger.cbr-checked span{background-image:url(../images/ok-white-full.png)}.cbr-replaced.cbr-danger.cbr-checked.cbr-radio .cbr-state span{background:#cc3f44}.cbr-replaced.cbr-danger.cbr-radio .cbr-state{background:#fff}.cbr-replaced.cbr-warning .cbr-state{background:#ffba00;border-color:#ffba00}.cbr-replaced.cbr-warning.cbr-checked span{background-image:url(../images/ok-white-full.png)}.cbr-replaced.cbr-warning.cbr-checked.cbr-radio .cbr-state span{background:#ffba00}.cbr-replaced.cbr-warning.cbr-radio .cbr-state{background:#fff}.cbr-replaced.cbr-red .cbr-state{background:#d5080f;border-color:#d5080f}.cbr-replaced.cbr-red.cbr-checked span{background-image:url(../images/ok-white-full.png)}.cbr-replaced.cbr-red.cbr-checked.cbr-radio .cbr-state span{background:#d5080f}.cbr-replaced.cbr-red.cbr-radio .cbr-state{background:#fff}.cbr-replaced.cbr-blue .cbr-state{background:#0e62c7;border-color:#0e62c7}.cbr-replaced.cbr-blue.cbr-checked span{background-image:url(../images/ok-white-full.png)}.cbr-replaced.cbr-blue.cbr-checked.cbr-radio .cbr-state span{background:#0e62c7}.cbr-replaced.cbr-blue.cbr-radio .cbr-state{background:#fff}.cbr-replaced.cbr-purple .cbr-state{background:#7c38bc;border-color:#7c38bc}.cbr-replaced.cbr-purple.cbr-checked span{background-image:url(../images/ok-white-full.png)}.cbr-replaced.cbr-purple.cbr-checked.cbr-radio .cbr-state span{background:#7c38bc}.cbr-replaced.cbr-purple.cbr-radio .cbr-state{background:#fff}.cbr-replaced.cbr-pink .cbr-state{background:#ff6264;border-color:#ff6264}.cbr-replaced.cbr-pink.cbr-checked span{background-image:url(../images/ok-white-full.png)}.cbr-replaced.cbr-pink.cbr-checked.cbr-radio .cbr-state span{background:#ff6264}.cbr-replaced.cbr-pink.cbr-radio .cbr-state{background:#fff}.cbr-replaced.cbr-orange .cbr-state{background:#f7aa47;border-color:#f7aa47}.cbr-replaced.cbr-orange.cbr-checked span{background-image:url(../images/ok-white-full.png)}.cbr-replaced.cbr-orange.cbr-checked.cbr-radio .cbr-state span{background:#f7aa47}.cbr-replaced.cbr-orange.cbr-radio .cbr-state{background:#fff}.cbr-replaced.cbr-turquoise .cbr-state{background:#00b19d;border-color:#00b19d}.cbr-replaced.cbr-turquoise.cbr-checked span{background-image:url(../images/ok-white-full.png)}.cbr-replaced.cbr-turquoise.cbr-checked.cbr-radio .cbr-state span{background:#00b19d}.cbr-replaced.cbr-turquoise.cbr-radio .cbr-state{background:#fff}.cbr-replaced.cbr-yellow .cbr-state{background:#fcd036;border-color:#fcd036}.cbr-replaced.cbr-yellow.cbr-checked span{background-image:url(../images/ok-white-full.png)}.cbr-replaced.cbr-yellow.cbr-checked.cbr-radio .cbr-state span{background:#fcd036}.cbr-replaced.cbr-yellow.cbr-radio .cbr-state{background:#fff}.cbr-replaced.cbr-gray .cbr-state{background:#c8c8c8;border-color:#c8c8c8}.cbr-replaced.cbr-gray.cbr-checked span{background-image:url(../images/ok-white-full.png)}.cbr-replaced.cbr-gray.cbr-checked.cbr-radio .cbr-state span{background:#c8c8c8}.cbr-replaced.cbr-gray.cbr-radio .cbr-state{background:#fff}.cbr-replaced.cbr-gray.cbr-checked span{background-image:url(../images/ok.png)}.cbr-replaced+label{padding-left:5px}label .cbr-replaced{margin-right:4px}label.cbr-inline{padding-top:7px}label.cbr-inline+.cbr-inline{margin-left:10px}.btn{outline:0;border:1px solid transparent;margin-bottom:10px}.btn.text-left{text-align:left}.btn.text-right{text-align:right}.btn:active,.btn:focus{outline:0!important}.btn:active,.btn.active{-webkit-box-shadow:inset 0 0 5px 2px rgba(0,0,0,.08);-moz-box-shadow:inset 0 0 5px 2px rgba(0,0,0,.08);box-shadow:inset 0 0 5px 2px rgba(0,0,0,.08)}.btn+.btn{margin-left:5px}.btn+.btn.btn-block{margin-left:0}.btn.btn-single{margin-bottom:0}.btn.btn-icon{line-height:1}.btn.btn-icon i{vertical-align:middle;display:inline-block;padding:5px 0}.btn.btn-icon span{display:inline-block}.btn.btn-icon-standalone{padding:0;border:0;line-height:1}.btn.btn-icon-standalone i,.btn.btn-icon-standalone span{display:block;padding:12px 12px}.btn.btn-icon-standalone i{border-right:1px solid transparent;float:left}.btn.btn-icon-standalone span{padding-left:55px;padding-right:13px}.btn.btn-icon-standalone.btn-icon-standalone-right i{float:right;border-left:1px solid transparent;border-right:0}.btn.btn-icon-standalone.btn-icon-standalone-right span{padding-left:13px;padding-right:55px}.btn.btn-icon-standalone.btn-lg i,.btn.btn-icon-standalone.btn-lg span{padding:15px 16px}.btn.btn-icon-standalone.btn-lg span{padding-left:75px}.btn.btn-icon-standalone.btn-lg.btn-icon-standalone-right span{padding-left:17px;padding-right:75px}.btn.btn-icon-standalone.btn-sm i,.btn.btn-icon-standalone.btn-sm span{padding:8px 10px}.btn.btn-icon-standalone.btn-sm span{padding-left:50px}.btn.btn-icon-standalone.btn-sm.btn-icon-standalone-right span{padding-left:12px;padding-right:50px}.btn.btn-icon-standalone.btn-xs i,.btn.btn-icon-standalone.btn-xs span{padding:5px 5px}.btn.btn-icon-standalone.btn-xs span{padding-left:34px}.btn.btn-icon-standalone.btn-xs.btn-icon-standalone-right span{padding-left:10px;padding-right:34px}.btn.btn-secondary{background-color:#68b828;color:#fff}.btn.btn-secondary:hover{background-color:#5ca323;text-color:#fff}.btn.btn-secondary:active,.btn.btn-secondary:focus{background-color:#5ca323;border-color:#579b22}.btn.btn-purple{background-color:#7c38bc;color:#fff}.btn.btn-purple:hover{background-color:#6f32a8;text-color:#fff}.btn.btn-purple:active,.btn.btn-purple:focus{background-color:#6f32a8;border-color:#6a30a0}.btn.btn-orange{background-color:#f7aa47;color:#fff}.btn.btn-orange:hover{background-color:#f69f2f;text-color:#fff}.btn.btn-orange:active,.btn.btn-orange:focus{background-color:#f69f2f;border-color:#f69a25}.btn.btn-pink{background-color:#ff6264;color:#fff}.btn.btn-pink:hover{background-color:#ff484b;text-color:#fff}.btn.btn-pink:active,.btn.btn-pink:focus{background-color:#ff484b;border-color:#ff3e41}.btn.btn-turquoise{background-color:#00b19d;color:#fff}.btn.btn-turquoise:hover{background-color:#009886;text-color:#fff}.btn.btn-turquoise:active,.btn.btn-turquoise:focus{background-color:#009886;border-color:#008d7d}.btn.btn-blue{background-color:#0e62c7;color:#fff}.btn.btn-blue:hover{background-color:#0c56af;text-color:#fff}.btn.btn-blue:active,.btn.btn-blue:focus{background-color:#0c56af;border-color:#0c52a6}.btn.btn-red{background-color:#d5080f;color:#fff}.btn.btn-red:hover{background-color:#bc070d;text-color:#fff}.btn.btn-red:active,.btn.btn-red:focus{background-color:#bc070d;border-color:#b3070d}.btn.btn-gray{background-color:#eee;color:#333}.btn.btn-gray:hover{background-color:#e1e1e1;text-color:#333}.btn.btn-gray:active,.btn.btn-gray:focus{background-color:#e1e1e1;border-color:#dcdcdc}.btn.btn-black{background-color:#222;color:#fff}.btn.btn-black:hover{background-color:#151515;text-color:#fff}.btn.btn-black:active,.btn.btn-black:focus{background-color:#151515;border-color:#101010}.btn.btn-black:hover{background-color:#3c3c3c}.btn.btn-white{background-color:#fff;color:#333;border:1px solid #ddd}.btn.btn-white:hover{background-color:#f2f2f2;text-color:#333}.btn.btn-white:active,.btn.btn-white:focus{background-color:#f2f2f2;border-color:#ededed}.btn.btn-primary.btn-icon-standalone i{background-color:#383b3c;border-right-color:#454849}.btn.btn-primary.btn-icon-standalone.btn-icon-standalone-right i{border-left-color:#454849}.btn.btn-primary.btn-icon-standalone.btn-icon-standalone-right:hover i{border-left-color:#1d1f1f}.btn.btn-primary.btn-icon-standalone:hover i{border-right-color:#1d1f1f}.btn.btn-secondary.btn-icon-standalone i{background-color:#63b026;border-right-color:#5fa724}.btn.btn-secondary.btn-icon-standalone.btn-icon-standalone-right i{border-left-color:#5fa724}.btn.btn-secondary.btn-icon-standalone.btn-icon-standalone-right:hover i{border-left-color:#5a9f23}.btn.btn-secondary.btn-icon-standalone:hover i{border-right-color:#5a9f23}.btn.btn-info.btn-icon-standalone i{background-color:#2eb4e8;border-right-color:#1baee6}.btn.btn-info.btn-icon-standalone.btn-icon-standalone-right i{border-left-color:#1baee6}.btn.btn-info.btn-icon-standalone.btn-icon-standalone-right:hover i{border-left-color:#24b1e7}.btn.btn-info.btn-icon-standalone:hover i{border-right-color:#24b1e7}.btn.btn-danger.btn-icon-standalone i{background-color:#c33439;border-right-color:#b32f34}.btn.btn-danger.btn-icon-standalone.btn-icon-standalone-right i{border-left-color:#b32f34}.btn.btn-danger.btn-icon-standalone.btn-icon-standalone-right:hover i{border-left-color:#bb3236}.btn.btn-danger.btn-icon-standalone:hover i{border-right-color:#bb3236}.btn.btn-warning.btn-icon-standalone i{background-color:#f0af00;border-right-color:#e6a700}.btn.btn-warning.btn-icon-standalone.btn-icon-standalone-right i{border-left-color:#e6a700}.btn.btn-warning.btn-icon-standalone.btn-icon-standalone-right:hover i{border-left-color:#e0a400}.btn.btn-warning.btn-icon-standalone:hover i{border-right-color:#e0a400}.btn.btn-red.btn-icon-standalone i{background-color:#c1070e;border-right-color:#b8070d}.btn.btn-red.btn-icon-standalone.btn-icon-standalone-right i{border-left-color:#b8070d}.btn.btn-red.btn-icon-standalone.btn-icon-standalone-right:hover i{border-left-color:#b8070d}.btn.btn-red.btn-icon-standalone:hover i{border-right-color:#b8070d}.btn.btn-purple.btn-icon-standalone i{background-color:#7233ac;border-right-color:#NaNNaNNaN}.btn.btn-purple.btn-icon-standalone.btn-icon-standalone-right i{border-left-color:#NaNNaNNaN}.btn.btn-purple.btn-icon-standalone.btn-icon-standalone-right:hover i{border-left-color:#6c31a4}.btn.btn-purple.btn-icon-standalone:hover i{border-right-color:#6c31a4}.btn.btn-blue.btn-icon-standalone i{background-color:#0d59b4;border-right-color:#0c54aa}.btn.btn-blue.btn-icon-standalone.btn-icon-standalone-right i{border-left-color:#0c54aa}.btn.btn-blue.btn-icon-standalone.btn-icon-standalone-right:hover i{border-left-color:#0c54aa}.btn.btn-blue.btn-icon-standalone:hover i{border-right-color:#0c54aa}.btn.btn-white.btn-icon-standalone i{background-color:#f5f5f5;border-right-color:#e6e6e6}.btn.btn-white.btn-icon-standalone.btn-icon-standalone-right i{border-left-color:#e6e6e6}.btn.btn-white.btn-icon-standalone.btn-icon-standalone-right:hover i{border-left-color:#e0e0e0}.btn.btn-white.btn-icon-standalone:hover i{border-right-color:#e0e0e0}.btn.btn-gray.btn-icon-standalone i{background-color:#e4e4e4;border-right-color:#d5d5d5}.btn.btn-gray.btn-icon-standalone.btn-icon-standalone-right i{border-left-color:#d5d5d5}.btn.btn-gray.btn-icon-standalone.btn-icon-standalone-right:hover i{border-left-color:#cfcfcf}.btn.btn-gray.btn-icon-standalone:hover i{border-right-color:#cfcfcf}.btn.btn-black.btn-icon-standalone i{background-color:#2f2f2f;border-right-color:#3c3c3c}.btn.btn-black.btn-icon-standalone.btn-icon-standalone-right i{border-left-color:#3c3c3c}.btn.btn-black.btn-icon-standalone.btn-icon-standalone-right:hover i{border-left-color:#414141}.btn.btn-black.btn-icon-standalone:hover i{border-right-color:#414141}.btn-group .btn.btn-purple:hover{border-color:#552681}.btn-group .btn.btn-red:hover{border-color:#8b050a}.btn-group .btn.btn-blue:hover{border-color:#093f80}.btn-group .btn.btn-white:hover{border-color:#d9d9d9}.btn-group .btn.btn-gray:hover{border-color:#c8c8c8}.btn-group .btn.btn-black:hover{border-color:#484848}.btn-unstyled{margin:0;padding:0;background:0 0;border:0;height:auto;line-height:1}.btn-unstyled:active,.btn-unstyled:focus{background:0 0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.dropdown-menu.no-spacing{margin-top:-10px}.dropdown-menu.dropdown-primary{background:#2c2e2f;border-color:#2c2e2f}.dropdown-menu.dropdown-primary .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#454849}.dropdown-menu.dropdown-primary>li>a{color:#fff}.dropdown-menu.dropdown-primary>li>a:hover{background-color:#454849}.dropdown-menu.dropdown-secondary{background:#68b828;border-color:#68b828}.dropdown-menu.dropdown-secondary .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#5ca323}.dropdown-menu.dropdown-secondary>li>a{color:#fff}.dropdown-menu.dropdown-secondary>li>a:hover{background-color:#5ca323}.dropdown-menu.dropdown-info{background:#40bbea;border-color:#40bbea}.dropdown-menu.dropdown-info .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#1baee6}.dropdown-menu.dropdown-info>li>a{color:#fff}.dropdown-menu.dropdown-info>li>a:hover{background-color:#1baee6}.dropdown-menu.dropdown-success{background:#8dc63f;border-color:#8dc63f}.dropdown-menu.dropdown-success .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#80b636}.dropdown-menu.dropdown-success>li>a{color:#fff}.dropdown-menu.dropdown-success>li>a:hover{background-color:#80b636}.dropdown-menu.dropdown-warning{background:#ffba00;border-color:#ffba00}.dropdown-menu.dropdown-warning .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e6a700}.dropdown-menu.dropdown-warning>li>a{color:#fff}.dropdown-menu.dropdown-warning>li>a:hover{background-color:#e6a700}.dropdown-menu.dropdown-danger{background:#cc3f44;border-color:#cc3f44}.dropdown-menu.dropdown-danger .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#b32f34}.dropdown-menu.dropdown-danger>li>a{color:#fff}.dropdown-menu.dropdown-danger>li>a:hover{background-color:#b32f34}.dropdown-menu.dropdown-red{background:#d5080f;border-color:#d5080f}.dropdown-menu.dropdown-red .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#bc070d}.dropdown-menu.dropdown-red>li>a{color:#fff}.dropdown-menu.dropdown-red>li>a:hover{background-color:#bc070d}.dropdown-menu.dropdown-purple{background:#7c38bc;border-color:#7c38bc}.dropdown-menu.dropdown-purple .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#672f9d}.dropdown-menu.dropdown-purple>li>a{color:#fff}.dropdown-menu.dropdown-purple>li>a:hover{background-color:#672f9d}.dropdown-menu.dropdown-blue{background:#0e62c7;border-color:#0e62c7}.dropdown-menu.dropdown-blue .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#0b4fa1}.dropdown-menu.dropdown-blue>li>a{color:#fff}.dropdown-menu.dropdown-blue>li>a:hover{background-color:#0b4fa1}.dropdown-menu.dropdown-black{background:#222;border-color:#222}.dropdown-menu.dropdown-black .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#363636}.dropdown-menu.dropdown-black>li>a{color:#fff}.dropdown-menu.dropdown-black>li>a:hover{background-color:#363636}.dropdown-menu.dropdown-white.no-spacing{margin-top:-11px}.nav.nav-tabs{border-bottom:0}.nav.nav-tabs>li{display:inline-block;float:none;margin-bottom:0}.nav.nav-tabs>li>a{border:none;background-color:#f4f4f4;margin-right:5px;padding-left:20px;padding-right:20px;cursor:pointer}.nav.nav-tabs>li>a:hover{border:none;background-color:#fff}.nav.nav-tabs>li.active>a{border:0;background-color:#fff}.nav.nav-tabs.right-aligned,.right-aligned .nav.nav-tabs{text-align:right}.nav.nav-tabs.right-aligned>li,.right-aligned .nav.nav-tabs>li{float:none;display:inline-block}.nav.nav-tabs.right-aligned>li>a,.right-aligned .nav.nav-tabs>li>a{margin-right:0;margin-left:5px}.nav.nav-tabs.nav-tabs-justified,.nav-tabs-justified .nav.nav-tabs{display:table;width:100%;table-layout:fixed;border-collapse:separate}.nav.nav-tabs.nav-tabs-justified:before,.nav-tabs-justified .nav.nav-tabs:before,.nav.nav-tabs.nav-tabs-justified:after,.nav-tabs-justified .nav.nav-tabs:after{display:none}.nav.nav-tabs.nav-tabs-justified>li,.nav-tabs-justified .nav.nav-tabs>li{display:table-cell;vertical-align:top;width:1%;text-align:center}.nav.nav-tabs.nav-tabs-justified>li:last-child>a,.nav-tabs-justified .nav.nav-tabs>li:last-child>a{margin-right:0}.nav.nav-tabs+.tab-content{background:#FFF;padding:30px;margin-bottom:30px}.nav.nav-tabs+.tab-content>p:last-child,.nav.nav-tabs+.tab-content *>p:last-child{margin-bottom:0}.panel-group .panel .panel-heading{padding-bottom:0;border-bottom:0}.panel-group .panel .panel-heading .panel-title{float:none}.panel-group .panel .panel-heading a[data-toggle=collapse],.panel-group .panel .panel-heading .accordion-toggle{display:block}.panel-group .panel .panel-heading a[data-toggle=collapse]:before,.panel-group .panel .panel-heading .accordion-toggle:before{float:right;display:block;content:'–';font-size:18px;width:25px;text-align:right}.panel-group .panel .panel-heading a[data-toggle=collapse].collapsed:before,.panel-group .panel .panel-heading .accordion-toggle.collapsed:before{content:'+'}.panel-group .panel .panel-heading .accordion-toggle{cursor:pointer}.panel-group .panel .panel-heading .accordion-toggle:before{content:'+'}.panel-group .panel .panel-heading+.panel-collapse .panel-body{border-top:2px solid #f5f5f5;margin-top:15px}.panel-group.panel-group-joined,.panel-group-joined .panel-group{border:1px solid #ddd}.panel-group.panel-group-joined .panel .panel-collapse .panel-body,.panel-group-joined .panel-group .panel .panel-collapse .panel-body{border-top:0;padding-top:0}.panel-group.panel-group-joined .panel+.panel,.panel-group-joined .panel-group .panel+.panel{margin-top:0;border-top:1px solid #ddd}.panel.expanded .accordion-toggle:before{content:'–'!important}.tabs-vertical-env{display:table;margin-bottom:30px;width:100%}.tabs-vertical-env .nav.tabs-vertical,.tabs-vertical-env .tab-content{display:table-cell;vertical-align:top}.tabs-vertical-env .nav.tabs-vertical{min-width:120px;width:150px}.tabs-vertical-env .nav.tabs-vertical li>a{background-color:#f4f4f4;margin-bottom:5px;text-align:center;white-space:nowrap}.tabs-vertical-env .nav.tabs-vertical li.active>a{background-color:#fff}.tabs-vertical-env .nav.tabs-vertical li:last-child{padding-bottom:20px}.tabs-vertical-env .tab-content{padding:30px;background:#FFF}.tabs-vertical-env .tab-content *>p:last-child{margin-bottom:0}.tabs-vertical-env.tabs-vertical-bordered .tab-content,.tabs-vertical-env.tabs-vertical-bordered .nav.tabs-vertical>li>a{border:1px solid #ddd}.tabs-vertical-env.tabs-vertical-bordered .nav.tabs-vertical{position:relative;right:-1px}.tabs-vertical-env.tabs-vertical-bordered .nav.tabs-vertical>li.active>a{border-right-color:#fff}.tabs-vertical-env.tabs-vertical-bordered.right-aligned .nav.tabs-vertical{right:1px}.tabs-vertical-env.tabs-vertical-bordered.right-aligned .nav.tabs-vertical>li.active>a{border-left-color:#fff;border-right-color:#ddd}.label{position:relative}.label.pull-right{margin-top:4px}.label.pull-left{margin-top:4px;margin-right:5px}.label.label-primary{background-color:#2c2e2f;color:#fff}.label.label-secondary{background-color:#68b828;color:#fff}.label.label-success{background-color:#8dc63f;color:#fff}.label.label-danger{background-color:#cc3f44;color:#fff}.label.label-info{background-color:#40bbea;color:#fff}.label.label-warning{background-color:#ffba00;color:#fff}.label.label-red{background-color:#d5080f;color:#fff}.label.label-purple{background-color:#7c38bc;color:#fff}.label.label-pink{background-color:#ff6264;color:#fff}.label.label-yellow{background-color:#fcd036;color:#fff}.label.label-orange{background-color:#f7aa47;color:#fff}.label.label-turquoise{background-color:#00b19d;color:#fff}.label.label-blue{background-color:#0e62c7;color:#fff}.label.label-black{background-color:#222;color:#fff}.label.label-white{color:#333;-webkit-box-shadow:0 0 0 1px #ddd;-moz-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}.line-height-default li{line-height:1.85}.popover+.btn,.tooltip+.btn{margin-left:5px}.popover{padding:0;border:1px solid #ddd;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.popover.popover-primary .popover-title{background-color:#2c2e2f;color:#FFF;position:relative}.popover.popover-primary.top .popover-title,.popover.popover-primary.bottom .popover-title{margin:-1px}.popover.popover-primary.bottom .arrow:after{border-bottom-color:#2c2e2f}.popover.popover-secondary .popover-title{background-color:#68b828;color:#FFF;position:relative}.popover.popover-secondary.top .popover-title,.popover.popover-secondary.bottom .popover-title{margin:-1px}.popover.popover-secondary.bottom .arrow:after{border-bottom-color:#68b828}.popover.popover-info .popover-title{background-color:#40bbea;color:#FFF;position:relative}.popover.popover-info.top .popover-title,.popover.popover-info.bottom .popover-title{margin:-1px}.popover.popover-info.bottom .arrow:after{border-bottom-color:#40bbea}.popover.popover-warning .popover-title{background-color:#ffba00;color:#FFF;position:relative}.popover.popover-warning.top .popover-title,.popover.popover-warning.bottom .popover-title{margin:-1px}.popover.popover-warning.bottom .arrow:after{border-bottom-color:#ffba00}.popover.popover-danger .popover-title{background-color:#cc3f44;color:#FFF;position:relative}.popover.popover-danger.top .popover-title,.popover.popover-danger.bottom .popover-title{margin:-1px}.popover.popover-danger.bottom .arrow:after{border-bottom-color:#cc3f44}.popover.popover-success .popover-title{background-color:#8dc63f;color:#FFF;position:relative}.popover.popover-success.top .popover-title,.popover.popover-success.bottom .popover-title{margin:-1px}.popover.popover-success.bottom .arrow:after{border-bottom-color:#8dc63f}.popover.popover-purple .popover-title{background-color:#7c38bc;color:#FFF;position:relative}.popover.popover-purple.top .popover-title,.popover.popover-purple.bottom .popover-title{margin:-1px}.popover.popover-purple.bottom .arrow:after{border-bottom-color:#7c38bc}.popover.popover-blue .popover-title{background-color:#0e62c7;color:#FFF;position:relative}.popover.popover-blue.top .popover-title,.popover.popover-blue.bottom .popover-title{margin:-1px}.popover.popover-blue.bottom .arrow:after{border-bottom-color:#0e62c7}.popover.popover-red .popover-title{background-color:#d5080f;color:#FFF;position:relative}.popover.popover-red.top .popover-title,.popover.popover-red.bottom .popover-title{margin:-1px}.popover.popover-red.bottom .arrow:after{border-bottom-color:#d5080f}.popover.popover-black .popover-title{background-color:#0e62c7;color:#FFF;position:relative}.popover.popover-black.top .popover-title,.popover.popover-black.bottom .popover-title{margin:-1px}.popover.popover-black.bottom .arrow:after{border-bottom-color:#0e62c7}.tooltip .tooltip-inner{padding:10px 15px}.tooltip.tooltip-primary .tooltip-inner{background-color:#2c2e2f}.tooltip.tooltip-primary.top .tooltip-arrow{border-top-color:#2c2e2f}.tooltip.tooltip-primary.bottom .tooltip-arrow{border-bottom-color:#2c2e2f}.tooltip.tooltip-primary.left .tooltip-arrow{border-left-color:#2c2e2f}.tooltip.tooltip-primary.right .tooltip-arrow{border-right-color:#2c2e2f}.tooltip.tooltip-secondary .tooltip-inner{background-color:#68b828}.tooltip.tooltip-secondary.top .tooltip-arrow{border-top-color:#68b828}.tooltip.tooltip-secondary.bottom .tooltip-arrow{border-bottom-color:#68b828}.tooltip.tooltip-secondary.left .tooltip-arrow{border-left-color:#68b828}.tooltip.tooltip-secondary.right .tooltip-arrow{border-right-color:#68b828}.tooltip.tooltip-info .tooltip-inner{background-color:#40bbea}.tooltip.tooltip-info.top .tooltip-arrow{border-top-color:#40bbea}.tooltip.tooltip-info.bottom .tooltip-arrow{border-bottom-color:#40bbea}.tooltip.tooltip-info.left .tooltip-arrow{border-left-color:#40bbea}.tooltip.tooltip-info.right .tooltip-arrow{border-right-color:#40bbea}.tooltip.tooltip-warning .tooltip-inner{background-color:#ffba00}.tooltip.tooltip-warning.top .tooltip-arrow{border-top-color:#ffba00}.tooltip.tooltip-warning.bottom .tooltip-arrow{border-bottom-color:#ffba00}.tooltip.tooltip-warning.left .tooltip-arrow{border-left-color:#ffba00}.tooltip.tooltip-warning.right .tooltip-arrow{border-right-color:#ffba00}.tooltip.tooltip-danger .tooltip-inner{background-color:#cc3f44}.tooltip.tooltip-danger.top .tooltip-arrow{border-top-color:#cc3f44}.tooltip.tooltip-danger.bottom .tooltip-arrow{border-bottom-color:#cc3f44}.tooltip.tooltip-danger.left .tooltip-arrow{border-left-color:#cc3f44}.tooltip.tooltip-danger.right .tooltip-arrow{border-right-color:#cc3f44}.tooltip.tooltip-success .tooltip-inner{background-color:#8dc63f}.tooltip.tooltip-success.top .tooltip-arrow{border-top-color:#8dc63f}.tooltip.tooltip-success.bottom .tooltip-arrow{border-bottom-color:#8dc63f}.tooltip.tooltip-success.left .tooltip-arrow{border-left-color:#8dc63f}.tooltip.tooltip-success.right .tooltip-arrow{border-right-color:#8dc63f}.tooltip.tooltip-purple .tooltip-inner{background-color:#7c38bc}.tooltip.tooltip-purple.top .tooltip-arrow{border-top-color:#7c38bc}.tooltip.tooltip-purple.bottom .tooltip-arrow{border-bottom-color:#7c38bc}.tooltip.tooltip-purple.left .tooltip-arrow{border-left-color:#7c38bc}.tooltip.tooltip-purple.right .tooltip-arrow{border-right-color:#7c38bc}.tooltip.tooltip-blue .tooltip-inner{background-color:#0e62c7}.tooltip.tooltip-blue.top .tooltip-arrow{border-top-color:#0e62c7}.tooltip.tooltip-blue.bottom .tooltip-arrow{border-bottom-color:#0e62c7}.tooltip.tooltip-blue.left .tooltip-arrow{border-left-color:#0e62c7}.tooltip.tooltip-blue.right .tooltip-arrow{border-right-color:#0e62c7}.tooltip.tooltip-red .tooltip-inner{background-color:#d5080f}.tooltip.tooltip-red.top .tooltip-arrow{border-top-color:#d5080f}.tooltip.tooltip-red.bottom .tooltip-arrow{border-bottom-color:#d5080f}.tooltip.tooltip-red.left .tooltip-arrow{border-left-color:#d5080f}.tooltip.tooltip-red.right .tooltip-arrow{border-right-color:#d5080f}.tooltip.tooltip-black .tooltip-inner{background-color:#0e62c7}.tooltip.tooltip-black.top .tooltip-arrow{border-top-color:#0e62c7}.tooltip.tooltip-black.bottom .tooltip-arrow{border-bottom-color:#0e62c7}.tooltip.tooltip-black.left .tooltip-arrow{border-left-color:#0e62c7}.tooltip.tooltip-black.right .tooltip-arrow{border-right-color:#0e62c7}blockquote small{margin-top:10px;display:block}.blockquote{position:relative;padding:20px 30px;background:#fff;border:1px solid #ddd}.blockquote:before{content:'';display:block;position:absolute;left:0;top:0;bottom:0;width:6px;background:#f7f7f7}.blockquote.blockquote-blue{border:1px solid #0e62c7}.blockquote.blockquote-blue:before{background:rgba(14,98,199,.1)}.blockquote.blockquote-blue strong{color:#0e62c7}.blockquote.blockquote-red{border:1px solid #d5080f}.blockquote.blockquote-red:before{background:rgba(213,8,15,.1)}.blockquote.blockquote-red strong{color:#d5080f}.blockquote.blockquote-success{border:1px solid #8dc63f}.blockquote.blockquote-success:before{background:rgba(141,198,63,.1)}.blockquote.blockquote-success strong{color:#8dc63f}.blockquote.blockquote-warning{border:1px solid #ffba00}.blockquote.blockquote-warning:before{background:rgba(255,186,0,.1)}.blockquote.blockquote-warning strong{color:#ffba00}.blockquote.blockquote-info{border:1px solid #40bbea}.blockquote.blockquote-info:before{background:rgba(64,187,234,.1)}.blockquote.blockquote-info strong{color:#40bbea}.blockquote.blockquote-danger{border:1px solid #cc3f44}.blockquote.blockquote-danger:before{background:rgba(204,63,68,.1)}.blockquote.blockquote-danger strong{color:#cc3f44}.blockquote.blockquote-purple{border:1px solid #7c38bc}.blockquote.blockquote-purple:before{background:rgba(124,56,188,.1)}.blockquote.blockquote-purple strong{color:#7c38bc}.blockquote.blockquote-black{border:1px solid #222}.blockquote.blockquote-black:before{background:rgba(34,34,34,.1)}.blockquote.blockquote-black strong{color:#222}.modal .modal-dialog .modal-content{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-color:#f5f5f5;padding:30px}.modal .modal-dialog .modal-content .modal-header{margin:0;padding:0;border-bottom-width:2px;padding-bottom:15px}.modal .modal-dialog .modal-content .modal-header .close{outline:0}.modal .modal-dialog .modal-content .modal-body{padding:20px 0}.modal .modal-dialog .modal-content .modal-footer{padding:0;padding-top:15px}.modal .modal-dialog .modal-content .modal-footer .btn{margin-bottom:0}.modal.scale .modal-dialog{zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-o-transform:scale(0.8);-ms-transform:scale(0.8);transform:scale(0.8);-webkit-transition:all 1000ms ease-in-out;-moz-transition:all 1000ms ease-in-out;-o-transition:all 1000ms ease-in-out;transition:all 1000ms ease-in-out;-webkit-transform-origin:center bottom;-moz-transform-origin:center bottom;-o-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom}.modal.scale.in .modal-dialog{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.table.table-bordered{border-color:#eee}.table.table-bordered>thead>tr>td,.table.table-bordered>tbody>tr>td,.table.table-bordered>tfood>tr>td,.table.table-bordered>thead>tr>th,.table.table-bordered>tbody>tr>th,.table.table-bordered>tfood>tr>th{border-color:#eee}.table>thead>tr>td,.table>tbody>tr>td,.table>tfood>tr>td,.table>thead>tr>th,.table>tbody>tr>th,.table>tfood>tr>th{padding:12px 15px}.text-center.table>thead>tr>td,.text-center.table>tbody>tr>td,.text-center.table>tfood>tr>td,.text-center.table>thead>tr>th,.text-center.table>tbody>tr>th,.text-center.table>tfood>tr>th{text-align:center!important}.middle-align.table>thead>tr>td,.middle-align.table>tbody>tr>td,.middle-align.table>tfood>tr>td,.middle-align.table>thead>tr>th,.middle-align.table>tbody>tr>th,.middle-align.table>tfood>tr>th{vertical-align:middle}.table>thead>tr>td.middle-align,.table>tbody>tr>td.middle-align,.table>tfood>tr>td.middle-align,.table>thead>tr>th.middle-align,.table>tbody>tr>th.middle-align,.table>tfood>tr>th.middle-align{vertical-align:middle}.table>thead>tr.no-borders>td,.table>tbody>tr.no-borders>td,.table>tfood>tr.no-borders>td,.table>thead>tr.no-borders>th,.table>tbody>tr.no-borders>th,.table>tfood>tr.no-borders>th{border-left:0;border-right:0}.table>thead>tr>td,.table>thead>tr>th{position:relative;border-bottom:1px solid #eee;color:#2c2e2f}.table>thead>tr>td:after,.table>thead>tr>th:after{content:'';display:block;position:absolute;left:0;right:0;bottom:1px;height:1px;background-color:#eee}.table>tbody>tr>td,.table>tfoot>tr>td,.table>tbody>tr>th,.table>tfoot>tr>th{border-top:0;border-bottom:1px solid #eee}.table>tbody>tr>td .progress,.table>tfoot>tr>td .progress,.table>tbody>tr>th .progress,.table>tfoot>tr>th .progress,.table>tbody>tr>td .btn,.table>tfoot>tr>td .btn,.table>tbody>tr>th .btn,.table>tfoot>tr>th .btn{margin-bottom:0}.table>tfoot>tr>td,.table>tfoot>tr>th{border-left:0;border-bottom:0;border-top:1px solid #eee;padding:12px 15px;position:relative;color:#2c2e2f}.table>tfoot>tr>td:after,.table>tfoot>tr>th:after{content:'';display:block;position:absolute;left:0;right:0;top:1px;height:1px;background-color:#eee}.table.table-condensed>thead>tr>td,.table.table-condensed>tbody>tr>td,.table.table-condensed>tfoot>tr>td,.table.table-condensed>thead>tr>th,.table.table-condensed>tbody>tr>th,.table.table-condensed>tfoot>tr>th{padding:5px 8px}.table.table-model-2>thead>tr{background:#f6f6f6}.table.table-model-2>thead>tr>td:after,.table.table-model-2>thead>tr>th:after{display:none}.table.table-model-2>thead>tr>td,.table.table-model-2>tbody>tr>td,.table.table-model-2>tfood>tr>td,.table.table-model-2>thead>tr>th,.table.table-model-2>tbody>tr>th,.table.table-model-2>tfood>tr>th{border-color:#ddd}.table.table-model-2.table-bordered{border-color:#ddd}.table tbody.middle-align>tr>th,.table tbody.middle-align>tr>td{vertical-align:middle}.panel>.table>thead>tr>td:after,.panel>.table>thead>tr>th:after{display:none}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{padding-bottom:5px}.dataTables_wrapper .dataTables_filter .form-control{margin-left:10px}.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{padding-top:10px}.dataTables_wrapper .DTTT_container{float:right;border:1px solid #eee;position:relative;margin-top:-2px;margin-left:20px}.dataTables_wrapper .DTTT_container+.dataTables_filter{float:right}.dataTables_wrapper .DTTT_container .DTTT_button{position:relative;display:block;float:left;padding:7px 10px}.dataTables_wrapper .DTTT_container .DTTT_button span{position:relative;z-index:100;cursor:pointer}.dataTables_wrapper .DTTT_container .DTTT_button:hover{background:#f5f5f5}.dataTables_wrapper .DTTT_container .DTTT_button:hover div{background:#f5f5f5}.dataTables_wrapper .DTTT_container .DTTT_button+.DTTT_button{border-left:1px solid #eee}.dataTables_wrapper table.dataTable thead>tr>th{padding-left:15px;padding-right:15px}.dataTables_wrapper tr.replace-inputs>th,.dataTables_wrapper tr.replace-inputs>td{vertical-align:top}.dataTables_wrapper tr .dataTables_empty{border-bottom:1px solid #eee}.dataTables_wrapper tr .yadcf-filter-wrapper{position:relative;margin-top:10px;border-top:1px solid #eee;margin-left:-15px;margin-right:-15px;display:block;padding:10px 15px;padding-bottom:0}.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter-reset-button{margin:0;padding:0;background:0 0;border:0;height:auto;position:absolute;top:0;right:0;padding:2px 5px;padding-top:0;background:#f5f5f5;color:#979898;line-height:1;font-weight:400;font-size:11px;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0)}.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter-reset-button:active,.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter-reset-button:focus{background:0 0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.dataTables_wrapper tr .yadcf-filter-wrapper:hover .yadcf-filter-reset-button{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter{display:block;width:100%;margin:0}.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter[type=text]{background:#fff;border:1px solid #e4e4e4;font-weight:400;outline:0;padding:0 10px;height:30px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter-wrapper-inner{display:table;width:100%}.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter-wrapper-inner .yadcf-filter-range{display:table-cell;width:100%;background:#fff;border:1px solid #e4e4e4;font-weight:400;outline:0;padding:0 5px;height:32px;text-align:center;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter-wrapper-inner .yadcf-filter-range-number-seperator{padding:0 5px;display:table-cell;width:10%}.dataTables_wrapper tr .yadcf-filter-wrapper .yadcf-filter-wrapper-inner .yadcf-filter-range-number-seperator:after{content:'–';color:#979898;font-size:11px;font-weight:400}.dataTables_wrapper .table thead>tr .sorting,.dataTables_wrapper .table thead>tr .sorting_asc,.dataTables_wrapper .table thead>tr .sorting_desc{background:0 0}.dataTables_wrapper .table thead>tr .sorting:before,.dataTables_wrapper .table thead>tr .sorting_asc:before,.dataTables_wrapper .table thead>tr .sorting_desc:before{font-family:fontawesome;content:'\f0dc';float:right;display:block;zoom:1;-webkit-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:alpha(Opacity=50);filter:alpha(opacity=50)}.dataTables_wrapper .table thead>tr .sorting_asc:before{content:'\f0de'}.dataTables_wrapper .table thead>tr .sorting_desc:before{content:'\f0dd'}.dataTables_wrapper .table thead>tr .no-sorting:before{display:none}.form-horizontal .control-label{text-align:right}.form-horizontal>.form-group:last-child{margin-bottom:0}input.form-control.form-focus-primary:focus{border-color:rgba(44,46,47,.6);outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(44,46,47,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(44,46,47,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(44,46,47,.6)}input.form-control.form-focus-primary:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input.form-control.form-focus-warning:focus{border-color:rgba(255,186,0,.6);outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(255,186,0,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(255,186,0,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(255,186,0,.6)}input.form-control.form-focus-warning:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input.form-control.form-focus-danger:focus{border-color:rgba(204,63,68,.6);outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(204,63,68,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(204,63,68,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(204,63,68,.6)}input.form-control.form-focus-danger:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input.form-control.form-focus-success:focus{border-color:rgba(141,198,63,.6);outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(141,198,63,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(141,198,63,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(141,198,63,.6)}input.form-control.form-focus-success:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input.form-control.form-focus-info:focus{border-color:rgba(64,187,234,.6);outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(64,187,234,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(64,187,234,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(64,187,234,.6)}input.form-control.form-focus-info:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input.form-control.form-focus-purple:focus{border-color:rgba(124,56,188,.6);outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(124,56,188,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(124,56,188,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(124,56,188,.6)}input.form-control.form-focus-purple:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input.form-control.form-focus-red:focus{border-color:rgba(213,8,15,.6);outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(213,8,15,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(213,8,15,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(213,8,15,.6)}input.form-control.form-focus-red:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input.form-control.form-focus-blue:focus{border-color:rgba(14,98,199,.6);outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(14,98,199,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(14,98,199,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(14,98,199,.6)}input.form-control.form-focus-blue:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input.form-control.form-focus-gray:focus{border-color:rgba(200,200,200,.6);outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(200,200,200,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(200,200,200,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(200,200,200,.6)}input.form-control.form-focus-gray:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}form .help-block{color:#979898}form .form-block{padding-top:7px}form .form-group.has-success .help-block,form .form-group.has-success .control-label,form .form-group.has-success .radio,form .form-group.has-success .checkbox,form .form-group.has-success .radio-inline,form .form-group.has-success .checkbox-inline{color:#8dc63f}form .form-group.has-success .form-control{border-color:rgba(141,198,63,.4);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}form .form-group.has-success .form-control:focus{border-color:#8dc63f}form .form-group.has-success .input-group-addon{color:#8dc63f;border-color:rgba(141,198,63,.4)}form .form-group.has-success .form-control-feedback{color:#8dc63f}form .form-group.has-warning .help-block,form .form-group.has-warning .control-label,form .form-group.has-warning .radio,form .form-group.has-warning .checkbox,form .form-group.has-warning .radio-inline,form .form-group.has-warning .checkbox-inline{color:#ffba00}form .form-group.has-warning .form-control{border-color:rgba(255,186,0,.6);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}form .form-group.has-warning .form-control:focus{border-color:#ffba00}form .form-group.has-warning .input-group-addon{color:#ffba00;border-color:rgba(255,186,0,.6)}form .form-group.has-warning .form-control-feedback{color:#ffba00}form .form-group.has-error .help-block,form .form-group.has-error .control-label,form .form-group.has-error .radio,form .form-group.has-error .checkbox,form .form-group.has-error .radio-inline,form .form-group.has-error .checkbox-inline{color:#cc3f44}form .form-group.has-error .form-control{border-color:rgba(204,63,68,.4);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}form .form-group.has-error .form-control:focus{border-color:#cc3f44}form .form-group.has-error .input-group-addon{color:#cc3f44;border-color:rgba(204,63,68,.4)}form .form-group.has-error .form-control-feedback{color:#cc3f44}form .form-group.has-info .help-block,form .form-group.has-info .control-label,form .form-group.has-info .radio,form .form-group.has-info .checkbox,form .form-group.has-info .radio-inline,form .form-group.has-info .checkbox-inline{color:#40bbea}form .form-group.has-info .form-control{border-color:rgba(64,187,234,.4);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}form .form-group.has-info .form-control:focus{border-color:#40bbea}form .form-group.has-info .input-group-addon{color:#40bbea;border-color:rgba(64,187,234,.4)}form .form-group.has-info .form-control-feedback{color:#40bbea}form .form-group.validate-has-error .form-control{border-color:#cc3f44;color:#cc3f44}form .form-group.validate-has-error .form-control::-moz-placeholder{color:#cc3f44;opacity:1}form .form-group.validate-has-error .form-control:-ms-input-placeholder{color:#cc3f44}form .form-group.validate-has-error .form-control::-webkit-input-placeholder{color:#cc3f44}form .form-group.validate-has-error .form-control::-webkit-input-placeholder{color:#cc3f44}form .form-group.validate-has-error .form-control:-moz-placeholder{color:#cc3f44}form .form-group.validate-has-error .form-control::-moz-placeholder{color:#cc3f44}form .form-group.validate-has-error .form-control:-ms-input-placeholder{color:#cc3f44}form .form-group.validate-has-error .form-control+span{display:block;padding-top:5px;font-size:12px;color:#cc3f44}form.form-inline .form-group+.form-group{margin-left:5px}form .form-group-separator{height:1px;background:#eee;margin-bottom:15px}label[for]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}label.checkbox-inline input[type=checkbox]{margin-top:2px}label.radio-inline input[type=radio]{margin-top:2px}.radio input[type=radio],.checkbox input[type=checkbox]{margin-top:2px}.input-group .btn{margin-bottom:0}.input-group.input-group-minimal>.form-control:first-child{border-right:0;padding-right:0}.input-group.input-group-minimal .input-group-addon{background:0 0;-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-moz-transition:border-color ease-in-out .15s,-moz-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}.input-group.input-group-minimal .input-group-addon+.form-control{border-left:0;padding-left:0}.input-group.input-group-minimal .input-group-addon+.form-control.no-right-border{padding-right:0}.input-group.input-group-minimal.focused .input-group-addon{border-color:rgba(104,184,40,.5)}nav.navbar{border:0}nav.navbar form>.btn{margin-bottom:0}nav.navbar .navbar-header .navbar-brand{padding-left:30px;padding-right:30px}nav.navbar .navbar-nav li a{padding-left:20px;padding-right:20px}nav.navbar.navbar-inverse .navbar-toggle i{color:#fff}@media print{.sidebar-menu{display:none}.main-content{padding:0!important}.main-content .user-info-navbar,.main-content .page-title,.main-content footer.main-footer{display:none}.main-content>.panel{margin-bottom:0}.main-content>.panel+.panel{margin-top:30px}}.overflow-hidden{overflow:hidden!important}.vertical-top>*{vertical-align:top}strong+table{margin-top:10px}.text-small{font-size:65%}.text-bold{font-weight:700}address{padding-left:20px;border-left:5px solid #f0f0f0}.scrollable .scrollable{margin-right:20px}.super-large{font-size:66px}.inline{display:inline-block!important}.text-overflow{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.list-margin{margin:10px 0}.list-margin li{padding:5px 0}.rotate-45deg{position:relative;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-o-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.text-medium{font-size:12px}.text-bold{font-weight:700}.text-bold.h1,.text-bold.h2,.text-bold.h3,.text-bold.h4,.text-bold.h5,.text-bold.h6{font-weight:700}.text-upper{text-transform:uppercase}.chart-item-bg{position:relative;background:#fff;width:100%;margin-bottom:30px}.chart-item-bg .chart-label{position:absolute;left:0;top:0;padding:30px;font-size:15px}.chart-item-bg .chart-label.chart-label-small{padding:20px}.chart-item-bg .chart-label .h1,.chart-item-bg .chart-label .h2,.chart-item-bg .chart-label .h3,.chart-item-bg .chart-label .h4{margin:0;padding:0}.chart-item-bg .chart-right-legend{position:absolute;left:0;top:0;padding:30px;font-size:15px;left:auto;right:0}.chart-item-bg .chart-right-legend.chart-label-small{padding:20px}.chart-item-bg .chart-right-legend .h1,.chart-item-bg .chart-right-legend .h2,.chart-item-bg .chart-right-legend .h3,.chart-item-bg .chart-right-legend .h4{margin:0;padding:0}.chart-item-bg .chart-inner{padding:20px}.chart-item-bg .chart-inner-wide{padding:20px 40px}.chart-item-bg .chart-entry-view{border-top:1px solid #eee;display:table;table-layout:fixed;width:100%}.chart-item-bg .chart-entry-view>div{display:table-cell;vertical-align:middle;padding:20px 30px;color:#979898;font-size:14px}.chart-item-bg .chart-entry-view:hover{background:#fafafa}.chart-item-bg-2{background:#fff;display:table;width:100%;margin-bottom:30px}.chart-item-bg-2>div{display:table-cell;padding:15px;vertical-align:middle}.chart-item-bg-2 .chart-item-num{padding-left:40px;font-size:90px;color:#434444;padding-right:30px;white-space:nowrap}.chart-item-bg-2 .chart-item-num.num-sm{font-size:70px}.chart-item-bg-2 .chart-item-env>div{margin:10px 0}.skin-color-palette-entry{margin-top:10px}.skin-color-palette{display:block;border:1px solid #f0f0f0;margin-right:20px}.skin-color-palette>span{float:left;width:16.66666667%;height:20px}.skin-color-palette>span+span{border-left:0 solid #fff}.skin-color-palette.skin-color-palette-four>span{width:25%}.skin-name-link{font-weight:700;color:#2c2e2f}.skin-name-link:hover{color:#68b828}.bs-example{line-height:1.85}.bs-example .label{margin-left:2px}.same-margin>*{margin-top:0;margin-bottom:15px}.same-margin>:last-child{margin-bottom:0}.vspacer{height:80px}.vspacer.v2{height:15px}.vspacer.v3{height:30px;display:block!important}.vspacer.v4{height:10px;display:block!important}@media screen and (max-width:768px){.vspacer{display:none}.vspacer.v2{display:block}}.img-container{margin-bottom:20px}.img-shade{display:block;background:#f5f5f5;text-align:center;line-height:0;margin-bottom:20px}.img-preview{display:inline-block;overflow:hidden;background:#f7f7f7;line-height:1}.img-preview img{display:block}.no-left-border{border-left:0!important}.no-right-border{border-right:0!important}.no-top-margin{margin-top:0!important}.no-padding{padding:0!important}.no-margin{margin:0!important}.no-transition{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important}img.img-cirlce{-webkit-border-radius:50%;-webkit-background-clip:padding-box;-moz-border-radius:50%;-moz-background-clip:padding;border-radius:50%;background-clip:padding-box}.col-margin.row>*{margin-bottom:20px}.col-margin.row>:last-child{margin-bottom:0}.ckeditor+.cke{margin-top:20px;margin-bottom:30px}[class*=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}div.scrollable{max-height:200px;overflow:hidden;position:relative}.icon-collection .page-header{margin:0;margin-bottom:10px}.icon-collection section .page-header{margin-top:40px}.icon-collection .fontawesome-icon-list{margin-left:-15px;margin-right:-15px}.icon-collection .fontawesome-icon-list .fa-hover{float:left;width:25%;margin-bottom:10px}.icon-collection .fontawesome-icon-list .fa-hover .icon-str{display:block;background:#fff;border:1px solid #ddd;margin:0 5px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.icon-collection .fontawesome-icon-list .fa-hover .icon-str>i{display:block;float:left;position:relative;background:#fafafa;border-right:1px solid #e9e9e9;padding:10px;text-align:center;width:25%}.icon-collection .fontawesome-icon-list .fa-hover .icon-str>i:hover{width:60%;background:#68b828;color:#fff}.icon-collection .fontawesome-icon-list .fa-hover .icon-str>i:hover+span{width:40%}.icon-collection .fontawesome-icon-list .fa-hover .icon-str>span{display:block;float:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;padding:10px;padding-bottom:8px;width:75%;color:#7d7f7f;font-family:Arimo,"Helvetica Neue",Helvetica,Arial,sans-serif}.icon-collection .fontawesome-icon-list .fa-hover .icon-str>span:hover{color:#2c2e2f}@media (max-width:991px){.icon-collection .fontawesome-icon-list .fa-hover{width:33%}}@media (max-width:767px){.icon-collection .fontawesome-icon-list .fa-hover{width:50%}}.layout-variants{background:#fff;padding:30px;margin-bottom:30px}.layout-variants .row-clearer{clear:both;height:15px}.layout-variants .layout-variant{display:block;margin-bottom:20px;padding:15px;border:1px solid transparent}.layout-variants .layout-variant:hover,.layout-variants .layout-variant.layout-current{background:rgba(240,240,240,.2);border-color:#f0f0f0}.layout-variants .layout-variant:hover .layout-name a,.layout-variants .layout-variant.layout-current .layout-name a{color:#2c2e2f}.layout-variants .layout-variant .layout-img{margin-bottom:15px}.layout-variants .layout-variant .layout-img img{display:block;width:100%}.layout-variants .layout-variant .layout-name{font-weight:700}.layout-variants .layout-variant .layout-name a{color:#6a6e71;max-width:218px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.layout-variants .layout-variant .layout-name:after{display:block;content:'';width:20px;height:1px;background:#ccc;margin:5.88px 0}.layout-variants .layout-variant .layout-links{list-style:none;margin:0;padding:0}.layout-variants .layout-variant .layout-links li{margin:2px 0}.layout-variants .layout-variant .layout-links li a{color:#979898;font-size:10px;text-transform:uppercase}.layout-variants .layout-variant .layout-links li a:hover,.layout-variants .layout-variant .layout-links li a.layout-mode-current{color:#4b4b4b}.layout-variants .layout-variant .layout-links li a.layout-mode-current{font-weight:700}.layout-variants .layout-variant .layout-links li a.disabled{cursor:not-allowed;color:#979898}.dx-warning{background:#FFF;border:5px solid #ffba00;padding:20px;margin-bottom:30px}.dx-warning h2{margin:0;margin-bottom:20px;padding-bottom:15px;border-bottom:2px solid #f0f0f0}.dx-warning ol{margin-top:20px}.dx-warning li{margin:5px 0}.loader-1{-webkit-animation:loaderAnimate 1000ms linear infinite;-moz-animation:loaderAnimate 1000ms linear infinite;-o-animation:loaderAnimate 1000ms linear infinite;animation:loaderAnimate 1000ms linear infinite;clip:rect(0,30px,30px,15px);height:30px;width:30px;position:absolute;left:50%;top:50%;margin-left:-15px;margin-top:-15px}lesshat-selector{-lh-property:0}@-webkit-keyframes loaderAnimate{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(220deg)}}@-moz-keyframes loaderAnimate{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(220deg)}}@-o-keyframes loaderAnimate{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(220deg)}}@keyframes loaderAnimate{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(220deg);-moz-transform:rotate(220deg);-ms-transform:rotate(220deg);transform:rotate(220deg)}}lesshat-selector{-lh-property:0}@-webkit-keyframes loaderAnimate2{0%{box-shadow:inset #555 0 0 0 8px;-webkit-transform:rotate(-140deg)}50%{box-shadow:inset #555 0 0 0 2px}100%{box-shadow:inset #555 0 0 0 8px;-webkit-transform:rotate(140deg)}}@-moz-keyframes loaderAnimate2{0%{box-shadow:inset #555 0 0 0 8px;-moz-transform:rotate(-140deg)}50%{box-shadow:inset #555 0 0 0 2px}100%{box-shadow:inset #555 0 0 0 8px;-moz-transform:rotate(140deg)}}@-o-keyframes loaderAnimate2{0%{box-shadow:inset #555 0 0 0 8px;-o-transform:rotate(-140deg)}50%{box-shadow:inset #555 0 0 0 2px}100%{box-shadow:inset #555 0 0 0 8px;-o-transform:rotate(140deg)}}@keyframes loaderAnimate2{0%{box-shadow:inset #555 0 0 0 8px;-webkit-transform:rotate(-140deg);-moz-transform:rotate(-140deg);-ms-transform:rotate(-140deg);transform:rotate(-140deg)}50%{box-shadow:inset #555 0 0 0 2px}100%{box-shadow:inset #555 0 0 0 8px;-webkit-transform:rotate(140deg);-moz-transform:rotate(140deg);-ms-transform:rotate(140deg);transform:rotate(140deg)}}.loader-1:after{-webkit-animation:loaderAnimate2 1000ms ease-in-out infinite;-moz-animation:loaderAnimate2 1000ms ease-in-out infinite;-o-animation:loaderAnimate2 1000ms ease-in-out infinite;animation:loaderAnimate2 1000ms ease-in-out infinite;clip:rect(0,30px,30px,15px);content:'';border-radius:50%;height:30px;width:30px;position:absolute}@keyframes loaderAnimate2{0%{box-shadow:inset #fff 0 0 0 17px;transform:rotate(-140deg)}50%{box-shadow:inset #fff 0 0 0 2px}100%{box-shadow:inset #fff 0 0 0 17px;transform:rotate(140deg)}}.loader-2{-webkit-animation:loaderAnimate2 1000ms linear infinite;-moz-animation:loaderAnimate2 1000ms linear infinite;-o-animation:loaderAnimate2 1000ms linear infinite;animation:loaderAnimate2 1000ms linear infinite;clip:rect(0,30px,30px,15px);height:30px;width:30px;position:absolute;left:50%;top:50%;margin-left:-15px;margin-top:-15px}lesshat-selector{-lh-property:0}@-webkit-keyframes loaderAnimate2{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(220deg)}}@-moz-keyframes loaderAnimate2{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(220deg)}}@-o-keyframes loaderAnimate2{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(220deg)}}@keyframes loaderAnimate2{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(220deg);-moz-transform:rotate(220deg);-ms-transform:rotate(220deg);transform:rotate(220deg)}}lesshat-selector{-lh-property:0}@-webkit-keyframes loaderAnimate22{0%{box-shadow:inset #fff 0 0 0 8px;-webkit-transform:rotate(-140deg)}50%{box-shadow:inset #fff 0 0 0 2px}100%{box-shadow:inset #fff 0 0 0 8px;-webkit-transform:rotate(140deg)}}@-moz-keyframes loaderAnimate22{0%{box-shadow:inset #fff 0 0 0 8px;-moz-transform:rotate(-140deg)}50%{box-shadow:inset #fff 0 0 0 2px}100%{box-shadow:inset #fff 0 0 0 8px;-moz-transform:rotate(140deg)}}@-o-keyframes loaderAnimate22{0%{box-shadow:inset #fff 0 0 0 8px;-o-transform:rotate(-140deg)}50%{box-shadow:inset #fff 0 0 0 2px}100%{box-shadow:inset #fff 0 0 0 8px;-o-transform:rotate(140deg)}}@keyframes loaderAnimate22{0%{box-shadow:inset #fff 0 0 0 8px;-webkit-transform:rotate(-140deg);-moz-transform:rotate(-140deg);-ms-transform:rotate(-140deg);transform:rotate(-140deg)}50%{box-shadow:inset #fff 0 0 0 2px}100%{box-shadow:inset #fff 0 0 0 8px;-webkit-transform:rotate(140deg);-moz-transform:rotate(140deg);-ms-transform:rotate(140deg);transform:rotate(140deg)}}.loader-2:after{-webkit-animation:loaderAnimate22 1000ms ease-in-out infinite;-moz-animation:loaderAnimate22 1000ms ease-in-out infinite;-o-animation:loaderAnimate22 1000ms ease-in-out infinite;animation:loaderAnimate22 1000ms ease-in-out infinite;clip:rect(0,30px,30px,15px);content:'';border-radius:50%;height:30px;width:30px;position:absolute}@keyframes loaderAnimate22{0%{box-shadow:inset #fff 0 0 0 17px;transform:rotate(-140deg)}50%{box-shadow:inset #fff 0 0 0 2px}100%{box-shadow:inset #fff 0 0 0 17px;transform:rotate(140deg)}}.page-loading-overlay{position:fixed;left:0;top:0;bottom:0;right:0;overflow:hidden;background:#2c2e2f;z-index:10000;-webkit-perspective:10000;-moz-perspective:10000;perspective:10000;-webkit-perspective:10000px;-moz-perspective:10000px;perspective:10000px;zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);-webkit-transition:all 800ms ease-in-out;-moz-transition:all 800ms ease-in-out;-o-transition:all 800ms ease-in-out;transition:all 800ms ease-in-out}.page-loading-overlay.loaded{zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);visibility:hidden}.tocify.full-width{width:100%!important}img.img-corona{-webkit-box-shadow:0 0 0 4px rgba(221,221,221,.3);-moz-box-shadow:0 0 0 4px rgba(221,221,221,.3);box-shadow:0 0 0 4px rgba(221,221,221,.3)}.highlights{margin-bottom:20px}.highlights li{display:block;margin:0}.highlights li.version+li{margin-top:20px}.highlights li h4{margin-bottom:0}.highlights li+li{margin-top:50px}.highlights .entry-img{display:block;float:left;width:30%;padding-right:20px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.highlights .entry-img img{display:block;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 4px 5px rgba(0,0,0,.15);-moz-box-shadow:0 4px 5px rgba(0,0,0,.15);box-shadow:0 4px 5px rgba(0,0,0,.15);max-width:100%}.highlights .entry-description{float:left;width:70%}.highlights .entry-description h3{margin-top:10px;color:#2c2e2f}@media screen and (max-width:768px){.highlights .entry-description h3{font-size:19px;margin-bottom:15px}}.highlights .entry-description h3 a{color:#2c2e2f}@media screen and (min-width:1500px){.highlights .entry-img{width:21%}.highlights .entry-description{width:79%}}@media screen and (max-width:992px){.highlights .entry-img{width:35%}.highlights .entry-description{width:65%}}@media screen and (max-width:768px){.highlights .entry-img,.highlights .entry-description{float:none;width:100%;text-align:center}.highlights .entry-img{padding-bottom:20px;padding-top:20px;padding-right:0}.highlights .entry-img img{display:inline-block}.highlights .entry-description p{text-align:left}}@media screen and (max-width:768px){.text-left-sm{text-align:left}}@media screen and (max-width:768px){.text-center-sm{text-align:center}}@media screen and (max-width:768px){.text-right-sm{text-align:right}}@media screen and (min-width:992px){.pull-right-md{float:right}}@media screen and (min-width:768px){.pull-right-sm{float:right}}pre.pre-line{white-space:pre-line}a:hover{text-decoration:none}label{font-weight:400}.label{-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.dropdown-menu,span.twitter-typeahead .tt-dropdown-menu{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.dropdown-menu>li>a,span.twitter-typeahead .tt-suggestion>p{padding:5px 20px}.dropdown-menu>li>a>i{display:inline-block;margin-right:5px}.left-dropdown .btn{float:right}.left-dropdown .btn.dropdown-toggle{float:left}.form-control{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.form-control:focus,.form-control:active{outline:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-weight:400}.btn-group+.btn-group{margin-left:5px}.alert.alert-dismissable{padding-right:20px}.alert.alert-dismissable .close{right:-10px;top:0}.alert .close{position:relative;margin-top:-2px;outline:0;color:#000}.alert .close span{text-shadow:none}.alert.alert-default{background-color:#eee;border-color:#eee;color:#333}.alert.alert-default hr{border-top-color:#e1e1e1}.alert.alert-default .alert-link{color:#1a1a1a}.alert.alert-white{background-color:#fff;border-color:#eee;color:#333}.alert.alert-white hr{border-top-color:#e1e1e1}.alert.alert-white .alert-link{color:#1a1a1a}.alert.alert-black{background-color:#000;border-color:#000;color:#fff}.alert.alert-black hr{border-top-color:#000}.alert.alert-black .alert-link{color:#e6e6e6}.alert.alert-black .close{zoom:1;-webkit-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:alpha(Opacity=50);filter:alpha(opacity=50)}.alert.alert-black .close span{color:#FFF}.alert.alert-black .close:hover{zoom:1;-webkit-opacity:.9;-moz-opacity:.9;opacity:.9;-ms-filter:alpha(Opacity=90);filter:alpha(opacity=90)}.progress{height:6px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.progress.progress-bar-purple>.progress-bar{background-color:#7c38bc}.progress-striped .progress.progress-bar-purple>.progress-bar{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.progress-bar-blue>.progress-bar{background-color:#0e62c7}.progress-striped .progress.progress-bar-blue>.progress-bar{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.progress-bar-red>.progress-bar{background-color:#d5080f}.progress-striped .progress.progress-bar-red>.progress-bar{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.progress-bar-black>.progress-bar{background-color:#222}.progress-striped .progress.progress-bar-black>.progress-bar{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.progress-bar-gray>.progress-bar{background-color:#ccc}.progress-striped .progress.progress-bar-gray>.progress-bar{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 .progress-bar{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.progress .progress-bar.progress-bar-purple{background-color:#7c38bc}.progress-striped .progress .progress-bar.progress-bar-purple{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 .progress-bar.progress-bar-blue{background-color:#0e62c7}.progress-striped .progress .progress-bar.progress-bar-blue{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 .progress-bar.progress-bar-red{background-color:#d5080f}.progress-striped .progress .progress-bar.progress-bar-red{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 .progress-bar.progress-bar-black{background-color:#222}.progress-striped .progress .progress-bar.progress-bar-black{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 .progress-bar.progress-bar-gray{background-color:#ccc}.progress-striped .progress .progress-bar.progress-bar-gray{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)}.list-group .list-group-item{padding:15px 20px}.list-group .list-group-item .list-group-item-text{margin-top:10px}.list-group.list-group-minimal .list-group-item{padding:10px 15px}.badge-roundless{-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}mark,.mark{background-color:rgba(255,186,0,.5);color:#666;padding-left:5px;padding-right:5px}.text-muted{color:#9d9d9d}.text-primary{color:#2c2e2f}a.text-primary:hover{color:#131415}.text-secondary{color:#68b828}a.text-secondary:hover{color:#508e1f}.text-purple{color:#7c38bc}a.text-purple:hover{color:#622c95}.text-turquoise{color:#00b19d}a.text-turquoise:hover{color:#007e70}.text-red{color:#d5080f}a.text-red:hover{color:#a4060c}.text-blue{color:#0e62c7}a.text-blue:hover{color:#0b4b97}.text-pink{color:#ff6264}a.text-pink:hover{color:#ff2f32}.text-yellow{color:#fcd036}a.text-yellow:hover{color:#fbc404}.text-gray{color:#555}a.text-gray:hover{color:#3b3b3b}.text-success{color:#8dc63f}a.text-success:hover{color:#72a230}.text-info{color:#40bbea}a.text-info:hover{color:#18a8df}.text-warning{color:#ffba00}a.text-warning:hover{color:#cc9500}.text-danger{color:#cc3f44}a.text-danger:hover{color:#ab2d32}.text-white{color:#fff}a.text-white:hover{color:#e6e6e6}.bg-muted,.bg-gray,.bg-primary,.bg-success,.bg-info,.bg-warning,.bg-danger{padding:10px 15px;color:#fff}.bg-muted{background-color:#d0d0d0}.bg-gray{background-color:#eee}pre{white-space:pre-wrap;font-size:12px}.page-body .jumbotron{padding:0;padding-top:0!important;padding-bottom:48px;margin-bottom:20px}.page-body .jumbotron>h1{margin-top:0;margin-bottom:20px}@media screen and (max-width:768px){.page-body .jumbotron{padding-left:0;padding-right:0}}@media screen and (min-width:768px){.page-body .jumbotron{padding-top:15px;padding-bottom:48px}}div.datepicker{padding:4px;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box;direction:ltr}div.datepicker-inline{width:206px}div.datepickerdiv.datepicker-rtl{direction:rtl}div.datepickerdiv.datepicker-rtl table tr td span{float:right}div.datepicker-dropdown{top:0;left:0}div.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #e4e4e4;border-top:0;border-bottom-color:#e4e4e4;position:absolute}div.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;border-top:0;position:absolute}div.datepicker-dropdown.datepicker-orient-left:before{left:6px}div.datepicker-dropdown.datepicker-orient-left:after{left:7px}div.datepicker-dropdown.datepicker-orient-right:before{right:6px}div.datepicker-dropdown.datepicker-orient-right:after{right:7px}div.datepicker-dropdown.datepicker-orient-top:before{top:-7px}div.datepicker-dropdown.datepicker-orient-top:after{top:-6px}div.datepicker-dropdown.datepicker-orient-bottom:before{bottom:-7px;border-bottom:0;border-top:7px solid #e4e4e4}div.datepicker-dropdown.datepicker-orient-bottom:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}div.datepicker>div{display:none}div.datepicker.days div.datepicker-days{display:block}div.datepicker.months div.datepicker-months{display:block}div.datepicker.years div.datepicker-years{display:block}div.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.datepicker td,div.datepicker th{text-align:center;width:20px;height:20px;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box;border:none}.table-striped div.datepicker table tr td,.table-striped div.datepicker table tr th{background-color:transparent}div.datepicker table tr td.day{color:#646565}div.datepicker table tr td.day:hover{background:#f5f5f5;cursor:pointer;color:#2c2e2f}div.datepicker table tr td.old,div.datepicker table tr td.new{color:#b1b1b1}div.datepicker table tr td.disabled,div.datepicker table tr td.disabled:hover{background:0 0;color:#777;color:#979898;cursor:default}div.datepicker table tr td.today,div.datepicker table tr td.today:hover,div.datepicker table tr td.today.disabled,div.datepicker table tr td.today.disabled:hover{;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#000}div.datepicker table tr td.today.switch-left,div.datepicker table tr td.today:hover.switch-left,div.datepicker table tr td.today.disabled.switch-left,div.datepicker table tr td.today.disabled:hover.switch-left{background-color:#76797e;color:#fff}div.datepicker table tr td.today.switch-right,div.datepicker table tr td.today:hover.switch-right,div.datepicker table tr td.today.disabled.switch-right,div.datepicker table tr td.today.disabled:hover.switch-right{background-color:#fff;color:#979898}div.datepicker table tr td.today.switch-right:hover,div.datepicker table tr td.today:hover.switch-right:hover,div.datepicker table tr td.today.disabled.switch-right:hover,div.datepicker table tr td.today.disabled:hover.switch-right:hover{background-color:#fff;color:#979898}div.datepicker table tr td.today:hover,div.datepicker table tr td.today:hover:hover,div.datepicker table tr td.today.disabled:hover,div.datepicker table tr td.today.disabled:hover:hover,div.datepicker table tr td.today:focus,div.datepicker table tr td.today:hover:focus,div.datepicker table tr td.today.disabled:focus,div.datepicker table tr td.today.disabled:hover:focus,div.datepicker table tr td.today:active,div.datepicker table tr td.today:hover:active,div.datepicker table tr td.today.disabled:active,div.datepicker table tr td.today.disabled:hover:active,div.datepicker table tr td.today.active,div.datepicker table tr td.today:hover.active,div.datepicker table tr td.today.disabled.active,div.datepicker table tr td.today.disabled:hover.active,div.datepicker table tr td.today.disabled,div.datepicker table tr td.today:hover.disabled,div.datepicker table tr td.today.disabled.disabled,div.datepicker table tr td.today.disabled:hover.disabled,div.datepicker table tr td.today[disabled],div.datepicker table tr td.today:hover[disabled],div.datepicker table tr td.today.disabled[disabled],div.datepicker table tr td.today.disabled:hover[disabled]{color:#fff;}div.datepicker table tr td.today:active,div.datepicker table tr td.today:hover:active,div.datepicker table tr td.today.disabled:active,div.datepicker table tr td.today.disabled:hover:active,div.datepicker table tr td.today.active,div.datepicker table tr td.today:hover.active,div.datepicker table tr td.today.disabled.active,div.datepicker table tr td.today.disabled:hover.active{background-color:#5d5f64 \9}div.datepicker table tr td.today:hover:hover{color:#000}div.datepicker table tr td.today.active:hover{color:#fff}div.datepicker table tr td.range,div.datepicker table tr td.range:hover,div.datepicker table tr td.range.disabled,div.datepicker table tr td.range.disabled:hover{background:#eee;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}div.datepicker table tr td.range.today,div.datepicker table tr td.range.today:hover,div.datepicker table tr td.range.today.disabled,div.datepicker table tr td.range.today.disabled:hover{;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}div.datepicker table tr td.range.today.switch-left,div.datepicker table tr td.range.today:hover.switch-left,div.datepicker table tr td.range.today.disabled.switch-left,div.datepicker table tr td.range.today.disabled:hover.switch-left{background-color:#eff777;color:#fff}div.datepicker table tr td.range.today.switch-right,div.datepicker table tr td.range.today:hover.switch-right,div.datepicker table tr td.range.today.disabled.switch-right,div.datepicker table tr td.range.today.disabled:hover.switch-right{background-color:#fff;color:#979898}div.datepicker table tr td.range.today.switch-right:hover,div.datepicker table tr td.range.today:hover.switch-right:hover,div.datepicker table tr td.range.today.disabled.switch-right:hover,div.datepicker table tr td.range.today.disabled:hover.switch-right:hover{background-color:#fff;color:#979898}div.datepicker table tr td.range.today:hover,div.datepicker table tr td.range.today:hover:hover,div.datepicker table tr td.range.today.disabled:hover,div.datepicker table tr td.range.today.disabled:hover:hover,div.datepicker table tr td.range.today:focus,div.datepicker table tr td.range.today:hover:focus,div.datepicker table tr td.range.today.disabled:focus,div.datepicker table tr td.range.today.disabled:hover:focus,div.datepicker table tr td.range.today:active,div.datepicker table tr td.range.today:hover:active,div.datepicker table tr td.range.today.disabled:active,div.datepicker table tr td.range.today.disabled:hover:active,div.datepicker table tr td.range.today.active,div.datepicker table tr td.range.today:hover.active,div.datepicker table tr td.range.today.disabled.active,div.datepicker table tr td.range.today.disabled:hover.active,div.datepicker table tr td.range.today.disabled,div.datepicker table tr td.range.today:hover.disabled,div.datepicker table tr td.range.today.disabled.disabled,div.datepicker table tr td.range.today.disabled:hover.disabled,div.datepicker table tr td.range.today[disabled],div.datepicker table tr td.range.today:hover[disabled],div.datepicker table tr td.range.today.disabled[disabled],div.datepicker table tr td.range.today.disabled:hover[disabled]{color:#fff;}div.datepicker table tr td.range.today:active,div.datepicker table tr td.range.today:hover:active,div.datepicker table tr td.range.today.disabled:active,div.datepicker table tr td.range.today.disabled:hover:active,div.datepicker table tr td.range.today.active,div.datepicker table tr td.range.today:hover.active,div.datepicker table tr td.range.today.disabled.active,div.datepicker table tr td.range.today.disabled:hover.active{background-color:#e9f447 \9}div.datepicker table tr td.selected,div.datepicker table tr td.selected:hover,div.datepicker table tr td.selected.disabled,div.datepicker table tr td.selected.disabled:hover{;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}div.datepicker table tr td.selected.switch-left,div.datepicker table tr td.selected:hover.switch-left,div.datepicker table tr td.selected.disabled.switch-left,div.datepicker table tr td.selected.disabled:hover.switch-left{background-color:#5e5e5e;color:#fff}div.datepicker table tr td.selected.switch-right,div.datepicker table tr td.selected:hover.switch-right,div.datepicker table tr td.selected.disabled.switch-right,div.datepicker table tr td.selected.disabled:hover.switch-right{background-color:#fff;color:#979898}div.datepicker table tr td.selected.switch-right:hover,div.datepicker table tr td.selected:hover.switch-right:hover,div.datepicker table tr td.selected.disabled.switch-right:hover,div.datepicker table tr td.selected.disabled:hover.switch-right:hover{background-color:#fff;color:#979898}div.datepicker table tr td.selected:hover,div.datepicker table tr td.selected:hover:hover,div.datepicker table tr td.selected.disabled:hover,div.datepicker table tr td.selected.disabled:hover:hover,div.datepicker table tr td.selected:focus,div.datepicker table tr td.selected:hover:focus,div.datepicker table tr td.selected.disabled:focus,div.datepicker table tr td.selected.disabled:hover:focus,div.datepicker table tr td.selected:active,div.datepicker table tr td.selected:hover:active,div.datepicker table tr td.selected.disabled:active,div.datepicker table tr td.selected.disabled:hover:active,div.datepicker table tr td.selected.active,div.datepicker table tr td.selected:hover.active,div.datepicker table tr td.selected.disabled.active,div.datepicker table tr td.selected.disabled:hover.active,div.datepicker table tr td.selected.disabled,div.datepicker table tr td.selected:hover.disabled,div.datepicker table tr td.selected.disabled.disabled,div.datepicker table tr td.selected.disabled:hover.disabled,div.datepicker table tr td.selected[disabled],div.datepicker table tr td.selected:hover[disabled],div.datepicker table tr td.selected.disabled[disabled],div.datepicker table tr td.selected.disabled:hover[disabled]{color:#fff;}div.datepicker table tr td.selected:active,div.datepicker table tr td.selected:hover:active,div.datepicker table tr td.selected.disabled:active,div.datepicker table tr td.selected.disabled:hover:active,div.datepicker table tr td.selected.active,div.datepicker table tr td.selected:hover.active,div.datepicker table tr td.selected.disabled.active,div.datepicker table tr td.selected.disabled:hover.active{background-color:#444 \9}div.datepicker table tr td.active,div.datepicker table tr td.active:hover,div.datepicker table tr td.active.disabled,div.datepicker table tr td.active.disabled:hover{background:#68b828;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}div.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}div.datepicker table tr td span:hover{background:#f5f5f5}div.datepicker table tr td span.disabled,div.datepicker table tr td span.disabled:hover{background:0 0;color:#777;cursor:default}div.datepicker table tr td span.active,div.datepicker table tr td span.active:hover,div.datepicker table tr td span.active.disabled,div.datepicker table tr td span.active.disabled:hover{background:#68b828;color:#fff}div.datepicker table tr td span.old,div.datepicker table tr td span.new{color:#b1b1b1}div.datepicker th.datepicker-switch{width:145px}div.datepicker thead tr:first-child th,div.datepicker tfoot tr th{cursor:pointer}div.datepicker thead tr:first-child th.datepicker-switch,div.datepicker tfoot tr th.datepicker-switch{color:#2c2e2f}div.datepicker thead tr:first-child th:hover,div.datepicker tfoot tr th:hover{background:#f5f5f5}div.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}div.datepicker thead tr:first-child th.cw{cursor:default;background-color:transparent}.input-append.date .add-on i,.input-prepend.date .add-on i{display:block;cursor:pointer;width:16px;height:16px}.input-daterange input{text-align:center}.input-daterange input:first-child{-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.input-daterange input:last-child{-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.input-daterange .add-on{display:inline-block;width:auto;min-width:16px;height:1.42857143;padding:4px 5px;font-weight:400;line-height:1.42857143;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:1px solid #ccc;margin-left:-5px;margin-right:-5px}.datepicker-inline{border:1px solid #e4e4e4}.datepicker-inline.no-border{border-color:transparent}.datepicker-inline table{width:195px}.no-border .datepicker-inline{border:0;padding:0}.input-group-addon .color-preview{width:16px;height:16px;background:#FFF;display:inline-block;border:1px solid #e4e4e4}.dropdown-menu.daterangepicker{background:#fafafa;border-color:#e4e4e4;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.dropdown-menu.daterangepicker:has(.ranges) .calendar{display:none}.dropdown-menu.daterangepicker.opensright:before{border-right:7px solid transparent;border-bottom:7px solid #e4e4e4;border-left:7px solid transparent;border-bottom-color:#e4e4e4}.dropdown-menu.daterangepicker.opensright:after{border-right:6px solid transparent;border-bottom:6px solid #fafafa;border-left:6px solid transparent}.dropdown-menu.daterangepicker .calendar-time{background:#fff;border:1px solid #e4e4e4;border-color:#e4e4e4;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.dropdown-menu.daterangepicker .no-border-radius{border-color:#e4e4e4;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.dropdown-menu.daterangepicker .range_inputs input{color:#979898;outline:0}.dropdown-menu.daterangepicker .calendar-date,.dropdown-menu.daterangepicker .range_inputs input,.dropdown-menu.daterangepicker table>thead>tr>th,.dropdown-menu.daterangepicker table>thead>tr>td,.dropdown-menu.daterangepicker table>tbody>tr>th,.dropdown-menu.daterangepicker table>tbody>tr>td,.dropdown-menu.daterangepicker table>tbody>tr>td.start-date.end-date{border-color:#e4e4e4;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.dropdown-menu.daterangepicker .calendar-date table>thead th{color:#979898}.dropdown-menu.daterangepicker .calendar-date table>thead .month{color:#2c2e2f}.dropdown-menu.daterangepicker .calendar-date table>thead .next i:before,.dropdown-menu.daterangepicker .calendar-date table>thead .prev i:before{font-family:fontawesome;content:'\f105';font-size:11px}.dropdown-menu.daterangepicker .calendar-date table>thead .next.prev i:before,.dropdown-menu.daterangepicker .calendar-date table>thead .prev.prev i:before{content:'\f104'}.dropdown-menu.daterangepicker .calendar-date table>thead .next:hover,.dropdown-menu.daterangepicker .calendar-date table>thead .prev:hover{background-color:#f5f5f5}.dropdown-menu.daterangepicker .calendar-date table>tbody>tr>td{color:#979898;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.dropdown-menu.daterangepicker .calendar-date table>tbody>tr>td:hover{background-color:#f5f5f5}.dropdown-menu.daterangepicker .calendar-date table>tbody>tr>td.available{color:#7d7f7f}.dropdown-menu.daterangepicker .calendar-date table>tbody>tr>td.off{color:#bdbebe}.dropdown-menu.daterangepicker .calendar-date table>tbody>tr>td.disabled{background-color:#fafafa;color:#bdbebe;cursor:not-allowed}.dropdown-menu.daterangepicker .calendar-date table>tbody>tr>td.in-range{background-color:rgba(104,184,40,.1)}.dropdown-menu.daterangepicker .calendar-date table>tbody>tr>td.active{background-color:#68b828;color:#fff}.dropdown-menu.daterangepicker .btn-default{border-color:#e4e4e4}.dropdown-menu.daterangepicker .ranges ul li{background:#fff;border-color:#e4e4e4;color:#979898;padding:4px 8px;font-size:12px;text-align:center;line-height:1;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.dropdown-menu.daterangepicker .ranges ul li:hover{background:#f5f5f5}.dropdown-menu.daterangepicker .ranges ul li.active{color:#fff;background:#68b828;border-color:#68b828}.daterange-inline{background:#f5f5f5;border:1px solid #e4e4e4;padding:10px;cursor:pointer}.daterange-inline i{color:#2c2e2f;margin-right:5px}.daterange-inline:hover{color:#2c2e2f}/*! + * Timepicker Component for Twitter Bootstrap + * + * Copyright 2013 Joris de Wit + * + * Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */.bootstrap-timepicker{position:relative}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu{left:auto;right:0}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before{left:auto;right:12px}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after{left:auto;right:13px}.bootstrap-timepicker .add-on{cursor:pointer}.bootstrap-timepicker .add-on i{display:inline-block;width:16px;height:16px}.bootstrap-timepicker-widget.dropdown-menu{padding:0}.bootstrap-timepicker-widget.dropdown-menu.open{display:inline-block}.bootstrap-timepicker-widget.dropdown-menu:before{border-bottom:7px solid #e4e4e4;border-left:7px solid transparent;border-right:7px solid transparent;content:"";display:inline-block;position:absolute}.bootstrap-timepicker-widget.dropdown-menu:after{border-bottom:6px solid #FFF;border-left:6px solid transparent;border-right:6px solid transparent;content:"";display:inline-block;position:absolute}.bootstrap-timepicker-widget.timepicker-orient-left:before{left:6px}.bootstrap-timepicker-widget.timepicker-orient-left:after{left:7px}.bootstrap-timepicker-widget.timepicker-orient-right:before{right:6px}.bootstrap-timepicker-widget.timepicker-orient-right:after{right:7px}.bootstrap-timepicker-widget.timepicker-orient-top:before{top:-7px}.bootstrap-timepicker-widget.timepicker-orient-top:after{top:-6px}.bootstrap-timepicker-widget.timepicker-orient-bottom:before{bottom:-7px;border-bottom:0;border-top:7px solid #e4e4e4}.bootstrap-timepicker-widget.timepicker-orient-bottom:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.bootstrap-timepicker-widget a.btn,.bootstrap-timepicker-widget input{border-radius:0}.bootstrap-timepicker-widget table{width:100%;margin:0}.bootstrap-timepicker-widget table td{text-align:center;height:30px;margin:0;padding:2px;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.bootstrap-timepicker-widget table td:not(.separator){min-width:30px}.bootstrap-timepicker-widget table td span{width:100%}.bootstrap-timepicker-widget table td a{border:1px transparent solid;width:100%;display:inline-block;margin:0;padding:0;outline:0;color:#979898}.bootstrap-timepicker-widget table td a .icon-chevron-up:before{font-family:fontawesome;content:'\f0d8';font-style:normal;color:#575858}.bootstrap-timepicker-widget table td a .icon-chevron-down:before{font-family:fontawesome;content:'\f0d7';font-style:normal;color:#575858}.bootstrap-timepicker-widget table td a:hover{text-decoration:none;background-color:#f5f5f5;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.bootstrap-timepicker-widget table td a i{margin-top:2px;font-size:18px}.bootstrap-timepicker-widget table td input{width:25px;margin:0;text-align:center;border:0;background:0 0;padding:0;height:auto}.bootstrap-timepicker-widget .modal-content{padding:4px}@media (min-width:767px){.bootstrap-timepicker-widget.modal{width:200px;margin-left:-100px}}@media (max-width:767px){.bootstrap-timepicker{width:100%}.bootstrap-timepicker .dropdown-menu{width:100%}}.date-and-time .form-control{float:left}.date-and-time .form-control+.form-control{border-left:0}.date-and-time .form-control.datepicker{width:65%}.date-and-time .form-control.timepicker{width:35%}/*! + * Bootstrap Colorpicker + * http://mjolnic.github.io/bootstrap-colorpicker/ + * + * Originally written by (c) 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + */.colorpicker-saturation{width:100px;height:100px;background-image:url(../js/colorpicker/images/saturation.png);cursor:crosshair;float:left}.colorpicker-saturation i{display:block;height:5px;width:5px;border:1px solid #000;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;position:absolute;top:0;left:0;margin:-4px 0 0 -4px}.colorpicker-saturation i b{display:block;height:5px;width:5px;border:1px solid #fff;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.colorpicker-hue,.colorpicker-alpha{width:15px;height:100px;float:left;cursor:row-resize;margin-left:4px;margin-bottom:4px}.colorpicker-hue i,.colorpicker-alpha i{display:block;height:1px;background:#000;border-top:1px solid #fff;position:absolute;top:0;left:0;width:100%;margin-top:-1px}.colorpicker-hue{background-image:url(../js/colorpicker/images/hue.png)}.colorpicker-alpha{background-image:url(../js/colorpicker/images/alpha.png);display:none}div.colorpicker{;top:0;left:0;padding:4px;min-width:130px;margin-top:1px;-moz-border-radius:-1px;-webkit-border-radius:-1px;border-radius:-1px;z-index:2500}.colorpicker:before,.colorpicker:after{display:table;content:"";line-height:0}.colorpicker:after{clear:both}.colorpicker:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #e4e4e4;border-bottom-color:#dfdfdf;position:absolute;top:-7px;left:6px}.colorpicker:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:7px}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-image:url(../js/colorpicker/images/alpha.png);background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-element .input-group-addon i{display:block;cursor:pointer;width:16px;height:16px}.colorpicker.colorpicker-inline{position:relative;display:inline-block;float:none}.colorpicker.colorpicker-horizontal{width:110px;min-width:110px;height:auto}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-hue,.colorpicker.colorpicker-horizontal .colorpicker-alpha{width:100px;height:15px;float:left;cursor:col-resize;margin-left:0;margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-hue i,.colorpicker.colorpicker-horizontal .colorpicker-alpha i{display:block;height:15px;background:#fff;position:absolute;top:0;left:0;width:1px;border:none;margin-top:0}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url(../js/colorpicker/images/hue-horizontal.png)}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url(../js/colorpicker/images/alpha-horizontal.png)}.colorpicker.colorpicker-hidden{display:none}.colorpicker.colorpicker-visible{display:block}.colorpicker-inline.colorpicker-visible{display:inline-block}html .select2-container{width:100%}html .select2-container .select2-choice{background:#fff!important;border-color:#e4e4e4!important;padding:0;height:35px;-webkit-border-radius:0!important;-webkit-background-clip:padding-box!important;-moz-border-radius:0!important;-moz-background-clip:padding!important;border-radius:0!important;background-clip:padding-box!important;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}html .select2-container .select2-choice .select2-chosen,html .select2-container .select2-choice .select2-search-choice-close,html .select2-container .select2-choice .select2-arrow{padding:0;line-height:35px}html .select2-container .select2-choice .select2-chosen{margin:0;padding-left:15px;padding-right:10px;margin-right:35px}html .select2-container .select2-choice .select2-search-choice-close{margin-right:20px;top:11px}html .select2-container .select2-choice .select2-arrow{background:#f5f5f5;border-left-color:#e4e4e4;text-align:center;color:#717272;width:35px;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}html .select2-container .select2-choice .select2-arrow b{background:none!important;-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);-webkit-transition:all 150ms ease-in-out;-moz-transition:all 150ms ease-in-out;-o-transition:all 150ms ease-in-out;transition:all 150ms ease-in-out}html .select2-container .select2-choice .select2-arrow b:before{position:relative;display:block;font-family:FontAwesome;content:'\f107'}html .select2-container.select2-dropdown-open{border-color:#e4e4e4!important;-webkit-border-radius:0!important;-webkit-background-clip:padding-box!important;-moz-border-radius:0!important;-moz-background-clip:padding!important;border-radius:0!important;background-clip:padding-box!important}html .select2-container.select2-dropdown-open .select2-arrow{border-left:1px solid #e4e4e4!important}html .select2-container.select2-dropdown-open .select2-arrow b{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}html .select2-container.select2-container-multi .select2-choices{border:1px solid #e4e4e4;background:#fff;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}html .select2-container.select2-container-multi .select2-choices .select2-search-choice{background:#f5f5f5;border:1px solid #e4e4e4;-webkit-box-shadow:none!important;-moz-box-shadow:none!important;box-shadow:none!important;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}html .select2-container.select2-container-multi .select2-choices .select2-search-choice div{color:#7d7f7f}html .select2-drop{border-top:1px solid #fff;-webkit-border-radius:0!important;-webkit-background-clip:padding-box!important;-moz-border-radius:0!important;-moz-background-clip:padding!important;border-radius:0!important;background-clip:padding-box!important}html .select2-drop.select2-drop-above{border:1px solid #e4e4e4!important;border-top:1px solid #e4e4e4!important}html .select2-drop.select2-drop-above .select2-search input{margin-top:0}html .select2-drop.select2-drop-active{border-color:#e4e4e4;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}html .select2-drop .select2-search{padding:0;position:relative}html .select2-drop .select2-search:after{position:absolute;content:'\e801';font-family:linecons;color:#979898;right:0;top:0;bottom:0;padding:10px 15px;z-index:2}html .select2-drop .select2-input{border:0;background:0 0;padding:0;height:auto;padding:10px 15px;padding-right:45px;background-image:none!important;border-bottom:1px solid #e8e8e8;position:relative;z-index:1;background:#f5f5f5}html .select2-drop .select2-results{padding:0;margin:0;max-height:250px}html .select2-drop .select2-results.overflow-hidden{overflow:hidden;position:relative}html .select2-drop .select2-results li.select2-result-selectable .select2-result-label{color:#7d7f7f;padding-left:15px}html .select2-drop .select2-results li.select2-result-unselectable .select2-result-label{padding:8px 15px;color:#7d7f7f}html .select2-drop .select2-results li.select2-no-results,html .select2-drop .select2-results li.select2-searching{padding:10px 15px;color:#979898;background:#fff}html .select2-drop .select2-results li ul .select2-result-label{padding-left:30px!important}html .select2-drop .select2-results li .select2-result-unselectable.select2-disabled{border:0!important;background:#f9f9f9}html .select2-drop .select2-results li .select2-result-unselectable.select2-disabled .select2-result-label{cursor:not-allowed;color:#a4a5a5}html .select2-drop .select2-results li .select2-result-selectable .select2-result-label{padding:5px}html .select2-drop .select2-results li .select2-result-selectable.select2-highlighted .select2-result-label{color:#fff}html .select2-drop .select2-results li.select2-highlighted{background-color:#68b828}html .select2-drop .select2-results li.select2-highlighted .select2-result-label{color:#fff}.selectboxit-container{position:relative;display:block;vertical-align:top}.selectboxit-container .selectboxit-open .selectboxit-arrow-container{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.selectboxit-container *{font:14px Helvetica,Arial;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:-moz-none;-ms-user-select:none;-o-user-select:none;user-select:none;outline:0;white-space:nowrap}.selectboxit-container .selectboxit{width:100%!important;cursor:pointer;margin:0;padding:0;border-radius:0;overflow:hidden;display:block;position:relative}.selectboxit-container span,.selectboxit-container .selectboxit-options a{height:35px;line-height:35px;display:block}.selectboxit-container .selectboxit-options a{height:25px;line-height:25px}.selectboxit-container .selectboxit:focus{outline:0}.selectboxit.selectboxit-disabled,.selectboxit-options .selectboxit-disabled{opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;cursor:default}.selectboxit-text{text-indent:10px;overflow:hidden;text-overflow:ellipsis;float:left;max-width:100%!important;color:#7d7f7f;font-size:13px}.selectboxit .selectboxit-option-icon-container{margin-left:5px}.selectboxit-container .selectboxit-options{-moz-box-sizing:border-box;box-sizing:border-box;min-width:100%;;margin:0;padding:0;list-style:none;position:absolute;overflow-x:hidden;overflow-y:auto;cursor:pointer;display:none;z-index:9999999999999;border-radius:0;text-align:left;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.selectboxit-option .selectboxit-option-anchor{padding:0 10px}.selectboxit-option .selectboxit-option-anchor:hover{text-decoration:none}.selectboxit-option,.selectboxit-optgroup-header{text-indent:5px;margin:0;list-style-type:none}.selectboxit-option-first{border-top-right-radius:0;border-top-left-radius:0}.selectboxit-optgroup-header+.selectboxit-option-first{border-top-right-radius:0;border-top-left-radius:0}.selectboxit-option-last{border-bottom-right-radius:0;border-bottom-left-radius:0}.selectboxit-optgroup-header{font-weight:700}.selectboxit-optgroup-header:hover{cursor:default}.selectboxit-arrow-container{width:30px;position:absolute;right:0;-webkit-transition:all 220ms ease-in-out;-moz-transition:all 220ms ease-in-out;-o-transition:all 220ms ease-in-out;transition:all 220ms ease-in-out}.selectboxit .selectboxit-arrow-container .selectboxit-arrow{margin:0 auto;position:absolute;top:10px;right:10px;left:0}.selectboxit .selectboxit-arrow-container .selectboxit-arrow.ui-icon{top:30%}.selectboxit-option-icon-container{float:left}.selectboxit-container .selectboxit-option-icon{margin:0;padding:0;vertical-align:middle}.selectboxit-option-icon-url{width:18px;background-size:18px 18px;background-repeat:no-repeat;height:100%;background-position:center;float:left}.selectboxit-rendering{display:inline-block!important;;zoom:1!important;visibility:visible!important;position:absolute!important;top:-9999px!important;left:-9999px!important}.jqueryui .ui-icon{background-color:inherit}.jqueryui .ui-icon-triangle-1-s{background-position:-64px -16px}.selectboxit-btn{background-color:#fff;background-repeat:repeat-x;border:1px solid #e4e4e4}.selectboxit-btn.selectboxit-enabled:hover,.selectboxit-btn.selectboxit-enabled:focus,.selectboxit-btn.selectboxit-enabled:active{color:#2c2e2f}.selectboxit-btn.selectboxit-enabled:hover,.selectboxit-btn.selectboxit-enabled:focus{color:#2c2e2f;text-decoration:none;background-position:0 -15px}.selectboxit-default-arrow{width:0;height:0}.selectboxit-default-arrow:before{display:block;content:'\f107';font-family:FontAwesome}.selectboxit-list{background-color:#fff;border:1px solid #e4e4e4;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);width:100%;max-height:250px}.selectboxit-list.ps-container{overflow:hidden}.selectboxit-list .selectboxit-option-anchor{color:#717272;font-size:13px}.selectboxit-list>.selectboxit-focus>.selectboxit-option-anchor{color:#fff;background-color:#68b828;background-repeat:repeat-x}.selectboxit-list>.selectboxit-disabled>.selectboxit-option-anchor{color:#999}.bootstrap-tagsinput{background-color:#fff;border:1px solid #e4e4e4;display:block;padding:4px 6px;color:#7d7f7f;vertical-align:middle;max-width:100%;line-height:22px;cursor:text}.bootstrap-tagsinput input{border:none;box-shadow:none;outline:0;background-color:transparent;padding:0;margin:0;width:auto!important;max-width:inherit}.bootstrap-tagsinput input:focus{border:none;box-shadow:none}.bootstrap-tagsinput .tag{margin-right:2px;color:#fff}.bootstrap-tagsinput .tag [data-role=remove]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role=remove]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role=remove]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.bootstrap-tagsinput .tag [data-role=remove]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}span.twitter-typeahead{width:100%}span.twitter-typeahead .tt-dropdown-menu{background:#fff;border:1px solid #e4e4e4;width:100%;margin-top:-1px;max-height:250px;overflow:auto}span.twitter-typeahead .tt-suggestion.tt-cursor{background-color:#fafafa}span.twitter-typeahead .tt-hint{color:#cacbcb}span.twitter-typeahead .empty-message{padding:5px 13px;color:#bdbebe}span.twitter-typeahead .tt-suggestion>p{padding:5px 13px}span.twitter-typeahead .tt-suggestion>p .tt-highlight{color:#7d7f7f}span.twitter-typeahead .tt-suggestion>p:hover,span.twitter-typeahead .tt-suggestion>p:focus{background:#fafafa;cursor:pointer}.input-group span.twitter-typeahead{display:block!important}.input-group span.twitter-typeahead .tt-dropdown-menu{top:32px!important}.input-group.input-group-lg span.twitter-typeahead .tt-dropdown-menu{top:44px!important}.input-group.input-group-sm span.twitter-typeahead .tt-dropdown-menu{top:28px!important}.ms-container{-webkit-background-size:21px!important;-moz-background-size:21px!important;background-size:21px!important}@media screen and (max-width:768px){.ms-container{width:100%!important}}.ms-container>div>.ms-list{border-color:#e4e4e4!important;-webkit-box-shadow:none!important;-moz-box-shadow:none!important;box-shadow:none!important;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden}.ms-container>div>.ms-list:active{border-color:#cbcbcb!important}.ms-container>div>.ms-list li{display:block;width:100%}.ms-container>div>.ms-list li span{font-size:13px}.ms-container>div>.ms-list li.ms-hover{background-color:#68b828}.icheck-list{width:100%;padding:0;margin:0;list-style:none}.icheck-list>li{display:block;margin-bottom:10px}.icheck-list>li:last-child{margin-bottom:0}.icheck-list>li div+label{position:relative;top:1px;margin-left:5px}.icheck-skins{display:block;margin-top:10px}.icheck-skins a{display:inline-block;border:1px solid transparent;background:#333;-webkit-transition:all 450ms cubic-bezier(0.175,.885,.32,1.275);-moz-transition:all 450ms cubic-bezier(0.175,.885,.32,1.275);-o-transition:all 450ms cubic-bezier(0.175,.885,.32,1.275);transition:all 450ms cubic-bezier(0.175,.885,.32,1.275);width:20px;height:20px;margin-right:5px}.icheck-skins a[data-color-class=red]{background-color:#d54e21}.icheck-skins a[data-color-class=green]{background-color:#1b7e5a}.icheck-skins a[data-color-class=blue]{background-color:#2489c5}.icheck-skins a[data-color-class=aero]{background-color:#9cc2cb}.icheck-skins a[data-color-class=grey]{background-color:#73716e}.icheck-skins a[data-color-class=orange]{background-color:#f70}.icheck-skins a[data-color-class=yellow]{background-color:#fc3}.icheck-skins a[data-color-class=pink]{background-color:#a77a94}.icheck-skins a[data-color-class=purple]{background-color:#6a5a8c}.icheck-skins a.current{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.5);-moz-box-shadow:0 0 0 1px rgba(0,0,0,.5);box-shadow:0 0 0 1px rgba(0,0,0,.5);-webkit-transform:scale(1.15);-moz-transform:scale(1.15);-o-transform:scale(1.15);-ms-transform:scale(1.15);transform:scale(1.15)}.form-wizard>.tabs{list-style:none;padding:0;margin:0;display:table;position:relative;width:100%}.form-wizard>.tabs>li{display:table-cell;width:1%;text-align:center;background:#fcfcfc}.form-wizard>.tabs>li a{position:relative;display:block;padding:10px 5px;color:#979898}.form-wizard>.tabs>li a>span{background:#68b828;font-size:12px;color:#fff;background:#e9e9e9;color:#979898;padding:2px 0;text-align:center;display:block;position:relative;margin:-10px -5px;margin-top:10px}.form-wizard>.tabs>li a:after{content:'';position:absolute;display:block;height:10px;background:0 0;top:100%;left:0;right:0}.form-wizard>.tabs>li a:hover{background:#f7f7f7}.form-wizard>.tabs>li+li{border-left:1px solid #eee}.form-wizard>.tabs>li.active a{color:#646565}.form-wizard>.tabs>li.active a:after{background-color:rgba(0,0,0,.1)}.form-wizard>.tabs>li.completed{background-color:#f7f7f7}.form-wizard>.progress-indicator{height:10px;position:relative;background:0 0;width:0;overflow:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:height 250ms cubic-bezier(0.19,1,.22,1),width 500ms cubic-bezier(0.19,1,.22,1);-moz-transition:height 250ms cubic-bezier(0.19,1,.22,1),width 500ms cubic-bezier(0.19,1,.22,1);-o-transition:height 250ms cubic-bezier(0.19,1,.22,1),width 500ms cubic-bezier(0.19,1,.22,1);transition:height 250ms cubic-bezier(0.19,1,.22,1),width 500ms cubic-bezier(0.19,1,.22,1)}.form-wizard>.progress-indicator>span{display:block;background:#8dc63f;height:10px;line-height:1;text-indent:-9999px}.form-wizard .tab-content{margin-top:20px}.form-wizard .tab-content strong{color:#7d7f7f}.form-wizard .tab-content label{color:#979898}.form-wizard .tab-content .tab-pane>.form-group{margin-bottom:25px}.form-wizard .tab-content .tab-pane>.form-group:last-child{margin-bottom:0}.form-wizard .tab-content.no-margin{margin-top:0}.form-wizard .tab-content.no-margin .tab-pane.with-bg{padding-top:15px}.form-wizard .tab-content .tab-pane.with-bg{background:#fff;padding:20px}.form-wizard .pager{margin-top:20px}.form-wizard .pager .previous+.previous a{margin-left:5px}.form-wizard .pager .next+.next a{margin-right:5px}.form-wizard .pager .disabled a{zoom:1;-webkit-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:alpha(Opacity=50);filter:alpha(opacity=50)}html body .ui-rangeSlider .ui-rangeSlider-container{height:10px;background:#ebebeb;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}html body .ui-rangeSlider .ui-rangeSlider-container .ui-rangeSlider-bar{background:#68b828;height:10px}html body .ui-rangeSlider .ui-rangeSlider-container .ui-rangeSlider-handle{position:relative;background:#68b828;width:10px;height:10px;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box;border:0 solid #FFF;padding:8px;margin-top:-7px}html body .ui-rangeSlider .ui-rangeSlider-container .ui-rangeSlider-handle.ui-rangeSlider-leftHandle{-webkit-transform:translateX(-100px);-moz-transform:translateX(-100px);-o-transform:translateX(-100px);-ms-transform:translateX(-100px);transform:translateX(-100px)}html body .ui-rangeSlider .ui-rangeSlider-label{visibility:hidden}html body .slider{height:8px;margin-bottom:30px;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box;background:#ebebeb}html body .slider .ui-slider-handle{background:#68b828;top:-3px;border:0;width:14px;height:14px;margin-top:0;outline:0;cursor:pointer!important}html body .slider .ui-slider-handle .ui-label{position:absolute;left:-50%;top:18px;color:#7d7f7f;margin-left:4px;white-space:nowrap}html body .slider .ui-slider-range{background:#68b828;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}html body .slider.ui-slider-horizontal .ui-slider-handle .ui-label{margin-top:0}html body .slider.ui-slider-vertical{height:250px;width:8px}html body .slider.ui-slider-vertical .ui-slider-handle{top:auto;margin-left:.5px}html body .slider.ui-slider-vertical .ui-slider-handle .ui-label{top:-1px;left:18px}html body .slider .ui-slider-handle{background:#508e1f;border:0}html body .slider .ui-slider-range,html body .slider .ui-fill{background:#68b828}html body .slider.slider-primary{background:#ebebeb}html body .slider.slider-primary .ui-slider-handle{background:#131415;border:0}html body .slider.slider-primary .ui-slider-range,html body .slider.slider-primary .ui-fill{background:#2c2e2f}html body .slider.slider-secondary{background:#ebebeb}html body .slider.slider-secondary .ui-slider-handle{background:#508e1f;border:0}html body .slider.slider-secondary .ui-slider-range,html body .slider.slider-secondary .ui-fill{background:#68b828}html body .slider.slider-success{background:#ebebeb}html body .slider.slider-success .ui-slider-handle{background:#72a230;border:0}html body .slider.slider-success .ui-slider-range,html body .slider.slider-success .ui-fill{background:#8dc63f}html body .slider.slider-info{background:#ebebeb}html body .slider.slider-info .ui-slider-handle{background:#18a8df;border:0}html body .slider.slider-info .ui-slider-range,html body .slider.slider-info .ui-fill{background:#40bbea}html body .slider.slider-danger{background:#ebebeb}html body .slider.slider-danger .ui-slider-handle{background:#ab2d32;border:0}html body .slider.slider-danger .ui-slider-range,html body .slider.slider-danger .ui-fill{background:#cc3f44}html body .slider.slider-warning{background:#ebebeb}html body .slider.slider-warning .ui-slider-handle{background:#f7d227;border:0}html body .slider.slider-warning .ui-slider-range,html body .slider.slider-warning .ui-fill{background:#f9dc58}html body .slider.slider-purple{background:#ebebeb}html body .slider.slider-purple .ui-slider-handle{background:#622c95;border:0}html body .slider.slider-purple .ui-slider-range,html body .slider.slider-purple .ui-fill{background:#7c38bc}html body .slider.slider-blue{background:#ebebeb}html body .slider.slider-blue .ui-slider-handle{background:#0b4b97;border:0}html body .slider.slider-blue .ui-slider-range,html body .slider.slider-blue .ui-fill{background:#0e62c7}html body .slider.slider-red{background:#ebebeb}html body .slider.slider-red .ui-slider-handle{background:#a4060c;border:0}html body .slider.slider-red .ui-slider-range,html body .slider.slider-red .ui-fill{background:#d5080f}html body .slider.slider-gray{background:#ebebeb}html body .slider.slider-gray .ui-slider-handle{background:#959595;border:0}html body .slider.slider-gray .ui-slider-range,html body .slider.slider-gray .ui-fill{background:#aeaeae}.wysihtml5{min-height:250px}.wysihtml5-toolbar .btn{margin-bottom:0}.wysihtml5-toolbar .btn.btn-white:active,.wysihtml5-toolbar .btn.btn-white:focus,.wysihtml5-toolbar .btn.btn-white.active{border-color:#d8d8d8!important}.wysihtml5-toolbar .btn.btn-white.wysihtml5-command-active{background:#eee;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.wysihtml5-toolbar .btn.btn-white.dropdown-toggle i{position:relative;top:1px}.wysihtml5-toolbar li.html-code-icon{float:right}.wysihtml5-toolbar .dropdown-menu{border-color:#e4e4e4}.wysihtml5-toolbar a.wysihtml5-colors-title{padding-top:3px!important;padding-left:35px!important}.wysihtml5-toolbar div.wysihtml5-colors{width:25px!important}.wysihtml5-sandbox{min-height:250px;padding:10px 15px!important}.wysihtml5-sandbox::-webkit-scrollbar{width:5px}.wysihtml5-sandbox::-webkit-scrollbar-track{width:5px;background-color:#e0e0e0}.wysihtml5-sandbox::-webkit-scrollbar-thumb{background-color:#bdbdbd}.modal .bootstrap-wysihtml5-insert-link-url{margin-bottom:12px!important}.modal .bootstrap-wysihtml5-insert-link-url+label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.modal .bootstrap-wysihtml5-insert-link-url+label input{top:4px;margin-right:10px!important}html .dropzone{border:1px solid #e9e9e9;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.droppable-area{display:inline-block;background:#ededed;border:2px dashed #cbcbcb;width:150px;min-height:150px!important;height:150px;line-height:150px;text-align:center;font-size:15px;color:#646565;margin-bottom:30px;-webkit-border-radius:50%;-webkit-background-clip:padding-box;-moz-border-radius:50%;-moz-background-clip:padding;border-radius:50%;background-clip:padding-box}.droppable-area.dz-clickable{cursor:pointer}.droppable-area.dz-drag-hover{background:#68b828;color:#fff;border-style:solid;border-color:#508e1f;border-width:5px;line-height:143px}input[type=checkbox].iswitch{font-size:10px;position:relative;display:inline-block;width:38px;height:22px;line-height:22px;border-radius:11px;margin:0;padding:0;box-shadow:inset 0 0 0 2px #eee;outline:1px solid transparent!important;cursor:pointer;border:none;background:0 0;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin-right:4px;margin-bottom:7px;transition:box-shadow .3s ease-in-out,padding .25s ease-in-out;transition-delay:.1s,0s}input[type=checkbox].iswitch:checked{transition-delay:0s,0s;box-shadow:inset 0 0 0 12.57px #eee!important;padding-left:16px}input[type=checkbox].iswitch.iswitch-primary:checked{box-shadow:inset 0 0 0 12.57px #2c2e2f!important}input[type=checkbox].iswitch.iswitch-secondary:checked{box-shadow:inset 0 0 0 12.57px #68b828!important}input[type=checkbox].iswitch.iswitch-info:checked{box-shadow:inset 0 0 0 12.57px #40bbea!important}input[type=checkbox].iswitch.iswitch-warning:checked{box-shadow:inset 0 0 0 12.57px #ffba00!important}input[type=checkbox].iswitch.iswitch-danger:checked{box-shadow:inset 0 0 0 12.57px #cc3f44!important}input[type=checkbox].iswitch.iswitch-success:checked{box-shadow:inset 0 0 0 12.57px #8dc63f!important}input[type=checkbox].iswitch.iswitch-red:checked{box-shadow:inset 0 0 0 12.57px #d5080f!important}input[type=checkbox].iswitch.iswitch-blue:checked{box-shadow:inset 0 0 0 12.57px #0e62c7!important}input[type=checkbox].iswitch.iswitch-purple:checked{box-shadow:inset 0 0 0 12.57px #7c38bc!important}input[type=checkbox].iswitch.iswitch-pink:checked{box-shadow:inset 0 0 0 12.57px #ff6264!important}input[type=checkbox].iswitch.iswitch-turquoise:checked{box-shadow:inset 0 0 0 12.57px #00b19d!important}input[type=checkbox].iswitch.iswitch-yellow:checked{box-shadow:inset 0 0 0 12.57px #fcd036!important}input[type=checkbox].iswitch.iswitch-orange:checked{box-shadow:inset 0 0 0 12.57px #f7aa47!important}input[type=checkbox].iswitch.iswitch-gray:checked{box-shadow:inset 0 0 0 12.57px #d5d5d5!important}input[type=checkbox].iswitch.hit{-webkit-animation:slide-off .35s ease both;-moz-animation:slide-off .35s ease both;-o-animation:slide-off .35s ease both;animation:slide-off .35s ease both}input[type=checkbox].iswitch.hit:checked{-webkit-animation:slide-on .35s ease both .05s;-moz-animation:slide-on .35s ease both .05s;-o-animation:slide-on .35s ease both .05s;animation:slide-on .35s ease both .05s}input[type=checkbox].iswitch:before,input[type=checkbox].iswitch:after{content:""}input[type=checkbox].iswitch:after{position:absolute;top:-6px;left:-6px;bottom:-6px;right:-6px}input[type=checkbox].iswitch:before{display:inline-block;height:18px;width:18px;margin:2px 0 0 2px;background-color:#fff;border-radius:9px;box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 0 1px 1px rgba(0,0,0,.1);-webkit-transition:all .1s ease .1s;-moz-transition:all .1s ease .1s;-o-transition:all .1s ease .1s;transition:all .1s ease .1s}input[type=checkbox].iswitch:active:before{transition:all .1s ease .05s}input[type=checkbox].iswitch.touch:hover:before{transition:all 0s ease 0s}input[type=checkbox].iswitch:active:before,input[type=checkbox].iswitch.touch:hover:before{width:20px}input[type=checkbox].iswitch:active:checked:before,input[type=checkbox].iswitch.touch:hover:checked:before{margin-left:0}@keyframes slide-on{0%{padding-left:0}60%{padding-left:16px}100%{padding-left:16px}}@keyframes slide-off{0%{padding-left:16px;text-indent:0}60%{padding-left:0;text-indent:0}100%{padding-left:0;text-indent:0}}input[type=checkbox].iswitch-lg{font-size:10px;position:relative;display:inline-block;width:50px;height:28px;line-height:28px;border-radius:14px;margin:0;padding:0;box-shadow:inset 0 0 0 2px #eee;outline:1px solid transparent!important;cursor:pointer;border:none;background:0 0;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin-right:4px;margin-bottom:7px;transition:box-shadow .3s ease-in-out,padding .25s ease-in-out;transition-delay:.1s,0s}input[type=checkbox].iswitch-lg:checked{transition-delay:0s,0s;box-shadow:inset 0 0 0 16px #eee!important;padding-left:22px}input[type=checkbox].iswitch-lg.iswitch-primary:checked{box-shadow:inset 0 0 0 16px #2c2e2f!important}input[type=checkbox].iswitch-lg.iswitch-secondary:checked{box-shadow:inset 0 0 0 16px #68b828!important}input[type=checkbox].iswitch-lg.iswitch-info:checked{box-shadow:inset 0 0 0 16px #40bbea!important}input[type=checkbox].iswitch-lg.iswitch-warning:checked{box-shadow:inset 0 0 0 16px #ffba00!important}input[type=checkbox].iswitch-lg.iswitch-danger:checked{box-shadow:inset 0 0 0 16px #cc3f44!important}input[type=checkbox].iswitch-lg.iswitch-success:checked{box-shadow:inset 0 0 0 16px #8dc63f!important}input[type=checkbox].iswitch-lg.iswitch-red:checked{box-shadow:inset 0 0 0 16px #d5080f!important}input[type=checkbox].iswitch-lg.iswitch-blue:checked{box-shadow:inset 0 0 0 16px #0e62c7!important}input[type=checkbox].iswitch-lg.iswitch-purple:checked{box-shadow:inset 0 0 0 16px #7c38bc!important}input[type=checkbox].iswitch-lg.iswitch-pink:checked{box-shadow:inset 0 0 0 16px #ff6264!important}input[type=checkbox].iswitch-lg.iswitch-turquoise:checked{box-shadow:inset 0 0 0 16px #00b19d!important}input[type=checkbox].iswitch-lg.iswitch-yellow:checked{box-shadow:inset 0 0 0 16px #fcd036!important}input[type=checkbox].iswitch-lg.iswitch-orange:checked{box-shadow:inset 0 0 0 16px #f7aa47!important}input[type=checkbox].iswitch-lg.iswitch-gray:checked{box-shadow:inset 0 0 0 16px #d5d5d5!important}input[type=checkbox].iswitch-lg.hit{-webkit-animation:slide-off .35s ease both;-moz-animation:slide-off .35s ease both;-o-animation:slide-off .35s ease both;animation:slide-off .35s ease both}input[type=checkbox].iswitch-lg.hit:checked{-webkit-animation:slide-on .35s ease both .05s;-moz-animation:slide-on .35s ease both .05s;-o-animation:slide-on .35s ease both .05s;animation:slide-on .35s ease both .05s}input[type=checkbox].iswitch-lg:before,input[type=checkbox].iswitch-lg:after{content:""}input[type=checkbox].iswitch-lg:after{position:absolute;top:-8px;left:-8px;bottom:-8px;right:-8px}input[type=checkbox].iswitch-lg:before{display:inline-block;height:24px;width:24px;margin:2px 0 0 2px;background-color:#fff;border-radius:12px;box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 0 1px 1px rgba(0,0,0,.1);-webkit-transition:all .1s ease .1s;-moz-transition:all .1s ease .1s;-o-transition:all .1s ease .1s;transition:all .1s ease .1s}input[type=checkbox].iswitch-lg:active:before{transition:all .1s ease .05s}input[type=checkbox].iswitch-lg.touch:hover:before{transition:all 0s ease 0s}input[type=checkbox].iswitch-lg:active:before,input[type=checkbox].iswitch-lg.touch:hover:before{width:26px}input[type=checkbox].iswitch-lg:active:checked:before,input[type=checkbox].iswitch-lg.touch:hover:checked:before{margin-left:0}@keyframes slide-on{0%{padding-left:0}60%{padding-left:22px}100%{padding-left:22px}}@keyframes slide-off{0%{padding-left:22px;text-indent:0}60%{padding-left:0;text-indent:0}100%{padding-left:0;text-indent:0}}input[type=checkbox].iswitch-xlg{font-size:10px;position:relative;display:inline-block;width:85px;height:38px;line-height:38px;border-radius:19px;margin:0;padding:0;box-shadow:inset 0 0 0 2px #eee;outline:1px solid transparent!important;cursor:pointer;border:none;background:0 0;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin-right:4px;margin-bottom:7px;transition:box-shadow .3s ease-in-out,padding .25s ease-in-out;transition-delay:.1s,0s}input[type=checkbox].iswitch-xlg:checked{transition-delay:0s,0s;box-shadow:inset 0 0 0 21.71px #eee!important;padding-left:47px}input[type=checkbox].iswitch-xlg.iswitch-primary:checked{box-shadow:inset 0 0 0 21.71px #2c2e2f!important}input[type=checkbox].iswitch-xlg.iswitch-secondary:checked{box-shadow:inset 0 0 0 21.71px #68b828!important}input[type=checkbox].iswitch-xlg.iswitch-info:checked{box-shadow:inset 0 0 0 21.71px #40bbea!important}input[type=checkbox].iswitch-xlg.iswitch-warning:checked{box-shadow:inset 0 0 0 21.71px #ffba00!important}input[type=checkbox].iswitch-xlg.iswitch-danger:checked{box-shadow:inset 0 0 0 21.71px #cc3f44!important}input[type=checkbox].iswitch-xlg.iswitch-success:checked{box-shadow:inset 0 0 0 21.71px #8dc63f!important}input[type=checkbox].iswitch-xlg.iswitch-red:checked{box-shadow:inset 0 0 0 21.71px #d5080f!important}input[type=checkbox].iswitch-xlg.iswitch-blue:checked{box-shadow:inset 0 0 0 21.71px #0e62c7!important}input[type=checkbox].iswitch-xlg.iswitch-purple:checked{box-shadow:inset 0 0 0 21.71px #7c38bc!important}input[type=checkbox].iswitch-xlg.iswitch-pink:checked{box-shadow:inset 0 0 0 21.71px #ff6264!important}input[type=checkbox].iswitch-xlg.iswitch-turquoise:checked{box-shadow:inset 0 0 0 21.71px #00b19d!important}input[type=checkbox].iswitch-xlg.iswitch-yellow:checked{box-shadow:inset 0 0 0 21.71px #fcd036!important}input[type=checkbox].iswitch-xlg.iswitch-orange:checked{box-shadow:inset 0 0 0 21.71px #f7aa47!important}input[type=checkbox].iswitch-xlg.iswitch-gray:checked{box-shadow:inset 0 0 0 21.71px #d5d5d5!important}input[type=checkbox].iswitch-xlg.hit{-webkit-animation:slide-off .35s ease both;-moz-animation:slide-off .35s ease both;-o-animation:slide-off .35s ease both;animation:slide-off .35s ease both}input[type=checkbox].iswitch-xlg.hit:checked{-webkit-animation:slide-on .35s ease both .05s;-moz-animation:slide-on .35s ease both .05s;-o-animation:slide-on .35s ease both .05s;animation:slide-on .35s ease both .05s}input[type=checkbox].iswitch-xlg:before,input[type=checkbox].iswitch-xlg:after{content:""}input[type=checkbox].iswitch-xlg:after{position:absolute;top:-11.33px;left:-11.33px;bottom:-11.33px;right:-11.33px}input[type=checkbox].iswitch-xlg:before{display:inline-block;height:34px;width:34px;margin:2px 0 0 2px;background-color:#fff;border-radius:17px;box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 0 1px 1px rgba(0,0,0,.1);-webkit-transition:all .1s ease .1s;-moz-transition:all .1s ease .1s;-o-transition:all .1s ease .1s;transition:all .1s ease .1s}input[type=checkbox].iswitch-xlg:active:before{transition:all .1s ease .05s}input[type=checkbox].iswitch-xlg.touch:hover:before{transition:all 0s ease 0s}input[type=checkbox].iswitch-xlg:active:before,input[type=checkbox].iswitch-xlg.touch:hover:before{width:36px}input[type=checkbox].iswitch-xlg:active:checked:before,input[type=checkbox].iswitch-xlg.touch:hover:checked:before{margin-left:0}@keyframes slide-on{0%{padding-left:0}60%{padding-left:47px}100%{padding-left:47px}}@keyframes slide-off{0%{padding-left:47px;text-indent:0}60%{padding-left:0;text-indent:0}100%{padding-left:0;text-indent:0}}.mailbox-env .mailbox-sidebar .mailbox-list{margin-top:30px}@media screen and (max-width:768px){.mailbox-env .mailbox-sidebar .mailbox-list{margin-top:10px}}.mailbox-env .mailbox-sidebar .mailbox-list li{border-bottom:1px solid #ddd}.mailbox-env .mailbox-sidebar .mailbox-list li a{display:block;color:#979898;padding:10px 10px}.mailbox-env .mailbox-sidebar .mailbox-list li a:hover{color:#717272}.mailbox-env .mailbox-sidebar .mailbox-list li a .badge{margin-top:0}.mailbox-env .mailbox-sidebar .mailbox-list li.active>a{color:#2c2e2f;font-weight:700}.mailbox-env .mailbox-sidebar .mailbox-list li:last-child{border-bottom:0}.mailbox-env .mailbox-sidebar .mailbox-list li.list-header{font-size:10px;padding:10px 10px;font-weight:700;color:#979898;text-transform:uppercase}.mailbox-env .mail-env{background:#FFF;padding:15px 0;margin-bottom:30px}.mailbox-env .mail-env .mail-table{color:#979898;margin-bottom:0}.mailbox-env .mail-env .mail-table>thead>tr>td,.mailbox-env .mail-env .mail-table>tfoot>tr>td,.mailbox-env .mail-env .mail-table>thead>tr>th,.mailbox-env .mail-env .mail-table>tfoot>tr>th{color:#717272;font-weight:400;padding-left:10px;padding-right:10px;padding-top:0;padding-bottom:15px}.mailbox-env .mail-env .mail-table>thead>tr>td:after,.mailbox-env .mail-env .mail-table>tfoot>tr>td:after,.mailbox-env .mail-env .mail-table>thead>tr>th:after,.mailbox-env .mail-env .mail-table>tfoot>tr>th:after{display:none}.mailbox-env .mail-env .mail-table>tfoot>tr>td,.mailbox-env .mail-env .mail-table>tfoot>tr>th{border-bottom:0;padding-top:15px;padding-bottom:0}.mailbox-env .mail-env .mail-table>tbody>tr>td,.mailbox-env .mail-env .mail-table>tbody>tr>th{padding-left:10px;padding-right:10px;vertical-align:middle}.mailbox-env .mail-env .mail-table>tbody>tr a:hover{color:#646565}.mailbox-env .mail-env .mail-table>tbody>tr.unread .col-name{font-weight:700}.mailbox-env .mail-env .mail-table>tbody>tr.unread .col-name a{color:#646565}.mailbox-env .mail-env .mail-table>tbody>tr.highlighted{background-color:rgba(255,255,204,.35)}.mailbox-env .mail-env .mail-table .col-cb,.mailbox-env .mail-env .mail-table .col-options{width:2%}.mailbox-env .mail-env .mail-table .col-cb{padding-left:30px}@media screen and (max-width:550px){.mailbox-env .mail-env .mail-table .col-cb{padding-left:15px}}.mailbox-env .mail-env .mail-table .col-subject a{display:block;max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}@media screen and (max-width:768px){.mailbox-env .mail-env .mail-table .col-subject a{max-width:150px}}@media screen and (max-width:550px){.mailbox-env .mail-env .mail-table .col-subject{padding-right:15px}}.mailbox-env .mail-env .mail-table .col-options{text-align:right}.mailbox-env .mail-env .mail-table .col-time{width:12%;text-align:right;padding-right:30px;white-space:nowrap}@media screen and (max-width:550px){.mailbox-env .mail-env .mail-table .col-time{display:none;padding-right:15px}}.mailbox-env .mail-env .mail-table .col-header-options{padding-right:30px}@media screen and (max-width:550px){.mailbox-env .mail-env .mail-table .col-header-options{padding-right:15px}}.mailbox-env .mail-env .mail-table a{color:#979898}.mailbox-env .mail-env .mail-table .btn{margin-bottom:0}.mailbox-env .mail-env .mail-table .checkbox{margin:0}.mailbox-env .mail-env .mail-table .mail-select-options{float:left;position:relative;top:2px}@media screen and (max-width:450px){.mailbox-env .mail-env .mail-table .mail-select-options{display:none}}.mailbox-env .mail-env .mail-table .mail-pagination{float:right;margin-right:-10px}.mailbox-env .mail-env .mail-table .mail-pagination .next-prev{position:relative;display:inline-block;margin-bottom:-5px;margin-left:10px}.mailbox-env .mail-env .mail-table .mail-pagination .next-prev a{position:relative;display:block;float:left;color:#575858;font-size:14px}.mailbox-env .mail-env .mail-table .mail-pagination .next-prev a i{margin:0 8px}.mailbox-env .mail-env .mail-table .mail-pagination .next-prev a:hover{background:rgba(221,221,221,.25)}.mailbox-env .mail-env .mail-table .mail-pagination .next-prev a:first-child{margin-right:9px}.mailbox-env .mail-env .mail-table .mail-pagination .next-prev a:first-child:after{display:block;height:10px;width:1px;background:#ddd;position:absolute;top:50%;margin-top:-5px;right:-5px;content:''}.mailbox-env .mail-env .mail-table .star{position:relative;display:inline-block;font-size:15px;margin-top:-3px}.mailbox-env .mail-env .mail-table .star.starred{color:#ffba00!important}.mailbox-env .mail-compose{background:#fff;padding:30px;margin-bottom:30px}.mailbox-env .mail-compose .compose-message-editor{margin-bottom:20px}.mailbox-env .mail-compose .compose-message-editor textarea{min-height:150px}.mailbox-env .mail-compose .form-group{position:relative}.mailbox-env .mail-compose .form-group label{position:absolute;left:0;top:0;z-index:5;line-height:48px;padding:0 15px;font-weight:700;color:#717272;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mailbox-env .mail-compose .form-group input,.mailbox-env .mail-compose .form-group textarea{position:relative;z-index:1}.mailbox-env .mail-compose .form-group input.form-control{height:48px;padding-left:80px}.mailbox-env .mail-compose .form-group .field-options{position:absolute;right:0;top:0;z-index:4;padding:14px 15px}.mailbox-env .mail-compose .form-group .field-options a{display:block;background:#ccc;color:#fff;font-size:10px;float:left;margin-left:5px;padding:3px 5px}.mailbox-env .mail-compose .form-group .field-options a:hover{background-color:#999}.mailbox-env .mail-header{border-bottom:1px solid #ddd;margin-bottom:20px;padding-bottom:20px}.mailbox-env .mail-header h3{margin:0}.mailbox-env .mail-header h3 i{font-size:17px}@media screen and (max-width:768px){.mailbox-env .mail-header h3{margin-bottom:20px}}.mailbox-env .mail-single{background:#fff;padding:30px;margin-bottom:30px}.mailbox-env .mail-single .mail-single-header{border-bottom:2px solid #f0f0f0;padding-bottom:20px;margin-bottom:20px}.mailbox-env .mail-single .mail-single-header>h2{float:left;margin:0;font-size:23px}@media screen and (max-width:768px){.mailbox-env .mail-single .mail-single-header>h2{float:none;margin-bottom:20px;font-size:19px}.mailbox-env .mail-single .mail-single-header>h2 .go-back{font-size:11px}}.mailbox-env .mail-single .mail-single-header>h2 .go-back{display:block;color:#bdbebe;font-size:13px;margin-top:10px;margin-left:-5px}.mailbox-env .mail-single .mail-single-header>h2 .go-back i{color:#b1b1b1}.mailbox-env .mail-single .mail-single-header>h2 .label,.mailbox-env .mail-single .mail-single-header>h2 .badge{margin-left:10px}.mailbox-env .mail-single .mail-single-header .mail-single-header-options{float:right}@media screen and (max-width:768px){.mailbox-env .mail-single .mail-single-header .mail-single-header-options{float:none}}.mailbox-env .mail-single .mail-single-info{border-bottom:1px solid #f0f0f0;padding-bottom:20px;margin-bottom:20px}.mailbox-env .mail-single .mail-single-info .mail-single-info-user{float:left}.mailbox-env .mail-single .mail-single-info .mail-single-info-user>a{display:block;color:#979898;text-decoration:none}.mailbox-env .mail-single .mail-single-info .mail-single-info-user>a strong,.mailbox-env .mail-single .mail-single-info .mail-single-info-user>a span{color:#717272;font-weight:700}.mailbox-env .mail-single .mail-single-info .mail-single-info-user>a img{float:left;margin-right:10px}.mailbox-env .mail-single .mail-single-info .mail-single-info-user>a em{font-style:normal;display:block;color:#CCC;padding-top:2px}.mailbox-env .mail-single .mail-single-info .mail-single-info-user.open>a{text-decoration:none}.mailbox-env .mail-single .mail-single-info .mail-single-info-user .dropdown-menu{width:100%;margin-top:10px}.mailbox-env .mail-single .mail-single-info .mail-single-info-user .dropdown-menu:before{content:'';position:absolute;display:block;background:inherit;width:10px;height:10px;top:-5px;left:4%;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-o-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);z-index:1}.mailbox-env .mail-single .mail-single-info .mail-single-info-user .dropdown-menu li{position:relative;z-index:2}.mailbox-env .mail-single .mail-single-info .mail-single-info-user .dropdown-menu li i{display:inline-block;margin-right:2px}.mailbox-env .mail-single .mail-single-info .mail-single-info-options{float:right;padding-top:10px}.mailbox-env .mail-single .mail-single-info .mail-single-info-options a{color:#979898;display:inline-block;margin-left:5px}.mailbox-env .mail-single .mail-single-info .mail-single-info-options a i{font-size:16px}.mailbox-env .mail-single .mail-single-info .mail-single-info-options a.starred{color:#ffba00}.mailbox-env .mail-single .mail-single-body{border-bottom:1px solid #f0f0f0;padding-bottom:20px;margin-bottom:20px}.mailbox-env .mail-single .mail-single-body p{color:#7d7f7f}.mailbox-env .mail-single .mail-single-attachments h3{margin:0;margin-bottom:20px;font-size:22px}.mailbox-env .mail-single .mail-single-attachments h3 i{font-size:17px;position:relative;top:-2px;display:inline-block}.mailbox-env .mail-single .mail-single-attachments ul li{margin-bottom:20px}.mailbox-env .mail-single .mail-single-attachments ul li .thumb{position:relative;display:block}.mailbox-env .mail-single .mail-single-attachments ul li .thumb:before{content:'';display:block;position:absolute;background:linear-gradient(to bottom,#fff 0,#7c38bc 100%);zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);left:8px;right:8px;top:8px;bottom:8px;z-index:1;-webkit-transition:all 100ms ease-in-out;-moz-transition:all 100ms ease-in-out;-o-transition:all 100ms ease-in-out;transition:all 100ms ease-in-out}.mailbox-env .mail-single .mail-single-attachments ul li .thumb:after{display:block;position:absolute;color:#fff;content:'\f06e';font-family:fontawesome;left:50%;top:50%;font-size:22px;z-index:2;margin-left:-12px;margin-top:-13px;-webkit-transform:scale(0);-moz-transform:scale(0);-o-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transition:all 200ms ease-in-out;-moz-transition:all 200ms ease-in-out;-o-transition:all 200ms ease-in-out;transition:all 200ms ease-in-out}.mailbox-env .mail-single .mail-single-attachments ul li .thumb:hover:before{zoom:1;-webkit-opacity:.4;-moz-opacity:.4;opacity:.4;-ms-filter:alpha(Opacity=40);filter:alpha(opacity=40)}.mailbox-env .mail-single .mail-single-attachments ul li .thumb:hover:after{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.mailbox-env .mail-single .mail-single-attachments ul li .img-thumbnail{border-width:2px}.mailbox-env .mail-single .mail-single-attachments ul li .name{display:block;margin-top:12px;color:#717272;font-weight:700}.mailbox-env .mail-single .mail-single-attachments ul li .name span{float:right;font-size:11px;color:#ddd;font-weight:400}.mailbox-env .mail-single .mail-single-attachments ul li .links{display:block;margin-top:5px;color:#a4a5a5;font-size:11px}.mailbox-env .mail-single .mail-single-attachments ul li .links a{color:#979898}.mailbox-env .mail-single .mail-single-attachments ul li .links a:hover{color:#646565}.mailbox-env .mail-single .mail-single-attachments ul.list-inline li{margin-right:20px}.mailbox-env .mail-single .mail-single-reply{border:1px solid #e4e4e4;padding:15px 20px;min-height:70px;color:#979898}.mailbox-env .mail-single .mail-single-reply a{font-weight:700;color:#717272;text-decoration:none}.mailbox-env .mail-single .mail-single-reply a:hover{color:#575858}.mailbox-env .mailbox-right{float:right!important}@media screen and (max-width:768px){.mailbox-env .mailbox-right{float:none!important}}.mailbox-env .mailbox-left{float:left!important}@media screen and (max-width:768px){.mailbox-env .mailbox-left{float:none!important}}.invoice-env{padding:15px 0}@media print{.invoice-env{padding:0}}.invoice-env .invoice-header{border-bottom:1px solid #f5f5f5;padding-bottom:20px}.invoice-env .invoice-header .invoice-logo{float:left}.invoice-env .invoice-header .invoice-logo .logo{display:block;margin-bottom:20px}.invoice-env .invoice-header .invoice-logo ul li{color:#979898;font-size:14px}.invoice-env .invoice-header .invoice-logo ul li strong{color:#717272}.invoice-env .invoice-header .invoice-logo ul li+li{margin-top:2px}.invoice-env .invoice-header .invoice-options{float:right;width:180px}@media screen and (max-width:480px){.invoice-env .invoice-header .invoice-logo,.invoice-env .invoice-header .invoice-options{float:none}.invoice-env .invoice-header .invoice-options{width:auto;margin-bottom:30px}}.invoice-env .invoice-details{padding-top:30px;padding-bottom:10px}.invoice-env .invoice-details .invoice-client-info,.invoice-env .invoice-details .invoice-payment-info{font-size:14px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.invoice-env .invoice-details .invoice-client-info>strong,.invoice-env .invoice-details .invoice-payment-info>strong{display:block;margin-bottom:5px;color:#646565}.invoice-env .invoice-details .invoice-client-info strong,.invoice-env .invoice-details .invoice-payment-info strong{color:#717272}.invoice-env .invoice-details .invoice-client-info{float:left;width:60%}.invoice-env .invoice-details .invoice-client-info ul{float:left;margin-right:20px}@media print{.invoice-env .invoice-details .invoice-client-info{width:50%}}.invoice-env .invoice-details .invoice-payment-info{float:right;width:30%}@media print{.invoice-env .invoice-details .invoice-payment-info{width:50%;text-align:right}}@media screen and (max-width:480px){.invoice-env .invoice-details .invoice-client-info,.invoice-env .invoice-details .invoice-payment-info{float:none;width:100%}.invoice-env .invoice-details .invoice-payment-info{margin-top:15px}}.invoice-env .table{margin-top:15px;margin-bottom:15px}.invoice-env .invoice-totals{margin-top:30px}.invoice-env .invoice-totals .invoice-bill-info{float:left;padding-left:15px}.invoice-env .invoice-totals .invoice-subtotals-totals{float:right;text-align:right;padding-right:15px}.invoice-env .invoice-totals .invoice-subtotals-totals span{display:block}.invoice-env .invoice-totals .invoice-subtotals-totals span strong{color:#717272;display:inline-block;min-width:50px}.invoice-env .invoice-totals .invoice-subtotals-totals hr{margin:8px 0}@media screen and (max-width:480px){.invoice-env .invoice-totals .invoice-bill-info,.invoice-env .invoice-totals .invoice-subtotals-totals{float:none;padding:0}.invoice-env .invoice-totals .invoice-subtotals-totals{margin-bottom:30px}}@media print{.invoice-env .invoice-totals .invoice-bill-info,.invoice-env .invoice-totals .invoice-subtotals-totals{padding:0}}.search-env form{position:relative;margin-bottom:30px}.search-env form .form-control{padding-right:50px}.search-env form button[type=submit]{position:absolute;right:0;top:0;line-height:45px;padding:0 15px;font-size:16px;color:#979898;outline:0}.search-env .nav.tabs-vertical{width:200px}@media screen and (max-width:768px){.search-env .nav.tabs-vertical{width:50px;min-width:50px}}.search-env .nav.tabs-vertical>li>a{background:0 0;font-size:14px;text-align:left}.search-env .nav.tabs-vertical>li>a:after{display:block;content:'';height:1px;margin-top:5px;background-color:#ddd;position:absolute;left:15px;right:15px;bottom:0}.search-env .nav.tabs-vertical>li.active>a{font-weight:700;color:#2c2e2f}.search-env .nav.tabs-vertical>li.active>a:after{display:none}.search-env .nav.tabs-vertical>li:last-child>a:after{display:none}.search-env .tab-content .tab-pane h2{margin:0;font-size:24px;border-bottom:1px solid #f5f5f5;padding-bottom:30px;margin-top:-10px;margin-bottom:30px}.search-env .tab-content .tab-pane h2 small{display:block;padding-top:10px;color:#999;font-size:13px}.search-env .tab-content .tab-pane .results li{border-bottom:1px solid #f5f5f5;padding-bottom:30px;margin-bottom:30px}.search-env .tab-content .tab-pane .results li h3{margin:0;margin-bottom:15px}.search-env .tab-content .tab-pane .results li p{color:#b1b1b1}.search-env .tab-content .tab-pane .results li .link{color:#68b828}.search-env .tab-content .tab-pane .results li .link:hover{color:#508e1f}.search-env .tab-content .tab-pane .results li+li{margin-bottom:30px}.search-env .tab-content .tab-pane .pagination{margin:0}.gallery-env{margin-bottom:20px}@media screen and (max-width:768px){.gallery-env .gallery-sidebar{margin-top:30px}}.gallery-env .gallery-sidebar ul{margin:20px 0}.gallery-env .gallery-sidebar ul li a{display:block;padding:10px 5px;border-bottom:1px solid #ddd;color:#7d7f7f}.gallery-env .gallery-sidebar ul li a i{display:inline-block;margin-right:2px}.gallery-env .gallery-sidebar ul li a:hover{color:#575858}.gallery-env .gallery-sidebar ul li.active>a{color:#2c2e2f;font-weight:700}.gallery-env .gallery-sidebar ul li:last-child>a{border-bottom:0}.gallery-env .album-header{padding:25px 30px;background:#fff;margin-bottom:20px}.gallery-env .album-header h2{margin:0;padding:0;float:left;color:#2c2e2f;font-size:24px}.gallery-env .album-header .album-options{float:right;padding:0;margin:0;margin-top:5px}.gallery-env .album-header .album-options .cbr-replaced{margin-bottom:0;margin-right:5px}.gallery-env .album-header .album-options li{color:#646565}.gallery-env .album-header .album-options li a{color:#646565}.gallery-env .album-header .album-options li a:hover{color:#2c2e2f}.gallery-env .album-header .album-options li label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.gallery-env .album-header .album-options li+li{margin-left:10px}@media screen and (max-width:768px){.gallery-env .album-header{padding:15px 20px}.gallery-env .album-header h2,.gallery-env .album-header .album-options{float:none}.gallery-env .album-header h2{text-align:center;padding:10px 0}.gallery-env .album-header .album-options{margin-top:10px}}.gallery-env .album-sorting-info{display:none}.gallery-env .album-sorting-info .album-sorting-info-inner{border:2px dashed #b7b7b7;padding:15px 10px;font-size:14px;margin-bottom:20px}.gallery-env .album-images .album-image{position:relative;padding:10px;background:#fff;margin-bottom:20px}.gallery-env .album-images .album-image .thumb{position:relative;display:block;margin-bottom:10px;z-index:2}.gallery-env .album-images .album-image .thumb img{display:block;margin:0;line-height:1;width:100%}.gallery-env .album-images .album-image .thumb:hover~.image-checkbox .cbr-replaced{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.gallery-env .album-images .album-image .name{float:left;width:75%}.gallery-env .album-images .album-image .name span{color:#2c2e2f;font-weight:700}.gallery-env .album-images .album-image .name em{font-style:normal;color:#979898;font-size:11px;display:block}@media screen and (min-width:768px){.gallery-env .album-images .album-image .name span,.gallery-env .album-images .album-image .name em{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}}.gallery-env .album-images .album-image .image-options{float:right;width:25%;text-align:right;white-space:nowrap}.gallery-env .album-images .album-image .image-options a{font-size:10px;color:#5d6264}.gallery-env .album-images .album-image .image-options a:hover{color:#2c2e2f}.gallery-env .album-images .album-image .image-checkbox{position:absolute;right:17px;top:15px;z-index:5}.gallery-env .album-images .album-image .image-checkbox .cbr-replaced{zoom:1;-webkit-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:alpha(Opacity=50);filter:alpha(opacity=50)}.gallery-env .album-images .album-image .image-checkbox .cbr-replaced:hover,.gallery-env .album-images .album-image .image-checkbox .cbr-replaced.cbr-checked{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.gallery-env .album-images .ui-sortable-handle .album-image{-webkit-box-shadow:0 0 0 1px rgba(104,184,40,.2);-moz-box-shadow:0 0 0 1px rgba(104,184,40,.2);box-shadow:0 0 0 1px rgba(104,184,40,.2);-webkit-animation:glowAnimation 1s ease-in-out alternate infinite;-moz-animation:glowAnimation 1s ease-in-out alternate infinite;-o-animation:glowAnimation 1s ease-in-out alternate infinite;animation:glowAnimation 1s ease-in-out alternate infinite;margin-bottom:0}.gallery-env .album-images .ui-sortable-handle{margin-bottom:20px}.gallery-env .album-images .ui-sortable-placeholder{visibility:visible!important;background:rgba(204,204,204,.1);border:1px dashed #c4c4c4;margin:0!important}.gallery-env .gallery-right{float:right!important}@media screen and (max-width:768px){.gallery-env .gallery-right{float:none!important}}.gallery-env .gallery-left{float:left!important}@media screen and (max-width:768px){.gallery-env .gallery-left{float:none!important}}lesshat-selector{-lh-property:0}@-webkit-keyframes glowAnimation{0%{box-shadow:rgba(104,184,40,.2) 0 0 0 1px}100%{box-shadow:rgba(104,184,40,.8) 0 0 3px 1px}}@-moz-keyframes glowAnimation{0%{box-shadow:rgba(104,184,40,.2) 0 0 0 1px}100%{box-shadow:rgba(104,184,40,.8) 0 0 3px 1px}}@-o-keyframes glowAnimation{0%{box-shadow:rgba(104,184,40,.2) 0 0 0 1px}100%{box-shadow:rgba(104,184,40,.8) 0 0 3px 1px}}@keyframes glowAnimation{0%{box-shadow:rgba(104,184,40,.2) 0 0 0 1px}100%{box-shadow:rgba(104,184,40,.8) 0 0 3px 1px}}.modal-gallery-image{margin:-31px;margin-bottom:0;border-bottom:5px solid #f5f5f5;position:relative}.modal-gallery-image img{display:block;width:100%}.modal-gallery-top-controls{position:absolute;right:15px;top:0;border:0}.page-error{background:#fff;width:700px;padding:50px;margin-bottom:20px}@media screen and (max-width:991px){.page-error{width:90%}.main-content .page-error{width:100%}}.page-error.centered{margin-left:auto;margin-right:auto}.page-error .error-symbol{font-size:48px;line-height:1}.page-error .error-symbol i{line-height:1}.page-error h2{font-size:35px;margin-bottom:20px}.page-error h2 small{display:block;padding-top:10px;color:#bcbcbc;font-size:50%}.page-error-env>.page-error{margin-top:50px}.page-error-search{width:700px}@media screen and (max-width:991px){.page-error-search{width:90%}.main-content .page-error-search{width:100%}}.page-error-search.centered{margin-left:auto;margin-right:auto}.page-error-search form{position:relative}.page-error-search form button[type=submit]{display:block;position:absolute;right:0;top:0;line-height:32px;padding:0 10px;font-size:12px;color:#a4a5a5}.page-error-search form.form-half{width:45%;margin-left:auto;margin-right:auto}.page-error-search form .input-lg+button[type=submit]{line-height:45px;padding:0 15px}.page-error-search .go-back{display:block;text-align:center;color:#abacac;margin:15px 0}.page-error-search .go-back:hover{color:#979898}.calendar-env{position:relative;margin-bottom:30px}.calendar-env .calendar-sidebar form{margin-bottom:20px}.calendar-env .calendar-sidebar form .form-control{padding:20px 15px;height:37px;width:100%}@media screen and (max-width:768px){.calendar-env .calendar-sidebar{margin-top:30px}.calendar-env .calendar-sidebar form{margin-bottom:0}}.calendar-env .calendar-sidebar .calendar-list{margin:0;margin-bottom:30px}@media screen and (max-width:768px){.calendar-env .calendar-sidebar .calendar-list{margin-top:10px}}.calendar-env .calendar-sidebar .calendar-list li a{display:block;color:#979898;padding-bottom:7px}.calendar-env .calendar-sidebar .calendar-list li a:hover{color:#717272}.calendar-env .calendar-sidebar .calendar-list li a .badge{margin-top:0;display:block;text-align:left;font-size:12px;padding:7px 10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.calendar-env .calendar-sidebar .calendar-list li.list-header{font-size:10px;padding:10px 0;font-weight:700;color:#979898;border-bottom:0;text-transform:uppercase}.calendar-env .calendar-sidebar .calendar-list li.ui-draggable-dragging .badge{zoom:1;-webkit-opacity:.6;-moz-opacity:.6;opacity:.6;-ms-filter:alpha(Opacity=60);filter:alpha(opacity=60)}.calendar-env .calendar-sidebar .calendar-list li.ui-draggable-handle .badge{cursor:move}.calendar-env .calendar-main{position:relative;background:#fff;padding:30px;z-index:5}.calendar-env .calendar-main .fc .fc-popover,.calendar-env .calendar-main .fc .fc-row,.calendar-env .calendar-main .fc hr,.calendar-env .calendar-main .fc tbody,.calendar-env .calendar-main .fc td,.calendar-env .calendar-main .fc th,.calendar-env .calendar-main .fc thead{border-color:#eee}.calendar-env .calendar-main .fc .fc-toolbar{padding-bottom:15px}.calendar-env .calendar-main .fc .fc-toolbar .fc-left h2{font-size:24px}.calendar-env .calendar-main .fc .fc-toolbar .fc-left h2:before{content:'\f133';font-family:fontawesome;display:inline-block;margin-right:10px}.calendar-env .calendar-main .fc .fc-toolbar .fc-right{margin-top:5px}.calendar-env .calendar-main .fc .fc-toolbar .fc-right>.fc-button-group:last-child{margin-right:-15px}@media screen and (max-width:768px){.calendar-env .calendar-main .fc .fc-toolbar .fc-left,.calendar-env .calendar-main .fc .fc-toolbar .fc-right{float:none;width:100%}.calendar-env .calendar-main .fc .fc-toolbar .fc-left:before,.calendar-env .calendar-main .fc .fc-toolbar .fc-right:before,.calendar-env .calendar-main .fc .fc-toolbar .fc-left:after,.calendar-env .calendar-main .fc .fc-toolbar .fc-right:after{content:" ";display:table}.calendar-env .calendar-main .fc .fc-toolbar .fc-left:after,.calendar-env .calendar-main .fc .fc-toolbar .fc-right:after{clear:both}.calendar-env .calendar-main .fc .fc-toolbar .fc-left:before,.calendar-env .calendar-main .fc .fc-toolbar .fc-right:before,.calendar-env .calendar-main .fc .fc-toolbar .fc-left:after,.calendar-env .calendar-main .fc .fc-toolbar .fc-right:after{content:" ";display:table}.calendar-env .calendar-main .fc .fc-toolbar .fc-left:after,.calendar-env .calendar-main .fc .fc-toolbar .fc-right:after{clear:both}.calendar-env .calendar-main .fc .fc-toolbar .fc-left h2{text-align:center;width:100%;float:none}.calendar-env .calendar-main .fc .fc-toolbar .fc-right{position:relative;margin-top:10px;text-align:center;top:12px}.calendar-env .calendar-main .fc .fc-toolbar .fc-right .fc-button-group{display:inline-block;float:none}}.calendar-env .calendar-main .fc .fc-toolbar .fc-button-group{background:0 0;border:0}.calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-month-button.fc-state-active,.calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-basicWeek-button.fc-state-active,.calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-agendaWeek-button.fc-state-active,.calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-agendaDay-button.fc-state-active,.calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-basicDay-button.fc-state-active{color:#2c2e2f}.calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-month-button:after{content:'';display:block;position:absolute;right:-1px;top:25%;bottom:25%;width:1px;background:#eee}.calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-month-button+.fc-agendaWeek-button:after{content:'';display:block;position:absolute;right:-1px;top:25%;bottom:25%;width:1px;background:#eee}.calendar-env .calendar-main .fc .fc-toolbar .fc-button-group .fc-month-button+.fc-basicWeek-button:after{content:'';display:block;position:absolute;right:-1px;top:25%;bottom:25%;width:1px;background:#eee}.calendar-env .calendar-main .fc .fc-toolbar .fc-button{border:0;background:0 0;padding:0 10px;margin:0;height:auto;position:relative;outline:0;color:#979898;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.calendar-env .calendar-main .fc .fc-toolbar .fc-button .fc-icon{font-size:13px;font-family:fontawesome}.calendar-env .calendar-main .fc .fc-toolbar .fc-button.fc-next-button:hover,.calendar-env .calendar-main .fc .fc-toolbar .fc-button.fc-prev-button:hover{color:#2c2e2f}.calendar-env .calendar-main .fc .fc-toolbar .fc-button.fc-prev-button:after{content:'';display:block;position:absolute;right:-1px;top:25%;bottom:25%;width:1px;background:#eee}.calendar-env .calendar-main .fc .fc-view-container>.fc-basic-view>table>thead>tr>td.fc-widget-header{border:0;border-bottom:1px solid #eee}.calendar-env .calendar-main .fc .fc-view-container>.fc-basic-view>table>thead>tr>td .fc-day-header{border:0;padding-bottom:10px;color:#717272;font-weight:400}.calendar-env .calendar-main .fc .fc-view-container>.fc-basic-view>table>tbody>tr>.fc-widget-content{border:0;border-bottom:1px solid #eee}.calendar-env .calendar-main .fc .fc-view-container>.fc-basic-view>table>tbody>tr>.fc-widget-content .fc-day-number{padding-top:10px;padding-right:10px;color:#949494}.calendar-env .calendar-main .fc .fc-popover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.calendar-env .calendar-main .fc .fc-popover .fc-header{padding:5px}.calendar-env .calendar-main .fc .fc-popover .fc-body .fc-event-container a{margin-left:2px;margin-right:2px}.calendar-env .calendar-main .fc .fc-today{background-color:#fafafa;color:#2c2e2f}.calendar-env .calendar-main .fc .fc-event{background:#68b828;border:0;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box;padding:1px 3px}.calendar-env .calendar-main .fc .fc-event.event-color-primary{background-color:#2c2e2f}.calendar-env .calendar-main .fc .fc-event.event-color-success{background-color:#8dc63f}.calendar-env .calendar-main .fc .fc-event.event-color-danger{background-color:#cc3f44}.calendar-env .calendar-main .fc .fc-event.event-color-warning{background-color:#ffba00}.calendar-env .calendar-main .fc .fc-event.event-color-info{background-color:#40bbea}.calendar-env .calendar-main .fc .fc-event.event-color-red{background-color:#d5080f}.calendar-env .calendar-main .fc .fc-event.event-color-blue{background-color:#0e62c7}.calendar-env .calendar-main .fc .fc-event.event-color-purple{background-color:#7c38bc}.calendar-env .calendar-main .fc .fc-event.event-color-gray{background-color:#959595}.calendar-env .calendar-main .fc .fc-event.event-color-black{background-color:#222}.calendar-env .calendar-right{float:right!important}@media screen and (max-width:768px){.calendar-env .calendar-right{float:none!important}}.calendar-env .calendar-left{float:left!important}@media screen and (max-width:768px){.calendar-env .calendar-left{float:none!important}}.profile-env{margin-bottom:30px}.profile-env .user-info-sidebar hr{border-top-color:#e1e1e1;margin:10px 0}.profile-env .user-info-sidebar .user-img{display:block;margin-bottom:10px;text-align:center}.profile-env .user-info-sidebar .user-img img{display:inline-block}.profile-env .user-info-sidebar .user-img img.img-thumbnail{padding:4px;border:0}.profile-env .user-info-sidebar .user-name{display:block;font-size:19px;text-align:center}.profile-env .user-info-sidebar .user-title{display:block;color:#999;text-align:center;font-size:12px;margin-bottom:20px}.profile-env .user-info-sidebar .user-title strong,.profile-env .user-info-sidebar .user-title a{color:#7d7f7f}.profile-env .user-info-sidebar .user-status{position:relative;display:inline-block;background:#FFF;top:-2px;margin-left:5px;width:6px;height:6px;-webkit-border-radius:50%;-webkit-background-clip:padding-box;-moz-border-radius:50%;-moz-background-clip:padding;border-radius:50%;background-clip:padding-box}.profile-env .user-info-sidebar .user-status.is-online{background-color:#8dc63f}.profile-env .user-info-sidebar .user-status.is-idle{background-color:#ffba00}.profile-env .user-info-sidebar .user-status.is-busy{background-color:#d5080f}.profile-env .user-info-sidebar .user-status.is-offline{background-color:#CCC}.profile-env .user-info-sidebar .user-info-list{display:table;margin:0 auto}.profile-env .user-info-sidebar .user-info-list li{margin:10px 0;color:#979898}.profile-env .user-info-sidebar .user-info-list li i{color:#7d7f7f;display:inline-block;margin-right:5px}.profile-env .user-info-sidebar .user-info-list li a,.profile-env .user-info-sidebar .user-info-list li strong{color:#717272}.profile-env .user-info-sidebar .user-info-list li a:hover{color:#4b4b4b}.profile-env .user-info-sidebar .user-friends-count{display:table;margin:20px auto}.profile-env .user-info-sidebar .user-friends-count li{position:relative;display:table-cell;color:#b1b1b1;font-size:12px;padding:0 20px}.profile-env .user-info-sidebar .user-friends-count li span{display:block;font-size:23px;color:#646565}.profile-env .user-info-sidebar .user-friends-count li:first-child{padding-left:0}.profile-env .user-info-sidebar .user-friends-count li:last-child{padding-right:0}.profile-env .user-info-sidebar .user-friends-count li+li:after{display:block;content:'';position:absolute;left:0;top:15%;bottom:15%;width:1px;background:#ddd}.profile-env .profile-post-form{position:relative;background:#fff;border:1px solid #e4e4e4;padding:20px;margin-bottom:30px}.profile-env .profile-post-form:after{content:'';display:block;position:absolute;left:-7.4px;top:25px;width:0;height:0;border-style:solid;border-width:7px 8.4px 7px 0;border-color:transparent #fff transparent transparent}@media screen and (max-width:767px){.profile-env .profile-post-form{margin-top:30px;margin-bottom:20px}.profile-env .profile-post-form:after{display:none}}.profile-env .profile-post-form textarea{position:relative;resize:none;z-index:1;border-bottom:1px solid #eee}.profile-env .profile-post-form textarea::-moz-placeholder{color:#bdbebe;opacity:1}.profile-env .profile-post-form textarea:-ms-input-placeholder{color:#bdbebe}.profile-env .profile-post-form textarea::-webkit-input-placeholder{color:#bdbebe}.profile-env .profile-post-form textarea::-webkit-input-placeholder{color:#bdbebe}.profile-env .profile-post-form textarea:-moz-placeholder{color:#bdbebe}.profile-env .profile-post-form textarea::-moz-placeholder{color:#bdbebe}.profile-env .profile-post-form textarea:-ms-input-placeholder{color:#bdbebe}.profile-env .profile-post-form textarea:focus~.post-story-button{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.profile-env .profile-post-form .form-action-buttons{margin:0;margin-top:15px}.profile-env .profile-post-form .form-action-buttons li button{color:#979898;font-size:15px}.profile-env .profile-post-form .form-action-buttons li button:hover{color:#515557}.profile-env .profile-post-form .form-action-buttons li button:active{color:#68b828}.profile-env .profile-post-form .post-story-button{float:right;margin-top:-17px;padding-left:20px;padding-right:20px;-webkit-transition:opacity 150ms linear;-moz-transition:opacity 150ms linear;-o-transition:opacity 150ms linear;transition:opacity 150ms linear;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0)}.profile-env .profile-post-form .post-story-button:active,.profile-env .profile-post-form .post-story-button:focus{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.profile-env .block-icon{position:absolute;right:20px;top:20px;color:#cacbcb}.profile-env .user-timeline-stories .timeline-story{position:relative;background:#fff;padding:20px;margin-bottom:30px}@media screen and (max-width:767px){.profile-env .user-timeline-stories .timeline-story{margin-bottom:20px}}.profile-env .user-timeline-stories .timeline-story header{color:#979898;font-size:14px;margin-bottom:10px}.profile-env .user-timeline-stories .timeline-story header .user-img{margin-right:20px;float:left}.profile-env .user-timeline-stories .timeline-story header .user-img img{width:48px}.profile-env .user-timeline-stories .timeline-story header .user-details{display:block;padding-top:5px}.profile-env .user-timeline-stories .timeline-story header a{color:#646565}.profile-env .user-timeline-stories .timeline-story header a:hover{color:#4b4b4b}.profile-env .user-timeline-stories .timeline-story header time{display:block;font-size:12px;color:#b1b1b1}.profile-env .user-timeline-stories .timeline-story .story-content{display:block;padding-left:70px}@media screen and (max-width:767px){.profile-env .user-timeline-stories .timeline-story .story-content{padding-left:0}}.profile-env .user-timeline-stories .timeline-story .story-content p{font-size:14px}@media screen and (max-width:767px){.profile-env .user-timeline-stories .timeline-story>.story-content{margin-top:20px}}.profile-env .user-timeline-stories .timeline-story .story-audio-item{background:#f8f8f8;padding:30px;margin:10px -20px;margin-top:20px}.profile-env .user-timeline-stories .timeline-story .story-audio-item .story-content{margin-left:-13px}.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info{padding-bottom:15px}.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info .artist-info,.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info .track-length{color:#979898}.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info .artist-info{float:left}.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-info .track-length{float:right}.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline{width:100%;display:table}.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline .play-pause,.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline .track-timeline,.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline .track-volume{display:table-cell;vertical-align:middle}.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline .play-pause{width:75px}.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline .track-volume{width:30px;text-align:right}.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline .track-timeline .track-timeline-empty{display:block;height:2px;background:#dedede;position:relative}.profile-env .user-timeline-stories .timeline-story .story-audio-item .audio-track-timeline .track-timeline .track-timeline-empty .track-fill{position:absolute;left:0;top:0;bottom:0;background:#2c2e2f}.profile-env .user-timeline-stories .timeline-story .story-options-links{padding-top:10px}.profile-env .user-timeline-stories .timeline-story .story-options-links a{display:inline-block;color:#979898;margin-right:30px}.profile-env .user-timeline-stories .timeline-story .story-options-links a span{display:inline-block;zoom:1;-webkit-opacity:.9;-moz-opacity:.9;opacity:.9;-ms-filter:alpha(Opacity=90);filter:alpha(opacity=90)}.profile-env .user-timeline-stories .timeline-story .story-options-links a:hover{color:#575858}.profile-env .user-timeline-stories .timeline-story .story-options-links a.liked{color:#ed3434}.profile-env .user-timeline-stories .timeline-story .story-comments{border-top:1px solid #eee;margin-top:20px;padding-top:10px}.profile-env .user-timeline-stories .timeline-story .story-comments .story-comment{margin-top:10px}.profile-env .user-timeline-stories .timeline-story .story-comments .story-comment .comment-user-img{display:block;float:left}.profile-env .user-timeline-stories .timeline-story .story-comments .story-comment .comment-user-img img{width:32px}.profile-env .user-timeline-stories .timeline-story .story-comments .story-comment .story-comment-content{margin-left:50px;padding-bottom:5px;padding-left:2px;border-bottom:1px solid #eee}.profile-env .user-timeline-stories .timeline-story .story-comments .story-comment .story-comment-content .story-comment-user-name{display:block;font-size:14px;color:#575858;margin-bottom:5px}.profile-env .user-timeline-stories .timeline-story .story-comments .story-comment .story-comment-content .story-comment-user-name time{display:inline-block;margin-left:5px;font-size:11px;color:#ddd}.profile-env .user-timeline-stories .timeline-story .story-comments .story-comment .story-comment-content p{font-size:13px}.profile-env .user-timeline-stories .timeline-story .story-comments li:last-child .story-comment .story-comment-content{border-bottom:0}.profile-env .user-timeline-stories .timeline-story .story-comment-form{margin-top:20px}.profile-env .user-timeline-stories .timeline-story .story-comment-form textarea{border:1px solid #eee;padding:10px;max-height:100px;margin-bottom:10px}.profile-env .user-timeline-stories .timeline-story .story-checkin{margin-bottom:10px;border:1px solid #eee;padding:10px}.profile-env .user-timeline-stories .timeline-story .story-album{border:1px solid #eee;padding:10px;margin-bottom:20px}.profile-env .user-timeline-stories .timeline-story .story-album .col-1,.profile-env .user-timeline-stories .timeline-story .story-album .col-2{display:block;float:left;width:50%}.profile-env .user-timeline-stories .timeline-story .story-album .col-1{padding-right:6px}.profile-env .user-timeline-stories .timeline-story .story-album .col-2{padding-left:6px}@media screen and (max-width:767px){.profile-env .user-timeline-stories .timeline-story .story-album{padding-bottom:0}.profile-env .user-timeline-stories .timeline-story .story-album .col-1,.profile-env .user-timeline-stories .timeline-story .story-album .col-2{padding:0;width:100%;float:none;margin-bottom:10px}}.profile-env .user-timeline-stories .timeline-story:last-child{margin-bottom:0}.page-body .main-content .cbp_tmtimeline:before{background:#fff;width:5px;margin-left:-6px}.page-body .main-content .cbp_tmtimeline>li .cbp_tmtime>span{color:#575858;font-size:15px}.page-body .main-content .cbp_tmtimeline>li .cbp_tmtime>span:first-child{font-weight:700;margin-bottom:2px}.page-body .main-content .cbp_tmtimeline>li .cbp_tmtime>span:last-child{color:#979898;zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80);font-size:12px}.page-body .main-content .cbp_tmtimeline>li .cbp_tmtime>span.large{font-size:17px}.page-body .main-content .cbp_tmtimeline>li .cbp_tmtime>span.hidden+span{margin-top:8px}.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon{background:#fff;color:#979898;-webkit-box-shadow:0 0 0 3px #fff;-moz-box-shadow:0 0 0 3px #fff;box-shadow:0 0 0 3px #fff}.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-primary{background-color:#2c2e2f;color:#fff}.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-success{background-color:#8dc63f;color:#fff}.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-info{background-color:#40bbea;color:#fff}.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-danger{background-color:#cc3f44;color:#fff}.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-warning{background-color:#ffba00;color:#fff}.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-red{background-color:#d5080f;color:#fff}.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-purple{background-color:#7c38bc;color:#fff}.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-secondary{background-color:#68b828;color:#fff}.page-body .main-content .cbp_tmtimeline>li .cbp_tmicon.timeline-bg-gray{background-color:#ddd;color:#777}.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel{background:#fff;color:#737881;margin-bottom:30px;padding:20px;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel h2,.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel p{color:#737881;font-size:13px;margin:0;line-height:1.42857143}.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel p+p{margin-top:10px}.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel h2{font-size:15px}.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel h2 a{color:#303641}.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel h2 span{zoom:1;-webkit-opacity:.6;-moz-opacity:.6;opacity:.6;-ms-filter:alpha(Opacity=60);filter:alpha(opacity=60)}.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel blockquote{font-size:14px;padding-top:4px;padding-bottom:4px}.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel:after{border-right-color:#fff}.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel.empty{background:0;padding:9px 0;margin-bottom:70px}.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel.empty:after{visibility:hidden}@media screen and (max-width:47.2em){.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel:after{border-right-color:transparent;border-bottom-color:#fff;left:10px}.page-body .main-content .cbp_tmtimeline>li .large{font-weight:700;font-size:16px!important}.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel.empty{background:#fff;padding:1.7em}.page-body .main-content .cbp_tmtimeline>li .cbp_tmlabel.empty:after{visibility:visible}}.timeline-centered{position:relative;margin-bottom:20px}@media screen and (max-width:768px){.timeline-centered{margin-top:60px!important}}.timeline-centered:before{content:'';position:absolute;display:block;width:4px;background:#fff;left:50%;top:20px;bottom:20px;margin-left:-4px}.timeline-centered .timeline-entry{position:relative;width:50%;float:right;margin-bottom:70px;clear:both}.timeline-centered .timeline-entry:before,.timeline-centered .timeline-entry:after{content:" ";display:table}.timeline-centered .timeline-entry:after{clear:both}.timeline-centered .timeline-entry:before,.timeline-centered .timeline-entry:after{content:" ";display:table}.timeline-centered .timeline-entry:after{clear:both}.timeline-centered .timeline-entry.begin{margin-bottom:0}.timeline-centered .timeline-entry.left-aligned{float:left}.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner{margin-left:0;margin-right:-18px}.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-time{left:auto;right:-120px;text-align:left}.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-icon{float:right}.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-label{margin-left:0;margin-right:70px}.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-label:after{left:auto;right:0;margin-left:0;margin-right:-9px;-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.timeline-centered .timeline-entry .timeline-entry-inner{position:relative;margin-left:-22px}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-time{position:absolute;left:-100px;text-align:right;padding:10px;padding-top:2px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-time>span{display:block;color:#979898}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-time>span:first-child{font-size:15px;font-weight:700;color:#717272}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-time>span:last-child{font-size:12px}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon{background:#fff;color:#737881;display:block;width:40px;height:40px;-webkit-border-radius:20px;-webkit-background-clip:padding-box;-moz-border-radius:20px;-moz-background-clip:padding;border-radius:20px;background-clip:padding-box;text-align:center;-webkit-box-shadow:0 0 0 5px #fff;-moz-box-shadow:0 0 0 5px #fff;box-shadow:0 0 0 5px #fff;line-height:40px;font-size:16px;float:left}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-primary{background-color:#2c2e2f;color:#fff}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-success{background-color:#8dc63f;color:#fff}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-info{background-color:#40bbea;color:#fff}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-danger{background-color:#cc3f44;color:#fff}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-warning{background-color:#ffba00;color:#fff}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-red{background-color:#d5080f;color:#fff}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-purple{background-color:#7c38bc;color:#fff}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.timeline-bg-secondary{background-color:#68b828;color:#fff}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label{position:relative;background:#fff;padding:1.7em;margin-left:70px}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label:after{content:'';display:block;position:absolute;width:0;height:0;border-style:solid;border-width:9px 9px 9px 0;border-color:transparent #fff transparent transparent;left:0;top:10px;margin-left:-9px}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label h2,.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label p{color:#737881;font-size:13px;margin:0;line-height:1.42857143}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label p+p{margin-top:10px}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label h2{font-size:15px;margin-bottom:10px}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label h2 a{color:#303641}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label h2 span{zoom:1;-webkit-opacity:.6;-moz-opacity:.6;opacity:.6;-ms-filter:alpha(Opacity=60);filter:alpha(opacity=60)}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-label blockquote{font-size:14px;padding-top:4px;padding-bottom:4px;color:#979898}@media screen and (max-width:47.2em){.timeline-centered{margin-top:20px}.timeline-centered:before{left:22px}.timeline-centered .timeline-entry,.timeline-centered .timeline-entry.left-aligned{width:100%;float:none}.timeline-centered .timeline-entry .timeline-entry-inner,.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner{margin-left:0;margin-right:0}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-time,.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-time{left:60px;right:auto;top:-30px;width:auto}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-time span,.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-time span{display:inline-block}.timeline-centered .timeline-entry .timeline-entry-inner .timeline-time span+span,.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-time span+span{margin-left:10px}.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-icon{float:left}.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-label{margin-left:70px;margin-right:0}.timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-label:after{left:0;right:auto;margin-left:-9px;margin-right:0;-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}}.draggable-portlets .sorted{min-height:100px}.draggable-portlets .sorted .ui-sortable-placeholder{background:rgba(255,255,204,.7);border:1px dashed #ddd;visibility:visible!important}.draggable-portlets .sorted>.panel{-webkit-transition:opacity 200ms ease-in-out,transform 200ms ease-in-out;-o-transition:opacity 200ms ease-in-out,transform 200ms ease-in-out;transition:opacity 200ms ease-in-out,transform 200ms ease-in-out;-webkit-transition:opacity 200ms ease-in-out,-webkit-transform 200ms ease-in-out;-moz-transition:opacity 200ms ease-in-out,-moz-transform 200ms ease-in-out;-o-transition:opacity 200ms ease-in-out,-o-transform 200ms ease-in-out;transition:opacity 200ms ease-in-out,-webkit-transform 200ms ease-in-out,-moz-transform 200ms ease-in-out,-o-transform 200ms ease-in-out,transform 200ms ease-in-out}.draggable-portlets .sorted>.panel .panel-heading{cursor:pointer}.draggable-portlets.dragging .sorted>.panel{-webkit-transform:scale(.97);-moz-transform:scale(.97);-o-transform:scale(.97);-ms-transform:scale(.97);transform:scale(.97);zoom:1;-webkit-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:alpha(Opacity=50);filter:alpha(opacity=50)}.draggable-portlets.dragging .sorted>.panel.ui-sortable-helper{-webkit-transform:scale(1.03);-moz-transform:scale(1.03);-o-transform:scale(1.03);-ms-transform:scale(1.03);transform:scale(1.03);zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.notes-env{position:relative;margin-bottom:30px}.notes-env .notes-header{margin-bottom:10px}.notes-env .notes-list{position:relative}.notes-env .notes-list .write-pad,.notes-env .notes-list .list-of-notes{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.notes-env .notes-list .list-of-notes{float:left;width:26%;list-style:none;margin:0;padding:0;padding-bottom:20px}.notes-env .notes-list .list-of-notes li{position:relative;padding-right:10px;padding-bottom:10px}.notes-env .notes-list .list-of-notes li a{display:block;border:1px solid #e0e0e0;background:#fff;padding:10px 15px}.notes-env .notes-list .list-of-notes li a strong,.notes-env .notes-list .list-of-notes li a span{display:block}.notes-env .notes-list .list-of-notes li a strong+strong,.notes-env .notes-list .list-of-notes li a span+strong,.notes-env .notes-list .list-of-notes li a strong+span,.notes-env .notes-list .list-of-notes li a span+span{padding-top:8px}.notes-env .notes-list .list-of-notes li a strong{word-break:break-all;background:#f5f5f5;margin:-15px;margin-top:-10px;margin-bottom:0;padding:8px 10px;border-bottom:1px solid #e0e0e0;font-size:12px}@media screen and (max-width:768px){.notes-env .notes-list .list-of-notes li a strong{margin-bottom:-10px;border-bottom:0}}.notes-env .notes-list .list-of-notes li a span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;font-size:12px}.notes-env .notes-list .list-of-notes li a em{float:right}.notes-env .notes-list .list-of-notes li a:hover{background:#f5f5f5!important;border-color:#d3d3d3}.notes-env .notes-list .list-of-notes li a:hover span,.notes-env .notes-list .list-of-notes li a:hover strong{color:#737881}.notes-env .notes-list .list-of-notes li .note-close{position:absolute;right:11px;top:1px;border:none;background:0 0;outline:0;background:#f5f5f5;border:1px solid #e0e0e0;border-top:0;border-right:0;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0)}.notes-env .notes-list .list-of-notes li:hover .note-close{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.notes-env .notes-list .list-of-notes li .content{display:none}.notes-env .notes-list .list-of-notes li.current a{background:#fff}.notes-env .notes-list .list-of-notes li+.no-notes{display:none}.notes-env .notes-list .write-pad{float:right;width:74%;background:#fff;position:relative}.notes-env .notes-list .write-pad:after{display:block;content:'';position:absolute;left:95px;top:0;bottom:0;background:#f9d4d1;width:1px}.notes-env .notes-list .write-pad textarea{background:0 0;border:none;background:url(../images/notes-lines.png) left top;background-attachment:local;min-height:780px;font:14px/52px Arimo,"Helvetica Neue",Helvetica,Arial,sans-serif,serif;border:1px solid #ddd;max-height:1500px;padding-left:125px;padding-right:50px}.notes-env .notes-list .write-pad textarea::-webkit-scrollbar{width:5px}.notes-env .notes-list .write-pad textarea::-webkit-scrollbar-track{width:5px;background-color:#e0e0e0}.notes-env .notes-list .write-pad textarea::-webkit-scrollbar-thumb{background-color:#bdbdbd}.notes-env+footer.main{border-top:0;padding-top:10px}@media (max-width:992px){.notes-env .notes-list .list-of-notes{width:35%}.notes-env .notes-list .write-pad{width:65%}.notes-env .notes-list .write-pad textarea{padding-left:50px}.notes-env .notes-list .write-pad:after{left:35px}}@media (max-width:768px){body .notes-env .notes-list .list-of-notes,body .notes-env .notes-list .write-pad{width:100%;float:none}body .notes-env .notes-list .list-of-notes{padding-bottom:10px}body .notes-env .notes-list .list-of-notes li{padding:0;padding-top:10px;padding-bottom:0}body .notes-env .notes-list .list-of-notes li a span{display:none}body .notes-env .notes-list .list-of-notes li .note-close{right:1px;top:11px}body .notes-env .notes-list .write-pad textarea{min-height:400px;max-height:600px}}.tocify{border:1px solid #ddd;background:#fff;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.tocify.fixed{position:fixed;top:15px}.navbar.horizontal-menu+.page-container .tocify.fixed{top:110px}@media (max-width:991px){.tocify{top:0;position:relative!important;margin-bottom:30px}.tocify .tocify-item.active>a:before,.tocify .tocify-item.active>a:after{display:none!important}}.tocify li{border-top:1px solid #f0f0f0}.tocify li a{color:#979898}.tocify li a:hover{background:#fff;color:#2c2e2f}.tocify>ul:first-child>li{border-top:0}.tocify>ul ul li a{padding-left:30px}.tocify>ul ul{background:#fff}.tocify>ul ul ul li a{padding-left:40px}.tocify>ul:last-child{border-bottom:0}.tocify .tocify-item.active>a{position:relative;background:#f6f6f6;color:#2c2e2f}.tocify .tocify-item.active>a:after{content:'';display:block;position:absolute;top:14px;right:-1px;width:0;height:0;border-color:transparent #eee transparent transparent;border-style:solid;border-width:6px}.tocify .tocify-item.active>a:before{content:'';display:block;position:absolute;top:13px;right:-1px;margin-left:-2px;width:0;height:0;border-color:transparent #ddd transparent transparent;border-style:solid;border-width:7px}.tocify-extend-page{display:none!important}.google-map-env{background:#e5e5e5;margin-bottom:30px}.google-map-env~.main-footer{display:none!important}.google-map-env.fill{margin:-30px}.google-map-env.fill .map-toolbar>.row{margin-left:0;margin-right:0}.google-map-env .map-toolbar{padding:20px 15px;background:#fff}.google-map-env .map-toolbar+.gmap{border-top:1px solid #ccc}.google-map-env .gmap+.map-toolbar{border-top:1px solid 0}.google-map-env .full-page-google-map{border-top:1px solid #ddd}.google-map-env .full-page-google-map>div{width:100%;height:500px}.jvectormap-label{position:absolute;display:none;background:#2c2e2f;color:#fff;font-family:sans-serif,Verdana;font-size:smaller;padding:3px 7px;z-index:1000!important;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.jvectormap-zoomin,.jvectormap-zoomout{position:absolute;left:10px;border:1px solid #e7e7e7;background:#fafafa;padding:3px;color:#979898;width:28px;height:28px;cursor:pointer;line-height:19px;text-align:center;-webkit-border-radius:0;-webkit-background-clip:padding-box;-moz-border-radius:0;-moz-background-clip:padding;border-radius:0;background-clip:padding-box}.jvectormap-zoomin:hover,.jvectormap-zoomout:hover{background-color:#f2f2f2}.jvectormap-zoomin:active,.jvectormap-zoomout:active{-webkit-box-shadow:inset 0 0 5px rgba(0,0,0,.1);-moz-box-shadow:inset 0 0 5px rgba(0,0,0,.1);box-shadow:inset 0 0 5px rgba(0,0,0,.1)}.jvectormap-zoomin{top:10px}.jvectormap-zoomout{top:37px}.xenon-loading-bar{position:fixed;left:0;top:0;right:0;background:rgba(44,46,47,.3);height:3px;z-index:10000;top:0;zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);-webkit-transition:all 220ms ease-in-out;-moz-transition:all 220ms ease-in-out;-o-transition:all 220ms ease-in-out;transition:all 220ms ease-in-out}.xenon-loading-bar span{display:block;position:absolute;left:0;top:0;bottom:0;width:0;background:#68b828}.xenon-loading-bar.progress-is-hidden{top:-3px;zoom:1;-webkit-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:alpha(Opacity=50);filter:alpha(opacity=50);visibility:hidden}.toast-title{font-weight:700;margin-bottom:5px}.toast-message{-ms-word-wrap:break-word;word-wrap:break-word}.toast-message a,.toast-message label{color:#fff}.toast-message a:hover{color:#ccc;text-decoration:none}.toast-close-button{position:relative;right:-.3em;top:-.3em;float:right;font-size:20px;font-weight:700;color:#fff;zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.toast-close-button:hover,.toast-close-button:focus{text-decoration:none;cursor:pointer;zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}button.toast-close-button{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.toast-top-full-width{top:0;right:0;width:100%;margin-top:15px}.toast-top-full-width .toast{margin-bottom:15px!important}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{top:12px;left:12px}.toast-top-right{top:12px;right:12px}.toast-bottom-right{right:12px;bottom:12px}.toast-bottom-left{bottom:12px;left:12px}#toast-container{position:fixed;z-index:999999}#toast-container *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#toast-container>div{margin:0 0 6px;padding:12px 15px;width:300px;margin-bottom:10px;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;background-position:15px center;background-repeat:no-repeat;color:#fff;zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}#toast-container>div i{margin-right:6px}#toast-container>:hover{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);cursor:pointer}#toast-container.toast-top-full-width>div,#toast-container.toast-bottom-full-width>div{width:96%;margin:auto}.toast{background-color:#030303}.toast-success{background-color:#8dc63f}.toast-error{background-color:#cc3f44}.toast-info{background-color:#40bbea}.toast-warning{background-color:#ffba00}.toast-default>div{background-color:rgba(44,46,47,.8)}@media all and (max-width:240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em}#toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width:241px) and (max-width:480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em}#toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width:481px) and (max-width:768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}}.uk-nestable-item .uk-nestable-handle{padding:5px 8px;background:#eee}.uk-nestable-item .uk-nestable-handle:hover,.uk-nestable-item .uk-nestable-handle:active{background:#e1e1e1}.uk-nestable-item [data-nestable-action=toggle]{padding:0 5px;padding-right:0;display:none}.uk-nestable-item .list-label{display:inline-block;line-height:1;padding:5px 8px}.uk-parent>.uk-nestable-item [data-nestable-action=toggle]{display:inline-block!important}.login-page{background:#2c2e2f;color:#fff;padding-top:150px}.login-page .errors-container{margin-bottom:20px;padding:0 30px}.login-page .login-form{position:relative;padding:30px;margin-bottom:20px}.login-page .login-form.fade-in-effect{zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transition:all 800ms cubic-bezier(0.39,.575,.565,1);-moz-transition:all 800ms cubic-bezier(0.39,.575,.565,1);-o-transition:all 800ms cubic-bezier(0.39,.575,.565,1);transition:all 800ms cubic-bezier(0.39,.575,.565,1)}@media screen and (max-width:768px){.login-page .login-form.fade-in-effect{left:0}}.login-page .login-form.fade-in-effect .form-group{position:relative;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transition:all 500ms ease-out;-moz-transition:all 500ms ease-out;-o-transition:all 500ms ease-out;transition:all 500ms ease-out;-webkit-transition-delay:150ms;-moz-transition-delay:150ms;-o-transition-delay:150ms;transition-delay:150ms}.login-page .login-form.fade-in-effect+.external-login{zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transition:all 500ms cubic-bezier(0.39,.575,.565,1);-moz-transition:all 500ms cubic-bezier(0.39,.575,.565,1);-o-transition:all 500ms cubic-bezier(0.39,.575,.565,1);transition:all 500ms cubic-bezier(0.39,.575,.565,1);-webkit-transition-delay:100ms;-moz-transition-delay:100ms;-o-transition-delay:100ms;transition-delay:100ms}.login-page .login-form.fade-in-effect.in{left:0;zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.login-page .login-form.fade-in-effect.in .form-group{top:0;zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.login-page .login-form.fade-in-effect.in+.external-login{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.login-page .login-form .login-header{margin-bottom:40px}.login-page .login-form .login-header .logo{display:block}.login-page .login-form .login-header .logo img{vertical-align:baseline}.login-page .login-form .login-header .logo span{padding-left:3px;color:rgba(151,152,152,.6);font-size:15px;vertical-align:baseline}.login-page .login-form .login-header p{color:#979898;font-size:13px;margin:0;margin-top:10px}.login-page .login-form .form-group{position:relative;margin-bottom:20px}.login-page .login-form .form-group .control-label{line-height:40px;position:absolute;left:0;top:0;bottom:0;right:0;padding:0 13px;color:#979898;cursor:text}.login-page .login-form .form-group .form-control{height:40px}.login-page .login-form .form-group .form-control::-moz-placeholder{color:rgba(151,152,152,.5);opacity:1}.login-page .login-form .form-group .form-control:-ms-input-placeholder{color:rgba(151,152,152,.5)}.login-page .login-form .form-group .form-control::-webkit-input-placeholder{color:rgba(151,152,152,.5)}.login-page .login-form .form-group .form-control::-webkit-input-placeholder{color:rgba(151,152,152,.5)}.login-page .login-form .form-group .form-control:-moz-placeholder{color:rgba(151,152,152,.5)}.login-page .login-form .form-group .form-control::-moz-placeholder{color:rgba(151,152,152,.5)}.login-page .login-form .form-group .form-control:-ms-input-placeholder{color:rgba(151,152,152,.5)}.login-page .login-form .form-group .form-control:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px #fff inset;-webkit-text-fill-color:#979898;border:1px solid #e4e4e4}.login-page .login-form .form-group .form-control.input-dark{background:#313334;border:1px solid transparent;color:#fff}.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:rgba(255,255,255,.5);opacity:1}.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:rgba(255,255,255,.5)}.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder{color:rgba(255,255,255,.5)}.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:rgba(255,255,255,.5)}.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:rgba(255,255,255,.5)}.login-page .login-form .form-group .form-control.input-dark:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px #313334 inset;-webkit-text-fill-color:#fff;border:0}.login-page .login-form .form-group .form-control.error{border-color:rgba(204,63,68,.5)}.login-page .login-form .form-group label.error{position:absolute;top:0;right:0;bottom:0;padding-right:12px;font-size:12px;line-height:40px;color:rgba(255,255,255,.7)}.login-page .login-form .form-group.validate-has-error .form-control{border-color:rgba(204,63,68,.5)}.login-page .login-form .form-group.is-focused .control-label{zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);visibility:hidden}.login-page .login-form .form-group .btn{padding-top:11.11px;padding-bottom:11.11px}.login-page .login-form .form-group .btn i{margin-right:5px}.login-page .login-form .form-group .btn.btn-dark{border-color:rgba(55,57,58,.9);background-color:#2c2e2f;color:#fff}.login-page .login-form .form-group .btn.btn-dark:hover{background-color:rgba(55,57,58,.3)}.login-page .login-form .login-footer{margin-top:45px}.login-page .login-form .login-footer a{color:#979898}.login-page .login-form .login-footer a:hover{color:#bdbebe}.login-page .login-form .login-footer .info-links{font-size:11px;margin-top:5px;color:rgba(151,152,152,.7)}.login-page .login-form .login-footer .info-links a{color:rgba(151,152,152,.7)}.login-page .login-form .login-footer .info-links a:hover{color:#979898}.login-page .external-login{position:relative;margin-bottom:30px;padding:0 30px}.login-page .external-login a{display:block;color:#fff;background:#2c2e2f;padding:13px 20px;font-size:15px;margin-bottom:10px}.login-page .external-login a i{margin-right:5px}.login-page .external-login a:hover{background:#454849}.login-page .external-login a.facebook{background-color:#3b5998}.login-page .external-login a.facebook:hover{background-color:#2d4373}.login-page .external-login a.twitter{background-color:#55acee}.login-page .external-login a.twitter:hover{background-color:#2795e9}.login-page .external-login a.gplus{background-color:#dd4b39}.login-page .external-login a.gplus:hover{background-color:#c23321}.login-page.login-light{background:#eee}.login-page.login-light .errors-container,.login-page.login-light .external-login{padding:0}.login-page.login-light .form-group label.error{color:rgba(151,152,152,.8)}.login-page.login-light .login-form{background:#fff;color:#979898}.login-page.login-light .login-form .login-footer a{color:#68b828}.login-page.login-light .login-form .login-footer a:hover{color:#508e1f}.login-page.login-light .login-form .login-footer .info-links a{color:rgba(151,152,152,.7)}.login-page.login-light .login-form .login-footer .info-links a:hover{color:#979898}@media screen and (max-width:768px){.login-page{padding-top:0}.login-page .login-form,.login-page .errors-container,.login-page .external-login{padding-left:10px;padding-right:10px}.login-page .errors-container{margin-top:20px}.login-page.login-light .login-form{padding-left:30px;padding-right:30px}.login-page.login-light .errors-container,.login-page.login-light .external-login{padding-left:0;padding-right:0}.login-page .row{margin:0}}.login-container{max-width:960px;margin:0 auto}.lockscreen-page{background:#2c2e2f;color:#fff;padding-top:250px}@media screen and (max-width:768px){.lockscreen-page{padding-top:30px}.lockscreen-page .row{margin:0 auto}}.lockscreen-page .lockcreen-form .user-thumb{float:left;width:25%}.lockscreen-page .lockcreen-form .user-thumb img{-webkit-box-shadow:0 0 0 6px rgba(255,255,255,.05);-moz-box-shadow:0 0 0 6px rgba(255,255,255,.05);box-shadow:0 0 0 6px rgba(255,255,255,.05)}.lockscreen-page .lockcreen-form .form-group{position:relative;float:left;width:75%;padding-left:30px}.lockscreen-page .lockcreen-form .form-group h3{margin:0}.lockscreen-page .lockcreen-form .form-group p{color:#979898;font-size:13px;margin:0;margin-top:10px}.lockscreen-page .lockcreen-form .form-group .input-group{position:relative;margin-top:20px}.lockscreen-page .lockcreen-form .form-group .input-group .form-control{background:0 0;border:1px solid #3e4142;color:#fff;height:40px}.lockscreen-page .lockcreen-form .form-group .input-group .form-control.error{border-color:rgba(204,63,68,.5)}.lockscreen-page .lockcreen-form .form-group .input-group label.error{position:absolute;top:100%;left:0;padding-top:10px;color:rgba(255,255,255,.6);font-size:12px}.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn{padding-left:10px}.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn{border:1px solid #3e4142;padding:10px 20px}.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover,.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus{background-color:rgba(62,65,66,.3)}.lockscreen-page .lockcreen-form.fade-in-effect .user-thumb{position:relative;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transition:all 800ms ease-in-out;-moz-transition:all 800ms ease-in-out;-o-transition:all 800ms ease-in-out;transition:all 800ms ease-in-out}.lockscreen-page .lockcreen-form.fade-in-effect .form-group{zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0);-webkit-transition:all 500ms ease-in-out;-moz-transition:all 500ms ease-in-out;-o-transition:all 500ms ease-in-out;transition:all 500ms ease-in-out}.lockscreen-page .lockcreen-form.fade-in-effect .form-group .input-group{zoom:1;-webkit-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:alpha(Opacity=50);filter:alpha(opacity=50);-webkit-transition:all 800ms ease-in-out;-moz-transition:all 800ms ease-in-out;-o-transition:all 800ms ease-in-out;transition:all 800ms ease-in-out}.lockscreen-page .lockcreen-form.fade-in-effect.in .user-thumb{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100);left:0}.lockscreen-page .lockcreen-form.fade-in-effect.in .form-group{top:0;zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.lockscreen-page .lockcreen-form.fade-in-effect.in .form-group .input-group{top:0;zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}@media screen and (max-width:768px){.lockscreen-page .lockcreen-form .user-thumb,.lockscreen-page .lockcreen-form .form-group{float:none;width:100%}.lockscreen-page .lockcreen-form .user-thumb{text-align:center;margin-bottom:30px}.lockscreen-page .lockcreen-form .user-thumb a{display:inline-block}.lockscreen-page .lockcreen-form .form-group{padding-left:0;text-align:center}}.xe-widget{position:relative}.xe-widget.xe-counter,.xe-widget.xe-counter-block .xe-upper,.xe-widget.xe-progress-counter .xe-upper{background:#fff;padding:28px;line-height:1;display:table;width:100%;margin-bottom:20px}.xe-widget.xe-counter .xe-icon,.xe-widget.xe-counter .xe-label,.xe-widget.xe-counter-block .xe-upper .xe-icon,.xe-widget.xe-counter-block .xe-upper .xe-label,.xe-widget.xe-progress-counter .xe-upper .xe-icon,.xe-widget.xe-progress-counter .xe-upper .xe-label{display:table-cell;vertical-align:middle;padding:18px}.xe-widget.xe-counter .xe-icon,.xe-widget.xe-counter-block .xe-upper .xe-icon,.xe-widget.xe-progress-counter .xe-upper .xe-icon{width:1%}.xe-widget.xe-counter .xe-icon i,.xe-widget.xe-counter-block .xe-upper .xe-icon i,.xe-widget.xe-progress-counter .xe-upper .xe-icon i{display:block;background:#68b828;color:#fff;text-align:center;font-size:25px;line-height:50px;width:50px;height:50px;-webkit-border-radius:50%;-webkit-background-clip:padding-box;-moz-border-radius:50%;-moz-background-clip:padding;border-radius:50%;background-clip:padding-box}.xe-widget.xe-counter .xe-icon+.xe-label,.xe-widget.xe-counter-block .xe-upper .xe-icon+.xe-label,.xe-widget.xe-progress-counter .xe-upper .xe-icon+.xe-label{padding-left:0}.xe-widget.xe-counter .xe-label .num,.xe-widget.xe-counter-block .xe-upper .xe-label .num,.xe-widget.xe-progress-counter .xe-upper .xe-label .num{display:block;font-size:28px;font-weight:400;color:#3e3f3f}.xe-widget.xe-counter .xe-label span,.xe-widget.xe-counter-block .xe-upper .xe-label span,.xe-widget.xe-progress-counter .xe-upper .xe-label span{display:block;font-style:normal;font-size:10px;text-transform:uppercase;color:#979898;margin-top:5px}.xe-widget.xe-counter .xe-label+.xe-icon,.xe-widget.xe-counter-block .xe-upper .xe-label+.xe-icon,.xe-widget.xe-progress-counter .xe-upper .xe-label+.xe-icon{padding-left:0}.xe-widget.xe-counter.xe-counter-primary .xe-icon i,.xe-widget.xe-counter-block .xe-upper.xe-counter-primary .xe-icon i,.xe-widget.xe-progress-counter .xe-upper.xe-counter-primary .xe-icon i{background-color:#2c2e2f;color:#fff}.xe-widget.xe-counter.xe-counter-success .xe-icon i,.xe-widget.xe-counter-block .xe-upper.xe-counter-success .xe-icon i,.xe-widget.xe-progress-counter .xe-upper.xe-counter-success .xe-icon i{background-color:#8dc63f;color:#fff}.xe-widget.xe-counter.xe-counter-warning .xe-icon i,.xe-widget.xe-counter-block .xe-upper.xe-counter-warning .xe-icon i,.xe-widget.xe-progress-counter .xe-upper.xe-counter-warning .xe-icon i{background-color:#ffba00;color:#fff}.xe-widget.xe-counter.xe-counter-info .xe-icon i,.xe-widget.xe-counter-block .xe-upper.xe-counter-info .xe-icon i,.xe-widget.xe-progress-counter .xe-upper.xe-counter-info .xe-icon i{background-color:#40bbea;color:#fff}.xe-widget.xe-counter.xe-counter-danger .xe-icon i,.xe-widget.xe-counter-block .xe-upper.xe-counter-danger .xe-icon i,.xe-widget.xe-progress-counter .xe-upper.xe-counter-danger .xe-icon i{background-color:#cc3f44;color:#fff}.xe-widget.xe-counter.xe-counter-blue .xe-icon i,.xe-widget.xe-counter-block .xe-upper.xe-counter-blue .xe-icon i,.xe-widget.xe-progress-counter .xe-upper.xe-counter-blue .xe-icon i{background-color:#0e62c7;color:#fff}.xe-widget.xe-counter.xe-counter-red .xe-icon i,.xe-widget.xe-counter-block .xe-upper.xe-counter-red .xe-icon i,.xe-widget.xe-progress-counter .xe-upper.xe-counter-red .xe-icon i{background-color:#d5080f;color:#fff}.xe-widget.xe-counter.xe-counter-purple .xe-icon i,.xe-widget.xe-counter-block .xe-upper.xe-counter-purple .xe-icon i,.xe-widget.xe-progress-counter .xe-upper.xe-counter-purple .xe-icon i{background-color:#7c38bc;color:#fff}.xe-widget.xe-counter.xe-counter-orange .xe-icon i,.xe-widget.xe-counter-block .xe-upper.xe-counter-orange .xe-icon i,.xe-widget.xe-progress-counter .xe-upper.xe-counter-orange .xe-icon i{background-color:#f7aa47;color:#fff}.xe-widget.xe-counter.xe-counter-yellow .xe-icon i,.xe-widget.xe-counter-block .xe-upper.xe-counter-yellow .xe-icon i,.xe-widget.xe-progress-counter .xe-upper.xe-counter-yellow .xe-icon i{background-color:#fcd036;color:#fff}.xe-widget.xe-counter.xe-counter-turquoise .xe-icon i,.xe-widget.xe-counter-block .xe-upper.xe-counter-turquoise .xe-icon i,.xe-widget.xe-progress-counter .xe-upper.xe-counter-turquoise .xe-icon i{background-color:#00b19d;color:#fff}.xe-widget.xe-counter.xe-counter-white .xe-icon i,.xe-widget.xe-counter-block .xe-upper.xe-counter-white .xe-icon i,.xe-widget.xe-progress-counter .xe-upper.xe-counter-white .xe-icon i{background-color:#fff;color:#4b4b4b}.xe-widget.xe-counter.xe-counter-white .xe-icon i,.xe-widget.xe-counter-block .xe-upper.xe-counter-white .xe-icon i,.xe-widget.xe-progress-counter .xe-upper.xe-counter-white .xe-icon i{border:1px solid #ddd}.xe-widget.xe-counter.xe-counter-gray .xe-icon i,.xe-widget.xe-counter-block .xe-upper.xe-counter-gray .xe-icon i,.xe-widget.xe-progress-counter .xe-upper.xe-counter-gray .xe-icon i{background-color:#eee;color:#555}.xe-widget.xe-counter.xe-counter-pink .xe-icon i,.xe-widget.xe-counter-block .xe-upper.xe-counter-pink .xe-icon i,.xe-widget.xe-progress-counter .xe-upper.xe-counter-pink .xe-icon i{background-color:#ff6264;color:#fff}.xe-widget.xe-counter-block,.xe-widget.xe-progress-counter{color:#fff;background:#68b828;margin-bottom:20px}.xe-widget.xe-counter-block .xe-upper,.xe-widget.xe-progress-counter .xe-upper{margin:0;border-spacing:0;border:0;background:#68b828}.xe-widget.xe-counter-block .xe-upper .xe-icon,.xe-widget.xe-counter-block .xe-upper .xe-label,.xe-widget.xe-progress-counter .xe-upper .xe-icon,.xe-widget.xe-progress-counter .xe-upper .xe-label{padding-bottom:0}.xe-widget.xe-counter-block .xe-upper .xe-icon,.xe-widget.xe-progress-counter .xe-upper .xe-icon{text-align:center}.xe-widget.xe-counter-block .xe-upper .xe-icon i,.xe-widget.xe-progress-counter .xe-upper .xe-icon i{background:#68b828;font-size:32px}.xe-widget.xe-counter-block .xe-upper .xe-label .num,.xe-widget.xe-progress-counter .xe-upper .xe-label .num{color:#fff}.xe-widget.xe-counter-block .xe-upper .xe-label span,.xe-widget.xe-progress-counter .xe-upper .xe-label span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block .xe-lower,.xe-widget.xe-progress-counter .xe-lower{padding:15px 30px}.xe-widget.xe-counter-block .xe-lower .border,.xe-widget.xe-progress-counter .xe-lower .border{height:1px;background:rgba(255,255,255,.5);margin-bottom:10px}.xe-widget.xe-counter-block .xe-lower span,.xe-widget.xe-counter-block .xe-lower strong,.xe-widget.xe-progress-counter .xe-lower span,.xe-widget.xe-progress-counter .xe-lower strong{font-size:10px;text-transform:uppercase;display:block}.xe-widget.xe-counter-block .xe-lower span,.xe-widget.xe-progress-counter .xe-lower span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block .xe-lower strong,.xe-widget.xe-progress-counter .xe-lower strong{font-weight:400}.xe-widget.xe-counter-block.xe-counter-block-primary,.xe-widget.xe-progress-counter.xe-counter-block-primary{background:#2c2e2f}.xe-widget.xe-counter-block.xe-counter-block-primary .xe-upper,.xe-widget.xe-progress-counter.xe-counter-block-primary .xe-upper{background:#2c2e2f}.xe-widget.xe-counter-block.xe-counter-block-primary .xe-upper .xe-icon i,.xe-widget.xe-progress-counter.xe-counter-block-primary .xe-upper .xe-icon i{background-color:#2c2e2f;color:#fff}.xe-widget.xe-counter-block.xe-counter-block-primary .xe-upper .xe-label .num,.xe-widget.xe-progress-counter.xe-counter-block-primary .xe-upper .xe-label .num{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-primary .xe-upper .xe-label span,.xe-widget.xe-progress-counter.xe-counter-block-primary .xe-upper .xe-label span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-primary .xe-lower .border,.xe-widget.xe-progress-counter.xe-counter-block-primary .xe-lower .border{background:rgba(255,255,255,.5)}.xe-widget.xe-counter-block.xe-counter-block-primary .xe-lower span,.xe-widget.xe-progress-counter.xe-counter-block-primary .xe-lower span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-primary .xe-lower strong,.xe-widget.xe-progress-counter.xe-counter-block-primary .xe-lower strong{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-success,.xe-widget.xe-progress-counter.xe-counter-block-success{background:#8dc63f}.xe-widget.xe-counter-block.xe-counter-block-success .xe-upper,.xe-widget.xe-progress-counter.xe-counter-block-success .xe-upper{background:#8dc63f}.xe-widget.xe-counter-block.xe-counter-block-success .xe-upper .xe-icon i,.xe-widget.xe-progress-counter.xe-counter-block-success .xe-upper .xe-icon i{background-color:#8dc63f;color:#fff}.xe-widget.xe-counter-block.xe-counter-block-success .xe-upper .xe-label .num,.xe-widget.xe-progress-counter.xe-counter-block-success .xe-upper .xe-label .num{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-success .xe-upper .xe-label span,.xe-widget.xe-progress-counter.xe-counter-block-success .xe-upper .xe-label span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-success .xe-lower .border,.xe-widget.xe-progress-counter.xe-counter-block-success .xe-lower .border{background:rgba(255,255,255,.5)}.xe-widget.xe-counter-block.xe-counter-block-success .xe-lower span,.xe-widget.xe-progress-counter.xe-counter-block-success .xe-lower span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-success .xe-lower strong,.xe-widget.xe-progress-counter.xe-counter-block-success .xe-lower strong{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-warning,.xe-widget.xe-progress-counter.xe-counter-block-warning{background:#ffba00}.xe-widget.xe-counter-block.xe-counter-block-warning .xe-upper,.xe-widget.xe-progress-counter.xe-counter-block-warning .xe-upper{background:#ffba00}.xe-widget.xe-counter-block.xe-counter-block-warning .xe-upper .xe-icon i,.xe-widget.xe-progress-counter.xe-counter-block-warning .xe-upper .xe-icon i{background-color:#ffba00;color:#fff}.xe-widget.xe-counter-block.xe-counter-block-warning .xe-upper .xe-label .num,.xe-widget.xe-progress-counter.xe-counter-block-warning .xe-upper .xe-label .num{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-warning .xe-upper .xe-label span,.xe-widget.xe-progress-counter.xe-counter-block-warning .xe-upper .xe-label span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-warning .xe-lower .border,.xe-widget.xe-progress-counter.xe-counter-block-warning .xe-lower .border{background:rgba(255,255,255,.5)}.xe-widget.xe-counter-block.xe-counter-block-warning .xe-lower span,.xe-widget.xe-progress-counter.xe-counter-block-warning .xe-lower span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-warning .xe-lower strong,.xe-widget.xe-progress-counter.xe-counter-block-warning .xe-lower strong{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-danger,.xe-widget.xe-progress-counter.xe-counter-block-danger{background:#cc3f44}.xe-widget.xe-counter-block.xe-counter-block-danger .xe-upper,.xe-widget.xe-progress-counter.xe-counter-block-danger .xe-upper{background:#cc3f44}.xe-widget.xe-counter-block.xe-counter-block-danger .xe-upper .xe-icon i,.xe-widget.xe-progress-counter.xe-counter-block-danger .xe-upper .xe-icon i{background-color:#cc3f44;color:#fff}.xe-widget.xe-counter-block.xe-counter-block-danger .xe-upper .xe-label .num,.xe-widget.xe-progress-counter.xe-counter-block-danger .xe-upper .xe-label .num{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-danger .xe-upper .xe-label span,.xe-widget.xe-progress-counter.xe-counter-block-danger .xe-upper .xe-label span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-danger .xe-lower .border,.xe-widget.xe-progress-counter.xe-counter-block-danger .xe-lower .border{background:rgba(255,255,255,.5)}.xe-widget.xe-counter-block.xe-counter-block-danger .xe-lower span,.xe-widget.xe-progress-counter.xe-counter-block-danger .xe-lower span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-danger .xe-lower strong,.xe-widget.xe-progress-counter.xe-counter-block-danger .xe-lower strong{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-info,.xe-widget.xe-progress-counter.xe-counter-block-info{background:#40bbea}.xe-widget.xe-counter-block.xe-counter-block-info .xe-upper,.xe-widget.xe-progress-counter.xe-counter-block-info .xe-upper{background:#40bbea}.xe-widget.xe-counter-block.xe-counter-block-info .xe-upper .xe-icon i,.xe-widget.xe-progress-counter.xe-counter-block-info .xe-upper .xe-icon i{background-color:#40bbea;color:#fff}.xe-widget.xe-counter-block.xe-counter-block-info .xe-upper .xe-label .num,.xe-widget.xe-progress-counter.xe-counter-block-info .xe-upper .xe-label .num{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-info .xe-upper .xe-label span,.xe-widget.xe-progress-counter.xe-counter-block-info .xe-upper .xe-label span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-info .xe-lower .border,.xe-widget.xe-progress-counter.xe-counter-block-info .xe-lower .border{background:rgba(255,255,255,.5)}.xe-widget.xe-counter-block.xe-counter-block-info .xe-lower span,.xe-widget.xe-progress-counter.xe-counter-block-info .xe-lower span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-info .xe-lower strong,.xe-widget.xe-progress-counter.xe-counter-block-info .xe-lower strong{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-purple,.xe-widget.xe-progress-counter.xe-counter-block-purple{background:#7c38bc}.xe-widget.xe-counter-block.xe-counter-block-purple .xe-upper,.xe-widget.xe-progress-counter.xe-counter-block-purple .xe-upper{background:#7c38bc}.xe-widget.xe-counter-block.xe-counter-block-purple .xe-upper .xe-icon i,.xe-widget.xe-progress-counter.xe-counter-block-purple .xe-upper .xe-icon i{background-color:#7c38bc;color:#fff}.xe-widget.xe-counter-block.xe-counter-block-purple .xe-upper .xe-label .num,.xe-widget.xe-progress-counter.xe-counter-block-purple .xe-upper .xe-label .num{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-purple .xe-upper .xe-label span,.xe-widget.xe-progress-counter.xe-counter-block-purple .xe-upper .xe-label span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-purple .xe-lower .border,.xe-widget.xe-progress-counter.xe-counter-block-purple .xe-lower .border{background:rgba(255,255,255,.5)}.xe-widget.xe-counter-block.xe-counter-block-purple .xe-lower span,.xe-widget.xe-progress-counter.xe-counter-block-purple .xe-lower span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-purple .xe-lower strong,.xe-widget.xe-progress-counter.xe-counter-block-purple .xe-lower strong{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-blue,.xe-widget.xe-progress-counter.xe-counter-block-blue{background:#0e62c7}.xe-widget.xe-counter-block.xe-counter-block-blue .xe-upper,.xe-widget.xe-progress-counter.xe-counter-block-blue .xe-upper{background:#0e62c7}.xe-widget.xe-counter-block.xe-counter-block-blue .xe-upper .xe-icon i,.xe-widget.xe-progress-counter.xe-counter-block-blue .xe-upper .xe-icon i{background-color:#0e62c7;color:#fff}.xe-widget.xe-counter-block.xe-counter-block-blue .xe-upper .xe-label .num,.xe-widget.xe-progress-counter.xe-counter-block-blue .xe-upper .xe-label .num{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-blue .xe-upper .xe-label span,.xe-widget.xe-progress-counter.xe-counter-block-blue .xe-upper .xe-label span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-blue .xe-lower .border,.xe-widget.xe-progress-counter.xe-counter-block-blue .xe-lower .border{background:rgba(255,255,255,.5)}.xe-widget.xe-counter-block.xe-counter-block-blue .xe-lower span,.xe-widget.xe-progress-counter.xe-counter-block-blue .xe-lower span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-blue .xe-lower strong,.xe-widget.xe-progress-counter.xe-counter-block-blue .xe-lower strong{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-red,.xe-widget.xe-progress-counter.xe-counter-block-red{background:#d5080f}.xe-widget.xe-counter-block.xe-counter-block-red .xe-upper,.xe-widget.xe-progress-counter.xe-counter-block-red .xe-upper{background:#d5080f}.xe-widget.xe-counter-block.xe-counter-block-red .xe-upper .xe-icon i,.xe-widget.xe-progress-counter.xe-counter-block-red .xe-upper .xe-icon i{background-color:#d5080f;color:#fff}.xe-widget.xe-counter-block.xe-counter-block-red .xe-upper .xe-label .num,.xe-widget.xe-progress-counter.xe-counter-block-red .xe-upper .xe-label .num{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-red .xe-upper .xe-label span,.xe-widget.xe-progress-counter.xe-counter-block-red .xe-upper .xe-label span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-red .xe-lower .border,.xe-widget.xe-progress-counter.xe-counter-block-red .xe-lower .border{background:rgba(255,255,255,.5)}.xe-widget.xe-counter-block.xe-counter-block-red .xe-lower span,.xe-widget.xe-progress-counter.xe-counter-block-red .xe-lower span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-red .xe-lower strong,.xe-widget.xe-progress-counter.xe-counter-block-red .xe-lower strong{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-orange,.xe-widget.xe-progress-counter.xe-counter-block-orange{background:#f7aa47}.xe-widget.xe-counter-block.xe-counter-block-orange .xe-upper,.xe-widget.xe-progress-counter.xe-counter-block-orange .xe-upper{background:#f7aa47}.xe-widget.xe-counter-block.xe-counter-block-orange .xe-upper .xe-icon i,.xe-widget.xe-progress-counter.xe-counter-block-orange .xe-upper .xe-icon i{background-color:#f7aa47;color:#fff}.xe-widget.xe-counter-block.xe-counter-block-orange .xe-upper .xe-label .num,.xe-widget.xe-progress-counter.xe-counter-block-orange .xe-upper .xe-label .num{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-orange .xe-upper .xe-label span,.xe-widget.xe-progress-counter.xe-counter-block-orange .xe-upper .xe-label span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-orange .xe-lower .border,.xe-widget.xe-progress-counter.xe-counter-block-orange .xe-lower .border{background:rgba(255,255,255,.5)}.xe-widget.xe-counter-block.xe-counter-block-orange .xe-lower span,.xe-widget.xe-progress-counter.xe-counter-block-orange .xe-lower span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-orange .xe-lower strong,.xe-widget.xe-progress-counter.xe-counter-block-orange .xe-lower strong{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-turquoise,.xe-widget.xe-progress-counter.xe-counter-block-turquoise{background:#00b19d}.xe-widget.xe-counter-block.xe-counter-block-turquoise .xe-upper,.xe-widget.xe-progress-counter.xe-counter-block-turquoise .xe-upper{background:#00b19d}.xe-widget.xe-counter-block.xe-counter-block-turquoise .xe-upper .xe-icon i,.xe-widget.xe-progress-counter.xe-counter-block-turquoise .xe-upper .xe-icon i{background-color:#00b19d;color:#fff}.xe-widget.xe-counter-block.xe-counter-block-turquoise .xe-upper .xe-label .num,.xe-widget.xe-progress-counter.xe-counter-block-turquoise .xe-upper .xe-label .num{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-turquoise .xe-upper .xe-label span,.xe-widget.xe-progress-counter.xe-counter-block-turquoise .xe-upper .xe-label span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-turquoise .xe-lower .border,.xe-widget.xe-progress-counter.xe-counter-block-turquoise .xe-lower .border{background:rgba(255,255,255,.5)}.xe-widget.xe-counter-block.xe-counter-block-turquoise .xe-lower span,.xe-widget.xe-progress-counter.xe-counter-block-turquoise .xe-lower span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-turquoise .xe-lower strong,.xe-widget.xe-progress-counter.xe-counter-block-turquoise .xe-lower strong{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-pink,.xe-widget.xe-progress-counter.xe-counter-block-pink{background:#ff6264}.xe-widget.xe-counter-block.xe-counter-block-pink .xe-upper,.xe-widget.xe-progress-counter.xe-counter-block-pink .xe-upper{background:#ff6264}.xe-widget.xe-counter-block.xe-counter-block-pink .xe-upper .xe-icon i,.xe-widget.xe-progress-counter.xe-counter-block-pink .xe-upper .xe-icon i{background-color:#ff6264;color:#fff}.xe-widget.xe-counter-block.xe-counter-block-pink .xe-upper .xe-label .num,.xe-widget.xe-progress-counter.xe-counter-block-pink .xe-upper .xe-label .num{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-pink .xe-upper .xe-label span,.xe-widget.xe-progress-counter.xe-counter-block-pink .xe-upper .xe-label span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-pink .xe-lower .border,.xe-widget.xe-progress-counter.xe-counter-block-pink .xe-lower .border{background:rgba(255,255,255,.5)}.xe-widget.xe-counter-block.xe-counter-block-pink .xe-lower span,.xe-widget.xe-progress-counter.xe-counter-block-pink .xe-lower span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-pink .xe-lower strong,.xe-widget.xe-progress-counter.xe-counter-block-pink .xe-lower strong{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-yellow,.xe-widget.xe-progress-counter.xe-counter-block-yellow{background:#fcd036}.xe-widget.xe-counter-block.xe-counter-block-yellow .xe-upper,.xe-widget.xe-progress-counter.xe-counter-block-yellow .xe-upper{background:#fcd036}.xe-widget.xe-counter-block.xe-counter-block-yellow .xe-upper .xe-icon i,.xe-widget.xe-progress-counter.xe-counter-block-yellow .xe-upper .xe-icon i{background-color:#fcd036;color:#fff}.xe-widget.xe-counter-block.xe-counter-block-yellow .xe-upper .xe-label .num,.xe-widget.xe-progress-counter.xe-counter-block-yellow .xe-upper .xe-label .num{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-yellow .xe-upper .xe-label span,.xe-widget.xe-progress-counter.xe-counter-block-yellow .xe-upper .xe-label span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-yellow .xe-lower .border,.xe-widget.xe-progress-counter.xe-counter-block-yellow .xe-lower .border{background:rgba(255,255,255,.5)}.xe-widget.xe-counter-block.xe-counter-block-yellow .xe-lower span,.xe-widget.xe-progress-counter.xe-counter-block-yellow .xe-lower span{color:rgba(255,255,255,.7)}.xe-widget.xe-counter-block.xe-counter-block-yellow .xe-lower strong,.xe-widget.xe-progress-counter.xe-counter-block-yellow .xe-lower strong{color:#fff}.xe-widget.xe-counter-block.xe-counter-block-gray,.xe-widget.xe-progress-counter.xe-counter-block-gray{background:#d5d5d5}.xe-widget.xe-counter-block.xe-counter-block-gray .xe-upper,.xe-widget.xe-progress-counter.xe-counter-block-gray .xe-upper{background:#d5d5d5}.xe-widget.xe-counter-block.xe-counter-block-gray .xe-upper .xe-icon i,.xe-widget.xe-progress-counter.xe-counter-block-gray .xe-upper .xe-icon i{background-color:#d5d5d5;color:#666}.xe-widget.xe-counter-block.xe-counter-block-gray .xe-upper .xe-label .num,.xe-widget.xe-progress-counter.xe-counter-block-gray .xe-upper .xe-label .num{color:#666}.xe-widget.xe-counter-block.xe-counter-block-gray .xe-upper .xe-label span,.xe-widget.xe-progress-counter.xe-counter-block-gray .xe-upper .xe-label span{color:rgba(102,102,102,.7)}.xe-widget.xe-counter-block.xe-counter-block-gray .xe-lower .border,.xe-widget.xe-progress-counter.xe-counter-block-gray .xe-lower .border{background:rgba(102,102,102,.5)}.xe-widget.xe-counter-block.xe-counter-block-gray .xe-lower span,.xe-widget.xe-progress-counter.xe-counter-block-gray .xe-lower span{color:rgba(102,102,102,.7)}.xe-widget.xe-counter-block.xe-counter-block-gray .xe-lower strong,.xe-widget.xe-progress-counter.xe-counter-block-gray .xe-lower strong{color:#666}.xe-widget.xe-counter-block.xe-counter-block-white,.xe-widget.xe-progress-counter.xe-counter-block-white{background:#fff}.xe-widget.xe-counter-block.xe-counter-block-white .xe-upper,.xe-widget.xe-progress-counter.xe-counter-block-white .xe-upper{background:#fff}.xe-widget.xe-counter-block.xe-counter-block-white .xe-upper .xe-icon i,.xe-widget.xe-progress-counter.xe-counter-block-white .xe-upper .xe-icon i{background-color:#fff;color:#4b4b4b}.xe-widget.xe-counter-block.xe-counter-block-white .xe-upper .xe-label .num,.xe-widget.xe-progress-counter.xe-counter-block-white .xe-upper .xe-label .num{color:#4b4b4b}.xe-widget.xe-counter-block.xe-counter-block-white .xe-upper .xe-label span,.xe-widget.xe-progress-counter.xe-counter-block-white .xe-upper .xe-label span{color:rgba(75,75,75,.7)}.xe-widget.xe-counter-block.xe-counter-block-white .xe-lower .border,.xe-widget.xe-progress-counter.xe-counter-block-white .xe-lower .border{background:rgba(75,75,75,.5)}.xe-widget.xe-counter-block.xe-counter-block-white .xe-lower span,.xe-widget.xe-progress-counter.xe-counter-block-white .xe-lower span{color:rgba(75,75,75,.7)}.xe-widget.xe-counter-block.xe-counter-block-white .xe-lower strong,.xe-widget.xe-progress-counter.xe-counter-block-white .xe-lower strong{color:#4b4b4b}.xe-widget.xe-progress-counter{position:relative;color:#fff;background:#68b828;margin-bottom:20px;overflow:hidden}.xe-widget.xe-progress-counter .xe-background{position:absolute;left:-40%;bottom:-10%;color:#fff;font-size:150px;zoom:1;-webkit-opacity:.1;-moz-opacity:.1;opacity:.1;-ms-filter:alpha(Opacity=10);filter:alpha(opacity=10)}.xe-widget.xe-progress-counter .xe-background i{line-height:1;display:block}.xe-widget.xe-progress-counter .xe-upper .xe-icon i{font-size:28px;background:0 0}.xe-widget.xe-progress-counter .xe-upper .xe-label span{padding:0;padding-bottom:5px}.xe-widget.xe-progress-counter .xe-upper .xe-label .num{font-size:20px}.xe-widget.xe-progress-counter .xe-progress{height:2px;position:relative;background:rgba(0,0,0,.1);margin:0 30px;margin-top:10px}.xe-widget.xe-progress-counter .xe-progress .xe-progress-fill{position:absolute;display:block;left:0;top:0;bottom:0;background:#fff}.xe-widget.xe-progress-counter.xe-progress-counter-primary{background-color:#2c2e2f}.xe-widget.xe-progress-counter.xe-progress-counter-primary .xe-background{color:#fff}.xe-widget.xe-progress-counter.xe-progress-counter-primary .xe-upper{background-color:transparent}.xe-widget.xe-progress-counter.xe-progress-counter-success{background-color:#8dc63f}.xe-widget.xe-progress-counter.xe-progress-counter-success .xe-background{color:#fff}.xe-widget.xe-progress-counter.xe-progress-counter-success .xe-upper{background-color:transparent}.xe-widget.xe-progress-counter.xe-progress-counter-info{background-color:#40bbea}.xe-widget.xe-progress-counter.xe-progress-counter-info .xe-background{color:#fff}.xe-widget.xe-progress-counter.xe-progress-counter-info .xe-upper{background-color:transparent}.xe-widget.xe-progress-counter.xe-progress-counter-danger{background-color:#cc3f44}.xe-widget.xe-progress-counter.xe-progress-counter-danger .xe-background{color:#fff}.xe-widget.xe-progress-counter.xe-progress-counter-danger .xe-upper{background-color:transparent}.xe-widget.xe-progress-counter.xe-progress-counter-warning{background-color:#ffba00}.xe-widget.xe-progress-counter.xe-progress-counter-warning .xe-background{color:#fff}.xe-widget.xe-progress-counter.xe-progress-counter-warning .xe-upper{background-color:transparent}.xe-widget.xe-progress-counter.xe-progress-counter-pink{background-color:#ff6264}.xe-widget.xe-progress-counter.xe-progress-counter-pink .xe-background{color:#fff}.xe-widget.xe-progress-counter.xe-progress-counter-pink .xe-upper{background-color:transparent}.xe-widget.xe-progress-counter.xe-progress-counter-turquoise{background-color:#00b19d}.xe-widget.xe-progress-counter.xe-progress-counter-turquoise .xe-background{color:#fff}.xe-widget.xe-progress-counter.xe-progress-counter-turquoise .xe-upper{background-color:transparent}.xe-widget.xe-progress-counter.xe-progress-counter-red{background-color:#d5080f}.xe-widget.xe-progress-counter.xe-progress-counter-red .xe-background{color:#fff}.xe-widget.xe-progress-counter.xe-progress-counter-red .xe-upper{background-color:transparent}.xe-widget.xe-progress-counter.xe-progress-counter-orange{background-color:#f7aa47}.xe-widget.xe-progress-counter.xe-progress-counter-orange .xe-background{color:#fff}.xe-widget.xe-progress-counter.xe-progress-counter-orange .xe-upper{background-color:transparent}.xe-widget.xe-progress-counter.xe-progress-counter-yellow{background-color:#fcd036}.xe-widget.xe-progress-counter.xe-progress-counter-yellow .xe-background{color:#fff}.xe-widget.xe-progress-counter.xe-progress-counter-yellow .xe-upper{background-color:transparent}.xe-widget.xe-progress-counter.xe-progress-counter-purple{background-color:#7c38bc}.xe-widget.xe-progress-counter.xe-progress-counter-purple .xe-background{color:#fff}.xe-widget.xe-progress-counter.xe-progress-counter-purple .xe-upper{background-color:transparent}.xe-widget.xe-vertical-counter{background:#68b828;padding:20px;padding-top:40px;margin-bottom:20px;color:#fff}.xe-widget.xe-vertical-counter .xe-icon{font-size:75px;text-align:center;padding-bottom:15px}.xe-widget.xe-vertical-counter .xe-icon i{display:block;line-height:1.4}.xe-widget.xe-vertical-counter .xe-label{padding-top:15px;text-align:center}.xe-widget.xe-vertical-counter .xe-label .num{display:block;font-weight:400;font-size:23px}.xe-widget.xe-vertical-counter .xe-label span{display:block;padding-top:5px;text-transform:uppercase;font-size:12px;color:rgba(255,255,255,.95)}.xe-widget.xe-vertical-counter.xe-vertical-counter-primary{background:#2c2e2f;color:#fff}.xe-widget.xe-vertical-counter.xe-vertical-counter-primary .xe-label span{color:rgba(255,255,255,.95)}.xe-widget.xe-vertical-counter.xe-vertical-counter-success{background:#8dc63f;color:#fff}.xe-widget.xe-vertical-counter.xe-vertical-counter-success .xe-label span{color:rgba(255,255,255,.95)}.xe-widget.xe-vertical-counter.xe-vertical-counter-danger{background:#cc3f44;color:#fff}.xe-widget.xe-vertical-counter.xe-vertical-counter-danger .xe-label span{color:rgba(255,255,255,.95)}.xe-widget.xe-vertical-counter.xe-vertical-counter-warning{background:#ffba00;color:#fff}.xe-widget.xe-vertical-counter.xe-vertical-counter-warning .xe-label span{color:rgba(255,255,255,.95)}.xe-widget.xe-vertical-counter.xe-vertical-counter-info{background:#40bbea;color:#fff}.xe-widget.xe-vertical-counter.xe-vertical-counter-info .xe-label span{color:rgba(255,255,255,.95)}.xe-widget.xe-vertical-counter.xe-vertical-counter-purple{background:#7c38bc;color:#fff}.xe-widget.xe-vertical-counter.xe-vertical-counter-purple .xe-label span{color:rgba(255,255,255,.95)}.xe-widget.xe-vertical-counter.xe-vertical-counter-orange{background:#f7aa47;color:#fff}.xe-widget.xe-vertical-counter.xe-vertical-counter-orange .xe-label span{color:rgba(255,255,255,.95)}.xe-widget.xe-vertical-counter.xe-vertical-counter-red{background:#d5080f;color:#fff}.xe-widget.xe-vertical-counter.xe-vertical-counter-red .xe-label span{color:rgba(255,255,255,.95)}.xe-widget.xe-vertical-counter.xe-vertical-counter-blue{background:#0e62c7;color:#fff}.xe-widget.xe-vertical-counter.xe-vertical-counter-blue .xe-label span{color:rgba(255,255,255,.95)}.xe-widget.xe-vertical-counter.xe-vertical-counter-turquoise{background:#00b19d;color:#fff}.xe-widget.xe-vertical-counter.xe-vertical-counter-turquoise .xe-label span{color:rgba(255,255,255,.95)}.xe-widget.xe-vertical-counter.xe-vertical-counter-pink{background:#ff6264;color:#fff}.xe-widget.xe-vertical-counter.xe-vertical-counter-pink .xe-label span{color:rgba(255,255,255,.95)}.xe-widget.xe-vertical-counter.xe-vertical-counter-yellow{background:#fcd036;color:#fff}.xe-widget.xe-vertical-counter.xe-vertical-counter-yellow .xe-label span{color:rgba(255,255,255,.95)}.xe-widget.xe-vertical-counter.xe-vertical-counter-gray{background:#d5d5d5;color:#555}.xe-widget.xe-vertical-counter.xe-vertical-counter-gray .xe-label span{color:rgba(85,85,85,.95)}.xe-widget.xe-vertical-counter.xe-vertical-counter-white{background:#fff;color:#4b4b4b}.xe-widget.xe-vertical-counter.xe-vertical-counter-white .xe-label span{color:rgba(75,75,75,.95)}.xe-widget.xe-todo-list{background:#fff;padding:25px 30px;margin-bottom:20px}.xe-widget.xe-todo-list .xe-header{display:table;width:100%;border-bottom:1px solid #eee;margin-bottom:15px}.xe-widget.xe-todo-list .xe-header .xe-icon,.xe-widget.xe-todo-list .xe-header .xe-label{display:table-cell;vertical-align:top;padding-bottom:20px}.xe-widget.xe-todo-list .xe-header .xe-icon{width:1%}.xe-widget.xe-todo-list .xe-header .xe-icon i{display:block;line-height:1;font-size:28px}.xe-widget.xe-todo-list .xe-header .xe-label{padding-left:15px}.xe-widget.xe-todo-list .xe-header .xe-label span,.xe-widget.xe-todo-list .xe-header .xe-label strong{display:block;line-height:1.1}.xe-widget.xe-todo-list .xe-header .xe-label span{font-size:12px;zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-todo-list .xe-header .xe-label strong{font-size:15px}.xe-widget.xe-todo-list .xe-body{padding-top:5px;padding-bottom:10px}.xe-widget.xe-todo-list .xe-body label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.xe-widget.xe-todo-list .xe-body label>span{position:relative;display:inline-block;color:#7d7f7f}.xe-widget.xe-todo-list .xe-body li{margin:2px 0}.xe-widget.xe-todo-list .xe-body li.done label>span{zoom:1;-webkit-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:alpha(Opacity=50);filter:alpha(opacity=50)}.xe-widget.xe-todo-list .xe-body li.done label>span:after{display:block;position:absolute;left:0;right:0;top:9px;height:1px;background:#8a8b8b;content:''}.xe-widget.xe-todo-list.xe-todo-list-primary{background:#2c2e2f;color:#fff}.xe-widget.xe-todo-list.xe-todo-list-primary .xe-header{border-bottom:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-primary .xe-body .cbr-replaced .cbr-state{border:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-primary .xe-body label>span{color:#fff}.xe-widget.xe-todo-list.xe-todo-list-primary .xe-body li.done label>span{zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-todo-list.xe-todo-list-primary .xe-body li.done label>span:after{background:rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control{background:0 0;border:1px solid rgba(255,255,255,.7);color:#fff}.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9);opacity:1}.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control:-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-primary .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-success{background:#8dc63f;color:#fff}.xe-widget.xe-todo-list.xe-todo-list-success .xe-header{border-bottom:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-success .xe-body .cbr-replaced .cbr-state{border:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-success .xe-body label>span{color:#fff}.xe-widget.xe-todo-list.xe-todo-list-success .xe-body li.done label>span{zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-todo-list.xe-todo-list-success .xe-body li.done label>span:after{background:rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control{background:0 0;border:1px solid rgba(255,255,255,.7);color:#fff}.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9);opacity:1}.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control:-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-success .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-warning{background:#ffba00;color:#fff}.xe-widget.xe-todo-list.xe-todo-list-warning .xe-header{border-bottom:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-warning .xe-body .cbr-replaced .cbr-state{border:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-warning .xe-body label>span{color:#fff}.xe-widget.xe-todo-list.xe-todo-list-warning .xe-body li.done label>span{zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-todo-list.xe-todo-list-warning .xe-body li.done label>span:after{background:rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control{background:0 0;border:1px solid rgba(255,255,255,.7);color:#fff}.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9);opacity:1}.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control:-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-warning .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-danger{background:#cc3f44;color:#fff}.xe-widget.xe-todo-list.xe-todo-list-danger .xe-header{border-bottom:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-danger .xe-body .cbr-replaced .cbr-state{border:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-danger .xe-body label>span{color:#fff}.xe-widget.xe-todo-list.xe-todo-list-danger .xe-body li.done label>span{zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-todo-list.xe-todo-list-danger .xe-body li.done label>span:after{background:rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control{background:0 0;border:1px solid rgba(255,255,255,.7);color:#fff}.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9);opacity:1}.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control:-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-danger .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-info{background:#40bbea;color:#fff}.xe-widget.xe-todo-list.xe-todo-list-info .xe-header{border-bottom:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-info .xe-body .cbr-replaced .cbr-state{border:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-info .xe-body label>span{color:#fff}.xe-widget.xe-todo-list.xe-todo-list-info .xe-body li.done label>span{zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-todo-list.xe-todo-list-info .xe-body li.done label>span:after{background:rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control{background:0 0;border:1px solid rgba(255,255,255,.7);color:#fff}.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9);opacity:1}.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control:-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-info .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-secondary{background:#68b828;color:#fff}.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-header{border-bottom:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-body .cbr-replaced .cbr-state{border:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-body label>span{color:#fff}.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-body li.done label>span{zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-body li.done label>span:after{background:rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control{background:0 0;border:1px solid rgba(255,255,255,.7);color:#fff}.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9);opacity:1}.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control:-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-secondary .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-turquoise{background:#00b19d;color:#fff}.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-header{border-bottom:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-body .cbr-replaced .cbr-state{border:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-body label>span{color:#fff}.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-body li.done label>span{zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-body li.done label>span:after{background:rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control{background:0 0;border:1px solid rgba(255,255,255,.7);color:#fff}.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9);opacity:1}.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control:-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-turquoise .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-pink{background:#ff6264;color:#fff}.xe-widget.xe-todo-list.xe-todo-list-pink .xe-header{border-bottom:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-pink .xe-body .cbr-replaced .cbr-state{border:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-pink .xe-body label>span{color:#fff}.xe-widget.xe-todo-list.xe-todo-list-pink .xe-body li.done label>span{zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-todo-list.xe-todo-list-pink .xe-body li.done label>span:after{background:rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control{background:0 0;border:1px solid rgba(255,255,255,.7);color:#fff}.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9);opacity:1}.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control:-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-pink .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-red{background:#d5080f;color:#fff}.xe-widget.xe-todo-list.xe-todo-list-red .xe-header{border-bottom:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-red .xe-body .cbr-replaced .cbr-state{border:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-red .xe-body label>span{color:#fff}.xe-widget.xe-todo-list.xe-todo-list-red .xe-body li.done label>span{zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-todo-list.xe-todo-list-red .xe-body li.done label>span:after{background:rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control{background:0 0;border:1px solid rgba(255,255,255,.7);color:#fff}.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9);opacity:1}.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control:-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-red .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-blue{background:#0e62c7;color:#fff}.xe-widget.xe-todo-list.xe-todo-list-blue .xe-header{border-bottom:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-blue .xe-body .cbr-replaced .cbr-state{border:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-blue .xe-body label>span{color:#fff}.xe-widget.xe-todo-list.xe-todo-list-blue .xe-body li.done label>span{zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-todo-list.xe-todo-list-blue .xe-body li.done label>span:after{background:rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control{background:0 0;border:1px solid rgba(255,255,255,.7);color:#fff}.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9);opacity:1}.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control:-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-blue .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-purple{background:#7c38bc;color:#fff}.xe-widget.xe-todo-list.xe-todo-list-purple .xe-header{border-bottom:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-purple .xe-body .cbr-replaced .cbr-state{border:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-purple .xe-body label>span{color:#fff}.xe-widget.xe-todo-list.xe-todo-list-purple .xe-body li.done label>span{zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-todo-list.xe-todo-list-purple .xe-body li.done label>span:after{background:rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control{background:0 0;border:1px solid rgba(255,255,255,.7);color:#fff}.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9);opacity:1}.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control:-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-purple .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-yellow{background:#fcd036;color:#fff}.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-header{border-bottom:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-body .cbr-replaced .cbr-state{border:1px solid rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-body label>span{color:#fff}.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-body li.done label>span{zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-body li.done label>span:after{background:rgba(255,255,255,.7)}.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control{background:0 0;border:1px solid rgba(255,255,255,.7);color:#fff}.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9);opacity:1}.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control:-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control::-moz-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-todo-list.xe-todo-list-yellow .xe-footer .form-control:-ms-input-placeholder{color:rgba(255,255,255,.9)}.xe-widget.xe-status-update{background:#55acee;color:#fff;margin-bottom:20px;padding:30px;padding-bottom:20px}.xe-widget.xe-status-update .xe-header{display:table;width:100%}.xe-widget.xe-status-update .xe-header .xe-icon,.xe-widget.xe-status-update .xe-header .xe-nav{display:table-cell;vertical-align:top;color:#fff;padding-bottom:20px}.xe-widget.xe-status-update .xe-header .xe-icon i{font-size:48px}.xe-widget.xe-status-update .xe-header .xe-nav{text-align:right}.xe-widget.xe-status-update .xe-header .xe-nav a{position:relative;margin-right:-10px;margin-top:-10px;color:#fff;padding:0 8px;display:inline-block;line-height:32px}.xe-widget.xe-status-update .xe-header .xe-nav a:hover{background:rgba(255,255,255,.1)}.xe-widget.xe-status-update .xe-header .xe-nav a+a{margin-left:10px}.xe-widget.xe-status-update .xe-body li{display:none!important}.xe-widget.xe-status-update .xe-body li .status-date{display:block;font-size:16px;zoom:1;-webkit-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:alpha(Opacity=50);filter:alpha(opacity=50);padding-bottom:10px}.xe-widget.xe-status-update .xe-body li p{font-size:14px;color:#fff;zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-status-update .xe-body li.active{display:block!important}.xe-widget.xe-status-update .xe-footer{text-transform:uppercase;font-size:11px;padding-top:15px}.xe-widget.xe-status-update .xe-footer a{color:#fff;zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-status-update .xe-footer a:hover{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.xe-widget.xe-status-update.xe-status-update-facebook{background-color:#3b5998}.xe-widget.xe-status-update.xe-status-update-google-plus{background-color:#dd4b39}.xe-widget.xe-single-news{margin-bottom:20px;position:relative}.xe-widget.xe-single-news .xe-image img{display:block;width:100%}.xe-widget.xe-single-news .xe-image .xe-gradient{position:absolute;left:0;right:0;top:0;bottom:0;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMTAwJSIgeDI9IjAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0icmdiKDAsIDAsIDApIiBzdG9wLW9wYWNpdHk9IjAuMDUiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjbGVzc2hhdC1nZW5lcmF0ZWQpIiAvPjwvc3ZnPg==);background-image:-webkit-linear-gradient(bottom,#000 0,rgba(0,0,0,.05) 100%);background-image:-moz-linear-gradient(bottom,#000 0,rgba(0,0,0,.05) 100%);background-image:-o-linear-gradient(bottom,#000 0,rgba(0,0,0,.05) 100%);background-image:linear-gradient(to top,#000 0,rgba(0,0,0,.05) 100%)}.xe-widget.xe-single-news .xe-details{position:absolute;bottom:0;left:0;right:0;padding:20px}.xe-widget.xe-single-news .xe-details .category{font-size:11px;text-transform:uppercase;margin-bottom:10px}.xe-widget.xe-single-news .xe-details .category a{color:#fff;zoom:1;-webkit-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:alpha(Opacity=50);filter:alpha(opacity=50)}.xe-widget.xe-single-news .xe-details .category a:hover{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.xe-widget.xe-single-news .xe-details h3{margin:0;padding:0;margin-bottom:10px;font-size:19px}.xe-widget.xe-single-news .xe-details h3 a{color:#fff;zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.xe-widget.xe-single-news .xe-details h3 a:hover{zoom:1;-webkit-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:alpha(Opacity=100);filter:alpha(opacity=100)}.xe-widget.xe-single-news .xe-details time{position:relative;display:block;color:#fff;font-size:13px;margin-bottom:-20px;-webkit-transition:all 350ms cubic-bezier(0.175,.885,.32,1.275);-moz-transition:all 350ms cubic-bezier(0.175,.885,.32,1.275);-o-transition:all 350ms cubic-bezier(0.175,.885,.32,1.275);transition:all 350ms cubic-bezier(0.175,.885,.32,1.275);zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:alpha(Opacity=0);filter:alpha(opacity=0)}.xe-widget.xe-single-news:hover .xe-details time{margin-bottom:0;zoom:1;-webkit-opacity:.7;-moz-opacity:.7;opacity:.7;-ms-filter:alpha(Opacity=70);filter:alpha(opacity=70)}.xe-widget.xe-conversations{position:relative;background:#fff;margin-bottom:20px;padding:30px}.xe-widget.xe-conversations .xe-bg-icon{position:absolute;right:20px;top:20px}.xe-widget.xe-conversations .xe-bg-icon i{font-size:80px;display:block;line-height:1;zoom:1;-webkit-opacity:.1;-moz-opacity:.1;opacity:.1;-ms-filter:alpha(Opacity=10);filter:alpha(opacity=10)}.xe-widget.xe-conversations .xe-header{display:table;width:100%;border-bottom:1px solid #eee}.xe-widget.xe-conversations .xe-header .xe-icon,.xe-widget.xe-conversations .xe-header .xe-label{display:table-cell;vertical-align:middle;padding-bottom:20px}.xe-widget.xe-conversations .xe-header .xe-icon{width:1%}.xe-widget.xe-conversations .xe-header .xe-icon i{display:block;line-height:1;font-size:37px}.xe-widget.xe-conversations .xe-header .xe-label{padding-left:10px}.xe-widget.xe-conversations .xe-header .xe-label h3{display:block;margin:0;padding:0}.xe-widget.xe-conversations .xe-header .xe-label h3 small{padding-top:5px;font-size:13px;display:block;zoom:1;-webkit-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:alpha(Opacity=50);filter:alpha(opacity=50)}.xe-widget.xe-conversations .xe-body{border-bottom:1px solid #eee}.xe-widget.xe-conversations .xe-body .xe-user-img{float:left;display:block;padding-right:10px}.xe-widget.xe-conversations .xe-body .xe-comment-entry{display:table;width:100%}.xe-widget.xe-conversations .xe-body .xe-comment-entry .xe-user-img,.xe-widget.xe-conversations .xe-body .xe-comment-entry .xe-comment{display:table-cell;vertical-align:top;padding-top:10px;padding-bottom:10px}.xe-widget.xe-conversations .xe-body .xe-comment-entry .xe-user-img img{display:block}.xe-widget.xe-conversations .xe-body .xe-comment-entry .xe-comment{width:99%;padding-left:10px}.xe-widget.xe-conversations .xe-body .xe-comment-entry .xe-comment .xe-user-name{display:block;margin-bottom:5px}.xe-widget.xe-conversations .xe-body .xe-comment-entry .xe-comment .xe-user-name:hover strong{color:#7d7f7f}.xe-widget.xe-conversations .xe-body .xe-comment-entry .xe-comment p{font-size:12px}.xe-widget.xe-conversations .xe-body ul>li{margin:10px 0;border-bottom:1px solid #eee}.xe-widget.xe-conversations .xe-body ul>li:last-child{border-bottom:0}.xe-widget.xe-conversations .xe-footer a{margin-top:20px;display:block;font-size:11px;color:#7d7f7f;text-align:center;text-transform:uppercase}.xe-widget.xe-conversations .xe-footer a:hover{color:#646565}.xe-widget.xe-weather{position:relative;background:#459ec4;color:#fff;overflow:hidden;margin-bottom:20px}.xe-widget.xe-weather .xe-background{position:absolute;z-index:1;top:0;left:0;right:0}.xe-widget.xe-weather .xe-background img{display:block;line-height:1;width:100%;position:relative}.xe-widget.xe-weather .xe-background.xe-background-animated{left:-10%;top:-20%}.xe-widget.xe-weather .xe-background.xe-background-animated img{width:120%;-webkit-animation:weatherBgMove 10s infinite linear;-moz-animation:weatherBgMove 10s infinite linear;-o-animation:weatherBgMove 10s infinite linear;animation:weatherBgMove 10s infinite linear;-webkit-animation-direction:alternate;-moz-animation-direction:alternate;-o-animation-direction:alternate;animation-direction:alternate}.xe-widget.xe-weather .xe-background.xe-background-animated lesshat-selector{-lh-property:0}@-webkit-keyframes weatherBgMove{0%{left:0}50%{left:10%}100%{left:0}}@-moz-keyframes weatherBgMove{0%{left:0}50%{left:10%}100%{left:0}}@-o-keyframes weatherBgMove{0%{left:0}50%{left:10%}100%{left:0}}@keyframes weatherBgMove{0%{left:0}50%{left:10%}100%{left:0}}@media screen and (max-width:768px){.xe-widget.xe-weather .xe-background{top:auto;bottom:0}.xe-widget.xe-weather .xe-background.xe-background-animated{top:auto;bottom:0}}.xe-widget.xe-weather .xe-current-day{position:absolute;z-index:2;right:35%;top:0;left:0;bottom:0;padding:30px}.xe-widget.xe-weather .xe-current-day .xe-now{margin-bottom:20px}.xe-widget.xe-weather .xe-current-day .xe-now .xe-temperature{display:table;float:left}.xe-widget.xe-weather .xe-current-day .xe-now .xe-temperature .xe-icon,.xe-widget.xe-weather .xe-current-day .xe-now .xe-temperature .xe-label{display:table-cell;vertical-align:middle}.xe-widget.xe-weather .xe-current-day .xe-now .xe-temperature .xe-icon i{display:block;line-height:1;font-size:35px}.xe-widget.xe-weather .xe-current-day .xe-now .xe-temperature .xe-label{padding-left:10px;line-height:1;text-transform:uppercase;color:rgba(255,255,255,.8);font-size:11px}.xe-widget.xe-weather .xe-current-day .xe-now .xe-temperature .xe-label strong{display:block;padding-top:2px;font-size:23px;line-height:1;color:#fff;font-weight:400}.xe-widget.xe-weather .xe-current-day .xe-now .xe-location{float:right;text-align:right}.xe-widget.xe-weather .xe-current-day .xe-now .xe-location h4{margin:0;padding-bottom:5px;color:rgba(255,255,255,.95)}.xe-widget.xe-weather .xe-current-day .xe-now .xe-location time{color:rgba(255,255,255,.8);font-size:12px}.xe-widget.xe-weather .xe-current-day .xe-forecast{position:absolute;bottom:0;left:0;right:0;padding:0 30px;padding-bottom:30px}.xe-widget.xe-weather .xe-current-day .xe-forecast ul{list-style:none;padding:0;margin:0;display:table;width:100%}.xe-widget.xe-weather .xe-current-day .xe-forecast ul>li{position:relative;display:table-cell;vertical-align:middle;width:1%}.xe-widget.xe-weather .xe-current-day .xe-forecast ul>li:after{content:'';display:block;width:1px;top:32px;left:0;bottom:0;background:rgba(255,255,255,.25);position:absolute}.xe-widget.xe-weather .xe-current-day .xe-forecast ul>li:first-child:after{display:none}.xe-widget.xe-weather .xe-current-day .xe-forecast .xe-forecast-entry{text-align:center}.xe-widget.xe-weather .xe-current-day .xe-forecast .xe-forecast-entry time{display:inline-block;background:rgba(0,0,0,.15);padding:5px 5px;line-height:1;color:rgba(255,255,255,.7);font-size:11px}.xe-widget.xe-weather .xe-current-day .xe-forecast .xe-forecast-entry .xe-icon i{display:block;line-height:42px;font-size:20px}.xe-widget.xe-weather .xe-current-day .xe-forecast .xe-forecast-entry .xe-temp{display:block;font-weight:400;font-size:14px;color:rgba(255,255,255,.85)}.xe-widget.xe-weather .xe-current-day .xe-forecast .xe-forecast-entry:hover time,.xe-widget.xe-weather .xe-current-day .xe-forecast .xe-forecast-entry:hover .xe-temp{color:#fff}@media screen and (max-width:768px){.xe-widget.xe-weather .xe-current-day{position:relative;width:100%}.xe-widget.xe-weather .xe-current-day .xe-forecast{position:relative;margin-top:90px;padding:0}}.xe-widget.xe-weather .xe-weekdays{float:right;position:relative;z-index:2;background:rgba(0,0,0,.05);padding:15px 30px;width:35%}.xe-widget.xe-weather .xe-weekdays ul>li{position:relative}.xe-widget.xe-weather .xe-weekdays ul>li:after{content:'';display:block;position:absolute;right:0;left:0;bottom:0;height:1px;background:rgba(255,255,255,.25)}.xe-widget.xe-weather .xe-weekdays ul>li:last-child:after{display:none}.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast{display:table;width:100%;cursor:default}.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-temp,.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-day,.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-icon{display:table-cell;vertical-align:middle;padding:15px 0}.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-temp{width:20%;font-size:14px;color:rgba(255,255,255,.5)}.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-icon{text-align:right;font-size:20px}.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-icon i{display:block;line-height:1}.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast:hover .xe-temp{color:rgba(255,255,255,.95)}@media screen and (max-width:768px){.xe-widget.xe-weather .xe-weekdays{float:none;width:100%}.xe-widget.xe-weather .xe-weekdays .xe-weekday-forecast .xe-temp{width:10%}}.xe-widget.xe-map-stats{background:#385868;color:#fff;margin-bottom:20px;display:table;width:100%}.xe-widget.xe-map-stats .xe-map,.xe-widget.xe-map-stats .xe-details{display:table-cell;vertical-align:top}.xe-widget.xe-map-stats .xe-map{width:65%;position:relative}.xe-widget.xe-map-stats .xe-map>div{position:absolute;top:20px;bottom:20px;left:20px;right:20px}.xe-widget.xe-map-stats .xe-map>div .jvectormap-zoomin,.xe-widget.xe-map-stats .xe-map>div .jvectormap-zoomout{width:22px;height:22px;line-height:20px;padding:0;border:0}.xe-widget.xe-map-stats .xe-map>div .jvectormap-zoomin.jvectormap-zoomout,.xe-widget.xe-map-stats .xe-map>div .jvectormap-zoomout.jvectormap-zoomout{top:32px;border-top:1px solid rgba(204,204,204,.8)}.xe-widget.xe-map-stats .xe-details{width:35%;background:rgba(0,0,0,.3);padding:30px}.xe-widget.xe-map-stats .xe-details>.xe-label h3{margin:0}.xe-widget.xe-map-stats .xe-details>.xe-label p{margin:0;padding-top:5px;color:rgba(255,255,255,.8)}.xe-widget.xe-map-stats .xe-details ul{margin-top:20px}.xe-widget.xe-map-stats .xe-details ul li{position:relative;padding:10px 5px;border-top:1px solid rgba(255,255,255,.1)}.xe-widget.xe-map-stats .xe-details .xe-map-data{display:block}.xe-widget.xe-map-stats .xe-details .xe-map-data .label{display:inline-block;text-align:center;min-width:30px;margin-right:5px;vertical-align:middle}.xe-widget.xe-map-stats .xe-details .xe-map-data .xe-label{font-size:14px}@media screen and (max-width:768px){.xe-widget.xe-map-stats{display:block}.xe-widget.xe-map-stats .xe-map{min-height:300px}.xe-widget.xe-map-stats .xe-map,.xe-widget.xe-map-stats .xe-details{width:100%;display:block}}.sidebar-user-info{background-color:#27292a;border-bottom:1px solid #323435}@media screen and (max-width:768px){.sidebar-user-info{display:none}.sidebar-user-info.mobile-is-visible{display:block}}.sidebar-user-info .user-profile{display:block;padding:30px 45px}@media screen and (max-width:768px){.sidebar-user-info .user-profile{padding-top:20px;padding-bottom:20px}}.sidebar-user-info .user-profile img{margin-right:20px}.sidebar-user-info .user-profile span{display:inline-block;color:#979898;vertical-align:middle}.sidebar-user-info .user-profile span strong{display:block;font-size:21px;color:#fff;font-weight:300}.sidebar-user-info .user-links{display:table;width:100%;table-layout:fixed;border-top:1px solid #323435;margin:0}.sidebar-user-info .user-links li{display:table-cell}.sidebar-user-info .user-links li.logout-link{width:20%}.sidebar-user-info .user-links li a{display:block;text-align:center;color:#979898;padding:10px}.sidebar-user-info .user-links li a:hover{color:#fff;background-color:rgba(50,52,53,.25)}.sidebar-user-info .user-links li.active a{color:#fff;background-color:rgba(50,52,53,.25)}.sidebar-user-info .user-links li+li a{border-left:1px solid #323435}.sidebar-user-info+.main-menu{margin-top:10px}@media screen and (min-width:768px){.sidebar-menu.collapsed .sidebar-user-info+.main-menu{margin-top:0}.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner{position:relative}.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-profile{padding:15px 0;text-align:center}.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-profile img{max-width:32px;height:auto!important;margin:0}.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-profile span{text-align:left;position:absolute;left:100%;top:0;background-color:#27292a;display:block;width:280px;height:62px;padding:10px 20px}.right-sidebar .sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-profile span{left:auto;right:100%}.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-profile span strong{font-size:17px}.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-links{position:absolute;left:100%;width:280px;background-color:#27292a;top:62px}.right-sidebar .sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-links{left:auto;right:100%}.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-profile span,.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner .user-links{display:none}.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner:hover .user-profile span{display:block}.sidebar-menu.collapsed .sidebar-user-info .sidebar-user-info-inner:hover .user-links{display:table}}.members-table thead tr th{text-transform:uppercase;color:#a4a5a5;font-weight:400;background-color:#f6f6f6}.members-table thead tr th:after{display:none}.table-hover.members-table tbody tr:hover{background-color:#f8f8f8}.members-table tbody tr td{padding:10px}.members-table tbody tr td .name{display:block;font-size:14px;color:#2c2e2f;font-weight:700}.members-table tbody tr td .name+span{font-size:12px;color:#9d9d9d}.members-table tbody tr td .email{color:#9d9d9d;cursor:default}.members-table tbody tr td .email:hover{color:#848484}.members-table tbody tr td.user-cb{width:1%}.members-table tbody tr td.user-image{width:1%}@media screen and (max-width:768px){.members-table tbody tr td.user-image{display:none}}.members-table tbody tr td.user-image img{width:100%;min-width:42px;height:auto!important}.members-table tbody tr td.user-id{color:#9d9d9d;white-space:nowrap;width:15%}.members-table tbody tr td.action-links{width:20%;white-space:nowrap}@media screen and (max-width:768px){.members-table tbody tr td.action-links{width:25%}}.members-table tbody tr td.action-links a{display:block;font-size:11px}.members-table tbody tr td.action-links a:hover{zoom:1;-webkit-opacity:.8;-moz-opacity:.8;opacity:.8;-ms-filter:alpha(Opacity=80);filter:alpha(opacity=80)}.members-table tbody tr td.action-links a.edit{color:#8dc63f}.members-table tbody tr td.action-links a.delete{color:#cc3f44}.members-table tbody tr td.action-links a+a{margin-top:5px}.members-table-actions{position:relative;margin-top:5px}@media screen and (max-width:768px){.members-table-actions{text-align:center;margin-bottom:20px}}.members-table-actions .selected-items,.members-table-actions .selected-actions{display:inline-block}.members-table-actions .selected-items span{font-weight:700;color:#2c2e2f}.members-table-actions .selected-items+.selected-actions{margin-left:30px}.members-table-actions .selected-actions .edit{color:#8dc63f}.members-table-actions .selected-actions .delete{color:#cc3f44}.member-form-add-header .user-img,.member-form-add-header .user-name{display:inline-block;vertical-align:middle}@media screen and (max-width:768px){.member-form-add-header .user-img{margin-top:20px}}.member-form-add-header .user-name{padding-left:20px}.member-form-add-header .user-name a{display:block;font-size:23px}.member-form-add-header .user-name span{display:block;color:#9d9d9d}.member-form-add-header+.member-form-inputs{margin-top:20px}.member-form-inputs .row:before{display:block;margin:0 15px;height:1px;background:#eaeaea;margin-bottom:20px}.member-form-inputs .row+.row{margin-top:20px}.member-form-inputs .control-label{font-size:14px;line-height:30px}.page-body.skin-aero .btn-primary{background:#558c89}.page-body.skin-aero .btn-primary:hover{background:#4b7c79;border-color:#4b7c79}.page-body.skin-aero .btn-primary:active,.page-body.skin-aero .btn-primary:focus{background:#385c5a;border-color:#385c5a}.page-body.skin-aero .btn.btn-secondary{background-color:#255e5b;color:#fff}.page-body.skin-aero .btn.btn-secondary:hover{background-color:#1e4c49;text-color:#fff}.page-body.skin-aero .btn.btn-secondary:active,.page-body.skin-aero .btn.btn-secondary:focus{background-color:#1e4c49;border-color:#1b4442}.page-body.skin-aero .settings-pane{background:#5f9a97;color:#ececea}.page-body.skin-aero .settings-pane>a[data-toggle=settings-pane]{color:#ececea}.page-body.skin-aero .settings-pane>a[data-toggle=settings-pane]:hover{color:#FFF}.page-body.skin-aero .settings-pane .user-info .user-details h3 a{color:#fff}.page-body.skin-aero .settings-pane .user-info .user-details .user-title{color:rgba(255,255,255,.65)}.page-body.skin-aero .settings-pane .links-block.left-sep{border-left:1px solid #558c89}.page-body.skin-aero .settings-pane .links-block h4{color:#fff}.page-body.skin-aero .settings-pane .links-block h4 span{display:inline-block;border-bottom:1px solid #5f9a97}.page-body.skin-aero .settings-pane .links-block h4 a{color:#fff}.page-body.skin-aero .settings-pane .links-block h4 a:hover{color:#ececea}.page-body.skin-aero .settings-pane .links-block ul li a{color:#ececea}.page-body.skin-aero .settings-pane .links-block ul li a:hover{color:#fff}.page-body.skin-aero .sidebar-menu{background:#558c89}.page-body.skin-aero .sidebar-menu .logo-env{border-bottom:1px solid #5f9a97}.page-body.skin-aero .sidebar-menu .logo-env .settings-icon a{color:#ececea}.page-body.skin-aero .sidebar-menu .logo-env .settings-icon a:hover{color:#fff}.page-body.skin-aero .sidebar-menu .main-menu a{color:#ececea;border-bottom:1px solid #5f9a97}.page-body.skin-aero .sidebar-menu .main-menu a:hover{color:#fff}.page-body.skin-aero .sidebar-menu .main-menu li.active>a{color:#fff}.page-body.skin-aero .sidebar-menu .main-menu li.has-sub>a:before{color:#acccca}.page-body.skin-aero .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x,.page-body.skin-aero .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y{background-color:#fff}@media screen and (min-width:768px){.page-body.skin-aero .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar]{color:#606161}.page-body.skin-aero .sidebar-menu.collapsed .main-menu>li.active,.page-body.skin-aero .sidebar-menu.collapsed .main-menu>li li.active{background-color:#4f8280}.page-body.skin-aero .sidebar-menu.collapsed .main-menu>li>ul{background:#558c89}}.page-body.skin-aero .page-loading-overlay{background-color:#558c89}.page-body.skin-aero.login-page{background:#558c89;color:#fff}.page-body.skin-aero.login-page .login-form .login-header .logo span{color:#ececea}.page-body.skin-aero.login-page .login-form .login-header p{color:#ececea}.page-body.skin-aero.login-page .login-form .form-group .control-label{color:#ececea}.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark{background:#4b7c79;border:1px solid transparent;color:#ececea}.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff;opacity:1}.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder{color:#fff}.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff}.page-body.skin-aero.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-aero.login-page .login-form .form-group .form-control.error{border-color:rgba(204,63,68,.5)}.page-body.skin-aero.login-page .login-form .form-group .btn.btn-dark{border-color:#5f9a97;background-color:#558c89;color:#fff}.page-body.skin-aero.login-page .login-form .form-group .btn.btn-dark:hover{background-color:rgba(95,154,151,.3)}.page-body.skin-aero.login-page .login-form .login-footer{margin-top:45px}.page-body.skin-aero.login-page .login-form .login-footer a{color:#fff}.page-body.skin-aero.login-page .login-form .login-footer a:hover{color:#fff}.page-body.skin-aero.login-page .login-form .login-footer .info-links{font-size:11px;margin-top:5px;color:#ececea}.page-body.skin-aero.login-page .login-form .login-footer .info-links a{color:#ececea}.page-body.skin-aero.login-page .login-form .login-footer .info-links a:hover{color:#fff}.page-body.skin-aero.login-page .external-login{position:relative;margin-bottom:30px;padding:0 30px}.page-body.skin-aero.login-page .external-login a{display:block;color:#fff;background:#2c2e2f;padding:13px 20px;font-size:15px;margin-bottom:10px}.page-body.skin-aero.login-page .external-login a i{margin-right:5px}.page-body.skin-aero.login-page .external-login a:hover{background:#454849}.page-body.skin-aero.login-page .external-login a.facebook{background-color:#3b5998}.page-body.skin-aero.login-page .external-login a.facebook:hover{background-color:#2d4373}.page-body.skin-aero.login-page .external-login a.twitter{background-color:#55acee}.page-body.skin-aero.login-page .external-login a.twitter:hover{background-color:#2795e9}.page-body.skin-aero.login-page .external-login a.gplus{background-color:#dd4b39}.page-body.skin-aero.login-page .external-login a.gplus:hover{background-color:#c23321}.page-body.skin-aero.login-page.login-light{background:#eee}.page-body.skin-aero.login-page.login-light .errors-container,.page-body.skin-aero.login-page.login-light .external-login{padding:0}.page-body.skin-aero.login-page.login-light .form-group label.error{color:rgba(151,152,152,.8)}.page-body.skin-aero.login-page.login-light .login-form{background:#fff;color:#979898}.page-body.skin-aero.login-page.login-light .login-form .login-footer a{color:#68b828}.page-body.skin-aero.login-page.login-light .login-form .login-footer a:hover{color:#508e1f}.page-body.skin-aero.login-page.login-light .login-form .login-footer .info-links a{color:rgba(151,152,152,.7)}.page-body.skin-aero.login-page.login-light .login-form .login-footer .info-links a:hover{color:#979898}@media screen and (max-width:768px){.page-body.skin-aero.login-page{padding-top:0}.page-body.skin-aero.login-page .login-form,.page-body.skin-aero.login-page .errors-container,.page-body.skin-aero.login-page .external-login{padding-left:10px;padding-right:10px}.page-body.skin-aero.login-page .errors-container{margin-top:20px}.page-body.skin-aero.login-page.login-light .login-form{padding-left:30px;padding-right:30px}.page-body.skin-aero.login-page.login-light .errors-container,.page-body.skin-aero.login-page.login-light .external-login{padding-left:0;padding-right:0}.page-body.skin-aero.login-page .row{margin:0}}.page-body.skin-aero.lockscreen-page{background:#558c89}.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group p{color:#ececea}.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group h3{color:#ececea}.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control{border:1px solid #5f9a97;color:#fff}.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5);opacity:1}.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn{color:#fff;border:1px solid #5f9a97}.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover,.page-body.skin-aero.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus{background-color:rgba(95,154,151,.3)}.page-body.skin-aero.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon{background:#5f9a97;-webkit-box-shadow:0 0 0 10px #5f9a97,0 -10px 0 10px #5f9a97,0 -20px 0 10px #5f9a97,0 -30px 0 10px #5f9a97;-moz-box-shadow:0 0 0 10px #5f9a97,0 -10px 0 10px #5f9a97,0 -20px 0 10px #5f9a97,0 -30px 0 10px #5f9a97;box-shadow:0 0 0 10px #5f9a97,0 -10px 0 10px #5f9a97,0 -20px 0 10px #5f9a97,0 -30px 0 10px #5f9a97}.page-body.skin-aero .sidebar-user-info{background-color:#4b7c79;border-bottom-color:#5f9a97}.page-body.skin-aero .sidebar-user-info .user-profile span{color:#ececea}.page-body.skin-aero .sidebar-user-info .user-profile span strong{color:#fff}.page-body.skin-aero .sidebar-user-info .user-links{border-top-color:#5f9a97}.page-body.skin-aero .sidebar-user-info .user-links li a{color:#ececea}.page-body.skin-aero .sidebar-user-info .user-links li a:hover{color:#fff;background-color:rgba(95,154,151,.25)}.page-body.skin-aero .sidebar-user-info .user-links li.active a{color:#fff;background-color:rgba(95,154,151,.25)}.page-body.skin-aero .sidebar-user-info .user-links li+li a{border-left-color:#5f9a97}@media screen and (min-width:991px){.sidebar-menu.collapsed .page-body.skin-aero .sidebar-user-info .sidebar-user-info-inner .user-profile span{background-color:#27292a}.sidebar-menu.collapsed .page-body.skin-aero .sidebar-user-info .sidebar-user-info-inner .user-links{background-color:#27292a}}.page-body.skin-navy .btn-primary{background:#2c3e50}.page-body.skin-navy .btn-primary:hover{background:#233140;border-color:#233140}.page-body.skin-navy .btn-primary:active,.page-body.skin-navy .btn-primary:focus{background:#11181f;border-color:#11181f}.page-body.skin-navy .btn.btn-secondary{background-color:#ff4e50;color:#fff}.page-body.skin-navy .btn.btn-secondary:hover{background-color:#ff3437;text-color:#fff}.page-body.skin-navy .btn.btn-secondary:active,.page-body.skin-navy .btn.btn-secondary:focus{background-color:#ff3437;border-color:#ff2a2d}.page-body.skin-navy .settings-pane{background:#34495e;color:#a7bfd6}.page-body.skin-navy .settings-pane>a[data-toggle=settings-pane]{color:#a7bfd6}.page-body.skin-navy .settings-pane>a[data-toggle=settings-pane]:hover{color:#FFF}.page-body.skin-navy .settings-pane .user-info .user-details h3 a{color:#fff}.page-body.skin-navy .settings-pane .user-info .user-details .user-title{color:rgba(255,255,255,.65)}.page-body.skin-navy .settings-pane .links-block.left-sep{border-left:1px solid #2c3e50}.page-body.skin-navy .settings-pane .links-block h4{color:#fff}.page-body.skin-navy .settings-pane .links-block h4 span{display:inline-block;border-bottom:1px solid #34495e}.page-body.skin-navy .settings-pane .links-block h4 a{color:#fff}.page-body.skin-navy .settings-pane .links-block h4 a:hover{color:#a7bfd6}.page-body.skin-navy .settings-pane .links-block ul li a{color:#a7bfd6}.page-body.skin-navy .settings-pane .links-block ul li a:hover{color:#fff}.page-body.skin-navy .sidebar-menu{background:#2c3e50}.page-body.skin-navy .sidebar-menu .logo-env{border-bottom:1px solid #34495e}.page-body.skin-navy .sidebar-menu .logo-env .settings-icon a{color:#a7bfd6}.page-body.skin-navy .sidebar-menu .logo-env .settings-icon a:hover{color:#fff}.page-body.skin-navy .sidebar-menu .main-menu a{color:#a7bfd6;border-bottom:1px solid #34495e}.page-body.skin-navy .sidebar-menu .main-menu a:hover{color:#fff}.page-body.skin-navy .sidebar-menu .main-menu li.active>a{color:#fff}.page-body.skin-navy .sidebar-menu .main-menu li.has-sub>a:before{color:#6789ab}.page-body.skin-navy .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x,.page-body.skin-navy .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y{background-color:#fff}@media screen and (min-width:768px){.page-body.skin-navy .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar]{color:#606161}.page-body.skin-navy .sidebar-menu.collapsed .main-menu>li.active,.page-body.skin-navy .sidebar-menu.collapsed .main-menu>li li.active{background-color:#273646}.page-body.skin-navy .sidebar-menu.collapsed .main-menu>li>ul{background:#2c3e50}}.page-body.skin-navy .page-loading-overlay{background-color:#2c3e50}.page-body.skin-navy.login-page{background:#2c3e50;color:#fff}.page-body.skin-navy.login-page .login-form .login-header .logo span{color:#a7bfd6}.page-body.skin-navy.login-page .login-form .login-header p{color:#a7bfd6}.page-body.skin-navy.login-page .login-form .form-group .control-label{color:#a7bfd6}.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark{background:#233140;border:1px solid transparent;color:#a7bfd6}.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff;opacity:1}.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder{color:#fff}.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff}.page-body.skin-navy.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-navy.login-page .login-form .form-group .form-control.error{border-color:rgba(204,63,68,.5)}.page-body.skin-navy.login-page .login-form .form-group .btn.btn-dark{border-color:#34495e;background-color:#2c3e50;color:#fff}.page-body.skin-navy.login-page .login-form .form-group .btn.btn-dark:hover{background-color:rgba(52,73,94,.3)}.page-body.skin-navy.login-page .login-form .login-footer{margin-top:45px}.page-body.skin-navy.login-page .login-form .login-footer a{color:#fff}.page-body.skin-navy.login-page .login-form .login-footer a:hover{color:#dbe5ee}.page-body.skin-navy.login-page .login-form .login-footer .info-links{font-size:11px;margin-top:5px;color:#a7bfd6}.page-body.skin-navy.login-page .login-form .login-footer .info-links a{color:#a7bfd6}.page-body.skin-navy.login-page .login-form .login-footer .info-links a:hover{color:#fff}.page-body.skin-navy.login-page .external-login{position:relative;margin-bottom:30px;padding:0 30px}.page-body.skin-navy.login-page .external-login a{display:block;color:#fff;background:#2c2e2f;padding:13px 20px;font-size:15px;margin-bottom:10px}.page-body.skin-navy.login-page .external-login a i{margin-right:5px}.page-body.skin-navy.login-page .external-login a:hover{background:#454849}.page-body.skin-navy.login-page .external-login a.facebook{background-color:#3b5998}.page-body.skin-navy.login-page .external-login a.facebook:hover{background-color:#2d4373}.page-body.skin-navy.login-page .external-login a.twitter{background-color:#55acee}.page-body.skin-navy.login-page .external-login a.twitter:hover{background-color:#2795e9}.page-body.skin-navy.login-page .external-login a.gplus{background-color:#dd4b39}.page-body.skin-navy.login-page .external-login a.gplus:hover{background-color:#c23321}.page-body.skin-navy.login-page.login-light{background:#eee}.page-body.skin-navy.login-page.login-light .errors-container,.page-body.skin-navy.login-page.login-light .external-login{padding:0}.page-body.skin-navy.login-page.login-light .form-group label.error{color:rgba(151,152,152,.8)}.page-body.skin-navy.login-page.login-light .login-form{background:#fff;color:#979898}.page-body.skin-navy.login-page.login-light .login-form .login-footer a{color:#68b828}.page-body.skin-navy.login-page.login-light .login-form .login-footer a:hover{color:#508e1f}.page-body.skin-navy.login-page.login-light .login-form .login-footer .info-links a{color:rgba(151,152,152,.7)}.page-body.skin-navy.login-page.login-light .login-form .login-footer .info-links a:hover{color:#979898}@media screen and (max-width:768px){.page-body.skin-navy.login-page{padding-top:0}.page-body.skin-navy.login-page .login-form,.page-body.skin-navy.login-page .errors-container,.page-body.skin-navy.login-page .external-login{padding-left:10px;padding-right:10px}.page-body.skin-navy.login-page .errors-container{margin-top:20px}.page-body.skin-navy.login-page.login-light .login-form{padding-left:30px;padding-right:30px}.page-body.skin-navy.login-page.login-light .errors-container,.page-body.skin-navy.login-page.login-light .external-login{padding-left:0;padding-right:0}.page-body.skin-navy.login-page .row{margin:0}}.page-body.skin-navy.lockscreen-page{background:#2c3e50}.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group p{color:#a7bfd6}.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group h3{color:#a7bfd6}.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control{border:1px solid #34495e;color:#fff}.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5);opacity:1}.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn{color:#fff;border:1px solid #34495e}.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover,.page-body.skin-navy.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus{background-color:rgba(52,73,94,.3)}.page-body.skin-navy.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon{background:#34495e;-webkit-box-shadow:0 0 0 10px #34495e,0 -10px 0 10px #34495e,0 -20px 0 10px #34495e,0 -30px 0 10px #34495e;-moz-box-shadow:0 0 0 10px #34495e,0 -10px 0 10px #34495e,0 -20px 0 10px #34495e,0 -30px 0 10px #34495e;box-shadow:0 0 0 10px #34495e,0 -10px 0 10px #34495e,0 -20px 0 10px #34495e,0 -30px 0 10px #34495e}.page-body.skin-navy .sidebar-user-info{background-color:#233140;border-bottom-color:#34495e}.page-body.skin-navy .sidebar-user-info .user-profile span{color:#a7bfd6}.page-body.skin-navy .sidebar-user-info .user-profile span strong{color:#fff}.page-body.skin-navy .sidebar-user-info .user-links{border-top-color:#34495e}.page-body.skin-navy .sidebar-user-info .user-links li a{color:#a7bfd6}.page-body.skin-navy .sidebar-user-info .user-links li a:hover{color:#fff;background-color:rgba(52,73,94,.25)}.page-body.skin-navy .sidebar-user-info .user-links li.active a{color:#fff;background-color:rgba(52,73,94,.25)}.page-body.skin-navy .sidebar-user-info .user-links li+li a{border-left-color:#34495e}@media screen and (min-width:991px){.sidebar-menu.collapsed .page-body.skin-navy .sidebar-user-info .sidebar-user-info-inner .user-profile span{background-color:#27292a}.sidebar-menu.collapsed .page-body.skin-navy .sidebar-user-info .sidebar-user-info-inner .user-links{background-color:#27292a}}.page-body.skin-facebook .btn-primary{background:#3b5998}.page-body.skin-facebook .btn-primary:hover{background:#344e86;border-color:#344e86}.page-body.skin-facebook .btn-primary:active,.page-body.skin-facebook .btn-primary:focus{background:#263961;border-color:#263961}.page-body.skin-facebook .btn.btn-secondary{background-color:#8b9dc3;color:#fff}.page-body.skin-facebook .btn.btn-secondary:hover{background-color:#7a8fba;text-color:#fff}.page-body.skin-facebook .btn.btn-secondary:active,.page-body.skin-facebook .btn.btn-secondary:focus{background-color:#7a8fba;border-color:#7389b7}.page-body.skin-facebook .settings-pane{background:#4160a0;color:#8b9dc3}.page-body.skin-facebook .settings-pane>a[data-toggle=settings-pane]{color:#8b9dc3}.page-body.skin-facebook .settings-pane>a[data-toggle=settings-pane]:hover{color:#FFF}.page-body.skin-facebook .settings-pane .user-info .user-details h3 a{color:#fff}.page-body.skin-facebook .settings-pane .user-info .user-details .user-title{color:rgba(255,255,255,.65)}.page-body.skin-facebook .settings-pane .links-block.left-sep{border-left:1px solid #3b5998}.page-body.skin-facebook .settings-pane .links-block h4{color:#fff}.page-body.skin-facebook .settings-pane .links-block h4 span{display:inline-block;border-bottom:1px solid #4160a0}.page-body.skin-facebook .settings-pane .links-block h4 a{color:#fff}.page-body.skin-facebook .settings-pane .links-block h4 a:hover{color:#8b9dc3}.page-body.skin-facebook .settings-pane .links-block ul li a{color:#8b9dc3}.page-body.skin-facebook .settings-pane .links-block ul li a:hover{color:#fff}.page-body.skin-facebook .sidebar-menu{background:#3b5998}.page-body.skin-facebook .sidebar-menu .logo-env{border-bottom:1px solid #4160a0}.page-body.skin-facebook .sidebar-menu .logo-env .settings-icon a{color:#8b9dc3}.page-body.skin-facebook .sidebar-menu .logo-env .settings-icon a:hover{color:#fff}.page-body.skin-facebook .sidebar-menu .main-menu a{color:#8b9dc3;border-bottom:1px solid #4160a0}.page-body.skin-facebook .sidebar-menu .main-menu a:hover{color:#fff}.page-body.skin-facebook .sidebar-menu .main-menu li.active>a{color:#fff}.page-body.skin-facebook .sidebar-menu .main-menu li.has-sub>a:before{color:#8fa5d2}.page-body.skin-facebook .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x,.page-body.skin-facebook .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y{background-color:#fff}@media screen and (min-width:768px){.page-body.skin-facebook .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar]{color:#606161}.page-body.skin-facebook .sidebar-menu.collapsed .main-menu>li.active,.page-body.skin-facebook .sidebar-menu.collapsed .main-menu>li li.active{background-color:#37538d}.page-body.skin-facebook .sidebar-menu.collapsed .main-menu>li>ul{background:#3b5998}}.page-body.skin-facebook .page-loading-overlay{background-color:#3b5998}.page-body.skin-facebook.login-page{background:#3b5998;color:#fff}.page-body.skin-facebook.login-page .login-form .login-header .logo span{color:#8b9dc3}.page-body.skin-facebook.login-page .login-form .login-header p{color:#8b9dc3}.page-body.skin-facebook.login-page .login-form .form-group .control-label{color:#8b9dc3}.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark{background:#344e86;border:1px solid transparent;color:#8b9dc3}.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff;opacity:1}.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder{color:#fff}.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff}.page-body.skin-facebook.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-facebook.login-page .login-form .form-group .form-control.error{border-color:rgba(204,63,68,.5)}.page-body.skin-facebook.login-page .login-form .form-group .btn.btn-dark{border-color:#4160a0;background-color:#3b5998;color:#fff}.page-body.skin-facebook.login-page .login-form .form-group .btn.btn-dark:hover{background-color:rgba(65,96,160,.3)}.page-body.skin-facebook.login-page .login-form .login-footer{margin-top:45px}.page-body.skin-facebook.login-page .login-form .login-footer a{color:#fff}.page-body.skin-facebook.login-page .login-form .login-footer a:hover{color:#bdc8dd}.page-body.skin-facebook.login-page .login-form .login-footer .info-links{font-size:11px;margin-top:5px;color:#8b9dc3}.page-body.skin-facebook.login-page .login-form .login-footer .info-links a{color:#8b9dc3}.page-body.skin-facebook.login-page .login-form .login-footer .info-links a:hover{color:#fff}.page-body.skin-facebook.login-page .external-login{position:relative;margin-bottom:30px;padding:0 30px}.page-body.skin-facebook.login-page .external-login a{display:block;color:#fff;background:#2c2e2f;padding:13px 20px;font-size:15px;margin-bottom:10px}.page-body.skin-facebook.login-page .external-login a i{margin-right:5px}.page-body.skin-facebook.login-page .external-login a:hover{background:#454849}.page-body.skin-facebook.login-page .external-login a.facebook{background-color:#3b5998}.page-body.skin-facebook.login-page .external-login a.facebook:hover{background-color:#2d4373}.page-body.skin-facebook.login-page .external-login a.twitter{background-color:#55acee}.page-body.skin-facebook.login-page .external-login a.twitter:hover{background-color:#2795e9}.page-body.skin-facebook.login-page .external-login a.gplus{background-color:#dd4b39}.page-body.skin-facebook.login-page .external-login a.gplus:hover{background-color:#c23321}.page-body.skin-facebook.login-page.login-light{background:#eee}.page-body.skin-facebook.login-page.login-light .errors-container,.page-body.skin-facebook.login-page.login-light .external-login{padding:0}.page-body.skin-facebook.login-page.login-light .form-group label.error{color:rgba(151,152,152,.8)}.page-body.skin-facebook.login-page.login-light .login-form{background:#fff;color:#979898}.page-body.skin-facebook.login-page.login-light .login-form .login-footer a{color:#68b828}.page-body.skin-facebook.login-page.login-light .login-form .login-footer a:hover{color:#508e1f}.page-body.skin-facebook.login-page.login-light .login-form .login-footer .info-links a{color:rgba(151,152,152,.7)}.page-body.skin-facebook.login-page.login-light .login-form .login-footer .info-links a:hover{color:#979898}@media screen and (max-width:768px){.page-body.skin-facebook.login-page{padding-top:0}.page-body.skin-facebook.login-page .login-form,.page-body.skin-facebook.login-page .errors-container,.page-body.skin-facebook.login-page .external-login{padding-left:10px;padding-right:10px}.page-body.skin-facebook.login-page .errors-container{margin-top:20px}.page-body.skin-facebook.login-page.login-light .login-form{padding-left:30px;padding-right:30px}.page-body.skin-facebook.login-page.login-light .errors-container,.page-body.skin-facebook.login-page.login-light .external-login{padding-left:0;padding-right:0}.page-body.skin-facebook.login-page .row{margin:0}}.page-body.skin-facebook.lockscreen-page{background:#3b5998}.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group p{color:#8b9dc3}.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group h3{color:#8b9dc3}.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control{border:1px solid #4160a0;color:#fff}.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5);opacity:1}.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn{color:#fff;border:1px solid #4160a0}.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover,.page-body.skin-facebook.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus{background-color:rgba(65,96,160,.3)}.page-body.skin-facebook.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon{background:#4160a0;-webkit-box-shadow:0 0 0 10px #4160a0,0 -10px 0 10px #4160a0,0 -20px 0 10px #4160a0,0 -30px 0 10px #4160a0;-moz-box-shadow:0 0 0 10px #4160a0,0 -10px 0 10px #4160a0,0 -20px 0 10px #4160a0,0 -30px 0 10px #4160a0;box-shadow:0 0 0 10px #4160a0,0 -10px 0 10px #4160a0,0 -20px 0 10px #4160a0,0 -30px 0 10px #4160a0}.page-body.skin-facebook .sidebar-user-info{background-color:#344e86;border-bottom-color:#4160a0}.page-body.skin-facebook .sidebar-user-info .user-profile span{color:#8b9dc3}.page-body.skin-facebook .sidebar-user-info .user-profile span strong{color:#fff}.page-body.skin-facebook .sidebar-user-info .user-links{border-top-color:#4160a0}.page-body.skin-facebook .sidebar-user-info .user-links li a{color:#8b9dc3}.page-body.skin-facebook .sidebar-user-info .user-links li a:hover{color:#fff;background-color:rgba(65,96,160,.25)}.page-body.skin-facebook .sidebar-user-info .user-links li.active a{color:#fff;background-color:rgba(65,96,160,.25)}.page-body.skin-facebook .sidebar-user-info .user-links li+li a{border-left-color:#4160a0}@media screen and (min-width:991px){.sidebar-menu.collapsed .page-body.skin-facebook .sidebar-user-info .sidebar-user-info-inner .user-profile span{background-color:#27292a}.sidebar-menu.collapsed .page-body.skin-facebook .sidebar-user-info .sidebar-user-info-inner .user-links{background-color:#27292a}}.page-body.skin-turquoise .btn-primary{background:#16a085}.page-body.skin-turquoise .btn-primary:hover{background:#138a72;border-color:#138a72}.page-body.skin-turquoise .btn-primary:active,.page-body.skin-turquoise .btn-primary:focus{background:#0d5d4d;border-color:#0d5d4d}.page-body.skin-turquoise .btn.btn-secondary{background-color:#0f7e68;color:#fff}.page-body.skin-turquoise .btn.btn-secondary:hover{background-color:#0c6755;text-color:#fff}.page-body.skin-turquoise .btn.btn-secondary:active,.page-body.skin-turquoise .btn.btn-secondary:focus{background-color:#0c6755;border-color:#0b5e4e}.page-body.skin-turquoise .settings-pane{background:#1daf92;color:#96ead9}.page-body.skin-turquoise .settings-pane>a[data-toggle=settings-pane]{color:#96ead9}.page-body.skin-turquoise .settings-pane>a[data-toggle=settings-pane]:hover{color:#FFF}.page-body.skin-turquoise .settings-pane .user-info .user-details h3 a{color:#fff}.page-body.skin-turquoise .settings-pane .user-info .user-details .user-title{color:rgba(255,255,255,.65)}.page-body.skin-turquoise .settings-pane .links-block.left-sep{border-left:1px solid #16a085}.page-body.skin-turquoise .settings-pane .links-block h4{color:#fff}.page-body.skin-turquoise .settings-pane .links-block h4 span{display:inline-block;border-bottom:1px solid #1daf92}.page-body.skin-turquoise .settings-pane .links-block h4 a{color:#fff}.page-body.skin-turquoise .settings-pane .links-block h4 a:hover{color:#96ead9}.page-body.skin-turquoise .settings-pane .links-block ul li a{color:#96ead9}.page-body.skin-turquoise .settings-pane .links-block ul li a:hover{color:#fff}.page-body.skin-turquoise .sidebar-menu{background:#16a085}.page-body.skin-turquoise .sidebar-menu .logo-env{border-bottom:1px solid #1daf92}.page-body.skin-turquoise .sidebar-menu .logo-env .settings-icon a{color:#96ead9}.page-body.skin-turquoise .sidebar-menu .logo-env .settings-icon a:hover{color:#fff}.page-body.skin-turquoise .sidebar-menu .main-menu a{color:#96ead9;border-bottom:1px solid #1daf92}.page-body.skin-turquoise .sidebar-menu .main-menu a:hover{color:#fff}.page-body.skin-turquoise .sidebar-menu .main-menu li.active>a{color:#fff}.page-body.skin-turquoise .sidebar-menu .main-menu li.has-sub>a:before{color:#66e6cc}.page-body.skin-turquoise .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x,.page-body.skin-turquoise .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y{background-color:#fff}@media screen and (min-width:768px){.page-body.skin-turquoise .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar]{color:#606161}.page-body.skin-turquoise .sidebar-menu.collapsed .main-menu>li.active,.page-body.skin-turquoise .sidebar-menu.collapsed .main-menu>li li.active{background-color:#14937a}.page-body.skin-turquoise .sidebar-menu.collapsed .main-menu>li>ul{background:#16a085}}.page-body.skin-turquoise .page-loading-overlay{background-color:#16a085}.page-body.skin-turquoise.login-page{background:#16a085;color:#fff}.page-body.skin-turquoise.login-page .login-form .login-header .logo span{color:#96ead9}.page-body.skin-turquoise.login-page .login-form .login-header p{color:#96ead9}.page-body.skin-turquoise.login-page .login-form .form-group .control-label{color:#96ead9}.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark{background:#138a72;border:1px solid transparent;color:#96ead9}.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff;opacity:1}.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder{color:#fff}.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff}.page-body.skin-turquoise.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-turquoise.login-page .login-form .form-group .form-control.error{border-color:rgba(204,63,68,.5)}.page-body.skin-turquoise.login-page .login-form .form-group .btn.btn-dark{border-color:#1daf92;background-color:#16a085;color:#fff}.page-body.skin-turquoise.login-page .login-form .form-group .btn.btn-dark:hover{background-color:rgba(29,175,146,.3)}.page-body.skin-turquoise.login-page .login-form .login-footer{margin-top:45px}.page-body.skin-turquoise.login-page .login-form .login-footer a{color:#fff}.page-body.skin-turquoise.login-page .login-form .login-footer a:hover{color:#d6f7f0}.page-body.skin-turquoise.login-page .login-form .login-footer .info-links{font-size:11px;margin-top:5px;color:#96ead9}.page-body.skin-turquoise.login-page .login-form .login-footer .info-links a{color:#96ead9}.page-body.skin-turquoise.login-page .login-form .login-footer .info-links a:hover{color:#fff}.page-body.skin-turquoise.login-page .external-login{position:relative;margin-bottom:30px;padding:0 30px}.page-body.skin-turquoise.login-page .external-login a{display:block;color:#fff;background:#2c2e2f;padding:13px 20px;font-size:15px;margin-bottom:10px}.page-body.skin-turquoise.login-page .external-login a i{margin-right:5px}.page-body.skin-turquoise.login-page .external-login a:hover{background:#454849}.page-body.skin-turquoise.login-page .external-login a.facebook{background-color:#3b5998}.page-body.skin-turquoise.login-page .external-login a.facebook:hover{background-color:#2d4373}.page-body.skin-turquoise.login-page .external-login a.twitter{background-color:#55acee}.page-body.skin-turquoise.login-page .external-login a.twitter:hover{background-color:#2795e9}.page-body.skin-turquoise.login-page .external-login a.gplus{background-color:#dd4b39}.page-body.skin-turquoise.login-page .external-login a.gplus:hover{background-color:#c23321}.page-body.skin-turquoise.login-page.login-light{background:#eee}.page-body.skin-turquoise.login-page.login-light .errors-container,.page-body.skin-turquoise.login-page.login-light .external-login{padding:0}.page-body.skin-turquoise.login-page.login-light .form-group label.error{color:rgba(151,152,152,.8)}.page-body.skin-turquoise.login-page.login-light .login-form{background:#fff;color:#979898}.page-body.skin-turquoise.login-page.login-light .login-form .login-footer a{color:#68b828}.page-body.skin-turquoise.login-page.login-light .login-form .login-footer a:hover{color:#508e1f}.page-body.skin-turquoise.login-page.login-light .login-form .login-footer .info-links a{color:rgba(151,152,152,.7)}.page-body.skin-turquoise.login-page.login-light .login-form .login-footer .info-links a:hover{color:#979898}@media screen and (max-width:768px){.page-body.skin-turquoise.login-page{padding-top:0}.page-body.skin-turquoise.login-page .login-form,.page-body.skin-turquoise.login-page .errors-container,.page-body.skin-turquoise.login-page .external-login{padding-left:10px;padding-right:10px}.page-body.skin-turquoise.login-page .errors-container{margin-top:20px}.page-body.skin-turquoise.login-page.login-light .login-form{padding-left:30px;padding-right:30px}.page-body.skin-turquoise.login-page.login-light .errors-container,.page-body.skin-turquoise.login-page.login-light .external-login{padding-left:0;padding-right:0}.page-body.skin-turquoise.login-page .row{margin:0}}.page-body.skin-turquoise.lockscreen-page{background:#16a085}.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group p{color:#96ead9}.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group h3{color:#96ead9}.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control{border:1px solid #1daf92;color:#fff}.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5);opacity:1}.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn{color:#fff;border:1px solid #1daf92}.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover,.page-body.skin-turquoise.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus{background-color:rgba(29,175,146,.3)}.page-body.skin-turquoise.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon{background:#1daf92;-webkit-box-shadow:0 0 0 10px #1daf92,0 -10px 0 10px #1daf92,0 -20px 0 10px #1daf92,0 -30px 0 10px #1daf92;-moz-box-shadow:0 0 0 10px #1daf92,0 -10px 0 10px #1daf92,0 -20px 0 10px #1daf92,0 -30px 0 10px #1daf92;box-shadow:0 0 0 10px #1daf92,0 -10px 0 10px #1daf92,0 -20px 0 10px #1daf92,0 -30px 0 10px #1daf92}.page-body.skin-turquoise .sidebar-user-info{background-color:#138a72;border-bottom-color:#1daf92}.page-body.skin-turquoise .sidebar-user-info .user-profile span{color:#96ead9}.page-body.skin-turquoise .sidebar-user-info .user-profile span strong{color:#fff}.page-body.skin-turquoise .sidebar-user-info .user-links{border-top-color:#1daf92}.page-body.skin-turquoise .sidebar-user-info .user-links li a{color:#96ead9}.page-body.skin-turquoise .sidebar-user-info .user-links li a:hover{color:#fff;background-color:rgba(29,175,146,.25)}.page-body.skin-turquoise .sidebar-user-info .user-links li.active a{color:#fff;background-color:rgba(29,175,146,.25)}.page-body.skin-turquoise .sidebar-user-info .user-links li+li a{border-left-color:#1daf92}@media screen and (min-width:991px){.sidebar-menu.collapsed .page-body.skin-turquoise .sidebar-user-info .sidebar-user-info-inner .user-profile span{background-color:#27292a}.sidebar-menu.collapsed .page-body.skin-turquoise .sidebar-user-info .sidebar-user-info-inner .user-links{background-color:#27292a}}.page-body.skin-lime .btn-primary{background:#8cc657}.page-body.skin-lime .btn-primary:hover{background:#7fc044;border-color:#7fc044}.page-body.skin-lime .btn-primary:active,.page-body.skin-lime .btn-primary:focus{background:#669c35;border-color:#669c35}.page-body.skin-lime .btn.btn-secondary{background-color:#70a93c;color:#fff}.page-body.skin-lime .btn.btn-secondary:hover{background-color:#649635;text-color:#fff}.page-body.skin-lime .btn.btn-secondary:active,.page-body.skin-lime .btn.btn-secondary:focus{background-color:#649635;border-color:#5f8f33}.page-body.skin-lime .settings-pane{background:#95cd62;color:#fff}.page-body.skin-lime .settings-pane>a[data-toggle=settings-pane]{color:#fff}.page-body.skin-lime .settings-pane>a[data-toggle=settings-pane]:hover{color:#FFF}.page-body.skin-lime .settings-pane .user-info .user-details h3 a{color:#fff}.page-body.skin-lime .settings-pane .user-info .user-details .user-title{color:rgba(255,255,255,.65)}.page-body.skin-lime .settings-pane .links-block.left-sep{border-left:1px solid #8cc657}.page-body.skin-lime .settings-pane .links-block h4{color:#fff}.page-body.skin-lime .settings-pane .links-block h4 span{display:inline-block;border-bottom:1px solid #95cd62}.page-body.skin-lime .settings-pane .links-block h4 a{color:#fff}.page-body.skin-lime .settings-pane .links-block h4 a:hover{color:#fff}.page-body.skin-lime .settings-pane .links-block ul li a{color:#fff}.page-body.skin-lime .settings-pane .links-block ul li a:hover{color:#fff}.page-body.skin-lime .sidebar-menu{background:#8cc657}.page-body.skin-lime .sidebar-menu .logo-env{border-bottom:1px solid #95cd62}.page-body.skin-lime .sidebar-menu .logo-env .settings-icon a{color:#fff}.page-body.skin-lime .sidebar-menu .logo-env .settings-icon a:hover{color:#fff}.page-body.skin-lime .sidebar-menu .main-menu a{color:#fff;border-bottom:1px solid #95cd62}.page-body.skin-lime .sidebar-menu .main-menu a:hover{color:#fff}.page-body.skin-lime .sidebar-menu .main-menu li.active>a{color:#fff}.page-body.skin-lime .sidebar-menu .main-menu li.has-sub>a:before{color:#d6ecc3}.page-body.skin-lime .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x,.page-body.skin-lime .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y{background-color:#fff}@media screen and (min-width:768px){.page-body.skin-lime .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar]{color:#606161}.page-body.skin-lime .sidebar-menu.collapsed .main-menu>li.active,.page-body.skin-lime .sidebar-menu.collapsed .main-menu>li li.active{background-color:#84c24c}.page-body.skin-lime .sidebar-menu.collapsed .main-menu>li>ul{background:#8cc657}}.page-body.skin-lime .page-loading-overlay{background-color:#8cc657}.page-body.skin-lime.login-page{background:#8cc657;color:#fff}.page-body.skin-lime.login-page .login-form .login-header .logo span{color:#fff}.page-body.skin-lime.login-page .login-form .login-header p{color:#fff}.page-body.skin-lime.login-page .login-form .form-group .control-label{color:#fff}.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark{background:#7fc044;border:1px solid transparent;color:#fff}.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff;opacity:1}.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder{color:#fff}.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff}.page-body.skin-lime.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-lime.login-page .login-form .form-group .form-control.error{border-color:rgba(204,63,68,.5)}.page-body.skin-lime.login-page .login-form .form-group .btn.btn-dark{border-color:#95cd62;background-color:#8cc657;color:#fff}.page-body.skin-lime.login-page .login-form .form-group .btn.btn-dark:hover{background-color:rgba(149,205,98,.3)}.page-body.skin-lime.login-page .login-form .login-footer{margin-top:45px}.page-body.skin-lime.login-page .login-form .login-footer a{color:#fff}.page-body.skin-lime.login-page .login-form .login-footer a:hover{color:#fff}.page-body.skin-lime.login-page .login-form .login-footer .info-links{font-size:11px;margin-top:5px;color:#fff}.page-body.skin-lime.login-page .login-form .login-footer .info-links a{color:#fff}.page-body.skin-lime.login-page .login-form .login-footer .info-links a:hover{color:#fff}.page-body.skin-lime.login-page .external-login{position:relative;margin-bottom:30px;padding:0 30px}.page-body.skin-lime.login-page .external-login a{display:block;color:#fff;background:#2c2e2f;padding:13px 20px;font-size:15px;margin-bottom:10px}.page-body.skin-lime.login-page .external-login a i{margin-right:5px}.page-body.skin-lime.login-page .external-login a:hover{background:#454849}.page-body.skin-lime.login-page .external-login a.facebook{background-color:#3b5998}.page-body.skin-lime.login-page .external-login a.facebook:hover{background-color:#2d4373}.page-body.skin-lime.login-page .external-login a.twitter{background-color:#55acee}.page-body.skin-lime.login-page .external-login a.twitter:hover{background-color:#2795e9}.page-body.skin-lime.login-page .external-login a.gplus{background-color:#dd4b39}.page-body.skin-lime.login-page .external-login a.gplus:hover{background-color:#c23321}.page-body.skin-lime.login-page.login-light{background:#eee}.page-body.skin-lime.login-page.login-light .errors-container,.page-body.skin-lime.login-page.login-light .external-login{padding:0}.page-body.skin-lime.login-page.login-light .form-group label.error{color:rgba(151,152,152,.8)}.page-body.skin-lime.login-page.login-light .login-form{background:#fff;color:#979898}.page-body.skin-lime.login-page.login-light .login-form .login-footer a{color:#68b828}.page-body.skin-lime.login-page.login-light .login-form .login-footer a:hover{color:#508e1f}.page-body.skin-lime.login-page.login-light .login-form .login-footer .info-links a{color:rgba(151,152,152,.7)}.page-body.skin-lime.login-page.login-light .login-form .login-footer .info-links a:hover{color:#979898}@media screen and (max-width:768px){.page-body.skin-lime.login-page{padding-top:0}.page-body.skin-lime.login-page .login-form,.page-body.skin-lime.login-page .errors-container,.page-body.skin-lime.login-page .external-login{padding-left:10px;padding-right:10px}.page-body.skin-lime.login-page .errors-container{margin-top:20px}.page-body.skin-lime.login-page.login-light .login-form{padding-left:30px;padding-right:30px}.page-body.skin-lime.login-page.login-light .errors-container,.page-body.skin-lime.login-page.login-light .external-login{padding-left:0;padding-right:0}.page-body.skin-lime.login-page .row{margin:0}}.page-body.skin-lime.lockscreen-page{background:#8cc657}.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group p{color:#fff}.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group h3{color:#fff}.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control{border:1px solid #95cd62;color:#fff}.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5);opacity:1}.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn{color:#fff;border:1px solid #95cd62}.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover,.page-body.skin-lime.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus{background-color:rgba(149,205,98,.3)}.page-body.skin-lime.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon{background:#95cd62;-webkit-box-shadow:0 0 0 10px #95cd62,0 -10px 0 10px #95cd62,0 -20px 0 10px #95cd62,0 -30px 0 10px #95cd62;-moz-box-shadow:0 0 0 10px #95cd62,0 -10px 0 10px #95cd62,0 -20px 0 10px #95cd62,0 -30px 0 10px #95cd62;box-shadow:0 0 0 10px #95cd62,0 -10px 0 10px #95cd62,0 -20px 0 10px #95cd62,0 -30px 0 10px #95cd62}.page-body.skin-lime .sidebar-user-info{background-color:#7fc044;border-bottom-color:#95cd62}.page-body.skin-lime .sidebar-user-info .user-profile span{color:#fff}.page-body.skin-lime .sidebar-user-info .user-profile span strong{color:#fff}.page-body.skin-lime .sidebar-user-info .user-links{border-top-color:#95cd62}.page-body.skin-lime .sidebar-user-info .user-links li a{color:#fff}.page-body.skin-lime .sidebar-user-info .user-links li a:hover{color:#fff;background-color:rgba(149,205,98,.25)}.page-body.skin-lime .sidebar-user-info .user-links li.active a{color:#fff;background-color:rgba(149,205,98,.25)}.page-body.skin-lime .sidebar-user-info .user-links li+li a{border-left-color:#95cd62}@media screen and (min-width:991px){.sidebar-menu.collapsed .page-body.skin-lime .sidebar-user-info .sidebar-user-info-inner .user-profile span{background-color:#27292a}.sidebar-menu.collapsed .page-body.skin-lime .sidebar-user-info .sidebar-user-info-inner .user-links{background-color:#27292a}}.page-body.skin-green .btn-primary{background:#27ae60}.page-body.skin-green .btn-primary:hover{background:#295;border-color:#295}.page-body.skin-green .btn-primary:active,.page-body.skin-green .btn-primary:focus{background:#19703e;border-color:#19703e}.page-body.skin-green .btn.btn-secondary{background-color:#1c954f;color:#fff}.page-body.skin-green .btn.btn-secondary:hover{background-color:#188044;text-color:#fff}.page-body.skin-green .btn.btn-secondary:active,.page-body.skin-green .btn.btn-secondary:focus{background-color:#188044;border-color:#16773f}.page-body.skin-green .settings-pane{background:#2fbd6b;color:#a2f9c7}.page-body.skin-green .settings-pane>a[data-toggle=settings-pane]{color:#a2f9c7}.page-body.skin-green .settings-pane>a[data-toggle=settings-pane]:hover{color:#FFF}.page-body.skin-green .settings-pane .user-info .user-details h3 a{color:#fff}.page-body.skin-green .settings-pane .user-info .user-details .user-title{color:rgba(255,255,255,.65)}.page-body.skin-green .settings-pane .links-block.left-sep{border-left:1px solid #27ae60}.page-body.skin-green .settings-pane .links-block h4{color:#fff}.page-body.skin-green .settings-pane .links-block h4 span{display:inline-block;border-bottom:1px solid #2fbd6b}.page-body.skin-green .settings-pane .links-block h4 a{color:#fff}.page-body.skin-green .settings-pane .links-block h4 a:hover{color:#a2f9c7}.page-body.skin-green .settings-pane .links-block ul li a{color:#a2f9c7}.page-body.skin-green .settings-pane .links-block ul li a:hover{color:#fff}.page-body.skin-green .sidebar-menu{background:#27ae60}.page-body.skin-green .sidebar-menu .logo-env{border-bottom:1px solid #2fbd6b}.page-body.skin-green .sidebar-menu .logo-env .settings-icon a{color:#a2f9c7}.page-body.skin-green .sidebar-menu .logo-env .settings-icon a:hover{color:#fff}.page-body.skin-green .sidebar-menu .main-menu a{color:#a2f9c7;border-bottom:1px solid #2fbd6b}.page-body.skin-green .sidebar-menu .main-menu a:hover{color:#fff}.page-body.skin-green .sidebar-menu .main-menu li.active>a{color:#fff}.page-body.skin-green .sidebar-menu .main-menu li.has-sub>a:before{color:#8ae2af}.page-body.skin-green .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x,.page-body.skin-green .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y{background-color:#fff}@media screen and (min-width:768px){.page-body.skin-green .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar]{color:#606161}.page-body.skin-green .sidebar-menu.collapsed .main-menu>li.active,.page-body.skin-green .sidebar-menu.collapsed .main-menu>li li.active{background-color:#24a259}.page-body.skin-green .sidebar-menu.collapsed .main-menu>li>ul{background:#27ae60}}.page-body.skin-green .page-loading-overlay{background-color:#27ae60}.page-body.skin-green.login-page{background:#27ae60;color:#fff}.page-body.skin-green.login-page .login-form .login-header .logo span{color:#a2f9c7}.page-body.skin-green.login-page .login-form .login-header p{color:#a2f9c7}.page-body.skin-green.login-page .login-form .form-group .control-label{color:#a2f9c7}.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark{background:#295;border:1px solid transparent;color:#a2f9c7}.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff;opacity:1}.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder{color:#fff}.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff}.page-body.skin-green.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-green.login-page .login-form .form-group .form-control.error{border-color:rgba(204,63,68,.5)}.page-body.skin-green.login-page .login-form .form-group .btn.btn-dark{border-color:#2fbd6b;background-color:#27ae60;color:#fff}.page-body.skin-green.login-page .login-form .form-group .btn.btn-dark:hover{background-color:rgba(47,189,107,.3)}.page-body.skin-green.login-page .login-form .login-footer{margin-top:45px}.page-body.skin-green.login-page .login-form .login-footer a{color:#fff}.page-body.skin-green.login-page .login-form .login-footer a:hover{color:#eafef2}.page-body.skin-green.login-page .login-form .login-footer .info-links{font-size:11px;margin-top:5px;color:#a2f9c7}.page-body.skin-green.login-page .login-form .login-footer .info-links a{color:#a2f9c7}.page-body.skin-green.login-page .login-form .login-footer .info-links a:hover{color:#fff}.page-body.skin-green.login-page .external-login{position:relative;margin-bottom:30px;padding:0 30px}.page-body.skin-green.login-page .external-login a{display:block;color:#fff;background:#2c2e2f;padding:13px 20px;font-size:15px;margin-bottom:10px}.page-body.skin-green.login-page .external-login a i{margin-right:5px}.page-body.skin-green.login-page .external-login a:hover{background:#454849}.page-body.skin-green.login-page .external-login a.facebook{background-color:#3b5998}.page-body.skin-green.login-page .external-login a.facebook:hover{background-color:#2d4373}.page-body.skin-green.login-page .external-login a.twitter{background-color:#55acee}.page-body.skin-green.login-page .external-login a.twitter:hover{background-color:#2795e9}.page-body.skin-green.login-page .external-login a.gplus{background-color:#dd4b39}.page-body.skin-green.login-page .external-login a.gplus:hover{background-color:#c23321}.page-body.skin-green.login-page.login-light{background:#eee}.page-body.skin-green.login-page.login-light .errors-container,.page-body.skin-green.login-page.login-light .external-login{padding:0}.page-body.skin-green.login-page.login-light .form-group label.error{color:rgba(151,152,152,.8)}.page-body.skin-green.login-page.login-light .login-form{background:#fff;color:#979898}.page-body.skin-green.login-page.login-light .login-form .login-footer a{color:#68b828}.page-body.skin-green.login-page.login-light .login-form .login-footer a:hover{color:#508e1f}.page-body.skin-green.login-page.login-light .login-form .login-footer .info-links a{color:rgba(151,152,152,.7)}.page-body.skin-green.login-page.login-light .login-form .login-footer .info-links a:hover{color:#979898}@media screen and (max-width:768px){.page-body.skin-green.login-page{padding-top:0}.page-body.skin-green.login-page .login-form,.page-body.skin-green.login-page .errors-container,.page-body.skin-green.login-page .external-login{padding-left:10px;padding-right:10px}.page-body.skin-green.login-page .errors-container{margin-top:20px}.page-body.skin-green.login-page.login-light .login-form{padding-left:30px;padding-right:30px}.page-body.skin-green.login-page.login-light .errors-container,.page-body.skin-green.login-page.login-light .external-login{padding-left:0;padding-right:0}.page-body.skin-green.login-page .row{margin:0}}.page-body.skin-green.lockscreen-page{background:#27ae60}.page-body.skin-green.lockscreen-page .lockcreen-form .form-group p{color:#a2f9c7}.page-body.skin-green.lockscreen-page .lockcreen-form .form-group h3{color:#a2f9c7}.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control{border:1px solid #2fbd6b;color:#fff}.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5);opacity:1}.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn{color:#fff;border:1px solid #2fbd6b}.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover,.page-body.skin-green.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus{background-color:rgba(47,189,107,.3)}.page-body.skin-green.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon{background:#2fbd6b;-webkit-box-shadow:0 0 0 10px #2fbd6b,0 -10px 0 10px #2fbd6b,0 -20px 0 10px #2fbd6b,0 -30px 0 10px #2fbd6b;-moz-box-shadow:0 0 0 10px #2fbd6b,0 -10px 0 10px #2fbd6b,0 -20px 0 10px #2fbd6b,0 -30px 0 10px #2fbd6b;box-shadow:0 0 0 10px #2fbd6b,0 -10px 0 10px #2fbd6b,0 -20px 0 10px #2fbd6b,0 -30px 0 10px #2fbd6b}.page-body.skin-green .sidebar-user-info{background-color:#295;border-bottom-color:#2fbd6b}.page-body.skin-green .sidebar-user-info .user-profile span{color:#a2f9c7}.page-body.skin-green .sidebar-user-info .user-profile span strong{color:#fff}.page-body.skin-green .sidebar-user-info .user-links{border-top-color:#2fbd6b}.page-body.skin-green .sidebar-user-info .user-links li a{color:#a2f9c7}.page-body.skin-green .sidebar-user-info .user-links li a:hover{color:#fff;background-color:rgba(47,189,107,.25)}.page-body.skin-green .sidebar-user-info .user-links li.active a{color:#fff;background-color:rgba(47,189,107,.25)}.page-body.skin-green .sidebar-user-info .user-links li+li a{border-left-color:#2fbd6b}@media screen and (min-width:991px){.sidebar-menu.collapsed .page-body.skin-green .sidebar-user-info .sidebar-user-info-inner .user-profile span{background-color:#27292a}.sidebar-menu.collapsed .page-body.skin-green .sidebar-user-info .sidebar-user-info-inner .user-links{background-color:#27292a}}.page-body.skin-purple .btn-primary{background:#795b95}.page-body.skin-purple .btn-primary:hover{background:#6c5185;border-color:#6c5185}.page-body.skin-purple .btn-primary:active,.page-body.skin-purple .btn-primary:focus{background:#523e66;border-color:#523e66}.page-body.skin-purple .btn.btn-secondary{background-color:#5f3d7e;color:#fff}.page-body.skin-purple .btn.btn-secondary:hover{background-color:#52356d;text-color:#fff}.page-body.skin-purple .btn.btn-secondary:active,.page-body.skin-purple .btn.btn-secondary:focus{background-color:#52356d;border-color:#4d3166}.page-body.skin-purple .settings-pane{background:#81629f;color:#c2afd4}.page-body.skin-purple .settings-pane>a[data-toggle=settings-pane]{color:#c2afd4}.page-body.skin-purple .settings-pane>a[data-toggle=settings-pane]:hover{color:#FFF}.page-body.skin-purple .settings-pane .user-info .user-details h3 a{color:#fff}.page-body.skin-purple .settings-pane .user-info .user-details .user-title{color:rgba(255,255,255,.65)}.page-body.skin-purple .settings-pane .links-block.left-sep{border-left:1px solid #795b95}.page-body.skin-purple .settings-pane .links-block h4{color:#fff}.page-body.skin-purple .settings-pane .links-block h4 span{display:inline-block;border-bottom:1px solid #81629f}.page-body.skin-purple .settings-pane .links-block h4 a{color:#fff}.page-body.skin-purple .settings-pane .links-block h4 a:hover{color:#c2afd4}.page-body.skin-purple .settings-pane .links-block ul li a{color:#c2afd4}.page-body.skin-purple .settings-pane .links-block ul li a:hover{color:#fff}.page-body.skin-purple .sidebar-menu{background:#795b95}.page-body.skin-purple .sidebar-menu .logo-env{border-bottom:1px solid #81629f}.page-body.skin-purple .sidebar-menu .logo-env .settings-icon a{color:#c2afd4}.page-body.skin-purple .sidebar-menu .logo-env .settings-icon a:hover{color:#fff}.page-body.skin-purple .sidebar-menu .main-menu a{color:#c2afd4;border-bottom:1px solid #81629f}.page-body.skin-purple .sidebar-menu .main-menu a:hover{color:#fff}.page-body.skin-purple .sidebar-menu .main-menu li.active>a{color:#fff}.page-body.skin-purple .sidebar-menu .main-menu li.has-sub>a:before{color:#c0b1cf}.page-body.skin-purple .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x,.page-body.skin-purple .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y{background-color:#fff}@media screen and (min-width:768px){.page-body.skin-purple .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar]{color:#606161}.page-body.skin-purple .sidebar-menu.collapsed .main-menu>li.active,.page-body.skin-purple .sidebar-menu.collapsed .main-menu>li li.active{background-color:#71558c}.page-body.skin-purple .sidebar-menu.collapsed .main-menu>li>ul{background:#795b95}}.page-body.skin-purple .page-loading-overlay{background-color:#795b95}.page-body.skin-purple.login-page{background:#795b95;color:#fff}.page-body.skin-purple.login-page .login-form .login-header .logo span{color:#c2afd4}.page-body.skin-purple.login-page .login-form .login-header p{color:#c2afd4}.page-body.skin-purple.login-page .login-form .form-group .control-label{color:#c2afd4}.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark{background:#6c5185;border:1px solid transparent;color:#c2afd4}.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff;opacity:1}.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder{color:#fff}.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff}.page-body.skin-purple.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-purple.login-page .login-form .form-group .form-control.error{border-color:rgba(204,63,68,.5)}.page-body.skin-purple.login-page .login-form .form-group .btn.btn-dark{border-color:#81629f;background-color:#795b95;color:#fff}.page-body.skin-purple.login-page .login-form .form-group .btn.btn-dark:hover{background-color:rgba(129,98,159,.3)}.page-body.skin-purple.login-page .login-form .login-footer{margin-top:45px}.page-body.skin-purple.login-page .login-form .login-footer a{color:#fff}.page-body.skin-purple.login-page .login-form .login-footer a:hover{color:#e8e1ef}.page-body.skin-purple.login-page .login-form .login-footer .info-links{font-size:11px;margin-top:5px;color:#c2afd4}.page-body.skin-purple.login-page .login-form .login-footer .info-links a{color:#c2afd4}.page-body.skin-purple.login-page .login-form .login-footer .info-links a:hover{color:#fff}.page-body.skin-purple.login-page .external-login{position:relative;margin-bottom:30px;padding:0 30px}.page-body.skin-purple.login-page .external-login a{display:block;color:#fff;background:#2c2e2f;padding:13px 20px;font-size:15px;margin-bottom:10px}.page-body.skin-purple.login-page .external-login a i{margin-right:5px}.page-body.skin-purple.login-page .external-login a:hover{background:#454849}.page-body.skin-purple.login-page .external-login a.facebook{background-color:#3b5998}.page-body.skin-purple.login-page .external-login a.facebook:hover{background-color:#2d4373}.page-body.skin-purple.login-page .external-login a.twitter{background-color:#55acee}.page-body.skin-purple.login-page .external-login a.twitter:hover{background-color:#2795e9}.page-body.skin-purple.login-page .external-login a.gplus{background-color:#dd4b39}.page-body.skin-purple.login-page .external-login a.gplus:hover{background-color:#c23321}.page-body.skin-purple.login-page.login-light{background:#eee}.page-body.skin-purple.login-page.login-light .errors-container,.page-body.skin-purple.login-page.login-light .external-login{padding:0}.page-body.skin-purple.login-page.login-light .form-group label.error{color:rgba(151,152,152,.8)}.page-body.skin-purple.login-page.login-light .login-form{background:#fff;color:#979898}.page-body.skin-purple.login-page.login-light .login-form .login-footer a{color:#68b828}.page-body.skin-purple.login-page.login-light .login-form .login-footer a:hover{color:#508e1f}.page-body.skin-purple.login-page.login-light .login-form .login-footer .info-links a{color:rgba(151,152,152,.7)}.page-body.skin-purple.login-page.login-light .login-form .login-footer .info-links a:hover{color:#979898}@media screen and (max-width:768px){.page-body.skin-purple.login-page{padding-top:0}.page-body.skin-purple.login-page .login-form,.page-body.skin-purple.login-page .errors-container,.page-body.skin-purple.login-page .external-login{padding-left:10px;padding-right:10px}.page-body.skin-purple.login-page .errors-container{margin-top:20px}.page-body.skin-purple.login-page.login-light .login-form{padding-left:30px;padding-right:30px}.page-body.skin-purple.login-page.login-light .errors-container,.page-body.skin-purple.login-page.login-light .external-login{padding-left:0;padding-right:0}.page-body.skin-purple.login-page .row{margin:0}}.page-body.skin-purple.lockscreen-page{background:#795b95}.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group p{color:#c2afd4}.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group h3{color:#c2afd4}.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control{border:1px solid #81629f;color:#fff}.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5);opacity:1}.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn{color:#fff;border:1px solid #81629f}.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover,.page-body.skin-purple.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus{background-color:rgba(129,98,159,.3)}.page-body.skin-purple.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon{background:#81629f;-webkit-box-shadow:0 0 0 10px #81629f,0 -10px 0 10px #81629f,0 -20px 0 10px #81629f,0 -30px 0 10px #81629f;-moz-box-shadow:0 0 0 10px #81629f,0 -10px 0 10px #81629f,0 -20px 0 10px #81629f,0 -30px 0 10px #81629f;box-shadow:0 0 0 10px #81629f,0 -10px 0 10px #81629f,0 -20px 0 10px #81629f,0 -30px 0 10px #81629f}.page-body.skin-purple .sidebar-user-info{background-color:#6c5185;border-bottom-color:#81629f}.page-body.skin-purple .sidebar-user-info .user-profile span{color:#c2afd4}.page-body.skin-purple .sidebar-user-info .user-profile span strong{color:#fff}.page-body.skin-purple .sidebar-user-info .user-links{border-top-color:#81629f}.page-body.skin-purple .sidebar-user-info .user-links li a{color:#c2afd4}.page-body.skin-purple .sidebar-user-info .user-links li a:hover{color:#fff;background-color:rgba(129,98,159,.25)}.page-body.skin-purple .sidebar-user-info .user-links li.active a{color:#fff;background-color:rgba(129,98,159,.25)}.page-body.skin-purple .sidebar-user-info .user-links li+li a{border-left-color:#81629f}@media screen and (min-width:991px){.sidebar-menu.collapsed .page-body.skin-purple .sidebar-user-info .sidebar-user-info-inner .user-profile span{background-color:#27292a}.sidebar-menu.collapsed .page-body.skin-purple .sidebar-user-info .sidebar-user-info-inner .user-links{background-color:#27292a}}.page-body.skin-white .btn-primary{background:#95cd62}.page-body.skin-white .btn-primary:hover{background:#88c74f;border-color:#88c74f}.page-body.skin-white .btn-primary:active,.page-body.skin-white .btn-primary:focus{background:#6fac37;border-color:#6fac37}.page-body.skin-white .btn.btn-secondary{background-color:#555;color:#fff}.page-body.skin-white .btn.btn-secondary:hover{background-color:#484848;text-color:#fff}.page-body.skin-white .btn.btn-secondary:active,.page-body.skin-white .btn.btn-secondary:focus{background-color:#484848;border-color:#434343}.page-body.skin-white .settings-pane{background:#eee;color:#666}.page-body.skin-white .settings-pane>a[data-toggle=settings-pane]{color:#666}.page-body.skin-white .settings-pane>a[data-toggle=settings-pane]:hover{color:#FFF}.page-body.skin-white .settings-pane .user-info .user-details h3 a{color:#95cd62}.page-body.skin-white .settings-pane .user-info .user-details .user-title{color:rgba(149,205,98,.65)}.page-body.skin-white .settings-pane .links-block.left-sep{border-left:1px solid #fff}.page-body.skin-white .settings-pane .links-block h4{color:#95cd62}.page-body.skin-white .settings-pane .links-block h4 span{display:inline-block;border-bottom:1px solid #eee}.page-body.skin-white .settings-pane .links-block h4 a{color:#95cd62}.page-body.skin-white .settings-pane .links-block h4 a:hover{color:#666}.page-body.skin-white .settings-pane .links-block ul li a{color:#666}.page-body.skin-white .settings-pane .links-block ul li a:hover{color:#95cd62}.page-body.skin-white .sidebar-menu{background:#fff}.page-body.skin-white .sidebar-menu .logo-env{border-bottom:1px solid #eee}.page-body.skin-white .sidebar-menu .logo-env .settings-icon a{color:#666}.page-body.skin-white .sidebar-menu .logo-env .settings-icon a:hover{color:#95cd62}.page-body.skin-white .sidebar-menu .main-menu a{color:#666;border-bottom:1px solid #eee}.page-body.skin-white .sidebar-menu .main-menu a:hover{color:#95cd62}.page-body.skin-white .sidebar-menu .main-menu li.active>a{color:#95cd62}.page-body.skin-white .sidebar-menu .main-menu li.has-sub>a:before{color:#fff}.page-body.skin-white .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x,.page-body.skin-white .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y{background-color:#eee}@media screen and (min-width:768px){.page-body.skin-white .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar]{color:#606161}.page-body.skin-white .sidebar-menu.collapsed .main-menu>li.active,.page-body.skin-white .sidebar-menu.collapsed .main-menu>li li.active{background-color:#f7f7f7}.page-body.skin-white .sidebar-menu.collapsed .main-menu>li>ul{background:#fff}}.page-body.skin-white .page-loading-overlay{background-color:#fff}.page-body.skin-white.login-page{background:#fff;color:#fff}.page-body.skin-white.login-page .login-form .login-header .logo span{color:#666}.page-body.skin-white.login-page .login-form .login-header p{color:#666}.page-body.skin-white.login-page .login-form .form-group .control-label{color:#666}.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark{background:#f2f2f2;border:1px solid transparent;color:#666}.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#95cd62;opacity:1}.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#95cd62}.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#95cd62}.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#95cd62}.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder{color:#95cd62}.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#95cd62}.page-body.skin-white.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#95cd62}.page-body.skin-white.login-page .login-form .form-group .form-control.error{border-color:rgba(204,63,68,.5)}.page-body.skin-white.login-page .login-form .form-group .btn.btn-dark{border-color:#eee;background-color:#fff;color:#95cd62}.page-body.skin-white.login-page .login-form .form-group .btn.btn-dark:hover{background-color:rgba(238,238,238,.3)}.page-body.skin-white.login-page .login-form .login-footer{margin-top:45px}.page-body.skin-white.login-page .login-form .login-footer a{color:#95cd62}.page-body.skin-white.login-page .login-form .login-footer a:hover{color:#8c8c8c}.page-body.skin-white.login-page .login-form .login-footer .info-links{font-size:11px;margin-top:5px;color:#666}.page-body.skin-white.login-page .login-form .login-footer .info-links a{color:#666}.page-body.skin-white.login-page .login-form .login-footer .info-links a:hover{color:#95cd62}.page-body.skin-white.login-page .external-login{position:relative;margin-bottom:30px;padding:0 30px}.page-body.skin-white.login-page .external-login a{display:block;color:#fff;background:#2c2e2f;padding:13px 20px;font-size:15px;margin-bottom:10px}.page-body.skin-white.login-page .external-login a i{margin-right:5px}.page-body.skin-white.login-page .external-login a:hover{background:#454849}.page-body.skin-white.login-page .external-login a.facebook{background-color:#3b5998}.page-body.skin-white.login-page .external-login a.facebook:hover{background-color:#2d4373}.page-body.skin-white.login-page .external-login a.twitter{background-color:#55acee}.page-body.skin-white.login-page .external-login a.twitter:hover{background-color:#2795e9}.page-body.skin-white.login-page .external-login a.gplus{background-color:#dd4b39}.page-body.skin-white.login-page .external-login a.gplus:hover{background-color:#c23321}.page-body.skin-white.login-page.login-light{background:#eee}.page-body.skin-white.login-page.login-light .errors-container,.page-body.skin-white.login-page.login-light .external-login{padding:0}.page-body.skin-white.login-page.login-light .form-group label.error{color:rgba(151,152,152,.8)}.page-body.skin-white.login-page.login-light .login-form{background:#fff;color:#979898}.page-body.skin-white.login-page.login-light .login-form .login-footer a{color:#68b828}.page-body.skin-white.login-page.login-light .login-form .login-footer a:hover{color:#508e1f}.page-body.skin-white.login-page.login-light .login-form .login-footer .info-links a{color:rgba(151,152,152,.7)}.page-body.skin-white.login-page.login-light .login-form .login-footer .info-links a:hover{color:#979898}@media screen and (max-width:768px){.page-body.skin-white.login-page{padding-top:0}.page-body.skin-white.login-page .login-form,.page-body.skin-white.login-page .errors-container,.page-body.skin-white.login-page .external-login{padding-left:10px;padding-right:10px}.page-body.skin-white.login-page .errors-container{margin-top:20px}.page-body.skin-white.login-page.login-light .login-form{padding-left:30px;padding-right:30px}.page-body.skin-white.login-page.login-light .errors-container,.page-body.skin-white.login-page.login-light .external-login{padding-left:0;padding-right:0}.page-body.skin-white.login-page .row{margin:0}}.page-body.skin-white.lockscreen-page{background:#fff}.page-body.skin-white.lockscreen-page .lockcreen-form .form-group p{color:#666}.page-body.skin-white.lockscreen-page .lockcreen-form .form-group h3{color:#666}.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control{border:1px solid #eee;color:#95cd62}.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(149,205,98,.5);opacity:1}.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(149,205,98,.5)}.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(149,205,98,.5)}.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(149,205,98,.5)}.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder{color:rgba(149,205,98,.5)}.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(149,205,98,.5)}.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(149,205,98,.5)}.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn{color:#95cd62;border:1px solid #eee}.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover,.page-body.skin-white.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus{background-color:rgba(238,238,238,.3)}.page-body.skin-white.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon{background:#eee;-webkit-box-shadow:0 0 0 10px #eee,0 -10px 0 10px #eee,0 -20px 0 10px #eee,0 -30px 0 10px #eee;-moz-box-shadow:0 0 0 10px #eee,0 -10px 0 10px #eee,0 -20px 0 10px #eee,0 -30px 0 10px #eee;box-shadow:0 0 0 10px #eee,0 -10px 0 10px #eee,0 -20px 0 10px #eee,0 -30px 0 10px #eee}.page-body.skin-white .sidebar-user-info{background-color:#f2f2f2;border-bottom-color:#eee}.page-body.skin-white .sidebar-user-info .user-profile span{color:#666}.page-body.skin-white .sidebar-user-info .user-profile span strong{color:#95cd62}.page-body.skin-white .sidebar-user-info .user-links{border-top-color:#eee}.page-body.skin-white .sidebar-user-info .user-links li a{color:#666}.page-body.skin-white .sidebar-user-info .user-links li a:hover{color:#95cd62;background-color:rgba(238,238,238,.25)}.page-body.skin-white .sidebar-user-info .user-links li.active a{color:#95cd62;background-color:rgba(238,238,238,.25)}.page-body.skin-white .sidebar-user-info .user-links li+li a{border-left-color:#eee}@media screen and (min-width:991px){.sidebar-menu.collapsed .page-body.skin-white .sidebar-user-info .sidebar-user-info-inner .user-profile span{background-color:#27292a}.sidebar-menu.collapsed .page-body.skin-white .sidebar-user-info .sidebar-user-info-inner .user-links{background-color:#27292a}}.page-body.skin-concrete .btn-primary{background:#a40f37}.page-body.skin-concrete .btn-primary:hover{background:#8d0d2f;border-color:#8d0d2f}.page-body.skin-concrete .btn-primary:active,.page-body.skin-concrete .btn-primary:focus{background:#5e091f;border-color:#5e091f}.page-body.skin-concrete .btn.btn-secondary{background-color:#323232;color:#fff}.page-body.skin-concrete .btn.btn-secondary:hover{background-color:#252525;text-color:#fff}.page-body.skin-concrete .btn.btn-secondary:active,.page-body.skin-concrete .btn.btn-secondary:focus{background-color:#252525;border-color:#202020}.page-body.skin-concrete .settings-pane{background:#b8bbb3;color:#666}.page-body.skin-concrete .settings-pane>a[data-toggle=settings-pane]{color:#666}.page-body.skin-concrete .settings-pane>a[data-toggle=settings-pane]:hover{color:#FFF}.page-body.skin-concrete .settings-pane .user-info .user-details h3 a{color:#a40f37}.page-body.skin-concrete .settings-pane .user-info .user-details .user-title{color:rgba(164,15,55,.65)}.page-body.skin-concrete .settings-pane .links-block.left-sep{border-left:1px solid #a8aba2}.page-body.skin-concrete .settings-pane .links-block h4{color:#a40f37}.page-body.skin-concrete .settings-pane .links-block h4 span{display:inline-block;border-bottom:1px solid #b8bbb3}.page-body.skin-concrete .settings-pane .links-block h4 a{color:#a40f37}.page-body.skin-concrete .settings-pane .links-block h4 a:hover{color:#666}.page-body.skin-concrete .settings-pane .links-block ul li a{color:#666}.page-body.skin-concrete .settings-pane .links-block ul li a:hover{color:#a40f37}.page-body.skin-concrete .sidebar-menu{background:#a8aba2}.page-body.skin-concrete .sidebar-menu .logo-env{border-bottom:1px solid #b8bbb3}.page-body.skin-concrete .sidebar-menu .logo-env .settings-icon a{color:#666}.page-body.skin-concrete .sidebar-menu .logo-env .settings-icon a:hover{color:#a40f37}.page-body.skin-concrete .sidebar-menu .main-menu a{color:#666;border-bottom:1px solid #b8bbb3}.page-body.skin-concrete .sidebar-menu .main-menu a:hover{color:#a40f37}.page-body.skin-concrete .sidebar-menu .main-menu li.active>a{color:#a40f37}.page-body.skin-concrete .sidebar-menu .main-menu li.has-sub>a:before{color:#f7f7f6}.page-body.skin-concrete .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x,.page-body.skin-concrete .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y{background-color:#fff}@media screen and (min-width:768px){.page-body.skin-concrete .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar]{color:#606161}.page-body.skin-concrete .sidebar-menu.collapsed .main-menu>li.active,.page-body.skin-concrete .sidebar-menu.collapsed .main-menu>li li.active{background-color:#a0a49a}.page-body.skin-concrete .sidebar-menu.collapsed .main-menu>li>ul{background:#a8aba2}}.page-body.skin-concrete .page-loading-overlay{background-color:#a8aba2}.page-body.skin-concrete.login-page{background:#a8aba2;color:#fff}.page-body.skin-concrete.login-page .login-form .login-header .logo span{color:#666}.page-body.skin-concrete.login-page .login-form .login-header p{color:#666}.page-body.skin-concrete.login-page .login-form .form-group .control-label{color:#666}.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark{background:#9b9f95;border:1px solid transparent;color:#666}.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#a40f37;opacity:1}.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#a40f37}.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#a40f37}.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#a40f37}.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder{color:#a40f37}.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#a40f37}.page-body.skin-concrete.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#a40f37}.page-body.skin-concrete.login-page .login-form .form-group .form-control.error{border-color:rgba(204,63,68,.5)}.page-body.skin-concrete.login-page .login-form .form-group .btn.btn-dark{border-color:#b8bbb3;background-color:#a8aba2;color:#a40f37}.page-body.skin-concrete.login-page .login-form .form-group .btn.btn-dark:hover{background-color:rgba(184,187,179,.3)}.page-body.skin-concrete.login-page .login-form .login-footer{margin-top:45px}.page-body.skin-concrete.login-page .login-form .login-footer a{color:#a40f37}.page-body.skin-concrete.login-page .login-form .login-footer a:hover{color:#8c8c8c}.page-body.skin-concrete.login-page .login-form .login-footer .info-links{font-size:11px;margin-top:5px;color:#666}.page-body.skin-concrete.login-page .login-form .login-footer .info-links a{color:#666}.page-body.skin-concrete.login-page .login-form .login-footer .info-links a:hover{color:#a40f37}.page-body.skin-concrete.login-page .external-login{position:relative;margin-bottom:30px;padding:0 30px}.page-body.skin-concrete.login-page .external-login a{display:block;color:#fff;background:#2c2e2f;padding:13px 20px;font-size:15px;margin-bottom:10px}.page-body.skin-concrete.login-page .external-login a i{margin-right:5px}.page-body.skin-concrete.login-page .external-login a:hover{background:#454849}.page-body.skin-concrete.login-page .external-login a.facebook{background-color:#3b5998}.page-body.skin-concrete.login-page .external-login a.facebook:hover{background-color:#2d4373}.page-body.skin-concrete.login-page .external-login a.twitter{background-color:#55acee}.page-body.skin-concrete.login-page .external-login a.twitter:hover{background-color:#2795e9}.page-body.skin-concrete.login-page .external-login a.gplus{background-color:#dd4b39}.page-body.skin-concrete.login-page .external-login a.gplus:hover{background-color:#c23321}.page-body.skin-concrete.login-page.login-light{background:#eee}.page-body.skin-concrete.login-page.login-light .errors-container,.page-body.skin-concrete.login-page.login-light .external-login{padding:0}.page-body.skin-concrete.login-page.login-light .form-group label.error{color:rgba(151,152,152,.8)}.page-body.skin-concrete.login-page.login-light .login-form{background:#fff;color:#979898}.page-body.skin-concrete.login-page.login-light .login-form .login-footer a{color:#68b828}.page-body.skin-concrete.login-page.login-light .login-form .login-footer a:hover{color:#508e1f}.page-body.skin-concrete.login-page.login-light .login-form .login-footer .info-links a{color:rgba(151,152,152,.7)}.page-body.skin-concrete.login-page.login-light .login-form .login-footer .info-links a:hover{color:#979898}@media screen and (max-width:768px){.page-body.skin-concrete.login-page{padding-top:0}.page-body.skin-concrete.login-page .login-form,.page-body.skin-concrete.login-page .errors-container,.page-body.skin-concrete.login-page .external-login{padding-left:10px;padding-right:10px}.page-body.skin-concrete.login-page .errors-container{margin-top:20px}.page-body.skin-concrete.login-page.login-light .login-form{padding-left:30px;padding-right:30px}.page-body.skin-concrete.login-page.login-light .errors-container,.page-body.skin-concrete.login-page.login-light .external-login{padding-left:0;padding-right:0}.page-body.skin-concrete.login-page .row{margin:0}}.page-body.skin-concrete.lockscreen-page{background:#a8aba2}.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group p{color:#666}.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group h3{color:#666}.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control{border:1px solid #b8bbb3;color:#a40f37}.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(164,15,55,.5);opacity:1}.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(164,15,55,.5)}.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(164,15,55,.5)}.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(164,15,55,.5)}.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder{color:rgba(164,15,55,.5)}.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(164,15,55,.5)}.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(164,15,55,.5)}.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn{color:#a40f37;border:1px solid #b8bbb3}.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover,.page-body.skin-concrete.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus{background-color:rgba(184,187,179,.3)}.page-body.skin-concrete.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon{background:#b8bbb3;-webkit-box-shadow:0 0 0 10px #b8bbb3,0 -10px 0 10px #b8bbb3,0 -20px 0 10px #b8bbb3,0 -30px 0 10px #b8bbb3;-moz-box-shadow:0 0 0 10px #b8bbb3,0 -10px 0 10px #b8bbb3,0 -20px 0 10px #b8bbb3,0 -30px 0 10px #b8bbb3;box-shadow:0 0 0 10px #b8bbb3,0 -10px 0 10px #b8bbb3,0 -20px 0 10px #b8bbb3,0 -30px 0 10px #b8bbb3}.page-body.skin-concrete .sidebar-user-info{background-color:#9b9f95;border-bottom-color:#b8bbb3}.page-body.skin-concrete .sidebar-user-info .user-profile span{color:#666}.page-body.skin-concrete .sidebar-user-info .user-profile span strong{color:#a40f37}.page-body.skin-concrete .sidebar-user-info .user-links{border-top-color:#b8bbb3}.page-body.skin-concrete .sidebar-user-info .user-links li a{color:#666}.page-body.skin-concrete .sidebar-user-info .user-links li a:hover{color:#a40f37;background-color:rgba(184,187,179,.25)}.page-body.skin-concrete .sidebar-user-info .user-links li.active a{color:#a40f37;background-color:rgba(184,187,179,.25)}.page-body.skin-concrete .sidebar-user-info .user-links li+li a{border-left-color:#b8bbb3}@media screen and (min-width:991px){.sidebar-menu.collapsed .page-body.skin-concrete .sidebar-user-info .sidebar-user-info-inner .user-profile span{background-color:#27292a}.sidebar-menu.collapsed .page-body.skin-concrete .sidebar-user-info .sidebar-user-info-inner .user-links{background-color:#27292a}}.page-body.skin-watermelon .btn-primary{background:#b63131}.page-body.skin-watermelon .btn-primary:hover{background:#a22c2c;border-color:#a22c2c}.page-body.skin-watermelon .btn-primary:active,.page-body.skin-watermelon .btn-primary:focus{background:#7a2121;border-color:#7a2121}.page-body.skin-watermelon .btn.btn-secondary{background-color:#32932e;color:#fff}.page-body.skin-watermelon .btn.btn-secondary:hover{background-color:#2b8028;text-color:#fff}.page-body.skin-watermelon .btn.btn-secondary:active,.page-body.skin-watermelon .btn.btn-secondary:focus{background-color:#2b8028;border-color:#297825}.page-body.skin-watermelon .settings-pane{background:#c03737;color:#f7b2b2}.page-body.skin-watermelon .settings-pane>a[data-toggle=settings-pane]{color:#f7b2b2}.page-body.skin-watermelon .settings-pane>a[data-toggle=settings-pane]:hover{color:#FFF}.page-body.skin-watermelon .settings-pane .user-info .user-details h3 a{color:#fff}.page-body.skin-watermelon .settings-pane .user-info .user-details .user-title{color:rgba(255,255,255,.65)}.page-body.skin-watermelon .settings-pane .links-block.left-sep{border-left:1px solid #b63131}.page-body.skin-watermelon .settings-pane .links-block h4{color:#fff}.page-body.skin-watermelon .settings-pane .links-block h4 span{display:inline-block;border-bottom:1px solid #c03737}.page-body.skin-watermelon .settings-pane .links-block h4 a{color:#fff}.page-body.skin-watermelon .settings-pane .links-block h4 a:hover{color:#f7b2b2}.page-body.skin-watermelon .settings-pane .links-block ul li a{color:#f7b2b2}.page-body.skin-watermelon .settings-pane .links-block ul li a:hover{color:#fff}.page-body.skin-watermelon .sidebar-menu{background:#b63131}.page-body.skin-watermelon .sidebar-menu .logo-env{border-bottom:1px solid #c03737}.page-body.skin-watermelon .sidebar-menu .logo-env .settings-icon a{color:#f7b2b2}.page-body.skin-watermelon .sidebar-menu .logo-env .settings-icon a:hover{color:#fff}.page-body.skin-watermelon .sidebar-menu .main-menu a{color:#f7b2b2;border-bottom:1px solid #c03737}.page-body.skin-watermelon .sidebar-menu .main-menu a:hover{color:#fff}.page-body.skin-watermelon .sidebar-menu .main-menu li.active>a{color:#fff}.page-body.skin-watermelon .sidebar-menu .main-menu li.has-sub>a:before{color:#e19696}.page-body.skin-watermelon .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x,.page-body.skin-watermelon .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y{background-color:#fff}@media screen and (min-width:768px){.page-body.skin-watermelon .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar]{color:#606161}.page-body.skin-watermelon .sidebar-menu.collapsed .main-menu>li.active,.page-body.skin-watermelon .sidebar-menu.collapsed .main-menu>li li.active{background-color:#aa2e2e}.page-body.skin-watermelon .sidebar-menu.collapsed .main-menu>li>ul{background:#b63131}}.page-body.skin-watermelon .page-loading-overlay{background-color:#b63131}.page-body.skin-watermelon.login-page{background:#b63131;color:#fff}.page-body.skin-watermelon.login-page .login-form .login-header .logo span{color:#f7b2b2}.page-body.skin-watermelon.login-page .login-form .login-header p{color:#f7b2b2}.page-body.skin-watermelon.login-page .login-form .form-group .control-label{color:#f7b2b2}.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark{background:#a22c2c;border:1px solid transparent;color:#f7b2b2}.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff;opacity:1}.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder{color:#fff}.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff}.page-body.skin-watermelon.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-watermelon.login-page .login-form .form-group .form-control.error{border-color:rgba(204,63,68,.5)}.page-body.skin-watermelon.login-page .login-form .form-group .btn.btn-dark{border-color:#c03737;background-color:#b63131;color:#fff}.page-body.skin-watermelon.login-page .login-form .form-group .btn.btn-dark:hover{background-color:rgba(192,55,55,.3)}.page-body.skin-watermelon.login-page .login-form .login-footer{margin-top:45px}.page-body.skin-watermelon.login-page .login-form .login-footer a{color:#fff}.page-body.skin-watermelon.login-page .login-form .login-footer a:hover{color:#fef7f7}.page-body.skin-watermelon.login-page .login-form .login-footer .info-links{font-size:11px;margin-top:5px;color:#f7b2b2}.page-body.skin-watermelon.login-page .login-form .login-footer .info-links a{color:#f7b2b2}.page-body.skin-watermelon.login-page .login-form .login-footer .info-links a:hover{color:#fff}.page-body.skin-watermelon.login-page .external-login{position:relative;margin-bottom:30px;padding:0 30px}.page-body.skin-watermelon.login-page .external-login a{display:block;color:#fff;background:#2c2e2f;padding:13px 20px;font-size:15px;margin-bottom:10px}.page-body.skin-watermelon.login-page .external-login a i{margin-right:5px}.page-body.skin-watermelon.login-page .external-login a:hover{background:#454849}.page-body.skin-watermelon.login-page .external-login a.facebook{background-color:#3b5998}.page-body.skin-watermelon.login-page .external-login a.facebook:hover{background-color:#2d4373}.page-body.skin-watermelon.login-page .external-login a.twitter{background-color:#55acee}.page-body.skin-watermelon.login-page .external-login a.twitter:hover{background-color:#2795e9}.page-body.skin-watermelon.login-page .external-login a.gplus{background-color:#dd4b39}.page-body.skin-watermelon.login-page .external-login a.gplus:hover{background-color:#c23321}.page-body.skin-watermelon.login-page.login-light{background:#eee}.page-body.skin-watermelon.login-page.login-light .errors-container,.page-body.skin-watermelon.login-page.login-light .external-login{padding:0}.page-body.skin-watermelon.login-page.login-light .form-group label.error{color:rgba(151,152,152,.8)}.page-body.skin-watermelon.login-page.login-light .login-form{background:#fff;color:#979898}.page-body.skin-watermelon.login-page.login-light .login-form .login-footer a{color:#68b828}.page-body.skin-watermelon.login-page.login-light .login-form .login-footer a:hover{color:#508e1f}.page-body.skin-watermelon.login-page.login-light .login-form .login-footer .info-links a{color:rgba(151,152,152,.7)}.page-body.skin-watermelon.login-page.login-light .login-form .login-footer .info-links a:hover{color:#979898}@media screen and (max-width:768px){.page-body.skin-watermelon.login-page{padding-top:0}.page-body.skin-watermelon.login-page .login-form,.page-body.skin-watermelon.login-page .errors-container,.page-body.skin-watermelon.login-page .external-login{padding-left:10px;padding-right:10px}.page-body.skin-watermelon.login-page .errors-container{margin-top:20px}.page-body.skin-watermelon.login-page.login-light .login-form{padding-left:30px;padding-right:30px}.page-body.skin-watermelon.login-page.login-light .errors-container,.page-body.skin-watermelon.login-page.login-light .external-login{padding-left:0;padding-right:0}.page-body.skin-watermelon.login-page .row{margin:0}}.page-body.skin-watermelon.lockscreen-page{background:#b63131}.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group p{color:#f7b2b2}.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group h3{color:#f7b2b2}.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control{border:1px solid #c03737;color:#fff}.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5);opacity:1}.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn{color:#fff;border:1px solid #c03737}.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover,.page-body.skin-watermelon.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus{background-color:rgba(192,55,55,.3)}.page-body.skin-watermelon.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon{background:#c03737;-webkit-box-shadow:0 0 0 10px #c03737,0 -10px 0 10px #c03737,0 -20px 0 10px #c03737,0 -30px 0 10px #c03737;-moz-box-shadow:0 0 0 10px #c03737,0 -10px 0 10px #c03737,0 -20px 0 10px #c03737,0 -30px 0 10px #c03737;box-shadow:0 0 0 10px #c03737,0 -10px 0 10px #c03737,0 -20px 0 10px #c03737,0 -30px 0 10px #c03737}.page-body.skin-watermelon .sidebar-user-info{background-color:#a22c2c;border-bottom-color:#c03737}.page-body.skin-watermelon .sidebar-user-info .user-profile span{color:#f7b2b2}.page-body.skin-watermelon .sidebar-user-info .user-profile span strong{color:#fff}.page-body.skin-watermelon .sidebar-user-info .user-links{border-top-color:#c03737}.page-body.skin-watermelon .sidebar-user-info .user-links li a{color:#f7b2b2}.page-body.skin-watermelon .sidebar-user-info .user-links li a:hover{color:#fff;background-color:rgba(192,55,55,.25)}.page-body.skin-watermelon .sidebar-user-info .user-links li.active a{color:#fff;background-color:rgba(192,55,55,.25)}.page-body.skin-watermelon .sidebar-user-info .user-links li+li a{border-left-color:#c03737}@media screen and (min-width:991px){.sidebar-menu.collapsed .page-body.skin-watermelon .sidebar-user-info .sidebar-user-info-inner .user-profile span{background-color:#27292a}.sidebar-menu.collapsed .page-body.skin-watermelon .sidebar-user-info .sidebar-user-info-inner .user-links{background-color:#27292a}}.page-body.skin-lemonade .btn-primary{background:#f5c150}.page-body.skin-lemonade .btn-primary:hover{background:#f4b838;border-color:#f4b838}.page-body.skin-lemonade .btn-primary:active,.page-body.skin-lemonade .btn-primary:focus{background:#eba50d;border-color:#eba50d}.page-body.skin-lemonade .btn.btn-secondary{background-color:#d9a940;color:#fff}.page-body.skin-lemonade .btn.btn-secondary:hover{background-color:#d59f2b;text-color:#fff}.page-body.skin-lemonade .btn.btn-secondary:active,.page-body.skin-lemonade .btn.btn-secondary:focus{background-color:#d59f2b;border-color:#cd9929}.page-body.skin-lemonade .settings-pane{background:#ffcf67;color:#ffeec9}.page-body.skin-lemonade .settings-pane>a[data-toggle=settings-pane]{color:#ffeec9}.page-body.skin-lemonade .settings-pane>a[data-toggle=settings-pane]:hover{color:#FFF}.page-body.skin-lemonade .settings-pane .user-info .user-details h3 a{color:#fff}.page-body.skin-lemonade .settings-pane .user-info .user-details .user-title{color:rgba(255,255,255,.65)}.page-body.skin-lemonade .settings-pane .links-block.left-sep{border-left:1px solid #f5c150}.page-body.skin-lemonade .settings-pane .links-block h4{color:#fff}.page-body.skin-lemonade .settings-pane .links-block h4 span{display:inline-block;border-bottom:1px solid #ffcf67}.page-body.skin-lemonade .settings-pane .links-block h4 a{color:#fff}.page-body.skin-lemonade .settings-pane .links-block h4 a:hover{color:#ffeec9}.page-body.skin-lemonade .settings-pane .links-block ul li a{color:#ffeec9}.page-body.skin-lemonade .settings-pane .links-block ul li a:hover{color:#fff}.page-body.skin-lemonade .sidebar-menu{background:#f5c150}.page-body.skin-lemonade .sidebar-menu .logo-env{border-bottom:1px solid #ffcf67}.page-body.skin-lemonade .sidebar-menu .logo-env .settings-icon a{color:#ffeec9}.page-body.skin-lemonade .sidebar-menu .logo-env .settings-icon a:hover{color:#fff}.page-body.skin-lemonade .sidebar-menu .main-menu a{color:#ffeec9;border-bottom:1px solid #ffcf67}.page-body.skin-lemonade .sidebar-menu .main-menu a:hover{color:#fff}.page-body.skin-lemonade .sidebar-menu .main-menu li.active>a{color:#fff}.page-body.skin-lemonade .sidebar-menu .main-menu li.has-sub>a:before{color:#fff7e6}.page-body.skin-lemonade .sidebar-menu .ps-scrollbar-x-rail .ps-scrollbar-x,.page-body.skin-lemonade .sidebar-menu .ps-scrollbar-y-rail .ps-scrollbar-y{background-color:#fff}@media screen and (min-width:768px){.page-body.skin-lemonade .sidebar-menu.collapsed+.main-content .user-info-navbar .user-info-menu a[data-toggle=sidebar]{color:#606161}.page-body.skin-lemonade .sidebar-menu.collapsed .main-menu>li.active,.page-body.skin-lemonade .sidebar-menu.collapsed .main-menu>li li.active{background-color:#f4bc42}.page-body.skin-lemonade .sidebar-menu.collapsed .main-menu>li>ul{background:#f5c150}}.page-body.skin-lemonade .page-loading-overlay{background-color:#f5c150}.page-body.skin-lemonade.login-page{background:#f5c150;color:#fff}.page-body.skin-lemonade.login-page .login-form .login-header .logo span{color:#ffeec9}.page-body.skin-lemonade.login-page .login-form .login-header p{color:#ffeec9}.page-body.skin-lemonade.login-page .login-form .form-group .control-label{color:#ffeec9}.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark{background:#f4b838;border:1px solid transparent;color:#ffeec9}.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff;opacity:1}.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark::-webkit-input-placeholder{color:#fff}.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark:-moz-placeholder{color:#fff}.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark::-moz-placeholder{color:#fff}.page-body.skin-lemonade.login-page .login-form .form-group .form-control.input-dark:-ms-input-placeholder{color:#fff}.page-body.skin-lemonade.login-page .login-form .form-group .form-control.error{border-color:rgba(204,63,68,.5)}.page-body.skin-lemonade.login-page .login-form .form-group .btn.btn-dark{border-color:#ffcf67;background-color:#f5c150;color:#fff}.page-body.skin-lemonade.login-page .login-form .form-group .btn.btn-dark:hover{background-color:rgba(255,207,103,.3)}.page-body.skin-lemonade.login-page .login-form .login-footer{margin-top:45px}.page-body.skin-lemonade.login-page .login-form .login-footer a{color:#fff}.page-body.skin-lemonade.login-page .login-form .login-footer a:hover{color:#fff}.page-body.skin-lemonade.login-page .login-form .login-footer .info-links{font-size:11px;margin-top:5px;color:#ffeec9}.page-body.skin-lemonade.login-page .login-form .login-footer .info-links a{color:#ffeec9}.page-body.skin-lemonade.login-page .login-form .login-footer .info-links a:hover{color:#fff}.page-body.skin-lemonade.login-page .external-login{position:relative;margin-bottom:30px;padding:0 30px}.page-body.skin-lemonade.login-page .external-login a{display:block;color:#fff;background:#2c2e2f;padding:13px 20px;font-size:15px;margin-bottom:10px}.page-body.skin-lemonade.login-page .external-login a i{margin-right:5px}.page-body.skin-lemonade.login-page .external-login a:hover{background:#454849}.page-body.skin-lemonade.login-page .external-login a.facebook{background-color:#3b5998}.page-body.skin-lemonade.login-page .external-login a.facebook:hover{background-color:#2d4373}.page-body.skin-lemonade.login-page .external-login a.twitter{background-color:#55acee}.page-body.skin-lemonade.login-page .external-login a.twitter:hover{background-color:#2795e9}.page-body.skin-lemonade.login-page .external-login a.gplus{background-color:#dd4b39}.page-body.skin-lemonade.login-page .external-login a.gplus:hover{background-color:#c23321}.page-body.skin-lemonade.login-page.login-light{background:#eee}.page-body.skin-lemonade.login-page.login-light .errors-container,.page-body.skin-lemonade.login-page.login-light .external-login{padding:0}.page-body.skin-lemonade.login-page.login-light .form-group label.error{color:rgba(151,152,152,.8)}.page-body.skin-lemonade.login-page.login-light .login-form{background:#fff;color:#979898}.page-body.skin-lemonade.login-page.login-light .login-form .login-footer a{color:#68b828}.page-body.skin-lemonade.login-page.login-light .login-form .login-footer a:hover{color:#508e1f}.page-body.skin-lemonade.login-page.login-light .login-form .login-footer .info-links a{color:rgba(151,152,152,.7)}.page-body.skin-lemonade.login-page.login-light .login-form .login-footer .info-links a:hover{color:#979898}@media screen and (max-width:768px){.page-body.skin-lemonade.login-page{padding-top:0}.page-body.skin-lemonade.login-page .login-form,.page-body.skin-lemonade.login-page .errors-container,.page-body.skin-lemonade.login-page .external-login{padding-left:10px;padding-right:10px}.page-body.skin-lemonade.login-page .errors-container{margin-top:20px}.page-body.skin-lemonade.login-page.login-light .login-form{padding-left:30px;padding-right:30px}.page-body.skin-lemonade.login-page.login-light .errors-container,.page-body.skin-lemonade.login-page.login-light .external-login{padding-left:0;padding-right:0}.page-body.skin-lemonade.login-page .row{margin:0}}.page-body.skin-lemonade.lockscreen-page{background:#f5c150}.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group p{color:#ffeec9}.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group h3{color:#ffeec9}.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control{border:1px solid #ffcf67;color:#fff}.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5);opacity:1}.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control::-moz-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .form-control:-ms-input-placeholder{color:rgba(255,255,255,.5)}.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn{color:#fff;border:1px solid #ffcf67}.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:hover,.page-body.skin-lemonade.lockscreen-page .lockcreen-form .form-group .input-group .input-group-btn .btn:focus{background-color:rgba(255,207,103,.3)}.page-body.skin-lemonade.settings-pane-open .sidebar-menu .sidebar-menu-inner .logo-env .settings-icon{background:#ffcf67;-webkit-box-shadow:0 0 0 10px #ffcf67,0 -10px 0 10px #ffcf67,0 -20px 0 10px #ffcf67,0 -30px 0 10px #ffcf67;-moz-box-shadow:0 0 0 10px #ffcf67,0 -10px 0 10px #ffcf67,0 -20px 0 10px #ffcf67,0 -30px 0 10px #ffcf67;box-shadow:0 0 0 10px #ffcf67,0 -10px 0 10px #ffcf67,0 -20px 0 10px #ffcf67,0 -30px 0 10px #ffcf67}.page-body.skin-lemonade .sidebar-user-info{background-color:#f4b838;border-bottom-color:#ffcf67}.page-body.skin-lemonade .sidebar-user-info .user-profile span{color:#ffeec9}.page-body.skin-lemonade .sidebar-user-info .user-profile span strong{color:#fff}.page-body.skin-lemonade .sidebar-user-info .user-links{border-top-color:#ffcf67}.page-body.skin-lemonade .sidebar-user-info .user-links li a{color:#ffeec9}.page-body.skin-lemonade .sidebar-user-info .user-links li a:hover{color:#fff;background-color:rgba(255,207,103,.25)}.page-body.skin-lemonade .sidebar-user-info .user-links li.active a{color:#fff;background-color:rgba(255,207,103,.25)}.page-body.skin-lemonade .sidebar-user-info .user-links li+li a{border-left-color:#ffcf67}@media screen and (min-width:991px){.sidebar-menu.collapsed .page-body.skin-lemonade .sidebar-user-info .sidebar-user-info-inner .user-profile span{background-color:#27292a}.sidebar-menu.collapsed .page-body.skin-lemonade .sidebar-user-info .sidebar-user-info-inner .user-links{background-color:#27292a}}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu{background:#558c89;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.settings-pane-open .page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#ececea}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#ececea}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i{color:#fff}@media screen and (min-width:768px){.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav a{color:#ececea}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a,.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a{color:#fff}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav>li{border:0}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active,.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover{border-color:transparent;background-color:#5f9a97}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover{border-left-color:transparent}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul{border:none;-webkit-box-shadow:0 2px 8px rgba(0,1,1,.05);-moz-box-shadow:0 2px 8px rgba(0,1,1,.05);box-shadow:0 2px 8px rgba(0,1,1,.05)}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul{background:#5f9a97}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a{color:#ececea}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after{background:#6da5a2}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a{color:#fff;background:#558c89}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before{color:#ececea}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul{background:#6da5a2;border-top:1px solid #77aba8;border-bottom:1px solid #77aba8}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul{background:#649f9c;border-top-color:#6aa3a0;border-bottom-color:#6aa3a0}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after{background-color:#6aa3a0}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul{background:#6aa3a0;border-top-color:#6aa3a0;border-bottom-color:#6aa3a0}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after{background-color:#6aa3a0}}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li:hover{background:#5f9a97}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li i{color:#ececea}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>a{border:0}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover{background:#5f9a97;color:#fff}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i{color:#fff}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before{background:#68b828}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus{background:#5f9a97}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before{background-color:#7c38bc}.chat-open .page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i{color:#fff}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon{background-color:#5f9a97;border-color:#6da5a2;color:#ececea}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i{color:#fff}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before{display:block}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li>ul{border-color:#5f9a97}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus{background-color:#5f9a97}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span{color:#ececea}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover{color:#fff}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a{background-color:#5f9a97;border-color:#5f9a97}.page-body.horizontal-menu-skin-aero .page-loading-overlay{background-color:#558c89}@media screen and (max-width:768px){.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu{background:#558c89;color:#ececea}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.navbar-nav a{color:#ececea;border-color:#5f9a97}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover,.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active,.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus{color:#fff}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a{color:#ececea}.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover,.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active,.page-body.horizontal-menu-skin-aero .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus{color:#fff}}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu{background:#2c3e50;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.settings-pane-open .page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#a7bfd6}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#a7bfd6}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i{color:#fff}@media screen and (min-width:768px){.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav a{color:#a7bfd6}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a,.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a{color:#fff}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav>li{border:0}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active,.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover{border-color:transparent;background-color:#34495e}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover{border-left-color:transparent}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul{border:none;-webkit-box-shadow:0 2px 8px rgba(0,1,1,.05);-moz-box-shadow:0 2px 8px rgba(0,1,1,.05);box-shadow:0 2px 8px rgba(0,1,1,.05)}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul{background:#34495e}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a{color:#a7bfd6}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after{background:#3d566e}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a{color:#fff;background:#2c3e50}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before{color:#a7bfd6}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul{background:#3d566e;border-top:1px solid #435d78;border-bottom:1px solid #435d78}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul{background:#384e65;border-top-color:#3b536b;border-bottom-color:#3b536b}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after{background-color:#3b536b}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul{background:#3b536b;border-top-color:#3b536b;border-bottom-color:#3b536b}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after{background-color:#3b536b}}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li:hover{background:#34495e}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li i{color:#a7bfd6}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>a{border:0}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover{background:#34495e;color:#fff}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i{color:#fff}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before{background:#68b828}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus{background:#34495e}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before{background-color:#7c38bc}.chat-open .page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i{color:#fff}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon{background-color:#34495e;border-color:#3d566e;color:#a7bfd6}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i{color:#fff}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before{display:block}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li>ul{border-color:#34495e}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus{background-color:#34495e}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span{color:#a7bfd6}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover{color:#fff}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a{background-color:#34495e;border-color:#34495e}.page-body.horizontal-menu-skin-navy .page-loading-overlay{background-color:#2c3e50}@media screen and (max-width:768px){.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu{background:#2c3e50;color:#a7bfd6}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.navbar-nav a{color:#a7bfd6;border-color:#34495e}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover,.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active,.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus{color:#fff}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a{color:#a7bfd6}.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover,.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active,.page-body.horizontal-menu-skin-navy .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus{color:#fff}}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu{background:#3b5998;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.settings-pane-open .page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#8b9dc3}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#8b9dc3}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i{color:#fff}@media screen and (min-width:768px){.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav a{color:#8b9dc3}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a,.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a{color:#fff}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav>li{border:0}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active,.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover{border-color:transparent;background-color:#4160a0}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover{border-left-color:transparent}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul{border:none;-webkit-box-shadow:0 2px 8px rgba(0,1,1,.05);-moz-box-shadow:0 2px 8px rgba(0,1,1,.05);box-shadow:0 2px 8px rgba(0,1,1,.05)}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul{background:#4160a0}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a{color:#8b9dc3}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after{background:#486bb2}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a{color:#fff;background:#3b5998}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before{color:#8b9dc3}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul{background:#486bb2;border-top:1px solid #5173b8;border-bottom:1px solid #5173b8}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul{background:#4464a7;border-top-color:#4769af;border-bottom-color:#4769af}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after{background-color:#4769af}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul{background:#4769af;border-top-color:#4769af;border-bottom-color:#4769af}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after{background-color:#4769af}}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li:hover{background:#4160a0}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li i{color:#8b9dc3}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>a{border:0}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover{background:#4160a0;color:#fff}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i{color:#fff}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before{background:#68b828}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus{background:#4160a0}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before{background-color:#7c38bc}.chat-open .page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i{color:#fff}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon{background-color:#4160a0;border-color:#486bb2;color:#8b9dc3}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i{color:#fff}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before{display:block}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li>ul{border-color:#4160a0}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus{background-color:#4160a0}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span{color:#8b9dc3}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover{color:#fff}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a{background-color:#4160a0;border-color:#4160a0}.page-body.horizontal-menu-skin-facebook .page-loading-overlay{background-color:#3b5998}@media screen and (max-width:768px){.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu{background:#3b5998;color:#8b9dc3}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.navbar-nav a{color:#8b9dc3;border-color:#4160a0}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover,.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active,.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus{color:#fff}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a{color:#8b9dc3}.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover,.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active,.page-body.horizontal-menu-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus{color:#fff}}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu{background:#16a085;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.settings-pane-open .page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#96ead9}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#96ead9}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i{color:#fff}@media screen and (min-width:768px){.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav a{color:#96ead9}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a,.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a{color:#fff}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav>li{border:0}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active,.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover{border-color:transparent;background-color:#1daf92}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover{border-left-color:transparent}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul{border:none;-webkit-box-shadow:0 2px 8px rgba(0,1,1,.05);-moz-box-shadow:0 2px 8px rgba(0,1,1,.05);box-shadow:0 2px 8px rgba(0,1,1,.05)}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul{background:#1daf92}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a{color:#96ead9}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after{background:#21c5a4}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a{color:#fff;background:#16a085}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before{color:#96ead9}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul{background:#21c5a4;border-top:1px solid #23d2af;border-bottom:1px solid #23d2af}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul{background:#1eb899;border-top-color:#20c1a1;border-bottom-color:#20c1a1}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after{background-color:#20c1a1}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul{background:#20c1a1;border-top-color:#20c1a1;border-bottom-color:#20c1a1}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after{background-color:#20c1a1}}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li:hover{background:#1daf92}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li i{color:#96ead9}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>a{border:0}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover{background:#1daf92;color:#fff}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i{color:#fff}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before{background:#68b828}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus{background:#1daf92}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before{background-color:#7c38bc}.chat-open .page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i{color:#fff}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon{background-color:#1daf92;border-color:#21c5a4;color:#96ead9}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i{color:#fff}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before{display:block}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li>ul{border-color:#1daf92}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus{background-color:#1daf92}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span{color:#96ead9}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover{color:#fff}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a{background-color:#1daf92;border-color:#1daf92}.page-body.horizontal-menu-skin-turquoise .page-loading-overlay{background-color:#16a085}@media screen and (max-width:768px){.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu{background:#16a085;color:#96ead9}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.navbar-nav a{color:#96ead9;border-color:#1daf92}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover,.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active,.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus{color:#fff}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a{color:#96ead9}.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover,.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active,.page-body.horizontal-menu-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus{color:#fff}}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu{background:#8cc657;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.settings-pane-open .page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i{color:#fff}@media screen and (min-width:768px){.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav a{color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a,.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a{color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav>li{border:0}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active,.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover{border-color:transparent;background-color:#95cd62}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover{border-left-color:transparent}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul{border:none;-webkit-box-shadow:0 2px 8px rgba(0,1,1,.05);-moz-box-shadow:0 2px 8px rgba(0,1,1,.05);box-shadow:0 2px 8px rgba(0,1,1,.05)}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul{background:#95cd62}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a{color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after{background:#a2d375}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a{color:#fff;background:#8cc657}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before{color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul{background:#a2d375;border-top:1px solid #aad781;border-bottom:1px solid #aad781}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul{background:#9acf6a;border-top-color:#9fd271;border-bottom-color:#9fd271}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after{background-color:#9fd271}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul{background:#9fd271;border-top-color:#9fd271;border-bottom-color:#9fd271}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after{background-color:#9fd271}}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li:hover{background:#95cd62}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li i{color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>a{border:0}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover{background:#95cd62;color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i{color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before{background:#68b828}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus{background:#95cd62}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before{background-color:#7c38bc}.chat-open .page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i{color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon{background-color:#95cd62;border-color:#a2d375;color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i{color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before{display:block}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li>ul{border-color:#95cd62}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus{background-color:#95cd62}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span{color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover{color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a{background-color:#95cd62;border-color:#95cd62}.page-body.horizontal-menu-skin-lime .page-loading-overlay{background-color:#8cc657}@media screen and (max-width:768px){.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu{background:#8cc657;color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.navbar-nav a{color:#fff;border-color:#95cd62}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover,.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active,.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus{color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a{color:#fff}.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover,.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active,.page-body.horizontal-menu-skin-lime .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus{color:#fff}}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu{background:#27ae60;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.settings-pane-open .page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#a2f9c7}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#a2f9c7}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i{color:#fff}@media screen and (min-width:768px){.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav a{color:#a2f9c7}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a,.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a{color:#fff}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav>li{border:0}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active,.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover{border-color:transparent;background-color:#2fbd6b}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover{border-left-color:transparent}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul{border:none;-webkit-box-shadow:0 2px 8px rgba(0,1,1,.05);-moz-box-shadow:0 2px 8px rgba(0,1,1,.05);box-shadow:0 2px 8px rgba(0,1,1,.05)}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul{background:#2fbd6b}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a{color:#a2f9c7}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after{background:#38ce77}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a{color:#fff;background:#27ae60}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before{color:#a2f9c7}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul{background:#38ce77;border-top:1px solid #44d180;border-bottom:1px solid #44d180}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul{background:#31c570;border-top-color:#34cc74;border-bottom-color:#34cc74}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after{background-color:#34cc74}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul{background:#34cc74;border-top-color:#34cc74;border-bottom-color:#34cc74}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after{background-color:#34cc74}}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li:hover{background:#2fbd6b}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li i{color:#a2f9c7}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>a{border:0}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover{background:#2fbd6b;color:#fff}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i{color:#fff}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before{background:#68b828}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus{background:#2fbd6b}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before{background-color:#7c38bc}.chat-open .page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i{color:#fff}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon{background-color:#2fbd6b;border-color:#38ce77;color:#a2f9c7}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i{color:#fff}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before{display:block}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li>ul{border-color:#2fbd6b}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus{background-color:#2fbd6b}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span{color:#a2f9c7}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover{color:#fff}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a{background-color:#2fbd6b;border-color:#2fbd6b}.page-body.horizontal-menu-skin-green .page-loading-overlay{background-color:#27ae60}@media screen and (max-width:768px){.page-body.horizontal-menu-skin-green .navbar.horizontal-menu{background:#27ae60;color:#a2f9c7}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.navbar-nav a{color:#a2f9c7;border-color:#2fbd6b}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover,.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active,.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus{color:#fff}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a{color:#a2f9c7}.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover,.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active,.page-body.horizontal-menu-skin-green .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus{color:#fff}}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu{background:#795b95;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.settings-pane-open .page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#c2afd4}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#c2afd4}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i{color:#fff}@media screen and (min-width:768px){.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav a{color:#c2afd4}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a,.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a{color:#fff}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav>li{border:0}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active,.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover{border-color:transparent;background-color:#81629f}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover{border-left-color:transparent}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul{border:none;-webkit-box-shadow:0 2px 8px rgba(0,1,1,.05);-moz-box-shadow:0 2px 8px rgba(0,1,1,.05);box-shadow:0 2px 8px rgba(0,1,1,.05)}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul{background:#81629f}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a{color:#c2afd4}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after{background:#8e72a9}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a{color:#fff;background:#795b95}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before{color:#c2afd4}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul{background:#8e72a9;border-top:1px solid #957bae;border-bottom:1px solid #957bae}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul{background:#8668a3;border-top-color:#8b6fa7;border-bottom-color:#8b6fa7}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after{background-color:#8b6fa7}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul{background:#8b6fa7;border-top-color:#8b6fa7;border-bottom-color:#8b6fa7}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after{background-color:#8b6fa7}}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li:hover{background:#81629f}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li i{color:#c2afd4}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>a{border:0}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover{background:#81629f;color:#fff}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i{color:#fff}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before{background:#68b828}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus{background:#81629f}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before{background-color:#7c38bc}.chat-open .page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i{color:#fff}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon{background-color:#81629f;border-color:#8e72a9;color:#c2afd4}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i{color:#fff}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before{display:block}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li>ul{border-color:#81629f}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus{background-color:#81629f}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span{color:#c2afd4}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover{color:#fff}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a{background-color:#81629f;border-color:#81629f}.page-body.horizontal-menu-skin-purple .page-loading-overlay{background-color:#795b95}@media screen and (max-width:768px){.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu{background:#795b95;color:#c2afd4}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.navbar-nav a{color:#c2afd4;border-color:#81629f}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover,.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active,.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus{color:#fff}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a{color:#c2afd4}.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover,.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active,.page-body.horizontal-menu-skin-purple .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus{color:#fff}}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu{background:#fff;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.settings-pane-open .page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#666}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#666}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i{color:#95cd62}@media screen and (min-width:768px){.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav a{color:#666}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a,.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a{color:#95cd62}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav>li{border:0}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active,.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover{border-color:transparent;background-color:#eee}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover{border-left-color:transparent}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul{border:none;-webkit-box-shadow:0 2px 8px rgba(0,1,1,.05);-moz-box-shadow:0 2px 8px rgba(0,1,1,.05);box-shadow:0 2px 8px rgba(0,1,1,.05)}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul{background:#eee}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a{color:#666}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after{background:#fbfbfb}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a{color:#95cd62;background:#fff}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before{color:#666}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul{background:#fbfbfb;border-top:1px solid #fff;border-bottom:1px solid #fff}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul{background:#f3f3f3;border-top-color:#f8f8f8;border-bottom-color:#f8f8f8}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after{background-color:#f8f8f8}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul{background:#f8f8f8;border-top-color:#f8f8f8;border-bottom-color:#f8f8f8}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after{background-color:#f8f8f8}}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li:hover{background:#eee}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li i{color:#666}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>a{border:0}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover{background:#eee;color:#95cd62}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i{color:#95cd62}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before{background:#68b828}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus{background:#eee}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before{background-color:#7c38bc}.chat-open .page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i{color:#95cd62}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon{background-color:#eee;border-color:#fbfbfb;color:#666}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i{color:#95cd62}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before{display:block}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li>ul{border-color:#eee}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus{background-color:#eee}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span{color:#666}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover{color:#95cd62}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a{background-color:#eee;border-color:#eee}.page-body.horizontal-menu-skin-white .page-loading-overlay{background-color:#fff}@media screen and (max-width:768px){.page-body.horizontal-menu-skin-white .navbar.horizontal-menu{background:#fff;color:#666}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.navbar-nav a{color:#666;border-color:#eee}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover,.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active,.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus{color:#95cd62}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a{color:#666}.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover,.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active,.page-body.horizontal-menu-skin-white .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus{color:#95cd62}}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu{background:#a8aba2;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.settings-pane-open .page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#666}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#666}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i{color:#a40f37}@media screen and (min-width:768px){.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav a{color:#666}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a,.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a{color:#a40f37}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav>li{border:0}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active,.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover{border-color:transparent;background-color:#b8bbb3}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover{border-left-color:transparent}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul{border:none;-webkit-box-shadow:0 2px 8px rgba(0,1,1,.05);-moz-box-shadow:0 2px 8px rgba(0,1,1,.05);box-shadow:0 2px 8px rgba(0,1,1,.05)}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul{background:#b8bbb3}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a{color:#666}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after{background:#c5c7c0}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a{color:#a40f37;background:#a8aba2}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before{color:#666}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul{background:#c5c7c0;border-top:1px solid #cccec9;border-bottom:1px solid #cccec9}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul{background:#bdc0b8;border-top-color:#c2c5be;border-bottom-color:#c2c5be}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after{background-color:#c2c5be}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul{background:#c2c5be;border-top-color:#c2c5be;border-bottom-color:#c2c5be}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after{background-color:#c2c5be}}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li:hover{background:#b8bbb3}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li i{color:#666}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>a{border:0}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover{background:#b8bbb3;color:#a40f37}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i{color:#a40f37}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before{background:#68b828}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus{background:#b8bbb3}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before{background-color:#7c38bc}.chat-open .page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i{color:#a40f37}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon{background-color:#b8bbb3;border-color:#c5c7c0;color:#666}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i{color:#a40f37}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before{display:block}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li>ul{border-color:#b8bbb3}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus{background-color:#b8bbb3}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span{color:#666}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover{color:#a40f37}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a{background-color:#b8bbb3;border-color:#b8bbb3}.page-body.horizontal-menu-skin-concrete .page-loading-overlay{background-color:#a8aba2}@media screen and (max-width:768px){.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu{background:#a8aba2;color:#666}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.navbar-nav a{color:#666;border-color:#b8bbb3}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover,.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active,.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus{color:#a40f37}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a{color:#666}.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover,.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active,.page-body.horizontal-menu-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus{color:#a40f37}}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu{background:#b63131;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.settings-pane-open .page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#f7b2b2}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#f7b2b2}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i{color:#fff}@media screen and (min-width:768px){.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav a{color:#f7b2b2}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a,.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a{color:#fff}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav>li{border:0}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active,.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover{border-color:transparent;background-color:#c03737}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover{border-left-color:transparent}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul{border:none;-webkit-box-shadow:0 2px 8px rgba(0,1,1,.05);-moz-box-shadow:0 2px 8px rgba(0,1,1,.05);box-shadow:0 2px 8px rgba(0,1,1,.05)}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul{background:#c03737}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a{color:#f7b2b2}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after{background:#ca4646}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a{color:#fff;background:#b63131}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before{color:#f7b2b2}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul{background:#ca4646;border-top:1px solid #ce5252;border-bottom:1px solid #ce5252}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul{background:#c73a3a;border-top-color:#c94242;border-bottom-color:#c94242}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after{background-color:#c94242}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul{background:#c94242;border-top-color:#c94242;border-bottom-color:#c94242}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after{background-color:#c94242}}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li:hover{background:#c03737}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li i{color:#f7b2b2}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>a{border:0}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover{background:#c03737;color:#fff}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i{color:#fff}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before{background:#68b828}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus{background:#c03737}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before{background-color:#7c38bc}.chat-open .page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i{color:#fff}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon{background-color:#c03737;border-color:#ca4646;color:#f7b2b2}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i{color:#fff}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before{display:block}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li>ul{border-color:#c03737}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus{background-color:#c03737}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span{color:#f7b2b2}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover{color:#fff}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a{background-color:#c03737;border-color:#c03737}.page-body.horizontal-menu-skin-watermelon .page-loading-overlay{background-color:#b63131}@media screen and (max-width:768px){.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu{background:#b63131;color:#f7b2b2}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.navbar-nav a{color:#f7b2b2;border-color:#c03737}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover,.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active,.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus{color:#fff}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a{color:#f7b2b2}.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover,.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active,.page-body.horizontal-menu-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus{color:#fff}}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu{background:#f5c150;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.settings-pane-open .page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#ffeec9}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane] i{color:#ffeec9}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-brand a[data-toggle=settings-pane]:hover i{color:#fff}@media screen and (min-width:768px){.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub:hover>a:before{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav.click-to-expand .has-sub.expanded>a:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav a{color:#ffeec9}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav li:hover>a,.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav li.active>a{color:#fff}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav>li{border:0}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active,.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav>li:hover{border-color:transparent;background-color:#ffcf67}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav>li.active+li:hover{border-left-color:transparent}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav>li>ul{border:none;-webkit-box-shadow:0 2px 8px rgba(0,1,1,.05);-moz-box-shadow:0 2px 8px rgba(0,1,1,.05);box-shadow:0 2px 8px rgba(0,1,1,.05)}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul{background:#ffcf67}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a{color:#ffeec9}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li>a:after{background:#ffd781}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.active>a{color:#fff;background:#f5c150}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li.has-sub>a:before{color:#ffeec9}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul{background:#ffd781;border-top:1px solid #ffdc90;border-bottom:1px solid #ffdc90}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul{background:#ffd271;border-top-color:#ffd57b;border-bottom-color:#ffd57b}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul a:after{background-color:#ffd57b}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul{background:#ffd57b;border-top-color:#ffd57b;border-bottom-color:#ffd57b}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner .navbar-nav ul>li ul ul ul a:after{background-color:#ffd57b}}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li:hover{background:#ffcf67}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li i{color:#ffeec9}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>a{border:0}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover{background:#ffcf67;color:#fff}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>a:hover i{color:#fff}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:before{background:#68b828}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon:focus{background:#ffcf67}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>a.notification-icon.notification-icon-messages:before{background-color:#7c38bc}.chat-open .page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>a[data-toggle=chat] i{color:#fff}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon{background-color:#ffcf67;border-color:#ffd781;color:#ffeec9}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon i{color:#fff}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.open>a.notification-icon:before{display:block}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li>ul{border-color:#ffcf67}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a:focus{background-color:#ffcf67}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span{color:#ffeec9}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile>a span:hover{color:#fff}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.user-profile.open>a{background-color:#ffcf67;border-color:#ffcf67}.page-body.horizontal-menu-skin-lemonade .page-loading-overlay{background-color:#f5c150}@media screen and (max-width:768px){.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu{background:#f5c150;color:#ffeec9}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.navbar-nav a{color:#ffeec9;border-color:#ffcf67}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.navbar-nav a:hover,.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.navbar-nav a:active,.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.navbar-nav a:focus{color:#fff}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a{color:#ffeec9}.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:hover,.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:active,.page-body.horizontal-menu-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav.navbar-mobile a:focus{color:#fff}}.page-body.user-info-navbar-skin-aero .user-info-navbar{background-color:#558c89}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li{border:0 solid transparent}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.hover-line:before{background:#ececea}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li>a{color:#ececea;border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li>a:hover{color:#fff}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li>form{border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .btn,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn{color:#ececea}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .btn:hover,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:hover{color:#fff}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .btn:active,.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .btn:focus,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:active,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field{border:1px solid #5f9a97;background:#f3f3f3}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898;opacity:1}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:focus+.btn{color:#fff}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.open{border-left-color:transparent;border-right-color:transparent;z-index:15}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li.open>a{color:#fff}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu{background:#5f9a97;border:1px solid transparent}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a{color:#ececea}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:after{background:#6da5a2}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:hover{color:#fff}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li.active a{color:#fff}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu>.top a,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a{color:#ececea}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a:hover{color:#fff}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu>.top p,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top p{color:#ececea;border-bottom:1px solid #6da5a2}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external:after{background-color:#6da5a2}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu>.external a,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a{color:#ececea;background-color:#6da5a2}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:hover{color:#fff}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li:after{background-color:#6da5a2}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li.active:after{background-color:#8dc63f}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list{max-height:276px}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i{background:#5f9a97;color:#FFF}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line{padding-left:45px}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i{background-color:#FFF;color:#444;-webkit-box-shadow:0 0 0 1px #eee;-moz-box-shadow:0 0 0 1px #eee;box-shadow:0 0 0 1px #eee}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a{color:#ececea;border-bottom:1px solid #6da5a2}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a:hover{color:#fff}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last{background:#6da5a2}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last:after{background:#6da5a2}.page-body.user-info-navbar-skin-aero .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a,.page-body.user-info-navbar-skin-aero .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last>a{border-bottom:0}.page-body.user-info-navbar-skin-navy .user-info-navbar{background-color:#2c3e50}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li{border:0 solid transparent}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.hover-line:before{background:#a7bfd6}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li>a{color:#a7bfd6;border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li>a:hover{color:#fff}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li>form{border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .btn,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn{color:#a7bfd6}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .btn:hover,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:hover{color:#fff}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .btn:active,.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .btn:focus,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:active,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field{border:1px solid #34495e;background:#f3f3f3}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898;opacity:1}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:focus+.btn{color:#fff}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.open{border-left-color:transparent;border-right-color:transparent;z-index:15}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li.open>a{color:#fff}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu{background:#34495e;border:1px solid transparent}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a{color:#a7bfd6}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:after{background:#3d566e}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:hover{color:#fff}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li.active a{color:#fff}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu>.top a,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a{color:#a7bfd6}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a:hover{color:#fff}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu>.top p,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top p{color:#a7bfd6;border-bottom:1px solid #3d566e}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external:after{background-color:#3d566e}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu>.external a,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a{color:#a7bfd6;background-color:#3d566e}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:hover{color:#fff}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li:after{background-color:#3d566e}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li.active:after{background-color:#8dc63f}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list{max-height:276px}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i{background:#34495e;color:#FFF}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line{padding-left:45px}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i{background-color:#FFF;color:#444;-webkit-box-shadow:0 0 0 1px #eee;-moz-box-shadow:0 0 0 1px #eee;box-shadow:0 0 0 1px #eee}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a{color:#a7bfd6;border-bottom:1px solid #3d566e}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a:hover{color:#fff}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last{background:#3d566e}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last:after{background:#3d566e}.page-body.user-info-navbar-skin-navy .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a,.page-body.user-info-navbar-skin-navy .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last>a{border-bottom:0}.page-body.user-info-navbar-skin-facebook .user-info-navbar{background-color:#3b5998}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li{border:0 solid transparent}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.hover-line:before{background:#8b9dc3}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li>a{color:#8b9dc3;border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li>a:hover{color:#fff}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li>form{border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .btn,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn{color:#8b9dc3}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .btn:hover,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:hover{color:#fff}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .btn:active,.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .btn:focus,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:active,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field{border:1px solid #4160a0;background:#f3f3f3}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898;opacity:1}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:focus+.btn{color:#fff}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.open{border-left-color:transparent;border-right-color:transparent;z-index:15}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li.open>a{color:#fff}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu{background:#4160a0;border:1px solid transparent}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a{color:#8b9dc3}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:after{background:#486bb2}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:hover{color:#fff}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li.active a{color:#fff}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu>.top a,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a{color:#8b9dc3}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a:hover{color:#fff}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu>.top p,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top p{color:#8b9dc3;border-bottom:1px solid #486bb2}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external:after{background-color:#486bb2}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu>.external a,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a{color:#8b9dc3;background-color:#486bb2}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:hover{color:#fff}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li:after{background-color:#486bb2}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li.active:after{background-color:#8dc63f}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list{max-height:276px}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i{background:#4160a0;color:#FFF}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line{padding-left:45px}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i{background-color:#FFF;color:#444;-webkit-box-shadow:0 0 0 1px #eee;-moz-box-shadow:0 0 0 1px #eee;box-shadow:0 0 0 1px #eee}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a{color:#8b9dc3;border-bottom:1px solid #486bb2}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a:hover{color:#fff}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last{background:#486bb2}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last:after{background:#486bb2}.page-body.user-info-navbar-skin-facebook .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a,.page-body.user-info-navbar-skin-facebook .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last>a{border-bottom:0}.page-body.user-info-navbar-skin-turquoise .user-info-navbar{background-color:#16a085}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li{border:0 solid transparent}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.hover-line:before{background:#96ead9}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li>a{color:#96ead9;border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li>a:hover{color:#fff}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li>form{border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .btn,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn{color:#96ead9}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .btn:hover,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:hover{color:#fff}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .btn:active,.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .btn:focus,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:active,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field{border:1px solid #1daf92;background:#f3f3f3}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898;opacity:1}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:focus+.btn{color:#fff}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.open{border-left-color:transparent;border-right-color:transparent;z-index:15}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li.open>a{color:#fff}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu{background:#1daf92;border:1px solid transparent}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a{color:#96ead9}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:after{background:#21c5a4}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:hover{color:#fff}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li.active a{color:#fff}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu>.top a,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a{color:#96ead9}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a:hover{color:#fff}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu>.top p,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top p{color:#96ead9;border-bottom:1px solid #21c5a4}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external:after{background-color:#21c5a4}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu>.external a,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a{color:#96ead9;background-color:#21c5a4}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:hover{color:#fff}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li:after{background-color:#21c5a4}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li.active:after{background-color:#8dc63f}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list{max-height:276px}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i{background:#1daf92;color:#FFF}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line{padding-left:45px}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i{background-color:#FFF;color:#444;-webkit-box-shadow:0 0 0 1px #eee;-moz-box-shadow:0 0 0 1px #eee;box-shadow:0 0 0 1px #eee}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a{color:#96ead9;border-bottom:1px solid #21c5a4}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a:hover{color:#fff}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last{background:#21c5a4}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last:after{background:#21c5a4}.page-body.user-info-navbar-skin-turquoise .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a,.page-body.user-info-navbar-skin-turquoise .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last>a{border-bottom:0}.page-body.user-info-navbar-skin-lime .user-info-navbar{background-color:#8cc657}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li{border:0 solid transparent}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.hover-line:before{background:#fff}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li>a{color:#fff;border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li>a:hover{color:#fff}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li>form{border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .btn,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn{color:#fff}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .btn:hover,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:hover{color:#fff}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .btn:active,.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .btn:focus,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:active,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field{border:1px solid #95cd62;background:#f3f3f3}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898;opacity:1}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:focus+.btn{color:#fff}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.open{border-left-color:transparent;border-right-color:transparent;z-index:15}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li.open>a{color:#fff}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu{background:#95cd62;border:1px solid transparent}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a{color:#fff}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:after{background:#a2d375}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:hover{color:#fff}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li.active a{color:#fff}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu>.top a,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a{color:#fff}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a:hover{color:#fff}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu>.top p,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top p{color:#fff;border-bottom:1px solid #a2d375}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external:after{background-color:#a2d375}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu>.external a,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a{color:#fff;background-color:#a2d375}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:hover{color:#fff}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li:after{background-color:#a2d375}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li.active:after{background-color:#8dc63f}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list{max-height:276px}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i{background:#95cd62;color:#FFF}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line{padding-left:45px}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i{background-color:#FFF;color:#444;-webkit-box-shadow:0 0 0 1px #eee;-moz-box-shadow:0 0 0 1px #eee;box-shadow:0 0 0 1px #eee}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a{color:#fff;border-bottom:1px solid #a2d375}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a:hover{color:#fff}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last{background:#a2d375}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last:after{background:#a2d375}.page-body.user-info-navbar-skin-lime .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a,.page-body.user-info-navbar-skin-lime .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last>a{border-bottom:0}.page-body.user-info-navbar-skin-green .user-info-navbar{background-color:#27ae60}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li{border:0 solid transparent}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.hover-line:before{background:#a2f9c7}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li>a{color:#a2f9c7;border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li>a:hover{color:#fff}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li>form{border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .btn,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn{color:#a2f9c7}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .btn:hover,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:hover{color:#fff}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .btn:active,.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .btn:focus,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:active,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field{border:1px solid #2fbd6b;background:#f3f3f3}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898;opacity:1}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:focus+.btn{color:#fff}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.open{border-left-color:transparent;border-right-color:transparent;z-index:15}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li.open>a{color:#fff}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu{background:#2fbd6b;border:1px solid transparent}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a{color:#a2f9c7}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:after{background:#38ce77}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:hover{color:#fff}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li.active a{color:#fff}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu>.top a,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a{color:#a2f9c7}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a:hover{color:#fff}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu>.top p,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top p{color:#a2f9c7;border-bottom:1px solid #38ce77}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external:after{background-color:#38ce77}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu>.external a,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a{color:#a2f9c7;background-color:#38ce77}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:hover{color:#fff}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li:after{background-color:#38ce77}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li.active:after{background-color:#8dc63f}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list{max-height:276px}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i{background:#2fbd6b;color:#FFF}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line{padding-left:45px}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i{background-color:#FFF;color:#444;-webkit-box-shadow:0 0 0 1px #eee;-moz-box-shadow:0 0 0 1px #eee;box-shadow:0 0 0 1px #eee}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a{color:#a2f9c7;border-bottom:1px solid #38ce77}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a:hover{color:#fff}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last{background:#38ce77}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last:after{background:#38ce77}.page-body.user-info-navbar-skin-green .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a,.page-body.user-info-navbar-skin-green .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last>a{border-bottom:0}.page-body.user-info-navbar-skin-purple .user-info-navbar{background-color:#795b95}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li{border:0 solid transparent}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.hover-line:before{background:#c2afd4}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li>a{color:#c2afd4;border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li>a:hover{color:#fff}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li>form{border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .btn,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn{color:#c2afd4}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .btn:hover,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:hover{color:#fff}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .btn:active,.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .btn:focus,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:active,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field{border:1px solid #81629f;background:#f3f3f3}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898;opacity:1}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:focus+.btn{color:#fff}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.open{border-left-color:transparent;border-right-color:transparent;z-index:15}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li.open>a{color:#fff}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu{background:#81629f;border:1px solid transparent}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a{color:#c2afd4}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:after{background:#8e72a9}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:hover{color:#fff}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li.active a{color:#fff}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu>.top a,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a{color:#c2afd4}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a:hover{color:#fff}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu>.top p,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top p{color:#c2afd4;border-bottom:1px solid #8e72a9}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external:after{background-color:#8e72a9}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu>.external a,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a{color:#c2afd4;background-color:#8e72a9}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:hover{color:#fff}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li:after{background-color:#8e72a9}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li.active:after{background-color:#8dc63f}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list{max-height:276px}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i{background:#81629f;color:#FFF}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line{padding-left:45px}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i{background-color:#FFF;color:#444;-webkit-box-shadow:0 0 0 1px #eee;-moz-box-shadow:0 0 0 1px #eee;box-shadow:0 0 0 1px #eee}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a{color:#c2afd4;border-bottom:1px solid #8e72a9}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a:hover{color:#fff}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last{background:#8e72a9}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last:after{background:#8e72a9}.page-body.user-info-navbar-skin-purple .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a,.page-body.user-info-navbar-skin-purple .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last>a{border-bottom:0}.page-body.user-info-navbar-skin-white .user-info-navbar{background-color:#fff}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li{border:0 solid transparent}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.hover-line:before{background:#666}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li>a{color:#666;border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li>a:hover{color:#95cd62}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li>form{border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .btn,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn{color:#666}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .btn:hover,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:hover{color:#95cd62}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .btn:active,.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .btn:focus,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:active,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field{border:1px solid #eee;background:#f3f3f3}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898;opacity:1}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:focus+.btn{color:#95cd62}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.open{border-left-color:transparent;border-right-color:transparent;z-index:15}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li.open>a{color:#95cd62}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu{background:#eee;border:1px solid transparent}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a{color:#666}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:after{background:#fbfbfb}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:hover{color:#95cd62}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li.active a{color:#95cd62}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu>.top a,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a{color:#666}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a:hover{color:#95cd62}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu>.top p,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top p{color:#666;border-bottom:1px solid #fbfbfb}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external:after{background-color:#fbfbfb}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu>.external a,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a{color:#666;background-color:#fbfbfb}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:hover{color:#95cd62}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li:after{background-color:#fbfbfb}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li.active:after{background-color:#8dc63f}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list{max-height:276px}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i{background:#eee;color:#FFF}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line{padding-left:45px}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i{background-color:#FFF;color:#444;-webkit-box-shadow:0 0 0 1px #eee;-moz-box-shadow:0 0 0 1px #eee;box-shadow:0 0 0 1px #eee}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a{color:#666;border-bottom:1px solid #fbfbfb}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a:hover{color:#95cd62}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last{background:#fbfbfb}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last:after{background:#fbfbfb}.page-body.user-info-navbar-skin-white .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a,.page-body.user-info-navbar-skin-white .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last>a{border-bottom:0}.page-body.user-info-navbar-skin-concrete .user-info-navbar{background-color:#a8aba2}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li{border:0 solid transparent}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.hover-line:before{background:#666}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li>a{color:#666;border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li>a:hover{color:#a40f37}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li>form{border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .btn,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn{color:#666}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .btn:hover,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:hover{color:#a40f37}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .btn:active,.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .btn:focus,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:active,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field{border:1px solid #b8bbb3;background:#f3f3f3}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898;opacity:1}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:focus+.btn{color:#a40f37}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.open{border-left-color:transparent;border-right-color:transparent;z-index:15}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li.open>a{color:#a40f37}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu{background:#b8bbb3;border:1px solid transparent}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a{color:#666}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:after{background:#c5c7c0}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:hover{color:#a40f37}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li.active a{color:#a40f37}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu>.top a,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a{color:#666}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a:hover{color:#a40f37}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu>.top p,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top p{color:#666;border-bottom:1px solid #c5c7c0}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external:after{background-color:#c5c7c0}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu>.external a,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a{color:#666;background-color:#c5c7c0}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:hover{color:#a40f37}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li:after{background-color:#c5c7c0}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li.active:after{background-color:#8dc63f}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list{max-height:276px}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i{background:#b8bbb3;color:#FFF}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line{padding-left:45px}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i{background-color:#FFF;color:#444;-webkit-box-shadow:0 0 0 1px #eee;-moz-box-shadow:0 0 0 1px #eee;box-shadow:0 0 0 1px #eee}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a{color:#666;border-bottom:1px solid #c5c7c0}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a:hover{color:#a40f37}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last{background:#c5c7c0}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last:after{background:#c5c7c0}.page-body.user-info-navbar-skin-concrete .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a,.page-body.user-info-navbar-skin-concrete .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last>a{border-bottom:0}.page-body.user-info-navbar-skin-watermelon .user-info-navbar{background-color:#b63131}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li{border:0 solid transparent}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.hover-line:before{background:#f7b2b2}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li>a{color:#f7b2b2;border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li>a:hover{color:#fff}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li>form{border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .btn,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn{color:#f7b2b2}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .btn:hover,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:hover{color:#fff}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .btn:active,.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .btn:focus,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:active,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field{border:1px solid #c03737;background:#f3f3f3}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898;opacity:1}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:focus+.btn{color:#fff}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.open{border-left-color:transparent;border-right-color:transparent;z-index:15}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li.open>a{color:#fff}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu{background:#c03737;border:1px solid transparent}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a{color:#f7b2b2}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:after{background:#ca4646}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:hover{color:#fff}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li.active a{color:#fff}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu>.top a,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a{color:#f7b2b2}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a:hover{color:#fff}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu>.top p,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top p{color:#f7b2b2;border-bottom:1px solid #ca4646}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external:after{background-color:#ca4646}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu>.external a,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a{color:#f7b2b2;background-color:#ca4646}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:hover{color:#fff}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li:after{background-color:#ca4646}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li.active:after{background-color:#8dc63f}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list{max-height:276px}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i{background:#c03737;color:#FFF}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line{padding-left:45px}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i{background-color:#FFF;color:#444;-webkit-box-shadow:0 0 0 1px #eee;-moz-box-shadow:0 0 0 1px #eee;box-shadow:0 0 0 1px #eee}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a{color:#f7b2b2;border-bottom:1px solid #ca4646}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a:hover{color:#fff}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last{background:#ca4646}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last:after{background:#ca4646}.page-body.user-info-navbar-skin-watermelon .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a,.page-body.user-info-navbar-skin-watermelon .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last>a{border-bottom:0}.page-body.user-info-navbar-skin-lemonade .user-info-navbar{background-color:#f5c150}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li{border:0 solid transparent}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.hover-line:before{background:#ffeec9}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li>a{color:#ffeec9;border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li>a:hover{color:#fff}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li>form{border-bottom:1px solid transparent}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .btn,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn{color:#ffeec9}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .btn:hover,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:hover{color:#fff}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .btn:active,.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .btn:focus,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:active,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .btn:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field{border:1px solid #ffcf67;background:#f3f3f3}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898;opacity:1}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field::-webkit-input-placeholder,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-webkit-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field:-moz-placeholder,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field::-moz-placeholder,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field::-moz-placeholder{color:#979898}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field:-ms-input-placeholder,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:-ms-input-placeholder{color:#979898}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.search-form .search-field:focus+.btn,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li.search-form .search-field:focus+.btn{color:#fff}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.open{border-left-color:transparent;border-right-color:transparent;z-index:15}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li.open>a{color:#fff}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu{background:#ffcf67;border:1px solid transparent}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a{color:#ffeec9}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:after,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:after{background:#ffd781}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li a:hover,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li a:hover{color:#fff}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu .dropdown-menu-list li.active a,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu .dropdown-menu-list li.active a{color:#fff}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu>.top a,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a{color:#ffeec9}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu>.top a:hover,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top a:hover{color:#fff}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu>.top p,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.top p{color:#ffeec9;border-bottom:1px solid #ffd781}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu>.external:after,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external:after{background-color:#ffd781}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu>.external a,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a{color:#ffeec9;background-color:#ffd781}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu>.external a:hover,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu>.external a:hover{color:#fff}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li:after,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li:after{background-color:#ffd781}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.messages .dropdown-menu-list li.active:after,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.messages .dropdown-menu-list li.active:after{background-color:#8dc63f}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list{max-height:276px}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a>i{background:#ffcf67;color:#FFF}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li>a .line{padding-left:45px}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.notifications .dropdown-menu-list>li.notification-secondary>a>i{background-color:#FFF;color:#444;-webkit-box-shadow:0 0 0 1px #eee;-moz-box-shadow:0 0 0 1px #eee;box-shadow:0 0 0 1px #eee}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a{color:#ffeec9;border-bottom:1px solid #ffd781}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li a:hover,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li a:hover{color:#fff}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last{background:#ffd781}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last:after,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last:after{background:#ffd781}.page-body.user-info-navbar-skin-lemonade .user-info-navbar .user-info-menu>li .dropdown-menu.user-profile-menu li.last>a,.page-body.user-info-navbar-skin-lemonade .navbar.horizontal-menu .navbar-inner>.nav>li .dropdown-menu.user-profile-menu li.last>a{border-bottom:0} \ No newline at end of file diff --git a/assets/bootstrap/static/index/images/favicon.png b/web/static/index/images/favicon.png similarity index 100% rename from assets/bootstrap/static/index/images/favicon.png rename to web/static/index/images/favicon.png diff --git a/web/static/index/images/flags/flag-cn.png b/web/static/index/images/flags/flag-cn.png new file mode 100644 index 0000000..67d4d3a Binary files /dev/null and b/web/static/index/images/flags/flag-cn.png differ diff --git a/web/static/index/images/flags/flag-us.png b/web/static/index/images/flags/flag-us.png new file mode 100644 index 0000000..8d2ffda Binary files /dev/null and b/web/static/index/images/flags/flag-us.png differ diff --git a/assets/bootstrap/static/index/images/logo-collapsed@2x.png b/web/static/index/images/logo-collapsed@2x.png similarity index 100% rename from assets/bootstrap/static/index/images/logo-collapsed@2x.png rename to web/static/index/images/logo-collapsed@2x.png diff --git a/assets/bootstrap/static/index/images/logo@2x.png b/web/static/index/images/logo@2x.png similarity index 100% rename from assets/bootstrap/static/index/images/logo@2x.png rename to web/static/index/images/logo@2x.png diff --git a/assets/bootstrap/static/index/images/logo_dark@2x.png b/web/static/index/images/logo_dark@2x.png similarity index 100% rename from assets/bootstrap/static/index/images/logo_dark@2x.png rename to web/static/index/images/logo_dark@2x.png diff --git a/assets/bootstrap/images/index/off_on.png b/web/static/index/images/off_on.png similarity index 100% rename from assets/bootstrap/images/index/off_on.png rename to web/static/index/images/off_on.png diff --git a/assets/bootstrap/images/index/search_icon.png b/web/static/index/images/search_icon.png similarity index 100% rename from assets/bootstrap/images/index/search_icon.png rename to web/static/index/images/search_icon.png diff --git a/web/static/index/js/TweenMax.min.js b/web/static/index/js/TweenMax.min.js new file mode 100755 index 0000000..16d66c6 --- /dev/null +++ b/web/static/index/js/TweenMax.min.js @@ -0,0 +1,17 @@ +/*! + * VERSION: 1.13.1 + * DATE: 2014-07-19 + * UPDATES AND DOCS AT: http://www.greensock.com + * + * Includes all of the following: TweenLite, TweenMax, TimelineLite, TimelineMax, EasePack, CSSPlugin, RoundPropsPlugin, BezierPlugin, AttrPlugin, DirectionalRotationPlugin + * + * @license Copyright (c) 2008-2014, GreenSock. All rights reserved. + * This work is subject to the terms at http://www.greensock.com/terms_of_use.html or for + * Club GreenSock members, the software agreement that was issued with your membership. + * + * @author: Jack Doyle, jack@greensock.com + **/ +var _gsScope="undefined"!=typeof module&&module.exports&&"undefined"!=typeof global?global:this||window;(_gsScope._gsQueue||(_gsScope._gsQueue=[])).push(function(){"use strict";_gsScope._gsDefine("TweenMax",["core.Animation","core.SimpleTimeline","TweenLite"],function(t,e,i){var s=function(t){var e,i=[],s=t.length;for(e=0;e!==s;i.push(t[e++]));return i},r=function(t,e,s){i.call(this,t,e,s),this._cycle=0,this._yoyo=this.vars.yoyo===!0,this._repeat=this.vars.repeat||0,this._repeatDelay=this.vars.repeatDelay||0,this._dirty=!0,this.render=r.prototype.render},n=1e-10,a=i._internals,o=a.isSelector,h=a.isArray,l=r.prototype=i.to({},.1,{}),_=[];r.version="1.13.1",l.constructor=r,l.kill()._gc=!1,r.killTweensOf=r.killDelayedCallsTo=i.killTweensOf,r.getTweensOf=i.getTweensOf,r.lagSmoothing=i.lagSmoothing,r.ticker=i.ticker,r.render=i.render,l.invalidate=function(){return this._yoyo=this.vars.yoyo===!0,this._repeat=this.vars.repeat||0,this._repeatDelay=this.vars.repeatDelay||0,this._uncache(!0),i.prototype.invalidate.call(this)},l.updateTo=function(t,e){var s,r=this.ratio;e&&this._startTime.998){var n=this._time;this.render(0,!0,!1),this._initted=!1,this.render(n,!0,!1)}else if(this._time>0){this._initted=!1,this._init();for(var a,o=1/(1-r),h=this._firstPT;h;)a=h.s+h.c,h.c*=o,h.s=a-h.c,h=h._next}return this},l.render=function(t,e,i){this._initted||0===this._duration&&this.vars.repeat&&this.invalidate();var s,r,o,h,l,u,p,c,f=this._dirty?this.totalDuration():this._totalDuration,m=this._time,d=this._totalTime,g=this._cycle,v=this._duration,y=this._rawPrevTime;if(t>=f?(this._totalTime=f,this._cycle=this._repeat,this._yoyo&&0!==(1&this._cycle)?(this._time=0,this.ratio=this._ease._calcEnd?this._ease.getRatio(0):0):(this._time=v,this.ratio=this._ease._calcEnd?this._ease.getRatio(1):1),this._reversed||(s=!0,r="onComplete"),0===v&&(this._initted||!this.vars.lazy||i)&&(this._startTime===this._timeline._duration&&(t=0),(0===t||0>y||y===n)&&y!==t&&(i=!0,y>n&&(r="onReverseComplete")),this._rawPrevTime=c=!e||t||y===t?t:n)):1e-7>t?(this._totalTime=this._time=this._cycle=0,this.ratio=this._ease._calcEnd?this._ease.getRatio(0):0,(0!==d||0===v&&y>0&&y!==n)&&(r="onReverseComplete",s=this._reversed),0>t?(this._active=!1,0===v&&(this._initted||!this.vars.lazy||i)&&(y>=0&&(i=!0),this._rawPrevTime=c=!e||t||y===t?t:n)):this._initted||(i=!0)):(this._totalTime=this._time=t,0!==this._repeat&&(h=v+this._repeatDelay,this._cycle=this._totalTime/h>>0,0!==this._cycle&&this._cycle===this._totalTime/h&&this._cycle--,this._time=this._totalTime-this._cycle*h,this._yoyo&&0!==(1&this._cycle)&&(this._time=v-this._time),this._time>v?this._time=v:0>this._time&&(this._time=0)),this._easeType?(l=this._time/v,u=this._easeType,p=this._easePower,(1===u||3===u&&l>=.5)&&(l=1-l),3===u&&(l*=2),1===p?l*=l:2===p?l*=l*l:3===p?l*=l*l*l:4===p&&(l*=l*l*l*l),this.ratio=1===u?1-l:2===u?l:.5>this._time/v?l/2:1-l/2):this.ratio=this._ease.getRatio(this._time/v)),m===this._time&&!i&&g===this._cycle)return d!==this._totalTime&&this._onUpdate&&(e||this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||_)),void 0;if(!this._initted){if(this._init(),!this._initted||this._gc)return;if(!i&&this._firstPT&&(this.vars.lazy!==!1&&this._duration||this.vars.lazy&&!this._duration))return this._time=m,this._totalTime=d,this._rawPrevTime=y,this._cycle=g,a.lazyTweens.push(this),this._lazy=t,void 0;this._time&&!s?this.ratio=this._ease.getRatio(this._time/v):s&&this._ease._calcEnd&&(this.ratio=this._ease.getRatio(0===this._time?0:1))}for(this._lazy!==!1&&(this._lazy=!1),this._active||!this._paused&&this._time!==m&&t>=0&&(this._active=!0),0===d&&(2===this._initted&&t>0&&this._init(),this._startAt&&(t>=0?this._startAt.render(t,e,i):r||(r="_dummyGS")),this.vars.onStart&&(0!==this._totalTime||0===v)&&(e||this.vars.onStart.apply(this.vars.onStartScope||this,this.vars.onStartParams||_))),o=this._firstPT;o;)o.f?o.t[o.p](o.c*this.ratio+o.s):o.t[o.p]=o.c*this.ratio+o.s,o=o._next;this._onUpdate&&(0>t&&this._startAt&&this._startTime&&this._startAt.render(t,e,i),e||(this._totalTime!==d||s)&&this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||_)),this._cycle!==g&&(e||this._gc||this.vars.onRepeat&&this.vars.onRepeat.apply(this.vars.onRepeatScope||this,this.vars.onRepeatParams||_)),r&&(!this._gc||i)&&(0>t&&this._startAt&&!this._onUpdate&&this._startTime&&this._startAt.render(t,e,i),s&&(this._timeline.autoRemoveChildren&&this._enabled(!1,!1),this._active=!1),!e&&this.vars[r]&&this.vars[r].apply(this.vars[r+"Scope"]||this,this.vars[r+"Params"]||_),0===v&&this._rawPrevTime===n&&c!==n&&(this._rawPrevTime=0))},r.to=function(t,e,i){return new r(t,e,i)},r.from=function(t,e,i){return i.runBackwards=!0,i.immediateRender=0!=i.immediateRender,new r(t,e,i)},r.fromTo=function(t,e,i,s){return s.startAt=i,s.immediateRender=0!=s.immediateRender&&0!=i.immediateRender,new r(t,e,s)},r.staggerTo=r.allTo=function(t,e,n,a,l,u,p){a=a||0;var c,f,m,d,g=n.delay||0,v=[],y=function(){n.onComplete&&n.onComplete.apply(n.onCompleteScope||this,arguments),l.apply(p||this,u||_)};for(h(t)||("string"==typeof t&&(t=i.selector(t)||t),o(t)&&(t=s(t))),c=t.length,m=0;c>m;m++){f={};for(d in n)f[d]=n[d];f.delay=g,m===c-1&&l&&(f.onComplete=y),v[m]=new r(t[m],e,f),g+=a}return v},r.staggerFrom=r.allFrom=function(t,e,i,s,n,a,o){return i.runBackwards=!0,i.immediateRender=0!=i.immediateRender,r.staggerTo(t,e,i,s,n,a,o)},r.staggerFromTo=r.allFromTo=function(t,e,i,s,n,a,o,h){return s.startAt=i,s.immediateRender=0!=s.immediateRender&&0!=i.immediateRender,r.staggerTo(t,e,s,n,a,o,h)},r.delayedCall=function(t,e,i,s,n){return new r(e,0,{delay:t,onComplete:e,onCompleteParams:i,onCompleteScope:s,onReverseComplete:e,onReverseCompleteParams:i,onReverseCompleteScope:s,immediateRender:!1,useFrames:n,overwrite:0})},r.set=function(t,e){return new r(t,0,e)},r.isTweening=function(t){return i.getTweensOf(t,!0).length>0};var u=function(t,e){for(var s=[],r=0,n=t._first;n;)n instanceof i?s[r++]=n:(e&&(s[r++]=n),s=s.concat(u(n,e)),r=s.length),n=n._next;return s},p=r.getAllTweens=function(e){return u(t._rootTimeline,e).concat(u(t._rootFramesTimeline,e))};r.killAll=function(t,i,s,r){null==i&&(i=!0),null==s&&(s=!0);var n,a,o,h=p(0!=r),l=h.length,_=i&&s&&r;for(o=0;l>o;o++)a=h[o],(_||a instanceof e||(n=a.target===a.vars.onComplete)&&s||i&&!n)&&(t?a.totalTime(a._reversed?0:a.totalDuration()):a._enabled(!1,!1))},r.killChildTweensOf=function(t,e){if(null!=t){var n,l,_,u,p,c=a.tweenLookup;if("string"==typeof t&&(t=i.selector(t)||t),o(t)&&(t=s(t)),h(t))for(u=t.length;--u>-1;)r.killChildTweensOf(t[u],e);else{n=[];for(_ in c)for(l=c[_].target.parentNode;l;)l===t&&(n=n.concat(c[_].tweens)),l=l.parentNode;for(p=n.length,u=0;p>u;u++)e&&n[u].totalTime(n[u].totalDuration()),n[u]._enabled(!1,!1)}}};var c=function(t,i,s,r){i=i!==!1,s=s!==!1,r=r!==!1;for(var n,a,o=p(r),h=i&&s&&r,l=o.length;--l>-1;)a=o[l],(h||a instanceof e||(n=a.target===a.vars.onComplete)&&s||i&&!n)&&a.paused(t)};return r.pauseAll=function(t,e,i){c(!0,t,e,i)},r.resumeAll=function(t,e,i){c(!1,t,e,i)},r.globalTimeScale=function(e){var s=t._rootTimeline,r=i.ticker.time;return arguments.length?(e=e||n,s._startTime=r-(r-s._startTime)*s._timeScale/e,s=t._rootFramesTimeline,r=i.ticker.frame,s._startTime=r-(r-s._startTime)*s._timeScale/e,s._timeScale=t._rootTimeline._timeScale=e,e):s._timeScale},l.progress=function(t){return arguments.length?this.totalTime(this.duration()*(this._yoyo&&0!==(1&this._cycle)?1-t:t)+this._cycle*(this._duration+this._repeatDelay),!1):this._time/this.duration()},l.totalProgress=function(t){return arguments.length?this.totalTime(this.totalDuration()*t,!1):this._totalTime/this.totalDuration()},l.time=function(t,e){return arguments.length?(this._dirty&&this.totalDuration(),t>this._duration&&(t=this._duration),this._yoyo&&0!==(1&this._cycle)?t=this._duration-t+this._cycle*(this._duration+this._repeatDelay):0!==this._repeat&&(t+=this._cycle*(this._duration+this._repeatDelay)),this.totalTime(t,e)):this._time},l.duration=function(e){return arguments.length?t.prototype.duration.call(this,e):this._duration},l.totalDuration=function(t){return arguments.length?-1===this._repeat?this:this.duration((t-this._repeat*this._repeatDelay)/(this._repeat+1)):(this._dirty&&(this._totalDuration=-1===this._repeat?999999999999:this._duration*(this._repeat+1)+this._repeatDelay*this._repeat,this._dirty=!1),this._totalDuration)},l.repeat=function(t){return arguments.length?(this._repeat=t,this._uncache(!0)):this._repeat},l.repeatDelay=function(t){return arguments.length?(this._repeatDelay=t,this._uncache(!0)):this._repeatDelay},l.yoyo=function(t){return arguments.length?(this._yoyo=t,this):this._yoyo},r},!0),_gsScope._gsDefine("TimelineLite",["core.Animation","core.SimpleTimeline","TweenLite"],function(t,e,i){var s=function(t){e.call(this,t),this._labels={},this.autoRemoveChildren=this.vars.autoRemoveChildren===!0,this.smoothChildTiming=this.vars.smoothChildTiming===!0,this._sortChildren=!0,this._onUpdate=this.vars.onUpdate;var i,s,r=this.vars;for(s in r)i=r[s],o(i)&&-1!==i.join("").indexOf("{self}")&&(r[s]=this._swapSelfInParams(i));o(r.tweens)&&this.add(r.tweens,0,r.align,r.stagger)},r=1e-10,n=i._internals,a=n.isSelector,o=n.isArray,h=n.lazyTweens,l=n.lazyRender,_=[],u=_gsScope._gsDefine.globals,p=function(t){var e,i={};for(e in t)i[e]=t[e];return i},c=function(t,e,i,s){t._timeline.pause(t._startTime),e&&e.apply(s||t._timeline,i||_)},f=function(t){var e,i=[],s=t.length;for(e=0;e!==s;i.push(t[e++]));return i},m=s.prototype=new e;return s.version="1.13.1",m.constructor=s,m.kill()._gc=!1,m.to=function(t,e,s,r){var n=s.repeat&&u.TweenMax||i;return e?this.add(new n(t,e,s),r):this.set(t,s,r)},m.from=function(t,e,s,r){return this.add((s.repeat&&u.TweenMax||i).from(t,e,s),r)},m.fromTo=function(t,e,s,r,n){var a=r.repeat&&u.TweenMax||i;return e?this.add(a.fromTo(t,e,s,r),n):this.set(t,r,n)},m.staggerTo=function(t,e,r,n,o,h,l,_){var u,c=new s({onComplete:h,onCompleteParams:l,onCompleteScope:_,smoothChildTiming:this.smoothChildTiming});for("string"==typeof t&&(t=i.selector(t)||t),a(t)&&(t=f(t)),n=n||0,u=0;t.length>u;u++)r.startAt&&(r.startAt=p(r.startAt)),c.to(t[u],e,p(r),u*n);return this.add(c,o)},m.staggerFrom=function(t,e,i,s,r,n,a,o){return i.immediateRender=0!=i.immediateRender,i.runBackwards=!0,this.staggerTo(t,e,i,s,r,n,a,o)},m.staggerFromTo=function(t,e,i,s,r,n,a,o,h){return s.startAt=i,s.immediateRender=0!=s.immediateRender&&0!=i.immediateRender,this.staggerTo(t,e,s,r,n,a,o,h)},m.call=function(t,e,s,r){return this.add(i.delayedCall(0,t,e,s),r)},m.set=function(t,e,s){return s=this._parseTimeOrLabel(s,0,!0),null==e.immediateRender&&(e.immediateRender=s===this._time&&!this._paused),this.add(new i(t,0,e),s)},s.exportRoot=function(t,e){t=t||{},null==t.smoothChildTiming&&(t.smoothChildTiming=!0);var r,n,a=new s(t),o=a._timeline;for(null==e&&(e=!0),o._remove(a,!0),a._startTime=0,a._rawPrevTime=a._time=a._totalTime=o._time,r=o._first;r;)n=r._next,e&&r instanceof i&&r.target===r.vars.onComplete||a.add(r,r._startTime-r._delay),r=n;return o.add(a,0),a},m.add=function(r,n,a,h){var l,_,u,p,c,f;if("number"!=typeof n&&(n=this._parseTimeOrLabel(n,0,!0,r)),!(r instanceof t)){if(r instanceof Array||r&&r.push&&o(r)){for(a=a||"normal",h=h||0,l=n,_=r.length,u=0;_>u;u++)o(p=r[u])&&(p=new s({tweens:p})),this.add(p,l),"string"!=typeof p&&"function"!=typeof p&&("sequence"===a?l=p._startTime+p.totalDuration()/p._timeScale:"start"===a&&(p._startTime-=p.delay())),l+=h;return this._uncache(!0)}if("string"==typeof r)return this.addLabel(r,n);if("function"!=typeof r)throw"Cannot add "+r+" into the timeline; it is not a tween, timeline, function, or string.";r=i.delayedCall(0,r)}if(e.prototype.add.call(this,r,n),(this._gc||this._time===this._duration)&&!this._paused&&this._durationr._startTime;c._timeline;)f&&c._timeline.smoothChildTiming?c.totalTime(c._totalTime,!0):c._gc&&c._enabled(!0,!1),c=c._timeline;return this},m.remove=function(e){if(e instanceof t)return this._remove(e,!1);if(e instanceof Array||e&&e.push&&o(e)){for(var i=e.length;--i>-1;)this.remove(e[i]);return this}return"string"==typeof e?this.removeLabel(e):this.kill(null,e)},m._remove=function(t,i){e.prototype._remove.call(this,t,i);var s=this._last;return s?this._time>s._startTime+s._totalDuration/s._timeScale&&(this._time=this.duration(),this._totalTime=this._totalDuration):this._time=this._totalTime=this._duration=this._totalDuration=0,this},m.append=function(t,e){return this.add(t,this._parseTimeOrLabel(null,e,!0,t))},m.insert=m.insertMultiple=function(t,e,i,s){return this.add(t,e||0,i,s)},m.appendMultiple=function(t,e,i,s){return this.add(t,this._parseTimeOrLabel(null,e,!0,t),i,s)},m.addLabel=function(t,e){return this._labels[t]=this._parseTimeOrLabel(e),this},m.addPause=function(t,e,i,s){return this.call(c,["{self}",e,i,s],this,t)},m.removeLabel=function(t){return delete this._labels[t],this},m.getLabelTime=function(t){return null!=this._labels[t]?this._labels[t]:-1},m._parseTimeOrLabel=function(e,i,s,r){var n;if(r instanceof t&&r.timeline===this)this.remove(r);else if(r&&(r instanceof Array||r.push&&o(r)))for(n=r.length;--n>-1;)r[n]instanceof t&&r[n].timeline===this&&this.remove(r[n]);if("string"==typeof i)return this._parseTimeOrLabel(i,s&&"number"==typeof e&&null==this._labels[i]?e-this.duration():0,s);if(i=i||0,"string"!=typeof e||!isNaN(e)&&null==this._labels[e])null==e&&(e=this.duration());else{if(n=e.indexOf("="),-1===n)return null==this._labels[e]?s?this._labels[e]=this.duration()+i:i:this._labels[e]+i;i=parseInt(e.charAt(n-1)+"1",10)*Number(e.substr(n+1)),e=n>1?this._parseTimeOrLabel(e.substr(0,n-1),0,s):this.duration()}return Number(e)+i},m.seek=function(t,e){return this.totalTime("number"==typeof t?t:this._parseTimeOrLabel(t),e!==!1)},m.stop=function(){return this.paused(!0)},m.gotoAndPlay=function(t,e){return this.play(t,e)},m.gotoAndStop=function(t,e){return this.pause(t,e)},m.render=function(t,e,i){this._gc&&this._enabled(!0,!1);var s,n,a,o,u,p=this._dirty?this.totalDuration():this._totalDuration,c=this._time,f=this._startTime,m=this._timeScale,d=this._paused;if(t>=p?(this._totalTime=this._time=p,this._reversed||this._hasPausedChild()||(n=!0,o="onComplete",0===this._duration&&(0===t||0>this._rawPrevTime||this._rawPrevTime===r)&&this._rawPrevTime!==t&&this._first&&(u=!0,this._rawPrevTime>r&&(o="onReverseComplete"))),this._rawPrevTime=this._duration||!e||t||this._rawPrevTime===t?t:r,t=p+1e-4):1e-7>t?(this._totalTime=this._time=0,(0!==c||0===this._duration&&this._rawPrevTime!==r&&(this._rawPrevTime>0||0>t&&this._rawPrevTime>=0))&&(o="onReverseComplete",n=this._reversed),0>t?(this._active=!1,this._rawPrevTime>=0&&this._first&&(u=!0),this._rawPrevTime=t):(this._rawPrevTime=this._duration||!e||t||this._rawPrevTime===t?t:r,t=0,this._initted||(u=!0))):this._totalTime=this._time=this._rawPrevTime=t,this._time!==c&&this._first||i||u){if(this._initted||(this._initted=!0),this._active||!this._paused&&this._time!==c&&t>0&&(this._active=!0),0===c&&this.vars.onStart&&0!==this._time&&(e||this.vars.onStart.apply(this.vars.onStartScope||this,this.vars.onStartParams||_)),this._time>=c)for(s=this._first;s&&(a=s._next,!this._paused||d);)(s._active||s._startTime<=this._time&&!s._paused&&!s._gc)&&(s._reversed?s.render((s._dirty?s.totalDuration():s._totalDuration)-(t-s._startTime)*s._timeScale,e,i):s.render((t-s._startTime)*s._timeScale,e,i)),s=a;else for(s=this._last;s&&(a=s._prev,!this._paused||d);)(s._active||c>=s._startTime&&!s._paused&&!s._gc)&&(s._reversed?s.render((s._dirty?s.totalDuration():s._totalDuration)-(t-s._startTime)*s._timeScale,e,i):s.render((t-s._startTime)*s._timeScale,e,i)),s=a;this._onUpdate&&(e||(h.length&&l(),this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||_))),o&&(this._gc||(f===this._startTime||m!==this._timeScale)&&(0===this._time||p>=this.totalDuration())&&(n&&(h.length&&l(),this._timeline.autoRemoveChildren&&this._enabled(!1,!1),this._active=!1),!e&&this.vars[o]&&this.vars[o].apply(this.vars[o+"Scope"]||this,this.vars[o+"Params"]||_)))}},m._hasPausedChild=function(){for(var t=this._first;t;){if(t._paused||t instanceof s&&t._hasPausedChild())return!0;t=t._next}return!1},m.getChildren=function(t,e,s,r){r=r||-9999999999;for(var n=[],a=this._first,o=0;a;)r>a._startTime||(a instanceof i?e!==!1&&(n[o++]=a):(s!==!1&&(n[o++]=a),t!==!1&&(n=n.concat(a.getChildren(!0,e,s)),o=n.length))),a=a._next;return n},m.getTweensOf=function(t,e){var s,r,n=this._gc,a=[],o=0;for(n&&this._enabled(!0,!0),s=i.getTweensOf(t),r=s.length;--r>-1;)(s[r].timeline===this||e&&this._contains(s[r]))&&(a[o++]=s[r]);return n&&this._enabled(!1,!0),a},m._contains=function(t){for(var e=t.timeline;e;){if(e===this)return!0;e=e.timeline}return!1},m.shiftChildren=function(t,e,i){i=i||0;for(var s,r=this._first,n=this._labels;r;)r._startTime>=i&&(r._startTime+=t),r=r._next;if(e)for(s in n)n[s]>=i&&(n[s]+=t);return this._uncache(!0)},m._kill=function(t,e){if(!t&&!e)return this._enabled(!1,!1);for(var i=e?this.getTweensOf(e):this.getChildren(!0,!0,!1),s=i.length,r=!1;--s>-1;)i[s]._kill(t,e)&&(r=!0);return r},m.clear=function(t){var e=this.getChildren(!1,!0,!0),i=e.length;for(this._time=this._totalTime=0;--i>-1;)e[i]._enabled(!1,!1);return t!==!1&&(this._labels={}),this._uncache(!0)},m.invalidate=function(){for(var t=this._first;t;)t.invalidate(),t=t._next;return this},m._enabled=function(t,i){if(t===this._gc)for(var s=this._first;s;)s._enabled(t,!0),s=s._next;return e.prototype._enabled.call(this,t,i)},m.duration=function(t){return arguments.length?(0!==this.duration()&&0!==t&&this.timeScale(this._duration/t),this):(this._dirty&&this.totalDuration(),this._duration)},m.totalDuration=function(t){if(!arguments.length){if(this._dirty){for(var e,i,s=0,r=this._last,n=999999999999;r;)e=r._prev,r._dirty&&r.totalDuration(),r._startTime>n&&this._sortChildren&&!r._paused?this.add(r,r._startTime-r._delay):n=r._startTime,0>r._startTime&&!r._paused&&(s-=r._startTime,this._timeline.smoothChildTiming&&(this._startTime+=r._startTime/this._timeScale),this.shiftChildren(-r._startTime,!1,-9999999999),n=0),i=r._startTime+r._totalDuration/r._timeScale,i>s&&(s=i),r=e;this._duration=this._totalDuration=s,this._dirty=!1}return this._totalDuration}return 0!==this.totalDuration()&&0!==t&&this.timeScale(this._totalDuration/t),this},m.usesFrames=function(){for(var e=this._timeline;e._timeline;)e=e._timeline;return e===t._rootFramesTimeline},m.rawTime=function(){return this._paused?this._totalTime:(this._timeline.rawTime()-this._startTime)*this._timeScale},s},!0),_gsScope._gsDefine("TimelineMax",["TimelineLite","TweenLite","easing.Ease"],function(t,e,i){var s=function(e){t.call(this,e),this._repeat=this.vars.repeat||0,this._repeatDelay=this.vars.repeatDelay||0,this._cycle=0,this._yoyo=this.vars.yoyo===!0,this._dirty=!0},r=1e-10,n=[],a=e._internals,o=a.lazyTweens,h=a.lazyRender,l=new i(null,null,1,0),_=s.prototype=new t;return _.constructor=s,_.kill()._gc=!1,s.version="1.13.1",_.invalidate=function(){return this._yoyo=this.vars.yoyo===!0,this._repeat=this.vars.repeat||0,this._repeatDelay=this.vars.repeatDelay||0,this._uncache(!0),t.prototype.invalidate.call(this)},_.addCallback=function(t,i,s,r){return this.add(e.delayedCall(0,t,s,r),i)},_.removeCallback=function(t,e){if(t)if(null==e)this._kill(null,t);else for(var i=this.getTweensOf(t,!1),s=i.length,r=this._parseTimeOrLabel(e);--s>-1;)i[s]._startTime===r&&i[s]._enabled(!1,!1);return this},_.tweenTo=function(t,i){i=i||{};var s,r,a,o={ease:l,overwrite:i.delay?2:1,useFrames:this.usesFrames(),immediateRender:!1};for(r in i)o[r]=i[r];return o.time=this._parseTimeOrLabel(t),s=Math.abs(Number(o.time)-this._time)/this._timeScale||.001,a=new e(this,s,o),o.onStart=function(){a.target.paused(!0),a.vars.time!==a.target.time()&&s===a.duration()&&a.duration(Math.abs(a.vars.time-a.target.time())/a.target._timeScale),i.onStart&&i.onStart.apply(i.onStartScope||a,i.onStartParams||n)},a},_.tweenFromTo=function(t,e,i){i=i||{},t=this._parseTimeOrLabel(t),i.startAt={onComplete:this.seek,onCompleteParams:[t],onCompleteScope:this},i.immediateRender=i.immediateRender!==!1;var s=this.tweenTo(e,i);return s.duration(Math.abs(s.vars.time-t)/this._timeScale||.001)},_.render=function(t,e,i){this._gc&&this._enabled(!0,!1);var s,a,l,_,u,p,c=this._dirty?this.totalDuration():this._totalDuration,f=this._duration,m=this._time,d=this._totalTime,g=this._startTime,v=this._timeScale,y=this._rawPrevTime,T=this._paused,w=this._cycle;if(t>=c?(this._locked||(this._totalTime=c,this._cycle=this._repeat),this._reversed||this._hasPausedChild()||(a=!0,_="onComplete",0===this._duration&&(0===t||0>y||y===r)&&y!==t&&this._first&&(u=!0,y>r&&(_="onReverseComplete"))),this._rawPrevTime=this._duration||!e||t||this._rawPrevTime===t?t:r,this._yoyo&&0!==(1&this._cycle)?this._time=t=0:(this._time=f,t=f+1e-4)):1e-7>t?(this._locked||(this._totalTime=this._cycle=0),this._time=0,(0!==m||0===f&&y!==r&&(y>0||0>t&&y>=0)&&!this._locked)&&(_="onReverseComplete",a=this._reversed),0>t?(this._active=!1,y>=0&&this._first&&(u=!0),this._rawPrevTime=t):(this._rawPrevTime=f||!e||t||this._rawPrevTime===t?t:r,t=0,this._initted||(u=!0))):(0===f&&0>y&&(u=!0),this._time=this._rawPrevTime=t,this._locked||(this._totalTime=t,0!==this._repeat&&(p=f+this._repeatDelay,this._cycle=this._totalTime/p>>0,0!==this._cycle&&this._cycle===this._totalTime/p&&this._cycle--,this._time=this._totalTime-this._cycle*p,this._yoyo&&0!==(1&this._cycle)&&(this._time=f-this._time),this._time>f?(this._time=f,t=f+1e-4):0>this._time?this._time=t=0:t=this._time))),this._cycle!==w&&!this._locked){var x=this._yoyo&&0!==(1&w),b=x===(this._yoyo&&0!==(1&this._cycle)),P=this._totalTime,S=this._cycle,k=this._rawPrevTime,R=this._time;if(this._totalTime=w*f,w>this._cycle?x=!x:this._totalTime+=f,this._time=m,this._rawPrevTime=0===f?y-1e-4:y,this._cycle=w,this._locked=!0,m=x?0:f,this.render(m,e,0===f),e||this._gc||this.vars.onRepeat&&this.vars.onRepeat.apply(this.vars.onRepeatScope||this,this.vars.onRepeatParams||n),b&&(m=x?f+1e-4:-1e-4,this.render(m,!0,!1)),this._locked=!1,this._paused&&!T)return;this._time=R,this._totalTime=P,this._cycle=S,this._rawPrevTime=k}if(!(this._time!==m&&this._first||i||u))return d!==this._totalTime&&this._onUpdate&&(e||this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||n)),void 0;if(this._initted||(this._initted=!0),this._active||!this._paused&&this._totalTime!==d&&t>0&&(this._active=!0),0===d&&this.vars.onStart&&0!==this._totalTime&&(e||this.vars.onStart.apply(this.vars.onStartScope||this,this.vars.onStartParams||n)),this._time>=m)for(s=this._first;s&&(l=s._next,!this._paused||T);)(s._active||s._startTime<=this._time&&!s._paused&&!s._gc)&&(s._reversed?s.render((s._dirty?s.totalDuration():s._totalDuration)-(t-s._startTime)*s._timeScale,e,i):s.render((t-s._startTime)*s._timeScale,e,i)),s=l;else for(s=this._last;s&&(l=s._prev,!this._paused||T);)(s._active||m>=s._startTime&&!s._paused&&!s._gc)&&(s._reversed?s.render((s._dirty?s.totalDuration():s._totalDuration)-(t-s._startTime)*s._timeScale,e,i):s.render((t-s._startTime)*s._timeScale,e,i)),s=l;this._onUpdate&&(e||(o.length&&h(),this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||n))),_&&(this._locked||this._gc||(g===this._startTime||v!==this._timeScale)&&(0===this._time||c>=this.totalDuration())&&(a&&(o.length&&h(),this._timeline.autoRemoveChildren&&this._enabled(!1,!1),this._active=!1),!e&&this.vars[_]&&this.vars[_].apply(this.vars[_+"Scope"]||this,this.vars[_+"Params"]||n)))},_.getActive=function(t,e,i){null==t&&(t=!0),null==e&&(e=!0),null==i&&(i=!1);var s,r,n=[],a=this.getChildren(t,e,i),o=0,h=a.length;for(s=0;h>s;s++)r=a[s],r.isActive()&&(n[o++]=r);return n},_.getLabelAfter=function(t){t||0!==t&&(t=this._time);var e,i=this.getLabelsArray(),s=i.length;for(e=0;s>e;e++)if(i[e].time>t)return i[e].name;return null},_.getLabelBefore=function(t){null==t&&(t=this._time);for(var e=this.getLabelsArray(),i=e.length;--i>-1;)if(t>e[i].time)return e[i].name;return null},_.getLabelsArray=function(){var t,e=[],i=0;for(t in this._labels)e[i++]={time:this._labels[t],name:t};return e.sort(function(t,e){return t.time-e.time}),e},_.progress=function(t){return arguments.length?this.totalTime(this.duration()*(this._yoyo&&0!==(1&this._cycle)?1-t:t)+this._cycle*(this._duration+this._repeatDelay),!1):this._time/this.duration()},_.totalProgress=function(t){return arguments.length?this.totalTime(this.totalDuration()*t,!1):this._totalTime/this.totalDuration()},_.totalDuration=function(e){return arguments.length?-1===this._repeat?this:this.duration((e-this._repeat*this._repeatDelay)/(this._repeat+1)):(this._dirty&&(t.prototype.totalDuration.call(this),this._totalDuration=-1===this._repeat?999999999999:this._duration*(this._repeat+1)+this._repeatDelay*this._repeat),this._totalDuration)},_.time=function(t,e){return arguments.length?(this._dirty&&this.totalDuration(),t>this._duration&&(t=this._duration),this._yoyo&&0!==(1&this._cycle)?t=this._duration-t+this._cycle*(this._duration+this._repeatDelay):0!==this._repeat&&(t+=this._cycle*(this._duration+this._repeatDelay)),this.totalTime(t,e)):this._time},_.repeat=function(t){return arguments.length?(this._repeat=t,this._uncache(!0)):this._repeat},_.repeatDelay=function(t){return arguments.length?(this._repeatDelay=t,this._uncache(!0)):this._repeatDelay},_.yoyo=function(t){return arguments.length?(this._yoyo=t,this):this._yoyo},_.currentLabel=function(t){return arguments.length?this.seek(t,!0):this.getLabelBefore(this._time+1e-8)},s},!0),function(){var t=180/Math.PI,e=[],i=[],s=[],r={},n=function(t,e,i,s){this.a=t,this.b=e,this.c=i,this.d=s,this.da=s-t,this.ca=i-t,this.ba=e-t},a=",x,y,z,left,top,right,bottom,marginTop,marginLeft,marginRight,marginBottom,paddingLeft,paddingTop,paddingRight,paddingBottom,backgroundPosition,backgroundPosition_y,",o=function(t,e,i,s){var r={a:t},n={},a={},o={c:s},h=(t+e)/2,l=(e+i)/2,_=(i+s)/2,u=(h+l)/2,p=(l+_)/2,c=(p-u)/8;return r.b=h+(t-h)/4,n.b=u+c,r.c=n.a=(r.b+n.b)/2,n.c=a.a=(u+p)/2,a.b=p-c,o.b=_+(s-_)/4,a.c=o.a=(a.b+o.b)/2,[r,n,a,o]},h=function(t,r,n,a,h){var l,_,u,p,c,f,m,d,g,v,y,T,w,x=t.length-1,b=0,P=t[0].a;for(l=0;x>l;l++)c=t[b],_=c.a,u=c.d,p=t[b+1].d,h?(y=e[l],T=i[l],w=.25*(T+y)*r/(a?.5:s[l]||.5),f=u-(u-_)*(a?.5*r:0!==y?w/y:0),m=u+(p-u)*(a?.5*r:0!==T?w/T:0),d=u-(f+((m-f)*(3*y/(y+T)+.5)/4||0))):(f=u-.5*(u-_)*r,m=u+.5*(p-u)*r,d=u-(f+m)/2),f+=d,m+=d,c.c=g=f,c.b=0!==l?P:P=c.a+.6*(c.c-c.a),c.da=u-_,c.ca=g-_,c.ba=P-_,n?(v=o(_,P,g,u),t.splice(b,1,v[0],v[1],v[2],v[3]),b+=4):b++,P=m;c=t[b],c.b=P,c.c=P+.4*(c.d-P),c.da=c.d-c.a,c.ca=c.c-c.a,c.ba=P-c.a,n&&(v=o(c.a,P,c.c,c.d),t.splice(b,1,v[0],v[1],v[2],v[3]))},l=function(t,s,r,a){var o,h,l,_,u,p,c=[];if(a)for(t=[a].concat(t),h=t.length;--h>-1;)"string"==typeof(p=t[h][s])&&"="===p.charAt(1)&&(t[h][s]=a[s]+Number(p.charAt(0)+p.substr(2)));if(o=t.length-2,0>o)return c[0]=new n(t[0][s],0,0,t[-1>o?0:1][s]),c;for(h=0;o>h;h++)l=t[h][s],_=t[h+1][s],c[h]=new n(l,0,0,_),r&&(u=t[h+2][s],e[h]=(e[h]||0)+(_-l)*(_-l),i[h]=(i[h]||0)+(u-_)*(u-_));return c[h]=new n(t[h][s],0,0,t[h+1][s]),c},_=function(t,n,o,_,u,p){var c,f,m,d,g,v,y,T,w={},x=[],b=p||t[0];u="string"==typeof u?","+u+",":a,null==n&&(n=1);for(f in t[0])x.push(f);if(t.length>1){for(T=t[t.length-1],y=!0,c=x.length;--c>-1;)if(f=x[c],Math.abs(b[f]-T[f])>.05){y=!1;break}y&&(t=t.concat(),p&&t.unshift(p),t.push(t[1]),p=t[t.length-3])}for(e.length=i.length=s.length=0,c=x.length;--c>-1;)f=x[c],r[f]=-1!==u.indexOf(","+f+","),w[f]=l(t,f,r[f],p);for(c=e.length;--c>-1;)e[c]=Math.sqrt(e[c]),i[c]=Math.sqrt(i[c]);if(!_){for(c=x.length;--c>-1;)if(r[f])for(m=w[x[c]],v=m.length-1,d=0;v>d;d++)g=m[d+1].da/i[d]+m[d].da/e[d],s[d]=(s[d]||0)+g*g;for(c=s.length;--c>-1;)s[c]=Math.sqrt(s[c])}for(c=x.length,d=o?4:1;--c>-1;)f=x[c],m=w[f],h(m,n,o,_,r[f]),y&&(m.splice(0,d),m.splice(m.length-d,d));return w},u=function(t,e,i){e=e||"soft";var s,r,a,o,h,l,_,u,p,c,f,m={},d="cubic"===e?3:2,g="soft"===e,v=[];if(g&&i&&(t=[i].concat(t)),null==t||d+1>t.length)throw"invalid Bezier data";for(p in t[0])v.push(p);for(l=v.length;--l>-1;){for(p=v[l],m[p]=h=[],c=0,u=t.length,_=0;u>_;_++)s=null==i?t[_][p]:"string"==typeof(f=t[_][p])&&"="===f.charAt(1)?i[p]+Number(f.charAt(0)+f.substr(2)):Number(f),g&&_>1&&u-1>_&&(h[c++]=(s+h[c-2])/2),h[c++]=s;for(u=c-d+1,c=0,_=0;u>_;_+=d)s=h[_],r=h[_+1],a=h[_+2],o=2===d?0:h[_+3],h[c++]=f=3===d?new n(s,r,a,o):new n(s,(2*r+s)/3,(2*r+a)/3,a);h.length=c}return m},p=function(t,e,i){for(var s,r,n,a,o,h,l,_,u,p,c,f=1/i,m=t.length;--m>-1;)for(p=t[m],n=p.a,a=p.d-n,o=p.c-n,h=p.b-n,s=r=0,_=1;i>=_;_++)l=f*_,u=1-l,s=r-(r=(l*l*a+3*u*(l*o+u*h))*l),c=m*i+_-1,e[c]=(e[c]||0)+s*s},c=function(t,e){e=e>>0||6;var i,s,r,n,a=[],o=[],h=0,l=0,_=e-1,u=[],c=[];for(i in t)p(t[i],a,e);for(r=a.length,s=0;r>s;s++)h+=Math.sqrt(a[s]),n=s%e,c[n]=h,n===_&&(l+=h,n=s/e>>0,u[n]=c,o[n]=l,h=0,c=[]);return{length:l,lengths:o,segments:u}},f=_gsScope._gsDefine.plugin({propName:"bezier",priority:-1,version:"1.3.3",API:2,global:!0,init:function(t,e,i){this._target=t,e instanceof Array&&(e={values:e}),this._func={},this._round={},this._props=[],this._timeRes=null==e.timeResolution?6:parseInt(e.timeResolution,10);var s,r,n,a,o,h=e.values||[],l={},p=h[0],f=e.autoRotate||i.vars.orientToBezier;this._autoRotate=f?f instanceof Array?f:[["x","y","rotation",f===!0?0:Number(f)||0]]:null;for(s in p)this._props.push(s);for(n=this._props.length;--n>-1;)s=this._props[n],this._overwriteProps.push(s),r=this._func[s]="function"==typeof t[s],l[s]=r?t[s.indexOf("set")||"function"!=typeof t["get"+s.substr(3)]?s:"get"+s.substr(3)]():parseFloat(t[s]),o||l[s]!==h[0][s]&&(o=l);if(this._beziers="cubic"!==e.type&&"quadratic"!==e.type&&"soft"!==e.type?_(h,isNaN(e.curviness)?1:e.curviness,!1,"thruBasic"===e.type,e.correlate,o):u(h,e.type,l),this._segCount=this._beziers[s].length,this._timeRes){var m=c(this._beziers,this._timeRes);this._length=m.length,this._lengths=m.lengths,this._segments=m.segments,this._l1=this._li=this._s1=this._si=0,this._l2=this._lengths[0],this._curSeg=this._segments[0],this._s2=this._curSeg[0],this._prec=1/this._curSeg.length}if(f=this._autoRotate)for(this._initialRotations=[],f[0]instanceof Array||(this._autoRotate=f=[f]),n=f.length;--n>-1;){for(a=0;3>a;a++)s=f[n][a],this._func[s]="function"==typeof t[s]?t[s.indexOf("set")||"function"!=typeof t["get"+s.substr(3)]?s:"get"+s.substr(3)]:!1;s=f[n][2],this._initialRotations[n]=this._func[s]?this._func[s].call(this._target):this._target[s]}return this._startRatio=i.vars.runBackwards?1:0,!0},set:function(e){var i,s,r,n,a,o,h,l,_,u,p=this._segCount,c=this._func,f=this._target,m=e!==this._startRatio;if(this._timeRes){if(_=this._lengths,u=this._curSeg,e*=this._length,r=this._li,e>this._l2&&p-1>r){for(l=p-1;l>r&&e>=(this._l2=_[++r]););this._l1=_[r-1],this._li=r,this._curSeg=u=this._segments[r],this._s2=u[this._s1=this._si=0]}else if(this._l1>e&&r>0){for(;r>0&&(this._l1=_[--r])>=e;);0===r&&this._l1>e?this._l1=0:r++,this._l2=_[r],this._li=r,this._curSeg=u=this._segments[r],this._s1=u[(this._si=u.length-1)-1]||0,this._s2=u[this._si]}if(i=r,e-=this._l1,r=this._si,e>this._s2&&u.length-1>r){for(l=u.length-1;l>r&&e>=(this._s2=u[++r]););this._s1=u[r-1],this._si=r}else if(this._s1>e&&r>0){for(;r>0&&(this._s1=u[--r])>=e;);0===r&&this._s1>e?this._s1=0:r++,this._s2=u[r],this._si=r}o=(r+(e-this._s1)/(this._s2-this._s1))*this._prec}else i=0>e?0:e>=1?p-1:p*e>>0,o=(e-i*(1/p))*p;for(s=1-o,r=this._props.length;--r>-1;)n=this._props[r],a=this._beziers[n][i],h=(o*o*a.da+3*s*(o*a.ca+s*a.ba))*o+a.a,this._round[n]&&(h=Math.round(h)),c[n]?f[n](h):f[n]=h;if(this._autoRotate){var d,g,v,y,T,w,x,b=this._autoRotate; +for(r=b.length;--r>-1;)n=b[r][2],w=b[r][3]||0,x=b[r][4]===!0?1:t,a=this._beziers[b[r][0]],d=this._beziers[b[r][1]],a&&d&&(a=a[i],d=d[i],g=a.a+(a.b-a.a)*o,y=a.b+(a.c-a.b)*o,g+=(y-g)*o,y+=(a.c+(a.d-a.c)*o-y)*o,v=d.a+(d.b-d.a)*o,T=d.b+(d.c-d.b)*o,v+=(T-v)*o,T+=(d.c+(d.d-d.c)*o-T)*o,h=m?Math.atan2(T-v,y-g)*x+w:this._initialRotations[r],c[n]?f[n](h):f[n]=h)}}}),m=f.prototype;f.bezierThrough=_,f.cubicToQuadratic=o,f._autoCSS=!0,f.quadraticToCubic=function(t,e,i){return new n(t,(2*e+t)/3,(2*e+i)/3,i)},f._cssRegister=function(){var t=_gsScope._gsDefine.globals.CSSPlugin;if(t){var e=t._internals,i=e._parseToProxy,s=e._setPluginRatio,r=e.CSSPropTween;e._registerComplexSpecialProp("bezier",{parser:function(t,e,n,a,o,h){e instanceof Array&&(e={values:e}),h=new f;var l,_,u,p=e.values,c=p.length-1,m=[],d={};if(0>c)return o;for(l=0;c>=l;l++)u=i(t,p[l],a,o,h,c!==l),m[l]=u.end;for(_ in e)d[_]=e[_];return d.values=m,o=new r(t,"bezier",0,0,u.pt,2),o.data=u,o.plugin=h,o.setRatio=s,0===d.autoRotate&&(d.autoRotate=!0),!d.autoRotate||d.autoRotate instanceof Array||(l=d.autoRotate===!0?0:Number(d.autoRotate),d.autoRotate=null!=u.end.left?[["left","top","rotation",l,!1]]:null!=u.end.x?[["x","y","rotation",l,!1]]:!1),d.autoRotate&&(a._transform||a._enableTransforms(!1),u.autoRotate=a._target._gsTransform),h._onInitTween(u.proxy,d,a._tween),o}})}},m._roundProps=function(t,e){for(var i=this._overwriteProps,s=i.length;--s>-1;)(t[i[s]]||t.bezier||t.bezierThrough)&&(this._round[i[s]]=e)},m._kill=function(t){var e,i,s=this._props;for(e in this._beziers)if(e in t)for(delete this._beziers[e],delete this._func[e],i=s.length;--i>-1;)s[i]===e&&s.splice(i,1);return this._super._kill.call(this,t)}}(),_gsScope._gsDefine("plugins.CSSPlugin",["plugins.TweenPlugin","TweenLite"],function(t,e){var i,s,r,n,a=function(){t.call(this,"css"),this._overwriteProps.length=0,this.setRatio=a.prototype.setRatio},o={},h=a.prototype=new t("css");h.constructor=a,a.version="1.13.1",a.API=2,a.defaultTransformPerspective=0,a.defaultSkewType="compensated",h="px",a.suffixMap={top:h,right:h,bottom:h,left:h,width:h,height:h,fontSize:h,padding:h,margin:h,perspective:h,lineHeight:""};var l,_,u,p,c,f,m=/(?:\d|\-\d|\.\d|\-\.\d)+/g,d=/(?:\d|\-\d|\.\d|\-\.\d|\+=\d|\-=\d|\+=.\d|\-=\.\d)+/g,g=/(?:\+=|\-=|\-|\b)[\d\-\.]+[a-zA-Z0-9]*(?:%|\b)/gi,v=/[^\d\-\.]/g,y=/(?:\d|\-|\+|=|#|\.)*/g,T=/opacity *= *([^)]*)/i,w=/opacity:([^;]*)/i,x=/alpha\(opacity *=.+?\)/i,b=/^(rgb|hsl)/,P=/([A-Z])/g,S=/-([a-z])/gi,k=/(^(?:url\(\"|url\())|(?:(\"\))$|\)$)/gi,R=function(t,e){return e.toUpperCase()},A=/(?:Left|Right|Width)/i,C=/(M11|M12|M21|M22)=[\d\-\.e]+/gi,O=/progid\:DXImageTransform\.Microsoft\.Matrix\(.+?\)/i,D=/,(?=[^\)]*(?:\(|$))/gi,M=Math.PI/180,z=180/Math.PI,I={},E=document,L=E.createElement("div"),F=E.createElement("img"),N=a._internals={_specialProps:o},X=navigator.userAgent,U=function(){var t,e=X.indexOf("Android"),i=E.createElement("div");return u=-1!==X.indexOf("Safari")&&-1===X.indexOf("Chrome")&&(-1===e||Number(X.substr(e+8,1))>3),c=u&&6>Number(X.substr(X.indexOf("Version/")+8,1)),p=-1!==X.indexOf("Firefox"),/MSIE ([0-9]{1,}[\.0-9]{0,})/.exec(X)&&(f=parseFloat(RegExp.$1)),i.innerHTML="a",t=i.getElementsByTagName("a")[0],t?/^0.55/.test(t.style.opacity):!1}(),Y=function(t){return T.test("string"==typeof t?t:(t.currentStyle?t.currentStyle.filter:t.style.filter)||"")?parseFloat(RegExp.$1)/100:1},j=function(t){window.console&&console.log(t)},B="",q="",V=function(t,e){e=e||L;var i,s,r=e.style;if(void 0!==r[t])return t;for(t=t.charAt(0).toUpperCase()+t.substr(1),i=["O","Moz","ms","Ms","Webkit"],s=5;--s>-1&&void 0===r[i[s]+t];);return s>=0?(q=3===s?"ms":i[s],B="-"+q.toLowerCase()+"-",q+t):null},G=E.defaultView?E.defaultView.getComputedStyle:function(){},W=a.getStyle=function(t,e,i,s,r){var n;return U||"opacity"!==e?(!s&&t.style[e]?n=t.style[e]:(i=i||G(t))?n=i[e]||i.getPropertyValue(e)||i.getPropertyValue(e.replace(P,"-$1").toLowerCase()):t.currentStyle&&(n=t.currentStyle[e]),null==r||n&&"none"!==n&&"auto"!==n&&"auto auto"!==n?n:r):Y(t)},Q=N.convertToPixels=function(t,i,s,r,n){if("px"===r||!r)return s;if("auto"===r||!s)return 0;var o,h,l,_=A.test(i),u=t,p=L.style,c=0>s;if(c&&(s=-s),"%"===r&&-1!==i.indexOf("border"))o=s/100*(_?t.clientWidth:t.clientHeight);else{if(p.cssText="border:0 solid red;position:"+W(t,"position")+";line-height:0;","%"!==r&&u.appendChild)p[_?"borderLeftWidth":"borderTopWidth"]=s+r;else{if(u=t.parentNode||E.body,h=u._gsCache,l=e.ticker.frame,h&&_&&h.time===l)return h.width*s/100;p[_?"width":"height"]=s+r}u.appendChild(L),o=parseFloat(L[_?"offsetWidth":"offsetHeight"]),u.removeChild(L),_&&"%"===r&&a.cacheWidths!==!1&&(h=u._gsCache=u._gsCache||{},h.time=l,h.width=100*(o/s)),0!==o||n||(o=Q(t,i,s,r,!0))}return c?-o:o},Z=N.calculateOffset=function(t,e,i){if("absolute"!==W(t,"position",i))return 0;var s="left"===e?"Left":"Top",r=W(t,"margin"+s,i);return t["offset"+s]-(Q(t,e,parseFloat(r),r.replace(y,""))||0)},$=function(t,e){var i,s,r={};if(e=e||G(t,null))if(i=e.length)for(;--i>-1;)r[e[i].replace(S,R)]=e.getPropertyValue(e[i]);else for(i in e)r[i]=e[i];else if(e=t.currentStyle||t.style)for(i in e)"string"==typeof i&&void 0===r[i]&&(r[i.replace(S,R)]=e[i]);return U||(r.opacity=Y(t)),s=Pe(t,e,!1),r.rotation=s.rotation,r.skewX=s.skewX,r.scaleX=s.scaleX,r.scaleY=s.scaleY,r.x=s.x,r.y=s.y,xe&&(r.z=s.z,r.rotationX=s.rotationX,r.rotationY=s.rotationY,r.scaleZ=s.scaleZ),r.filters&&delete r.filters,r},H=function(t,e,i,s,r){var n,a,o,h={},l=t.style;for(a in i)"cssText"!==a&&"length"!==a&&isNaN(a)&&(e[a]!==(n=i[a])||r&&r[a])&&-1===a.indexOf("Origin")&&("number"==typeof n||"string"==typeof n)&&(h[a]="auto"!==n||"left"!==a&&"top"!==a?""!==n&&"auto"!==n&&"none"!==n||"string"!=typeof e[a]||""===e[a].replace(v,"")?n:0:Z(t,a),void 0!==l[a]&&(o=new ue(l,a,l[a],o)));if(s)for(a in s)"className"!==a&&(h[a]=s[a]);return{difs:h,firstMPT:o}},K={width:["Left","Right"],height:["Top","Bottom"]},J=["marginLeft","marginRight","marginTop","marginBottom"],te=function(t,e,i){var s=parseFloat("width"===e?t.offsetWidth:t.offsetHeight),r=K[e],n=r.length;for(i=i||G(t,null);--n>-1;)s-=parseFloat(W(t,"padding"+r[n],i,!0))||0,s-=parseFloat(W(t,"border"+r[n]+"Width",i,!0))||0;return s},ee=function(t,e){(null==t||""===t||"auto"===t||"auto auto"===t)&&(t="0 0");var i=t.split(" "),s=-1!==t.indexOf("left")?"0%":-1!==t.indexOf("right")?"100%":i[0],r=-1!==t.indexOf("top")?"0%":-1!==t.indexOf("bottom")?"100%":i[1];return null==r?r="0":"center"===r&&(r="50%"),("center"===s||isNaN(parseFloat(s))&&-1===(s+"").indexOf("="))&&(s="50%"),e&&(e.oxp=-1!==s.indexOf("%"),e.oyp=-1!==r.indexOf("%"),e.oxr="="===s.charAt(1),e.oyr="="===r.charAt(1),e.ox=parseFloat(s.replace(v,"")),e.oy=parseFloat(r.replace(v,""))),s+" "+r+(i.length>2?" "+i[2]:"")},ie=function(t,e){return"string"==typeof t&&"="===t.charAt(1)?parseInt(t.charAt(0)+"1",10)*parseFloat(t.substr(2)):parseFloat(t)-parseFloat(e)},se=function(t,e){return null==t?e:"string"==typeof t&&"="===t.charAt(1)?parseInt(t.charAt(0)+"1",10)*Number(t.substr(2))+e:parseFloat(t)},re=function(t,e,i,s){var r,n,a,o,h=1e-6;return null==t?o=e:"number"==typeof t?o=t:(r=360,n=t.split("_"),a=Number(n[0].replace(v,""))*(-1===t.indexOf("rad")?1:z)-("="===t.charAt(1)?0:e),n.length&&(s&&(s[i]=e+a),-1!==t.indexOf("short")&&(a%=r,a!==a%(r/2)&&(a=0>a?a+r:a-r)),-1!==t.indexOf("_cw")&&0>a?a=(a+9999999999*r)%r-(0|a/r)*r:-1!==t.indexOf("ccw")&&a>0&&(a=(a-9999999999*r)%r-(0|a/r)*r)),o=e+a),h>o&&o>-h&&(o=0),o},ne={aqua:[0,255,255],lime:[0,255,0],silver:[192,192,192],black:[0,0,0],maroon:[128,0,0],teal:[0,128,128],blue:[0,0,255],navy:[0,0,128],white:[255,255,255],fuchsia:[255,0,255],olive:[128,128,0],yellow:[255,255,0],orange:[255,165,0],gray:[128,128,128],purple:[128,0,128],green:[0,128,0],red:[255,0,0],pink:[255,192,203],cyan:[0,255,255],transparent:[255,255,255,0]},ae=function(t,e,i){return t=0>t?t+1:t>1?t-1:t,0|255*(1>6*t?e+6*(i-e)*t:.5>t?i:2>3*t?e+6*(i-e)*(2/3-t):e)+.5},oe=function(t){var e,i,s,r,n,a;return t&&""!==t?"number"==typeof t?[t>>16,255&t>>8,255&t]:(","===t.charAt(t.length-1)&&(t=t.substr(0,t.length-1)),ne[t]?ne[t]:"#"===t.charAt(0)?(4===t.length&&(e=t.charAt(1),i=t.charAt(2),s=t.charAt(3),t="#"+e+e+i+i+s+s),t=parseInt(t.substr(1),16),[t>>16,255&t>>8,255&t]):"hsl"===t.substr(0,3)?(t=t.match(m),r=Number(t[0])%360/360,n=Number(t[1])/100,a=Number(t[2])/100,i=.5>=a?a*(n+1):a+n-a*n,e=2*a-i,t.length>3&&(t[3]=Number(t[3])),t[0]=ae(r+1/3,e,i),t[1]=ae(r,e,i),t[2]=ae(r-1/3,e,i),t):(t=t.match(m)||ne.transparent,t[0]=Number(t[0]),t[1]=Number(t[1]),t[2]=Number(t[2]),t.length>3&&(t[3]=Number(t[3])),t)):ne.black},he="(?:\\b(?:(?:rgb|rgba|hsl|hsla)\\(.+?\\))|\\B#.+?\\b";for(h in ne)he+="|"+h+"\\b";he=RegExp(he+")","gi");var le=function(t,e,i,s){if(null==t)return function(t){return t};var r,n=e?(t.match(he)||[""])[0]:"",a=t.split(n).join("").match(g)||[],o=t.substr(0,t.indexOf(a[0])),h=")"===t.charAt(t.length-1)?")":"",l=-1!==t.indexOf(" ")?" ":",",_=a.length,u=_>0?a[0].replace(m,""):"";return _?r=e?function(t){var e,p,c,f;if("number"==typeof t)t+=u;else if(s&&D.test(t)){for(f=t.replace(D,"|").split("|"),c=0;f.length>c;c++)f[c]=r(f[c]);return f.join(",")}if(e=(t.match(he)||[n])[0],p=t.split(e).join("").match(g)||[],c=p.length,_>c--)for(;_>++c;)p[c]=i?p[0|(c-1)/2]:a[c];return o+p.join(l)+l+e+h+(-1!==t.indexOf("inset")?" inset":"")}:function(t){var e,n,p;if("number"==typeof t)t+=u;else if(s&&D.test(t)){for(n=t.replace(D,"|").split("|"),p=0;n.length>p;p++)n[p]=r(n[p]);return n.join(",")}if(e=t.match(g)||[],p=e.length,_>p--)for(;_>++p;)e[p]=i?e[0|(p-1)/2]:a[p];return o+e.join(l)+h}:function(t){return t}},_e=function(t){return t=t.split(","),function(e,i,s,r,n,a,o){var h,l=(i+"").split(" ");for(o={},h=0;4>h;h++)o[t[h]]=l[h]=l[h]||l[(h-1)/2>>0];return r.parse(e,o,n,a)}},ue=(N._setPluginRatio=function(t){this.plugin.setRatio(t);for(var e,i,s,r,n=this.data,a=n.proxy,o=n.firstMPT,h=1e-6;o;)e=a[o.v],o.r?e=Math.round(e):h>e&&e>-h&&(e=0),o.t[o.p]=e,o=o._next;if(n.autoRotate&&(n.autoRotate.rotation=a.rotation),1===t)for(o=n.firstMPT;o;){if(i=o.t,i.type){if(1===i.type){for(r=i.xs0+i.s+i.xs1,s=1;i.l>s;s++)r+=i["xn"+s]+i["xs"+(s+1)];i.e=r}}else i.e=i.s+i.xs0;o=o._next}},function(t,e,i,s,r){this.t=t,this.p=e,this.v=i,this.r=r,s&&(s._prev=this,this._next=s)}),pe=(N._parseToProxy=function(t,e,i,s,r,n){var a,o,h,l,_,u=s,p={},c={},f=i._transform,m=I;for(i._transform=null,I=e,s=_=i.parse(t,e,s,r),I=m,n&&(i._transform=f,u&&(u._prev=null,u._prev&&(u._prev._next=null)));s&&s!==u;){if(1>=s.type&&(o=s.p,c[o]=s.s+s.c,p[o]=s.s,n||(l=new ue(s,"s",o,l,s.r),s.c=0),1===s.type))for(a=s.l;--a>0;)h="xn"+a,o=s.p+"_"+h,c[o]=s.data[h],p[o]=s[h],n||(l=new ue(s,h,o,l,s.rxp[h]));s=s._next}return{proxy:p,end:c,firstMPT:l,pt:_}},N.CSSPropTween=function(t,e,s,r,a,o,h,l,_,u,p){this.t=t,this.p=e,this.s=s,this.c=r,this.n=h||e,t instanceof pe||n.push(this.n),this.r=l,this.type=o||0,_&&(this.pr=_,i=!0),this.b=void 0===u?s:u,this.e=void 0===p?s+r:p,a&&(this._next=a,a._prev=this)}),ce=a.parseComplex=function(t,e,i,s,r,n,a,o,h,_){i=i||n||"",a=new pe(t,e,0,0,a,_?2:1,null,!1,o,i,s),s+="";var u,p,c,f,g,v,y,T,w,x,P,S,k=i.split(", ").join(",").split(" "),R=s.split(", ").join(",").split(" "),A=k.length,C=l!==!1;for((-1!==s.indexOf(",")||-1!==i.indexOf(","))&&(k=k.join(" ").replace(D,", ").split(" "),R=R.join(" ").replace(D,", ").split(" "),A=k.length),A!==R.length&&(k=(n||"").split(" "),A=k.length),a.plugin=h,a.setRatio=_,u=0;A>u;u++)if(f=k[u],g=R[u],T=parseFloat(f),T||0===T)a.appendXtra("",T,ie(g,T),g.replace(d,""),C&&-1!==g.indexOf("px"),!0);else if(r&&("#"===f.charAt(0)||ne[f]||b.test(f)))S=","===g.charAt(g.length-1)?"),":")",f=oe(f),g=oe(g),w=f.length+g.length>6,w&&!U&&0===g[3]?(a["xs"+a.l]+=a.l?" transparent":"transparent",a.e=a.e.split(R[u]).join("transparent")):(U||(w=!1),a.appendXtra(w?"rgba(":"rgb(",f[0],g[0]-f[0],",",!0,!0).appendXtra("",f[1],g[1]-f[1],",",!0).appendXtra("",f[2],g[2]-f[2],w?",":S,!0),w&&(f=4>f.length?1:f[3],a.appendXtra("",f,(4>g.length?1:g[3])-f,S,!1)));else if(v=f.match(m)){if(y=g.match(d),!y||y.length!==v.length)return a;for(c=0,p=0;v.length>p;p++)P=v[p],x=f.indexOf(P,c),a.appendXtra(f.substr(c,x-c),Number(P),ie(y[p],P),"",C&&"px"===f.substr(x+P.length,2),0===p),c=x+P.length;a["xs"+a.l]+=f.substr(c)}else a["xs"+a.l]+=a.l?" "+f:f;if(-1!==s.indexOf("=")&&a.data){for(S=a.xs0+a.data.s,u=1;a.l>u;u++)S+=a["xs"+u]+a.data["xn"+u];a.e=S+a["xs"+u]}return a.l||(a.type=-1,a.xs0=a.e),a.xfirst||a},fe=9;for(h=pe.prototype,h.l=h.pr=0;--fe>0;)h["xn"+fe]=0,h["xs"+fe]="";h.xs0="",h._next=h._prev=h.xfirst=h.data=h.plugin=h.setRatio=h.rxp=null,h.appendXtra=function(t,e,i,s,r,n){var a=this,o=a.l;return a["xs"+o]+=n&&o?" "+t:t||"",i||0===o||a.plugin?(a.l++,a.type=a.setRatio?2:1,a["xs"+a.l]=s||"",o>0?(a.data["xn"+o]=e+i,a.rxp["xn"+o]=r,a["xn"+o]=e,a.plugin||(a.xfirst=new pe(a,"xn"+o,e,i,a.xfirst||a,0,a.n,r,a.pr),a.xfirst.xs0=0),a):(a.data={s:e+i},a.rxp={},a.s=e,a.c=i,a.r=r,a)):(a["xs"+o]+=e+(s||""),a)};var me=function(t,e){e=e||{},this.p=e.prefix?V(t)||t:t,o[t]=o[this.p]=this,this.format=e.formatter||le(e.defaultValue,e.color,e.collapsible,e.multi),e.parser&&(this.parse=e.parser),this.clrs=e.color,this.multi=e.multi,this.keyword=e.keyword,this.dflt=e.defaultValue,this.pr=e.priority||0},de=N._registerComplexSpecialProp=function(t,e,i){"object"!=typeof e&&(e={parser:i});var s,r,n=t.split(","),a=e.defaultValue;for(i=i||[a],s=0;n.length>s;s++)e.prefix=0===s&&e.prefix,e.defaultValue=i[s]||a,r=new me(n[s],e)},ge=function(t){if(!o[t]){var e=t.charAt(0).toUpperCase()+t.substr(1)+"Plugin";de(t,{parser:function(t,i,s,r,n,a,h){var l=(_gsScope.GreenSockGlobals||_gsScope).com.greensock.plugins[e];return l?(l._cssRegister(),o[s].parse(t,i,s,r,n,a,h)):(j("Error: "+e+" js file not loaded."),n)}})}};h=me.prototype,h.parseComplex=function(t,e,i,s,r,n){var a,o,h,l,_,u,p=this.keyword;if(this.multi&&(D.test(i)||D.test(e)?(o=e.replace(D,"|").split("|"),h=i.replace(D,"|").split("|")):p&&(o=[e],h=[i])),h){for(l=h.length>o.length?h.length:o.length,a=0;l>a;a++)e=o[a]=o[a]||this.dflt,i=h[a]=h[a]||this.dflt,p&&(_=e.indexOf(p),u=i.indexOf(p),_!==u&&(i=-1===u?h:o,i[a]+=" "+p));e=o.join(", "),i=h.join(", ")}return ce(t,this.p,e,i,this.clrs,this.dflt,s,this.pr,r,n)},h.parse=function(t,e,i,s,n,a){return this.parseComplex(t.style,this.format(W(t,this.p,r,!1,this.dflt)),this.format(e),n,a)},a.registerSpecialProp=function(t,e,i){de(t,{parser:function(t,s,r,n,a,o){var h=new pe(t,r,0,0,a,2,r,!1,i);return h.plugin=o,h.setRatio=e(t,s,n._tween,r),h},priority:i})};var ve="scaleX,scaleY,scaleZ,x,y,z,skewX,skewY,rotation,rotationX,rotationY,perspective,xPercent,yPercent".split(","),ye=V("transform"),Te=B+"transform",we=V("transformOrigin"),xe=null!==V("perspective"),be=N.Transform=function(){this.skewY=0},Pe=N.getTransform=function(t,e,i,s){if(t._gsTransform&&i&&!s)return t._gsTransform;var r,n,o,h,l,_,u,p,c,f,m,d,g,v=i?t._gsTransform||new be:new be,y=0>v.scaleX,T=2e-5,w=1e5,x=179.99,b=x*M,P=xe?parseFloat(W(t,we,e,!1,"0 0 0").split(" ")[2])||v.zOrigin||0:0;if(ye?r=W(t,Te,e,!0):t.currentStyle&&(r=t.currentStyle.filter.match(C),r=r&&4===r.length?[r[0].substr(4),Number(r[2].substr(4)),Number(r[1].substr(4)),r[3].substr(4),v.x||0,v.y||0].join(","):""),r&&"none"!==r&&"matrix(1, 0, 0, 1, 0, 0)"!==r){for(n=(r||"").match(/(?:\-|\b)[\d\-\.e]+\b/gi)||[],o=n.length;--o>-1;)h=Number(n[o]),n[o]=(l=h-(h|=0))?(0|l*w+(0>l?-.5:.5))/w+h:h;if(16===n.length){var S=n[8],k=n[9],R=n[10],A=n[12],O=n[13],D=n[14];if(v.zOrigin&&(D=-v.zOrigin,A=S*D-n[12],O=k*D-n[13],D=R*D+v.zOrigin-n[14]),!i||s||null==v.rotationX){var I,E,L,F,N,X,U,Y=n[0],j=n[1],B=n[2],q=n[3],V=n[4],G=n[5],Q=n[6],Z=n[7],$=n[11],H=Math.atan2(Q,R),K=-b>H||H>b;v.rotationX=H*z,H&&(F=Math.cos(-H),N=Math.sin(-H),I=V*F+S*N,E=G*F+k*N,L=Q*F+R*N,S=V*-N+S*F,k=G*-N+k*F,R=Q*-N+R*F,$=Z*-N+$*F,V=I,G=E,Q=L),H=Math.atan2(S,Y),v.rotationY=H*z,H&&(X=-b>H||H>b,F=Math.cos(-H),N=Math.sin(-H),I=Y*F-S*N,E=j*F-k*N,L=B*F-R*N,k=j*N+k*F,R=B*N+R*F,$=q*N+$*F,Y=I,j=E,B=L),H=Math.atan2(j,G),v.rotation=H*z,H&&(U=-b>H||H>b,F=Math.cos(-H),N=Math.sin(-H),Y=Y*F+V*N,E=j*F+G*N,G=j*-N+G*F,Q=B*-N+Q*F,j=E),U&&K?v.rotation=v.rotationX=0:U&&X?v.rotation=v.rotationY=0:X&&K&&(v.rotationY=v.rotationX=0),v.scaleX=(0|Math.sqrt(Y*Y+j*j)*w+.5)/w,v.scaleY=(0|Math.sqrt(G*G+k*k)*w+.5)/w,v.scaleZ=(0|Math.sqrt(Q*Q+R*R)*w+.5)/w,v.skewX=0,v.perspective=$?1/(0>$?-$:$):0,v.x=A,v.y=O,v.z=D}}else if(!(xe&&!s&&n.length&&v.x===n[4]&&v.y===n[5]&&(v.rotationX||v.rotationY)||void 0!==v.x&&"none"===W(t,"display",e))){var J=n.length>=6,te=J?n[0]:1,ee=n[1]||0,ie=n[2]||0,se=J?n[3]:1;v.x=n[4]||0,v.y=n[5]||0,_=Math.sqrt(te*te+ee*ee),u=Math.sqrt(se*se+ie*ie),p=te||ee?Math.atan2(ee,te)*z:v.rotation||0,c=ie||se?Math.atan2(ie,se)*z+p:v.skewX||0,f=_-Math.abs(v.scaleX||0),m=u-Math.abs(v.scaleY||0),Math.abs(c)>90&&270>Math.abs(c)&&(y?(_*=-1,c+=0>=p?180:-180,p+=0>=p?180:-180):(u*=-1,c+=0>=c?180:-180)),d=(p-v.rotation)%180,g=(c-v.skewX)%180,(void 0===v.skewX||f>T||-T>f||m>T||-T>m||d>-x&&x>d&&false|d*w||g>-x&&x>g&&false|g*w)&&(v.scaleX=_,v.scaleY=u,v.rotation=p,v.skewX=c),xe&&(v.rotationX=v.rotationY=v.z=0,v.perspective=parseFloat(a.defaultTransformPerspective)||0,v.scaleZ=1)}v.zOrigin=P;for(o in v)T>v[o]&&v[o]>-T&&(v[o]=0)}else v={x:0,y:0,z:0,scaleX:1,scaleY:1,scaleZ:1,skewX:0,perspective:0,rotation:0,rotationX:0,rotationY:0,zOrigin:0};return i&&(t._gsTransform=v),v.xPercent=v.yPercent=0,v},Se=function(t){var e,i,s=this.data,r=-s.rotation*M,n=r+s.skewX*M,a=1e5,o=(0|Math.cos(r)*s.scaleX*a)/a,h=(0|Math.sin(r)*s.scaleX*a)/a,l=(0|Math.sin(n)*-s.scaleY*a)/a,_=(0|Math.cos(n)*s.scaleY*a)/a,u=this.t.style,p=this.t.currentStyle;if(p){i=h,h=-l,l=-i,e=p.filter,u.filter="";var c,m,d=this.t.offsetWidth,g=this.t.offsetHeight,v="absolute"!==p.position,w="progid:DXImageTransform.Microsoft.Matrix(M11="+o+", M12="+h+", M21="+l+", M22="+_,x=s.x+d*s.xPercent/100,b=s.y+g*s.yPercent/100;if(null!=s.ox&&(c=(s.oxp?.01*d*s.ox:s.ox)-d/2,m=(s.oyp?.01*g*s.oy:s.oy)-g/2,x+=c-(c*o+m*h),b+=m-(c*l+m*_)),v?(c=d/2,m=g/2,w+=", Dx="+(c-(c*o+m*h)+x)+", Dy="+(m-(c*l+m*_)+b)+")"):w+=", sizingMethod='auto expand')",u.filter=-1!==e.indexOf("DXImageTransform.Microsoft.Matrix(")?e.replace(O,w):w+" "+e,(0===t||1===t)&&1===o&&0===h&&0===l&&1===_&&(v&&-1===w.indexOf("Dx=0, Dy=0")||T.test(e)&&100!==parseFloat(RegExp.$1)||-1===e.indexOf("gradient("&&e.indexOf("Alpha"))&&u.removeAttribute("filter")),!v){var P,S,k,R=8>f?1:-1;for(c=s.ieOffsetX||0,m=s.ieOffsetY||0,s.ieOffsetX=Math.round((d-((0>o?-o:o)*d+(0>h?-h:h)*g))/2+x),s.ieOffsetY=Math.round((g-((0>_?-_:_)*g+(0>l?-l:l)*d))/2+b),fe=0;4>fe;fe++)S=J[fe],P=p[S],i=-1!==P.indexOf("px")?parseFloat(P):Q(this.t,S,parseFloat(P),P.replace(y,""))||0,k=i!==s[S]?2>fe?-s.ieOffsetX:-s.ieOffsetY:2>fe?c-s.ieOffsetX:m-s.ieOffsetY,u[S]=(s[S]=Math.round(i-k*(0===fe||2===fe?1:R)))+"px"}}},ke=N.set3DTransformRatio=function(t){var e,i,s,r,n,a,o,h,l,_,u,c,f,m,d,g,v,y,T,w,x,b,P,S=this.data,k=this.t.style,R=S.rotation*M,A=S.scaleX,C=S.scaleY,O=S.scaleZ,D=S.x,z=S.y,I=S.z,E=S.perspective;if(!(1!==t&&0!==t||"auto"!==S.force3D||S.rotationY||S.rotationX||1!==O||E||I))return Re.call(this,t),void 0;if(p){var L=1e-4;L>A&&A>-L&&(A=O=2e-5),L>C&&C>-L&&(C=O=2e-5),!E||S.z||S.rotationX||S.rotationY||(E=0)}if(R||S.skewX)y=Math.cos(R),T=Math.sin(R),e=y,n=T,S.skewX&&(R-=S.skewX*M,y=Math.cos(R),T=Math.sin(R),"simple"===S.skewType&&(w=Math.tan(S.skewX*M),w=Math.sqrt(1+w*w),y*=w,T*=w)),i=-T,a=y;else{if(!(S.rotationY||S.rotationX||1!==O||E))return k[ye]=(S.xPercent||S.yPercent?"translate("+S.xPercent+"%,"+S.yPercent+"%) translate3d(":"translate3d(")+D+"px,"+z+"px,"+I+"px)"+(1!==A||1!==C?" scale("+A+","+C+")":""),void 0;e=a=1,i=n=0}u=1,s=r=o=h=l=_=c=f=m=0,d=E?-1/E:0,g=S.zOrigin,v=1e5,R=S.rotationY*M,R&&(y=Math.cos(R),T=Math.sin(R),l=u*-T,f=d*-T,s=e*T,o=n*T,u*=y,d*=y,e*=y,n*=y),R=S.rotationX*M,R&&(y=Math.cos(R),T=Math.sin(R),w=i*y+s*T,x=a*y+o*T,b=_*y+u*T,P=m*y+d*T,s=i*-T+s*y,o=a*-T+o*y,u=_*-T+u*y,d=m*-T+d*y,i=w,a=x,_=b,m=P),1!==O&&(s*=O,o*=O,u*=O,d*=O),1!==C&&(i*=C,a*=C,_*=C,m*=C),1!==A&&(e*=A,n*=A,l*=A,f*=A),g&&(c-=g,r=s*c,h=o*c,c=u*c+g),r=(w=(r+=D)-(r|=0))?(0|w*v+(0>w?-.5:.5))/v+r:r,h=(w=(h+=z)-(h|=0))?(0|w*v+(0>w?-.5:.5))/v+h:h,c=(w=(c+=I)-(c|=0))?(0|w*v+(0>w?-.5:.5))/v+c:c,k[ye]=(S.xPercent||S.yPercent?"translate("+S.xPercent+"%,"+S.yPercent+"%) matrix3d(":"matrix3d(")+[(0|e*v)/v,(0|n*v)/v,(0|l*v)/v,(0|f*v)/v,(0|i*v)/v,(0|a*v)/v,(0|_*v)/v,(0|m*v)/v,(0|s*v)/v,(0|o*v)/v,(0|u*v)/v,(0|d*v)/v,r,h,c,E?1+-c/E:1].join(",")+")"},Re=N.set2DTransformRatio=function(t){var e,i,s,r,n,a=this.data,o=this.t,h=o.style,l=a.x,_=a.y;return a.rotationX||a.rotationY||a.z||a.force3D===!0||"auto"===a.force3D&&1!==t&&0!==t?(this.setRatio=ke,ke.call(this,t),void 0):(a.rotation||a.skewX?(e=a.rotation*M,i=e-a.skewX*M,s=1e5,r=a.scaleX*s,n=a.scaleY*s,h[ye]=(a.xPercent||a.yPercent?"translate("+a.xPercent+"%,"+a.yPercent+"%) matrix(":"matrix(")+(0|Math.cos(e)*r)/s+","+(0|Math.sin(e)*r)/s+","+(0|Math.sin(i)*-n)/s+","+(0|Math.cos(i)*n)/s+","+l+","+_+")"):h[ye]=(a.xPercent||a.yPercent?"translate("+a.xPercent+"%,"+a.yPercent+"%) matrix(":"matrix(")+a.scaleX+",0,0,"+a.scaleY+","+l+","+_+")",void 0)};de("transform,scale,scaleX,scaleY,scaleZ,x,y,z,rotation,rotationX,rotationY,rotationZ,skewX,skewY,shortRotation,shortRotationX,shortRotationY,shortRotationZ,transformOrigin,transformPerspective,directionalRotation,parseTransform,force3D,skewType,xPercent,yPercent",{parser:function(t,e,i,s,n,o,h){if(s._transform)return n;var l,_,u,p,c,f,m,d=s._transform=Pe(t,r,!0,h.parseTransform),g=t.style,v=1e-6,y=ve.length,T=h,w={};if("string"==typeof T.transform&&ye)u=L.style,u[ye]=T.transform,u.display="block",u.position="absolute",E.body.appendChild(L),l=Pe(L,null,!1),E.body.removeChild(L);else if("object"==typeof T){if(l={scaleX:se(null!=T.scaleX?T.scaleX:T.scale,d.scaleX),scaleY:se(null!=T.scaleY?T.scaleY:T.scale,d.scaleY),scaleZ:se(T.scaleZ,d.scaleZ),x:se(T.x,d.x),y:se(T.y,d.y),z:se(T.z,d.z),xPercent:se(T.xPercent,d.xPercent),yPercent:se(T.yPercent,d.yPercent),perspective:se(T.transformPerspective,d.perspective)},m=T.directionalRotation,null!=m)if("object"==typeof m)for(u in m)T[u]=m[u];else T.rotation=m;"string"==typeof T.x&&-1!==T.x.indexOf("%")&&(l.x=0,l.xPercent=se(T.x,d.xPercent)),"string"==typeof T.y&&-1!==T.y.indexOf("%")&&(l.y=0,l.yPercent=se(T.y,d.yPercent)),l.rotation=re("rotation"in T?T.rotation:"shortRotation"in T?T.shortRotation+"_short":"rotationZ"in T?T.rotationZ:d.rotation,d.rotation,"rotation",w),xe&&(l.rotationX=re("rotationX"in T?T.rotationX:"shortRotationX"in T?T.shortRotationX+"_short":d.rotationX||0,d.rotationX,"rotationX",w),l.rotationY=re("rotationY"in T?T.rotationY:"shortRotationY"in T?T.shortRotationY+"_short":d.rotationY||0,d.rotationY,"rotationY",w)),l.skewX=null==T.skewX?d.skewX:re(T.skewX,d.skewX),l.skewY=null==T.skewY?d.skewY:re(T.skewY,d.skewY),(_=l.skewY-d.skewY)&&(l.skewX+=_,l.rotation+=_)}for(xe&&null!=T.force3D&&(d.force3D=T.force3D,f=!0),d.skewType=T.skewType||d.skewType||a.defaultSkewType,c=d.force3D||d.z||d.rotationX||d.rotationY||l.z||l.rotationX||l.rotationY||l.perspective,c||null==T.scale||(l.scaleZ=1);--y>-1;)i=ve[y],p=l[i]-d[i],(p>v||-v>p||null!=I[i])&&(f=!0,n=new pe(d,i,d[i],p,n),i in w&&(n.e=w[i]),n.xs0=0,n.plugin=o,s._overwriteProps.push(n.n));return p=T.transformOrigin,(p||xe&&c&&d.zOrigin)&&(ye?(f=!0,i=we,p=(p||W(t,i,r,!1,"50% 50%"))+"",n=new pe(g,i,0,0,n,-1,"transformOrigin"),n.b=g[i],n.plugin=o,xe?(u=d.zOrigin,p=p.split(" "),d.zOrigin=(p.length>2&&(0===u||"0px"!==p[2])?parseFloat(p[2]):u)||0,n.xs0=n.e=p[0]+" "+(p[1]||"50%")+" 0px",n=new pe(d,"zOrigin",0,0,n,-1,n.n),n.b=u,n.xs0=n.e=d.zOrigin):n.xs0=n.e=p):ee(p+"",d)),f&&(s._transformType=c||3===this._transformType?3:2),n},prefix:!0}),de("boxShadow",{defaultValue:"0px 0px 0px 0px #999",prefix:!0,color:!0,multi:!0,keyword:"inset"}),de("borderRadius",{defaultValue:"0px",parser:function(t,e,i,n,a){e=this.format(e);var o,h,l,_,u,p,c,f,m,d,g,v,y,T,w,x,b=["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],P=t.style;for(m=parseFloat(t.offsetWidth),d=parseFloat(t.offsetHeight),o=e.split(" "),h=0;b.length>h;h++)this.p.indexOf("border")&&(b[h]=V(b[h])),u=_=W(t,b[h],r,!1,"0px"),-1!==u.indexOf(" ")&&(_=u.split(" "),u=_[0],_=_[1]),p=l=o[h],c=parseFloat(u),v=u.substr((c+"").length),y="="===p.charAt(1),y?(f=parseInt(p.charAt(0)+"1",10),p=p.substr(2),f*=parseFloat(p),g=p.substr((f+"").length-(0>f?1:0))||""):(f=parseFloat(p),g=p.substr((f+"").length)),""===g&&(g=s[i]||v),g!==v&&(T=Q(t,"borderLeft",c,v),w=Q(t,"borderTop",c,v),"%"===g?(u=100*(T/m)+"%",_=100*(w/d)+"%"):"em"===g?(x=Q(t,"borderLeft",1,"em"),u=T/x+"em",_=w/x+"em"):(u=T+"px",_=w+"px"),y&&(p=parseFloat(u)+f+g,l=parseFloat(_)+f+g)),a=ce(P,b[h],u+" "+_,p+" "+l,!1,"0px",a);return a},prefix:!0,formatter:le("0px 0px 0px 0px",!1,!0)}),de("backgroundPosition",{defaultValue:"0 0",parser:function(t,e,i,s,n,a){var o,h,l,_,u,p,c="background-position",m=r||G(t,null),d=this.format((m?f?m.getPropertyValue(c+"-x")+" "+m.getPropertyValue(c+"-y"):m.getPropertyValue(c):t.currentStyle.backgroundPositionX+" "+t.currentStyle.backgroundPositionY)||"0 0"),g=this.format(e);if(-1!==d.indexOf("%")!=(-1!==g.indexOf("%"))&&(p=W(t,"backgroundImage").replace(k,""),p&&"none"!==p)){for(o=d.split(" "),h=g.split(" "),F.setAttribute("src",p),l=2;--l>-1;)d=o[l],_=-1!==d.indexOf("%"),_!==(-1!==h[l].indexOf("%"))&&(u=0===l?t.offsetWidth-F.width:t.offsetHeight-F.height,o[l]=_?parseFloat(d)/100*u+"px":100*(parseFloat(d)/u)+"%");d=o.join(" ")}return this.parseComplex(t.style,d,g,n,a)},formatter:ee}),de("backgroundSize",{defaultValue:"0 0",formatter:ee}),de("perspective",{defaultValue:"0px",prefix:!0}),de("perspectiveOrigin",{defaultValue:"50% 50%",prefix:!0}),de("transformStyle",{prefix:!0}),de("backfaceVisibility",{prefix:!0}),de("userSelect",{prefix:!0}),de("margin",{parser:_e("marginTop,marginRight,marginBottom,marginLeft")}),de("padding",{parser:_e("paddingTop,paddingRight,paddingBottom,paddingLeft")}),de("clip",{defaultValue:"rect(0px,0px,0px,0px)",parser:function(t,e,i,s,n,a){var o,h,l;return 9>f?(h=t.currentStyle,l=8>f?" ":",",o="rect("+h.clipTop+l+h.clipRight+l+h.clipBottom+l+h.clipLeft+")",e=this.format(e).split(",").join(l)):(o=this.format(W(t,this.p,r,!1,this.dflt)),e=this.format(e)),this.parseComplex(t.style,o,e,n,a)}}),de("textShadow",{defaultValue:"0px 0px 0px #999",color:!0,multi:!0}),de("autoRound,strictUnits",{parser:function(t,e,i,s,r){return r}}),de("border",{defaultValue:"0px solid #000",parser:function(t,e,i,s,n,a){return this.parseComplex(t.style,this.format(W(t,"borderTopWidth",r,!1,"0px")+" "+W(t,"borderTopStyle",r,!1,"solid")+" "+W(t,"borderTopColor",r,!1,"#000")),this.format(e),n,a)},color:!0,formatter:function(t){var e=t.split(" ");return e[0]+" "+(e[1]||"solid")+" "+(t.match(he)||["#000"])[0]}}),de("borderWidth",{parser:_e("borderTopWidth,borderRightWidth,borderBottomWidth,borderLeftWidth")}),de("float,cssFloat,styleFloat",{parser:function(t,e,i,s,r){var n=t.style,a="cssFloat"in n?"cssFloat":"styleFloat";return new pe(n,a,0,0,r,-1,i,!1,0,n[a],e)}});var Ae=function(t){var e,i=this.t,s=i.filter||W(this.data,"filter"),r=0|this.s+this.c*t;100===r&&(-1===s.indexOf("atrix(")&&-1===s.indexOf("radient(")&&-1===s.indexOf("oader(")?(i.removeAttribute("filter"),e=!W(this.data,"filter")):(i.filter=s.replace(x,""),e=!0)),e||(this.xn1&&(i.filter=s=s||"alpha(opacity="+r+")"),-1===s.indexOf("pacity")?0===r&&this.xn1||(i.filter=s+" alpha(opacity="+r+")"):i.filter=s.replace(T,"opacity="+r))};de("opacity,alpha,autoAlpha",{defaultValue:"1",parser:function(t,e,i,s,n,a){var o=parseFloat(W(t,"opacity",r,!1,"1")),h=t.style,l="autoAlpha"===i;return"string"==typeof e&&"="===e.charAt(1)&&(e=("-"===e.charAt(0)?-1:1)*parseFloat(e.substr(2))+o),l&&1===o&&"hidden"===W(t,"visibility",r)&&0!==e&&(o=0),U?n=new pe(h,"opacity",o,e-o,n):(n=new pe(h,"opacity",100*o,100*(e-o),n),n.xn1=l?1:0,h.zoom=1,n.type=2,n.b="alpha(opacity="+n.s+")",n.e="alpha(opacity="+(n.s+n.c)+")",n.data=t,n.plugin=a,n.setRatio=Ae),l&&(n=new pe(h,"visibility",0,0,n,-1,null,!1,0,0!==o?"inherit":"hidden",0===e?"hidden":"inherit"),n.xs0="inherit",s._overwriteProps.push(n.n),s._overwriteProps.push(i)),n}});var Ce=function(t,e){e&&(t.removeProperty?("ms"===e.substr(0,2)&&(e="M"+e.substr(1)),t.removeProperty(e.replace(P,"-$1").toLowerCase())):t.removeAttribute(e))},Oe=function(t){if(this.t._gsClassPT=this,1===t||0===t){this.t.setAttribute("class",0===t?this.b:this.e);for(var e=this.data,i=this.t.style;e;)e.v?i[e.p]=e.v:Ce(i,e.p),e=e._next;1===t&&this.t._gsClassPT===this&&(this.t._gsClassPT=null)}else this.t.getAttribute("class")!==this.e&&this.t.setAttribute("class",this.e)};de("className",{parser:function(t,e,s,n,a,o,h){var l,_,u,p,c,f=t.getAttribute("class")||"",m=t.style.cssText;if(a=n._classNamePT=new pe(t,s,0,0,a,2),a.setRatio=Oe,a.pr=-11,i=!0,a.b=f,_=$(t,r),u=t._gsClassPT){for(p={},c=u.data;c;)p[c.p]=1,c=c._next;u.setRatio(1)}return t._gsClassPT=a,a.e="="!==e.charAt(1)?e:f.replace(RegExp("\\s*\\b"+e.substr(2)+"\\b"),"")+("+"===e.charAt(0)?" "+e.substr(2):""),n._tween._duration&&(t.setAttribute("class",a.e),l=H(t,_,$(t),h,p),t.setAttribute("class",f),a.data=l.firstMPT,t.style.cssText=m,a=a.xfirst=n.parse(t,l.difs,a,o)),a}});var De=function(t){if((1===t||0===t)&&this.data._totalTime===this.data._totalDuration&&"isFromStart"!==this.data.data){var e,i,s,r,n=this.t.style,a=o.transform.parse;if("all"===this.e)n.cssText="",r=!0;else for(e=this.e.split(","),s=e.length;--s>-1;)i=e[s],o[i]&&(o[i].parse===a?r=!0:i="transformOrigin"===i?we:o[i].p),Ce(n,i);r&&(Ce(n,ye),this.t._gsTransform&&delete this.t._gsTransform)}};for(de("clearProps",{parser:function(t,e,s,r,n){return n=new pe(t,s,0,0,n,2),n.setRatio=De,n.e=e,n.pr=-10,n.data=r._tween,i=!0,n}}),h="bezier,throwProps,physicsProps,physics2D".split(","),fe=h.length;fe--;)ge(h[fe]);h=a.prototype,h._firstPT=null,h._onInitTween=function(t,e,o){if(!t.nodeType)return!1;this._target=t,this._tween=o,this._vars=e,l=e.autoRound,i=!1,s=e.suffixMap||a.suffixMap,r=G(t,""),n=this._overwriteProps;var h,p,f,m,d,g,v,y,T,x=t.style;if(_&&""===x.zIndex&&(h=W(t,"zIndex",r),("auto"===h||""===h)&&this._addLazySet(x,"zIndex",0)),"string"==typeof e&&(m=x.cssText,h=$(t,r),x.cssText=m+";"+e,h=H(t,h,$(t)).difs,!U&&w.test(e)&&(h.opacity=parseFloat(RegExp.$1)),e=h,x.cssText=m),this._firstPT=p=this.parse(t,e,null),this._transformType){for(T=3===this._transformType,ye?u&&(_=!0,""===x.zIndex&&(v=W(t,"zIndex",r),("auto"===v||""===v)&&this._addLazySet(x,"zIndex",0)),c&&this._addLazySet(x,"WebkitBackfaceVisibility",this._vars.WebkitBackfaceVisibility||(T?"visible":"hidden"))):x.zoom=1,f=p;f&&f._next;)f=f._next;y=new pe(t,"transform",0,0,null,2),this._linkCSSP(y,null,f),y.setRatio=T&&xe?ke:ye?Re:Se,y.data=this._transform||Pe(t,r,!0),n.pop()}if(i){for(;p;){for(g=p._next,f=m;f&&f.pr>p.pr;)f=f._next;(p._prev=f?f._prev:d)?p._prev._next=p:m=p,(p._next=f)?f._prev=p:d=p,p=g}this._firstPT=m}return!0},h.parse=function(t,e,i,n){var a,h,_,u,p,c,f,m,d,g,v=t.style;for(a in e)c=e[a],h=o[a],h?i=h.parse(t,c,a,this,i,n,e):(p=W(t,a,r)+"",d="string"==typeof c,"color"===a||"fill"===a||"stroke"===a||-1!==a.indexOf("Color")||d&&b.test(c)?(d||(c=oe(c),c=(c.length>3?"rgba(":"rgb(")+c.join(",")+")"),i=ce(v,a,p,c,!0,"transparent",i,0,n)):!d||-1===c.indexOf(" ")&&-1===c.indexOf(",")?(_=parseFloat(p),f=_||0===_?p.substr((_+"").length):"",(""===p||"auto"===p)&&("width"===a||"height"===a?(_=te(t,a,r),f="px"):"left"===a||"top"===a?(_=Z(t,a,r),f="px"):(_="opacity"!==a?0:1,f="")),g=d&&"="===c.charAt(1),g?(u=parseInt(c.charAt(0)+"1",10),c=c.substr(2),u*=parseFloat(c),m=c.replace(y,"")):(u=parseFloat(c),m=d?c.substr((u+"").length)||"":""),""===m&&(m=a in s?s[a]:f),c=u||0===u?(g?u+_:u)+m:e[a],f!==m&&""!==m&&(u||0===u)&&_&&(_=Q(t,a,_,f),"%"===m?(_/=Q(t,a,100,"%")/100,e.strictUnits!==!0&&(p=_+"%")):"em"===m?_/=Q(t,a,1,"em"):"px"!==m&&(u=Q(t,a,u,m),m="px"),g&&(u||0===u)&&(c=u+_+m)),g&&(u+=_),!_&&0!==_||!u&&0!==u?void 0!==v[a]&&(c||"NaN"!=c+""&&null!=c)?(i=new pe(v,a,u||_||0,0,i,-1,a,!1,0,p,c),i.xs0="none"!==c||"display"!==a&&-1===a.indexOf("Style")?c:p):j("invalid "+a+" tween value: "+e[a]):(i=new pe(v,a,_,u-_,i,0,a,l!==!1&&("px"===m||"zIndex"===a),0,p,c),i.xs0=m)):i=ce(v,a,p,c,!0,null,i,0,n)),n&&i&&!i.plugin&&(i.plugin=n); +return i},h.setRatio=function(t){var e,i,s,r=this._firstPT,n=1e-6;if(1!==t||this._tween._time!==this._tween._duration&&0!==this._tween._time)if(t||this._tween._time!==this._tween._duration&&0!==this._tween._time||this._tween._rawPrevTime===-1e-6)for(;r;){if(e=r.c*t+r.s,r.r?e=Math.round(e):n>e&&e>-n&&(e=0),r.type)if(1===r.type)if(s=r.l,2===s)r.t[r.p]=r.xs0+e+r.xs1+r.xn1+r.xs2;else if(3===s)r.t[r.p]=r.xs0+e+r.xs1+r.xn1+r.xs2+r.xn2+r.xs3;else if(4===s)r.t[r.p]=r.xs0+e+r.xs1+r.xn1+r.xs2+r.xn2+r.xs3+r.xn3+r.xs4;else if(5===s)r.t[r.p]=r.xs0+e+r.xs1+r.xn1+r.xs2+r.xn2+r.xs3+r.xn3+r.xs4+r.xn4+r.xs5;else{for(i=r.xs0+e+r.xs1,s=1;r.l>s;s++)i+=r["xn"+s]+r["xs"+(s+1)];r.t[r.p]=i}else-1===r.type?r.t[r.p]=r.xs0:r.setRatio&&r.setRatio(t);else r.t[r.p]=e+r.xs0;r=r._next}else for(;r;)2!==r.type?r.t[r.p]=r.b:r.setRatio(t),r=r._next;else for(;r;)2!==r.type?r.t[r.p]=r.e:r.setRatio(t),r=r._next},h._enableTransforms=function(t){this._transformType=t||3===this._transformType?3:2,this._transform=this._transform||Pe(this._target,r,!0)};var Me=function(){this.t[this.p]=this.e,this.data._linkCSSP(this,this._next,null,!0)};h._addLazySet=function(t,e,i){var s=this._firstPT=new pe(t,e,0,0,this._firstPT,2);s.e=i,s.setRatio=Me,s.data=this},h._linkCSSP=function(t,e,i,s){return t&&(e&&(e._prev=t),t._next&&(t._next._prev=t._prev),t._prev?t._prev._next=t._next:this._firstPT===t&&(this._firstPT=t._next,s=!0),i?i._next=t:s||null!==this._firstPT||(this._firstPT=t),t._next=e,t._prev=i),t},h._kill=function(e){var i,s,r,n=e;if(e.autoAlpha||e.alpha){n={};for(s in e)n[s]=e[s];n.opacity=1,n.autoAlpha&&(n.visibility=1)}return e.className&&(i=this._classNamePT)&&(r=i.xfirst,r&&r._prev?this._linkCSSP(r._prev,i._next,r._prev._prev):r===this._firstPT&&(this._firstPT=i._next),i._next&&this._linkCSSP(i._next,i._next._next,r._prev),this._classNamePT=null),t.prototype._kill.call(this,n)};var ze=function(t,e,i){var s,r,n,a;if(t.slice)for(r=t.length;--r>-1;)ze(t[r],e,i);else for(s=t.childNodes,r=s.length;--r>-1;)n=s[r],a=n.type,n.style&&(e.push($(n)),i&&i.push(n)),1!==a&&9!==a&&11!==a||!n.childNodes.length||ze(n,e,i)};return a.cascadeTo=function(t,i,s){var r,n,a,o=e.to(t,i,s),h=[o],l=[],_=[],u=[],p=e._internals.reservedProps;for(t=o._targets||o.target,ze(t,l,u),o.render(i,!0),ze(t,_),o.render(0,!0),o._enabled(!0),r=u.length;--r>-1;)if(n=H(u[r],l[r],_[r]),n.firstMPT){n=n.difs;for(a in s)p[a]&&(n[a]=s[a]);h.push(e.to(u[r],i,n))}return h},t.activate([a]),a},!0),function(){var t=_gsScope._gsDefine.plugin({propName:"roundProps",priority:-1,API:2,init:function(t,e,i){return this._tween=i,!0}}),e=t.prototype;e._onInitAllProps=function(){for(var t,e,i,s=this._tween,r=s.vars.roundProps instanceof Array?s.vars.roundProps:s.vars.roundProps.split(","),n=r.length,a={},o=s._propLookup.roundProps;--n>-1;)a[r[n]]=1;for(n=r.length;--n>-1;)for(t=r[n],e=s._firstPT;e;)i=e._next,e.pg?e.t._roundProps(a,!0):e.n===t&&(this._add(e.t,t,e.s,e.c),i&&(i._prev=e._prev),e._prev?e._prev._next=i:s._firstPT===e&&(s._firstPT=i),e._next=e._prev=null,s._propLookup[t]=o),e=i;return!1},e._add=function(t,e,i,s){this._addTween(t,e,i,i+s,e,!0),this._overwriteProps.push(e)}}(),_gsScope._gsDefine.plugin({propName:"attr",API:2,version:"0.3.3",init:function(t,e){var i,s,r;if("function"!=typeof t.setAttribute)return!1;this._target=t,this._proxy={},this._start={},this._end={};for(i in e)this._start[i]=this._proxy[i]=s=t.getAttribute(i),r=this._addTween(this._proxy,i,parseFloat(s),e[i],i),this._end[i]=r?r.s+r.c:e[i],this._overwriteProps.push(i);return!0},set:function(t){this._super.setRatio.call(this,t);for(var e,i=this._overwriteProps,s=i.length,r=1===t?this._end:t?this._proxy:this._start;--s>-1;)e=i[s],this._target.setAttribute(e,r[e]+"")}}),_gsScope._gsDefine.plugin({propName:"directionalRotation",version:"0.2.1",API:2,init:function(t,e){"object"!=typeof e&&(e={rotation:e}),this.finals={};var i,s,r,n,a,o,h=e.useRadians===!0?2*Math.PI:360,l=1e-6;for(i in e)"useRadians"!==i&&(o=(e[i]+"").split("_"),s=o[0],r=parseFloat("function"!=typeof t[i]?t[i]:t[i.indexOf("set")||"function"!=typeof t["get"+i.substr(3)]?i:"get"+i.substr(3)]()),n=this.finals[i]="string"==typeof s&&"="===s.charAt(1)?r+parseInt(s.charAt(0)+"1",10)*Number(s.substr(2)):Number(s)||0,a=n-r,o.length&&(s=o.join("_"),-1!==s.indexOf("short")&&(a%=h,a!==a%(h/2)&&(a=0>a?a+h:a-h)),-1!==s.indexOf("_cw")&&0>a?a=(a+9999999999*h)%h-(0|a/h)*h:-1!==s.indexOf("ccw")&&a>0&&(a=(a-9999999999*h)%h-(0|a/h)*h)),(a>l||-l>a)&&(this._addTween(t,i,r,r+a,i),this._overwriteProps.push(i)));return!0},set:function(t){var e;if(1!==t)this._super.setRatio.call(this,t);else for(e=this._firstPT;e;)e.f?e.t[e.p](this.finals[e.p]):e.t[e.p]=this.finals[e.p],e=e._next}})._autoCSS=!0,_gsScope._gsDefine("easing.Back",["easing.Ease"],function(t){var e,i,s,r=_gsScope.GreenSockGlobals||_gsScope,n=r.com.greensock,a=2*Math.PI,o=Math.PI/2,h=n._class,l=function(e,i){var s=h("easing."+e,function(){},!0),r=s.prototype=new t;return r.constructor=s,r.getRatio=i,s},_=t.register||function(){},u=function(t,e,i,s){var r=h("easing."+t,{easeOut:new e,easeIn:new i,easeInOut:new s},!0);return _(r,t),r},p=function(t,e,i){this.t=t,this.v=e,i&&(this.next=i,i.prev=this,this.c=i.v-e,this.gap=i.t-t)},c=function(e,i){var s=h("easing."+e,function(t){this._p1=t||0===t?t:1.70158,this._p2=1.525*this._p1},!0),r=s.prototype=new t;return r.constructor=s,r.getRatio=i,r.config=function(t){return new s(t)},s},f=u("Back",c("BackOut",function(t){return(t-=1)*t*((this._p1+1)*t+this._p1)+1}),c("BackIn",function(t){return t*t*((this._p1+1)*t-this._p1)}),c("BackInOut",function(t){return 1>(t*=2)?.5*t*t*((this._p2+1)*t-this._p2):.5*((t-=2)*t*((this._p2+1)*t+this._p2)+2)})),m=h("easing.SlowMo",function(t,e,i){e=e||0===e?e:.7,null==t?t=.7:t>1&&(t=1),this._p=1!==t?e:0,this._p1=(1-t)/2,this._p2=t,this._p3=this._p1+this._p2,this._calcEnd=i===!0},!0),d=m.prototype=new t;return d.constructor=m,d.getRatio=function(t){var e=t+(.5-t)*this._p;return this._p1>t?this._calcEnd?1-(t=1-t/this._p1)*t:e-(t=1-t/this._p1)*t*t*t*e:t>this._p3?this._calcEnd?1-(t=(t-this._p3)/this._p1)*t:e+(t-e)*(t=(t-this._p3)/this._p1)*t*t*t:this._calcEnd?1:e},m.ease=new m(.7,.7),d.config=m.config=function(t,e,i){return new m(t,e,i)},e=h("easing.SteppedEase",function(t){t=t||1,this._p1=1/t,this._p2=t+1},!0),d=e.prototype=new t,d.constructor=e,d.getRatio=function(t){return 0>t?t=0:t>=1&&(t=.999999999),(this._p2*t>>0)*this._p1},d.config=e.config=function(t){return new e(t)},i=h("easing.RoughEase",function(e){e=e||{};for(var i,s,r,n,a,o,h=e.taper||"none",l=[],_=0,u=0|(e.points||20),c=u,f=e.randomize!==!1,m=e.clamp===!0,d=e.template instanceof t?e.template:null,g="number"==typeof e.strength?.4*e.strength:.4;--c>-1;)i=f?Math.random():1/u*c,s=d?d.getRatio(i):i,"none"===h?r=g:"out"===h?(n=1-i,r=n*n*g):"in"===h?r=i*i*g:.5>i?(n=2*i,r=.5*n*n*g):(n=2*(1-i),r=.5*n*n*g),f?s+=Math.random()*r-.5*r:c%2?s+=.5*r:s-=.5*r,m&&(s>1?s=1:0>s&&(s=0)),l[_++]={x:i,y:s};for(l.sort(function(t,e){return t.x-e.x}),o=new p(1,1,null),c=u;--c>-1;)a=l[c],o=new p(a.x,a.y,o);this._prev=new p(0,0,0!==o.t?o:o.next)},!0),d=i.prototype=new t,d.constructor=i,d.getRatio=function(t){var e=this._prev;if(t>e.t){for(;e.next&&t>=e.t;)e=e.next;e=e.prev}else for(;e.prev&&e.t>=t;)e=e.prev;return this._prev=e,e.v+(t-e.t)/e.gap*e.c},d.config=function(t){return new i(t)},i.ease=new i,u("Bounce",l("BounceOut",function(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}),l("BounceIn",function(t){return 1/2.75>(t=1-t)?1-7.5625*t*t:2/2.75>t?1-(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1-(7.5625*(t-=2.25/2.75)*t+.9375):1-(7.5625*(t-=2.625/2.75)*t+.984375)}),l("BounceInOut",function(t){var e=.5>t;return t=e?1-2*t:2*t-1,t=1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,e?.5*(1-t):.5*t+.5})),u("Circ",l("CircOut",function(t){return Math.sqrt(1-(t-=1)*t)}),l("CircIn",function(t){return-(Math.sqrt(1-t*t)-1)}),l("CircInOut",function(t){return 1>(t*=2)?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)})),s=function(e,i,s){var r=h("easing."+e,function(t,e){this._p1=t||1,this._p2=e||s,this._p3=this._p2/a*(Math.asin(1/this._p1)||0)},!0),n=r.prototype=new t;return n.constructor=r,n.getRatio=i,n.config=function(t,e){return new r(t,e)},r},u("Elastic",s("ElasticOut",function(t){return this._p1*Math.pow(2,-10*t)*Math.sin((t-this._p3)*a/this._p2)+1},.3),s("ElasticIn",function(t){return-(this._p1*Math.pow(2,10*(t-=1))*Math.sin((t-this._p3)*a/this._p2))},.3),s("ElasticInOut",function(t){return 1>(t*=2)?-.5*this._p1*Math.pow(2,10*(t-=1))*Math.sin((t-this._p3)*a/this._p2):.5*this._p1*Math.pow(2,-10*(t-=1))*Math.sin((t-this._p3)*a/this._p2)+1},.45)),u("Expo",l("ExpoOut",function(t){return 1-Math.pow(2,-10*t)}),l("ExpoIn",function(t){return Math.pow(2,10*(t-1))-.001}),l("ExpoInOut",function(t){return 1>(t*=2)?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*(t-1)))})),u("Sine",l("SineOut",function(t){return Math.sin(t*o)}),l("SineIn",function(t){return-Math.cos(t*o)+1}),l("SineInOut",function(t){return-.5*(Math.cos(Math.PI*t)-1)})),h("easing.EaseLookup",{find:function(e){return t.map[e]}},!0),_(r.SlowMo,"SlowMo","ease,"),_(i,"RoughEase","ease,"),_(e,"SteppedEase","ease,"),f},!0)}),_gsScope._gsDefine&&_gsScope._gsQueue.pop()(),function(t,e){"use strict";var i=t.GreenSockGlobals=t.GreenSockGlobals||t;if(!i.TweenLite){var s,r,n,a,o,h=function(t){var e,s=t.split("."),r=i;for(e=0;s.length>e;e++)r[s[e]]=r=r[s[e]]||{};return r},l=h("com.greensock"),_=1e-10,u=function(t){var e,i=[],s=t.length;for(e=0;e!==s;i.push(t[e++]));return i},p=function(){},c=function(){var t=Object.prototype.toString,e=t.call([]);return function(i){return null!=i&&(i instanceof Array||"object"==typeof i&&!!i.push&&t.call(i)===e)}}(),f={},m=function(s,r,n,a){this.sc=f[s]?f[s].sc:[],f[s]=this,this.gsClass=null,this.func=n;var o=[];this.check=function(l){for(var _,u,p,c,d=r.length,g=d;--d>-1;)(_=f[r[d]]||new m(r[d],[])).gsClass?(o[d]=_.gsClass,g--):l&&_.sc.push(this);if(0===g&&n)for(u=("com.greensock."+s).split("."),p=u.pop(),c=h(u.join("."))[p]=this.gsClass=n.apply(n,o),a&&(i[p]=c,"function"==typeof define&&define.amd?define((t.GreenSockAMDPath?t.GreenSockAMDPath+"/":"")+s.split(".").pop(),[],function(){return c}):s===e&&"undefined"!=typeof module&&module.exports&&(module.exports=c)),d=0;this.sc.length>d;d++)this.sc[d].check()},this.check(!0)},d=t._gsDefine=function(t,e,i,s){return new m(t,e,i,s)},g=l._class=function(t,e,i){return e=e||function(){},d(t,[],function(){return e},i),e};d.globals=i;var v=[0,0,1,1],y=[],T=g("easing.Ease",function(t,e,i,s){this._func=t,this._type=i||0,this._power=s||0,this._params=e?v.concat(e):v},!0),w=T.map={},x=T.register=function(t,e,i,s){for(var r,n,a,o,h=e.split(","),_=h.length,u=(i||"easeIn,easeOut,easeInOut").split(",");--_>-1;)for(n=h[_],r=s?g("easing."+n,null,!0):l.easing[n]||{},a=u.length;--a>-1;)o=u[a],w[n+"."+o]=w[o+n]=r[o]=t.getRatio?t:t[o]||new t};for(n=T.prototype,n._calcEnd=!1,n.getRatio=function(t){if(this._func)return this._params[0]=t,this._func.apply(null,this._params);var e=this._type,i=this._power,s=1===e?1-t:2===e?t:.5>t?2*t:2*(1-t);return 1===i?s*=s:2===i?s*=s*s:3===i?s*=s*s*s:4===i&&(s*=s*s*s*s),1===e?1-s:2===e?s:.5>t?s/2:1-s/2},s=["Linear","Quad","Cubic","Quart","Quint,Strong"],r=s.length;--r>-1;)n=s[r]+",Power"+r,x(new T(null,null,1,r),n,"easeOut",!0),x(new T(null,null,2,r),n,"easeIn"+(0===r?",easeNone":"")),x(new T(null,null,3,r),n,"easeInOut");w.linear=l.easing.Linear.easeIn,w.swing=l.easing.Quad.easeInOut;var b=g("events.EventDispatcher",function(t){this._listeners={},this._eventTarget=t||this});n=b.prototype,n.addEventListener=function(t,e,i,s,r){r=r||0;var n,h,l=this._listeners[t],_=0;for(null==l&&(this._listeners[t]=l=[]),h=l.length;--h>-1;)n=l[h],n.c===e&&n.s===i?l.splice(h,1):0===_&&r>n.pr&&(_=h+1);l.splice(_,0,{c:e,s:i,up:s,pr:r}),this!==a||o||a.wake()},n.removeEventListener=function(t,e){var i,s=this._listeners[t];if(s)for(i=s.length;--i>-1;)if(s[i].c===e)return s.splice(i,1),void 0},n.dispatchEvent=function(t){var e,i,s,r=this._listeners[t];if(r)for(e=r.length,i=this._eventTarget;--e>-1;)s=r[e],s.up?s.c.call(s.s||i,{type:t,target:i}):s.c.call(s.s||i)};var P=t.requestAnimationFrame,S=t.cancelAnimationFrame,k=Date.now||function(){return(new Date).getTime()},R=k();for(s=["ms","moz","webkit","o"],r=s.length;--r>-1&&!P;)P=t[s[r]+"RequestAnimationFrame"],S=t[s[r]+"CancelAnimationFrame"]||t[s[r]+"CancelRequestAnimationFrame"];g("Ticker",function(t,e){var i,s,r,n,h,l=this,u=k(),c=e!==!1&&P,f=500,m=33,d=function(t){var e,a,o=k()-R;o>f&&(u+=o-m),R+=o,l.time=(R-u)/1e3,e=l.time-h,(!i||e>0||t===!0)&&(l.frame++,h+=e+(e>=n?.004:n-e),a=!0),t!==!0&&(r=s(d)),a&&l.dispatchEvent("tick")};b.call(l),l.time=l.frame=0,l.tick=function(){d(!0)},l.lagSmoothing=function(t,e){f=t||1/_,m=Math.min(e,f,0)},l.sleep=function(){null!=r&&(c&&S?S(r):clearTimeout(r),s=p,r=null,l===a&&(o=!1))},l.wake=function(){null!==r?l.sleep():l.frame>10&&(R=k()-f+5),s=0===i?p:c&&P?P:function(t){return setTimeout(t,0|1e3*(h-l.time)+1)},l===a&&(o=!0),d(2)},l.fps=function(t){return arguments.length?(i=t,n=1/(i||60),h=this.time+n,l.wake(),void 0):i},l.useRAF=function(t){return arguments.length?(l.sleep(),c=t,l.fps(i),void 0):c},l.fps(t),setTimeout(function(){c&&(!r||5>l.frame)&&l.useRAF(!1)},1500)}),n=l.Ticker.prototype=new l.events.EventDispatcher,n.constructor=l.Ticker;var A=g("core.Animation",function(t,e){if(this.vars=e=e||{},this._duration=this._totalDuration=t||0,this._delay=Number(e.delay)||0,this._timeScale=1,this._active=e.immediateRender===!0,this.data=e.data,this._reversed=e.reversed===!0,B){o||a.wake();var i=this.vars.useFrames?j:B;i.add(this,i._time),this.vars.paused&&this.paused(!0)}});a=A.ticker=new l.Ticker,n=A.prototype,n._dirty=n._gc=n._initted=n._paused=!1,n._totalTime=n._time=0,n._rawPrevTime=-1,n._next=n._last=n._onUpdate=n._timeline=n.timeline=null,n._paused=!1;var C=function(){o&&k()-R>2e3&&a.wake(),setTimeout(C,2e3)};C(),n.play=function(t,e){return null!=t&&this.seek(t,e),this.reversed(!1).paused(!1)},n.pause=function(t,e){return null!=t&&this.seek(t,e),this.paused(!0)},n.resume=function(t,e){return null!=t&&this.seek(t,e),this.paused(!1)},n.seek=function(t,e){return this.totalTime(Number(t),e!==!1)},n.restart=function(t,e){return this.reversed(!1).paused(!1).totalTime(t?-this._delay:0,e!==!1,!0)},n.reverse=function(t,e){return null!=t&&this.seek(t||this.totalDuration(),e),this.reversed(!0).paused(!1)},n.render=function(){},n.invalidate=function(){return this},n.isActive=function(){var t,e=this._timeline,i=this._startTime;return!e||!this._gc&&!this._paused&&e.isActive()&&(t=e.rawTime())>=i&&i+this.totalDuration()/this._timeScale>t},n._enabled=function(t,e){return o||a.wake(),this._gc=!t,this._active=this.isActive(),e!==!0&&(t&&!this.timeline?this._timeline.add(this,this._startTime-this._delay):!t&&this.timeline&&this._timeline._remove(this,!0)),!1},n._kill=function(){return this._enabled(!1,!1)},n.kill=function(t,e){return this._kill(t,e),this},n._uncache=function(t){for(var e=t?this:this.timeline;e;)e._dirty=!0,e=e.timeline;return this},n._swapSelfInParams=function(t){for(var e=t.length,i=t.concat();--e>-1;)"{self}"===t[e]&&(i[e]=this);return i},n.eventCallback=function(t,e,i,s){if("on"===(t||"").substr(0,2)){var r=this.vars;if(1===arguments.length)return r[t];null==e?delete r[t]:(r[t]=e,r[t+"Params"]=c(i)&&-1!==i.join("").indexOf("{self}")?this._swapSelfInParams(i):i,r[t+"Scope"]=s),"onUpdate"===t&&(this._onUpdate=e)}return this},n.delay=function(t){return arguments.length?(this._timeline.smoothChildTiming&&this.startTime(this._startTime+t-this._delay),this._delay=t,this):this._delay},n.duration=function(t){return arguments.length?(this._duration=this._totalDuration=t,this._uncache(!0),this._timeline.smoothChildTiming&&this._time>0&&this._timethis._duration?this._duration:t,e)):this._time},n.totalTime=function(t,e,i){if(o||a.wake(),!arguments.length)return this._totalTime;if(this._timeline){if(0>t&&!i&&(t+=this.totalDuration()),this._timeline.smoothChildTiming){this._dirty&&this.totalDuration();var s=this._totalDuration,r=this._timeline;if(t>s&&!i&&(t=s),this._startTime=(this._paused?this._pauseTime:r._time)-(this._reversed?s-t:t)/this._timeScale,r._dirty||this._uncache(!1),r._timeline)for(;r._timeline;)r._timeline._time!==(r._startTime+r._totalTime)/r._timeScale&&r.totalTime(r._totalTime,!0),r=r._timeline}this._gc&&this._enabled(!0,!1),(this._totalTime!==t||0===this._duration)&&(this.render(t,e,!1),I.length&&q())}return this},n.progress=n.totalProgress=function(t,e){return arguments.length?this.totalTime(this.duration()*t,e):this._time/this.duration()},n.startTime=function(t){return arguments.length?(t!==this._startTime&&(this._startTime=t,this.timeline&&this.timeline._sortChildren&&this.timeline.add(this,t-this._delay)),this):this._startTime},n.timeScale=function(t){if(!arguments.length)return this._timeScale;if(t=t||_,this._timeline&&this._timeline.smoothChildTiming){var e=this._pauseTime,i=e||0===e?e:this._timeline.totalTime();this._startTime=i-(i-this._startTime)*this._timeScale/t}return this._timeScale=t,this._uncache(!1)},n.reversed=function(t){return arguments.length?(t!=this._reversed&&(this._reversed=t,this.totalTime(this._timeline&&!this._timeline.smoothChildTiming?this.totalDuration()-this._totalTime:this._totalTime,!0)),this):this._reversed},n.paused=function(t){if(!arguments.length)return this._paused;if(t!=this._paused&&this._timeline){o||t||a.wake();var e=this._timeline,i=e.rawTime(),s=i-this._pauseTime;!t&&e.smoothChildTiming&&(this._startTime+=s,this._uncache(!1)),this._pauseTime=t?i:null,this._paused=t,this._active=this.isActive(),!t&&0!==s&&this._initted&&this.duration()&&this.render(e.smoothChildTiming?this._totalTime:(i-this._startTime)/this._timeScale,!0,!0)}return this._gc&&!t&&this._enabled(!0,!1),this};var O=g("core.SimpleTimeline",function(t){A.call(this,0,t),this.autoRemoveChildren=this.smoothChildTiming=!0});n=O.prototype=new A,n.constructor=O,n.kill()._gc=!1,n._first=n._last=null,n._sortChildren=!1,n.add=n.insert=function(t,e){var i,s;if(t._startTime=Number(e||0)+t._delay,t._paused&&this!==t._timeline&&(t._pauseTime=t._startTime+(this.rawTime()-t._startTime)/t._timeScale),t.timeline&&t.timeline._remove(t,!0),t.timeline=t._timeline=this,t._gc&&t._enabled(!0,!0),i=this._last,this._sortChildren)for(s=t._startTime;i&&i._startTime>s;)i=i._prev;return i?(t._next=i._next,i._next=t):(t._next=this._first,this._first=t),t._next?t._next._prev=t:this._last=t,t._prev=i,this._timeline&&this._uncache(!0),this},n._remove=function(t,e){return t.timeline===this&&(e||t._enabled(!1,!0),t._prev?t._prev._next=t._next:this._first===t&&(this._first=t._next),t._next?t._next._prev=t._prev:this._last===t&&(this._last=t._prev),t._next=t._prev=t.timeline=null,this._timeline&&this._uncache(!0)),this},n.render=function(t,e,i){var s,r=this._first;for(this._totalTime=this._time=this._rawPrevTime=t;r;)s=r._next,(r._active||t>=r._startTime&&!r._paused)&&(r._reversed?r.render((r._dirty?r.totalDuration():r._totalDuration)-(t-r._startTime)*r._timeScale,e,i):r.render((t-r._startTime)*r._timeScale,e,i)),r=s},n.rawTime=function(){return o||a.wake(),this._totalTime};var D=g("TweenLite",function(e,i,s){if(A.call(this,i,s),this.render=D.prototype.render,null==e)throw"Cannot tween a null target.";this.target=e="string"!=typeof e?e:D.selector(e)||e;var r,n,a,o=e.jquery||e.length&&e!==t&&e[0]&&(e[0]===t||e[0].nodeType&&e[0].style&&!e.nodeType),h=this.vars.overwrite;if(this._overwrite=h=null==h?Y[D.defaultOverwrite]:"number"==typeof h?h>>0:Y[h],(o||e instanceof Array||e.push&&c(e))&&"number"!=typeof e[0])for(this._targets=a=u(e),this._propLookup=[],this._siblings=[],r=0;a.length>r;r++)n=a[r],n?"string"!=typeof n?n.length&&n!==t&&n[0]&&(n[0]===t||n[0].nodeType&&n[0].style&&!n.nodeType)?(a.splice(r--,1),this._targets=a=a.concat(u(n))):(this._siblings[r]=V(n,this,!1),1===h&&this._siblings[r].length>1&&G(n,this,null,1,this._siblings[r])):(n=a[r--]=D.selector(n),"string"==typeof n&&a.splice(r+1,1)):a.splice(r--,1);else this._propLookup={},this._siblings=V(e,this,!1),1===h&&this._siblings.length>1&&G(e,this,null,1,this._siblings);(this.vars.immediateRender||0===i&&0===this._delay&&this.vars.immediateRender!==!1)&&(this._time=-_,this.render(-this._delay))},!0),M=function(e){return e.length&&e!==t&&e[0]&&(e[0]===t||e[0].nodeType&&e[0].style&&!e.nodeType)},z=function(t,e){var i,s={};for(i in t)U[i]||i in e&&"transform"!==i&&"x"!==i&&"y"!==i&&"width"!==i&&"height"!==i&&"className"!==i&&"border"!==i||!(!F[i]||F[i]&&F[i]._autoCSS)||(s[i]=t[i],delete t[i]);t.css=s};n=D.prototype=new A,n.constructor=D,n.kill()._gc=!1,n.ratio=0,n._firstPT=n._targets=n._overwrittenProps=n._startAt=null,n._notifyPluginsOfEnabled=n._lazy=!1,D.version="1.13.1",D.defaultEase=n._ease=new T(null,null,1,1),D.defaultOverwrite="auto",D.ticker=a,D.autoSleep=!0,D.lagSmoothing=function(t,e){a.lagSmoothing(t,e)},D.selector=t.$||t.jQuery||function(e){var i=t.$||t.jQuery;return i?(D.selector=i,i(e)):"undefined"==typeof document?e:document.querySelectorAll?document.querySelectorAll(e):document.getElementById("#"===e.charAt(0)?e.substr(1):e)};var I=[],E={},L=D._internals={isArray:c,isSelector:M,lazyTweens:I},F=D._plugins={},N=L.tweenLookup={},X=0,U=L.reservedProps={ease:1,delay:1,overwrite:1,onComplete:1,onCompleteParams:1,onCompleteScope:1,useFrames:1,runBackwards:1,startAt:1,onUpdate:1,onUpdateParams:1,onUpdateScope:1,onStart:1,onStartParams:1,onStartScope:1,onReverseComplete:1,onReverseCompleteParams:1,onReverseCompleteScope:1,onRepeat:1,onRepeatParams:1,onRepeatScope:1,easeParams:1,yoyo:1,immediateRender:1,repeat:1,repeatDelay:1,data:1,paused:1,reversed:1,autoCSS:1,lazy:1},Y={none:0,all:1,auto:2,concurrent:3,allOnStart:4,preexisting:5,"true":1,"false":0},j=A._rootFramesTimeline=new O,B=A._rootTimeline=new O,q=L.lazyRender=function(){var t=I.length;for(E={};--t>-1;)s=I[t],s&&s._lazy!==!1&&(s.render(s._lazy,!1,!0),s._lazy=!1);I.length=0};B._startTime=a.time,j._startTime=a.frame,B._active=j._active=!0,setTimeout(q,1),A._updateRoot=D.render=function(){var t,e,i;if(I.length&&q(),B.render((a.time-B._startTime)*B._timeScale,!1,!1),j.render((a.frame-j._startTime)*j._timeScale,!1,!1),I.length&&q(),!(a.frame%120)){for(i in N){for(e=N[i].tweens,t=e.length;--t>-1;)e[t]._gc&&e.splice(t,1);0===e.length&&delete N[i]}if(i=B._first,(!i||i._paused)&&D.autoSleep&&!j._first&&1===a._listeners.tick.length){for(;i&&i._paused;)i=i._next;i||a.sleep()}}},a.addEventListener("tick",A._updateRoot);var V=function(t,e,i){var s,r,n=t._gsTweenID;if(N[n||(t._gsTweenID=n="t"+X++)]||(N[n]={target:t,tweens:[]}),e&&(s=N[n].tweens,s[r=s.length]=e,i))for(;--r>-1;)s[r]===e&&s.splice(r,1);return N[n].tweens},G=function(t,e,i,s,r){var n,a,o,h;if(1===s||s>=4){for(h=r.length,n=0;h>n;n++)if((o=r[n])!==e)o._gc||o._enabled(!1,!1)&&(a=!0);else if(5===s)break;return a}var l,u=e._startTime+_,p=[],c=0,f=0===e._duration;for(n=r.length;--n>-1;)(o=r[n])===e||o._gc||o._paused||(o._timeline!==e._timeline?(l=l||W(e,0,f),0===W(o,l,f)&&(p[c++]=o)):u>=o._startTime&&o._startTime+o.totalDuration()/o._timeScale>u&&((f||!o._initted)&&2e-10>=u-o._startTime||(p[c++]=o)));for(n=c;--n>-1;)o=p[n],2===s&&o._kill(i,t)&&(a=!0),(2!==s||!o._firstPT&&o._initted)&&o._enabled(!1,!1)&&(a=!0);return a},W=function(t,e,i){for(var s=t._timeline,r=s._timeScale,n=t._startTime;s._timeline;){if(n+=s._startTime,r*=s._timeScale,s._paused)return-100;s=s._timeline}return n/=r,n>e?n-e:i&&n===e||!t._initted&&2*_>n-e?_:(n+=t.totalDuration()/t._timeScale/r)>e+_?0:n-e-_};n._init=function(){var t,e,i,s,r,n=this.vars,a=this._overwrittenProps,o=this._duration,h=!!n.immediateRender,l=n.ease;if(n.startAt){this._startAt&&(this._startAt.render(-1,!0),this._startAt.kill()),r={};for(s in n.startAt)r[s]=n.startAt[s];if(r.overwrite=!1,r.immediateRender=!0,r.lazy=h&&n.lazy!==!1,r.startAt=r.delay=null,this._startAt=D.to(this.target,0,r),h)if(this._time>0)this._startAt=null;else if(0!==o)return}else if(n.runBackwards&&0!==o)if(this._startAt)this._startAt.render(-1,!0),this._startAt.kill(),this._startAt=null;else{i={};for(s in n)U[s]&&"autoCSS"!==s||(i[s]=n[s]);if(i.overwrite=0,i.data="isFromStart",i.lazy=h&&n.lazy!==!1,i.immediateRender=h,this._startAt=D.to(this.target,0,i),h){if(0===this._time)return}else this._startAt._init(),this._startAt._enabled(!1)}if(this._ease=l=l?l instanceof T?l:"function"==typeof l?new T(l,n.easeParams):w[l]||D.defaultEase:D.defaultEase,n.easeParams instanceof Array&&l.config&&(this._ease=l.config.apply(l,n.easeParams)),this._easeType=this._ease._type,this._easePower=this._ease._power,this._firstPT=null,this._targets)for(t=this._targets.length;--t>-1;)this._initProps(this._targets[t],this._propLookup[t]={},this._siblings[t],a?a[t]:null)&&(e=!0);else e=this._initProps(this.target,this._propLookup,this._siblings,a);if(e&&D._onPluginEvent("_onInitAllProps",this),a&&(this._firstPT||"function"!=typeof this.target&&this._enabled(!1,!1)),n.runBackwards)for(i=this._firstPT;i;)i.s+=i.c,i.c=-i.c,i=i._next;this._onUpdate=n.onUpdate,this._initted=!0},n._initProps=function(e,i,s,r){var n,a,o,h,l,_;if(null==e)return!1;E[e._gsTweenID]&&q(),this.vars.css||e.style&&e!==t&&e.nodeType&&F.css&&this.vars.autoCSS!==!1&&z(this.vars,e);for(n in this.vars){if(_=this.vars[n],U[n])_&&(_ instanceof Array||_.push&&c(_))&&-1!==_.join("").indexOf("{self}")&&(this.vars[n]=_=this._swapSelfInParams(_,this));else if(F[n]&&(h=new F[n])._onInitTween(e,this.vars[n],this)){for(this._firstPT=l={_next:this._firstPT,t:h,p:"setRatio",s:0,c:1,f:!0,n:n,pg:!0,pr:h._priority},a=h._overwriteProps.length;--a>-1;)i[h._overwriteProps[a]]=this._firstPT;(h._priority||h._onInitAllProps)&&(o=!0),(h._onDisable||h._onEnable)&&(this._notifyPluginsOfEnabled=!0)}else this._firstPT=i[n]=l={_next:this._firstPT,t:e,p:n,f:"function"==typeof e[n],n:n,pg:!1,pr:0},l.s=l.f?e[n.indexOf("set")||"function"!=typeof e["get"+n.substr(3)]?n:"get"+n.substr(3)]():parseFloat(e[n]),l.c="string"==typeof _&&"="===_.charAt(1)?parseInt(_.charAt(0)+"1",10)*Number(_.substr(2)):Number(_)-l.s||0;l&&l._next&&(l._next._prev=l)}return r&&this._kill(r,e)?this._initProps(e,i,s,r):this._overwrite>1&&this._firstPT&&s.length>1&&G(e,this,i,this._overwrite,s)?(this._kill(i,e),this._initProps(e,i,s,r)):(this._firstPT&&(this.vars.lazy!==!1&&this._duration||this.vars.lazy&&!this._duration)&&(E[e._gsTweenID]=!0),o)},n.render=function(t,e,i){var s,r,n,a,o=this._time,h=this._duration,l=this._rawPrevTime;if(t>=h)this._totalTime=this._time=h,this.ratio=this._ease._calcEnd?this._ease.getRatio(1):1,this._reversed||(s=!0,r="onComplete"),0===h&&(this._initted||!this.vars.lazy||i)&&(this._startTime===this._timeline._duration&&(t=0),(0===t||0>l||l===_)&&l!==t&&(i=!0,l>_&&(r="onReverseComplete")),this._rawPrevTime=a=!e||t||l===t?t:_);else if(1e-7>t)this._totalTime=this._time=0,this.ratio=this._ease._calcEnd?this._ease.getRatio(0):0,(0!==o||0===h&&l>0&&l!==_)&&(r="onReverseComplete",s=this._reversed),0>t?(this._active=!1,0===h&&(this._initted||!this.vars.lazy||i)&&(l>=0&&(i=!0),this._rawPrevTime=a=!e||t||l===t?t:_)):this._initted||(i=!0);else if(this._totalTime=this._time=t,this._easeType){var u=t/h,p=this._easeType,c=this._easePower;(1===p||3===p&&u>=.5)&&(u=1-u),3===p&&(u*=2),1===c?u*=u:2===c?u*=u*u:3===c?u*=u*u*u:4===c&&(u*=u*u*u*u),this.ratio=1===p?1-u:2===p?u:.5>t/h?u/2:1-u/2}else this.ratio=this._ease.getRatio(t/h);if(this._time!==o||i){if(!this._initted){if(this._init(),!this._initted||this._gc)return;if(!i&&this._firstPT&&(this.vars.lazy!==!1&&this._duration||this.vars.lazy&&!this._duration))return this._time=this._totalTime=o,this._rawPrevTime=l,I.push(this),this._lazy=t,void 0;this._time&&!s?this.ratio=this._ease.getRatio(this._time/h):s&&this._ease._calcEnd&&(this.ratio=this._ease.getRatio(0===this._time?0:1))}for(this._lazy!==!1&&(this._lazy=!1),this._active||!this._paused&&this._time!==o&&t>=0&&(this._active=!0),0===o&&(this._startAt&&(t>=0?this._startAt.render(t,e,i):r||(r="_dummyGS")),this.vars.onStart&&(0!==this._time||0===h)&&(e||this.vars.onStart.apply(this.vars.onStartScope||this,this.vars.onStartParams||y))),n=this._firstPT;n;)n.f?n.t[n.p](n.c*this.ratio+n.s):n.t[n.p]=n.c*this.ratio+n.s,n=n._next;this._onUpdate&&(0>t&&this._startAt&&this._startTime&&this._startAt.render(t,e,i),e||(this._time!==o||s)&&this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||y)),r&&(!this._gc||i)&&(0>t&&this._startAt&&!this._onUpdate&&this._startTime&&this._startAt.render(t,e,i),s&&(this._timeline.autoRemoveChildren&&this._enabled(!1,!1),this._active=!1),!e&&this.vars[r]&&this.vars[r].apply(this.vars[r+"Scope"]||this,this.vars[r+"Params"]||y),0===h&&this._rawPrevTime===_&&a!==_&&(this._rawPrevTime=0))}},n._kill=function(t,e){if("all"===t&&(t=null),null==t&&(null==e||e===this.target))return this._lazy=!1,this._enabled(!1,!1);e="string"!=typeof e?e||this._targets||this.target:D.selector(e)||e;var i,s,r,n,a,o,h,l;if((c(e)||M(e))&&"number"!=typeof e[0])for(i=e.length;--i>-1;)this._kill(t,e[i])&&(o=!0);else{if(this._targets){for(i=this._targets.length;--i>-1;)if(e===this._targets[i]){a=this._propLookup[i]||{},this._overwrittenProps=this._overwrittenProps||[],s=this._overwrittenProps[i]=t?this._overwrittenProps[i]||{}:"all";break}}else{if(e!==this.target)return!1;a=this._propLookup,s=this._overwrittenProps=t?this._overwrittenProps||{}:"all"}if(a){h=t||a,l=t!==s&&"all"!==s&&t!==a&&("object"!=typeof t||!t._tempKill);for(r in h)(n=a[r])&&(n.pg&&n.t._kill(h)&&(o=!0),n.pg&&0!==n.t._overwriteProps.length||(n._prev?n._prev._next=n._next:n===this._firstPT&&(this._firstPT=n._next),n._next&&(n._next._prev=n._prev),n._next=n._prev=null),delete a[r]),l&&(s[r]=1);!this._firstPT&&this._initted&&this._enabled(!1,!1)}}return o},n.invalidate=function(){return this._notifyPluginsOfEnabled&&D._onPluginEvent("_onDisable",this),this._firstPT=null,this._overwrittenProps=null,this._onUpdate=null,this._startAt=null,this._initted=this._active=this._notifyPluginsOfEnabled=this._lazy=!1,this._propLookup=this._targets?{}:[],this},n._enabled=function(t,e){if(o||a.wake(),t&&this._gc){var i,s=this._targets;if(s)for(i=s.length;--i>-1;)this._siblings[i]=V(s[i],this,!0);else this._siblings=V(this.target,this,!0)}return A.prototype._enabled.call(this,t,e),this._notifyPluginsOfEnabled&&this._firstPT?D._onPluginEvent(t?"_onEnable":"_onDisable",this):!1},D.to=function(t,e,i){return new D(t,e,i)},D.from=function(t,e,i){return i.runBackwards=!0,i.immediateRender=0!=i.immediateRender,new D(t,e,i)},D.fromTo=function(t,e,i,s){return s.startAt=i,s.immediateRender=0!=s.immediateRender&&0!=i.immediateRender,new D(t,e,s)},D.delayedCall=function(t,e,i,s,r){return new D(e,0,{delay:t,onComplete:e,onCompleteParams:i,onCompleteScope:s,onReverseComplete:e,onReverseCompleteParams:i,onReverseCompleteScope:s,immediateRender:!1,useFrames:r,overwrite:0})},D.set=function(t,e){return new D(t,0,e)},D.getTweensOf=function(t,e){if(null==t)return[];t="string"!=typeof t?t:D.selector(t)||t;var i,s,r,n;if((c(t)||M(t))&&"number"!=typeof t[0]){for(i=t.length,s=[];--i>-1;)s=s.concat(D.getTweensOf(t[i],e));for(i=s.length;--i>-1;)for(n=s[i],r=i;--r>-1;)n===s[r]&&s.splice(i,1)}else for(s=V(t).concat(),i=s.length;--i>-1;)(s[i]._gc||e&&!s[i].isActive())&&s.splice(i,1);return s},D.killTweensOf=D.killDelayedCallsTo=function(t,e,i){"object"==typeof e&&(i=e,e=!1);for(var s=D.getTweensOf(t,e),r=s.length;--r>-1;)s[r]._kill(i,t)};var Q=g("plugins.TweenPlugin",function(t,e){this._overwriteProps=(t||"").split(","),this._propName=this._overwriteProps[0],this._priority=e||0,this._super=Q.prototype},!0);if(n=Q.prototype,Q.version="1.10.1",Q.API=2,n._firstPT=null,n._addTween=function(t,e,i,s,r,n){var a,o; +return null!=s&&(a="number"==typeof s||"="!==s.charAt(1)?Number(s)-i:parseInt(s.charAt(0)+"1",10)*Number(s.substr(2)))?(this._firstPT=o={_next:this._firstPT,t:t,p:e,s:i,c:a,f:"function"==typeof t[e],n:r||e,r:n},o._next&&(o._next._prev=o),o):void 0},n.setRatio=function(t){for(var e,i=this._firstPT,s=1e-6;i;)e=i.c*t+i.s,i.r?e=Math.round(e):s>e&&e>-s&&(e=0),i.f?i.t[i.p](e):i.t[i.p]=e,i=i._next},n._kill=function(t){var e,i=this._overwriteProps,s=this._firstPT;if(null!=t[this._propName])this._overwriteProps=[];else for(e=i.length;--e>-1;)null!=t[i[e]]&&i.splice(e,1);for(;s;)null!=t[s.n]&&(s._next&&(s._next._prev=s._prev),s._prev?(s._prev._next=s._next,s._prev=null):this._firstPT===s&&(this._firstPT=s._next)),s=s._next;return!1},n._roundProps=function(t,e){for(var i=this._firstPT;i;)(t[this._propName]||null!=i.n&&t[i.n.split(this._propName+"_").join("")])&&(i.r=e),i=i._next},D._onPluginEvent=function(t,e){var i,s,r,n,a,o=e._firstPT;if("_onInitAllProps"===t){for(;o;){for(a=o._next,s=r;s&&s.pr>o.pr;)s=s._next;(o._prev=s?s._prev:n)?o._prev._next=o:r=o,(o._next=s)?s._prev=o:n=o,o=a}o=e._firstPT=r}for(;o;)o.pg&&"function"==typeof o.t[t]&&o.t[t]()&&(i=!0),o=o._next;return i},Q.activate=function(t){for(var e=t.length;--e>-1;)t[e].API===Q.API&&(F[(new t[e])._propName]=t[e]);return!0},d.plugin=function(t){if(!(t&&t.propName&&t.init&&t.API))throw"illegal plugin definition.";var e,i=t.propName,s=t.priority||0,r=t.overwriteProps,n={init:"_onInitTween",set:"setRatio",kill:"_kill",round:"_roundProps",initAll:"_onInitAllProps"},a=g("plugins."+i.charAt(0).toUpperCase()+i.substr(1)+"Plugin",function(){Q.call(this,i,s),this._overwriteProps=r||[]},t.global===!0),o=a.prototype=new Q(i);o.constructor=a,a.API=t.API;for(e in n)"function"==typeof t[e]&&(o[n[e]]=t[e]);return a.version=t.version,Q.activate([a]),a},s=t._gsQueue){for(r=0;s.length>r;r++)s[r]();for(n in f)f[n].func||t.console.log("GSAP encountered missing dependency: com.greensock."+n)}o=!1}}("undefined"!=typeof module&&module.exports&&"undefined"!=typeof global?global:this||window,"TweenMax"); \ No newline at end of file diff --git a/web/static/index/js/bootstrap.min.js b/web/static/index/js/bootstrap.min.js new file mode 100644 index 0000000..2b72a78 --- /dev/null +++ b/web/static/index/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.1 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.1",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.1",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.1",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.1",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.1",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('